fix(frontend,application,backend,web-server,infrastructure): le set de couleurs projet s'applique à tous les projets — #316 (QA verte)
Cause: update_project_settings remplaçait tout ProjectSettings avec la seule couleur fournie — champ absent et null indistinguables — et des réponses de chargement/sauvegarde obsolètes d'un projet précédent pouvaient réafficher/écraser la couleur lors d'un changement de projet rapide, d'où l'impression que la couleur ne prenait pas sur tous les projets. - DTO tri-état (absent = inchangé, null = défaut produit) avec Deserialize manuel et use case de mise à jour partielle du champ theme_color; commandes Tauri et web-server alignées sur le même contrat. - Garde-fous de course frontend: séquences load/save + révision thème par projet (pub/sub onProjectThemeChanged) dans ProjectSettingsPanel, garde de révision de focus dans ViewWindow. - Tests: infrastructure settings, contrats web-server (inchangé/reset), ProjectSettingsPanel, ViewWindow, projects. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1,7 +1,9 @@
|
||||
//! Read/update use cases for global and project settings.
|
||||
|
||||
use crate::AppError;
|
||||
use domain::{IdeaUserSettings, Project, ProjectSettings, ProjectSettingsStore, UserSettingsStore};
|
||||
use domain::{
|
||||
IdeaUserSettings, Project, ProjectSettings, ProjectSettingsStore, ThemeColor, UserSettingsStore,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
|
||||
/// Reads global machine-local user settings.
|
||||
@ -50,7 +52,7 @@ impl ReadProjectSettings {
|
||||
self.store.load(&project.root).await.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
/// Replaces the settings owned by one project.
|
||||
/// Updates the settings owned by one project.
|
||||
pub struct UpdateProjectSettings {
|
||||
store: Arc<dyn ProjectSettingsStore>,
|
||||
}
|
||||
@ -60,13 +62,20 @@ impl UpdateProjectSettings {
|
||||
pub fn new(store: Arc<dyn ProjectSettingsStore>) -> Self {
|
||||
Self { store }
|
||||
}
|
||||
/// Persists and returns the accepted project settings.
|
||||
/// Applies the supplied fields and returns the accepted project settings.
|
||||
///
|
||||
/// An absent outer option leaves the colour unchanged; an explicit inner
|
||||
/// `None` restores the product fallback.
|
||||
pub async fn execute(
|
||||
&self,
|
||||
project: &Project,
|
||||
settings: ProjectSettings,
|
||||
theme_color: Option<Option<ThemeColor>>,
|
||||
) -> Result<ProjectSettings, AppError> {
|
||||
self.store.save(&project.root, &settings).await?;
|
||||
let mut settings = self.store.load(&project.root).await?;
|
||||
if let Some(theme_color) = theme_color {
|
||||
settings.theme_color = theme_color;
|
||||
self.store.save(&project.root, &settings).await?;
|
||||
}
|
||||
Ok(settings)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user