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:
@ -3295,14 +3295,32 @@ impl From<domain::ProjectSettings> for ProjectSettingsDto {
|
||||
}
|
||||
|
||||
/// Project settings update request.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct UpdateProjectSettingsRequestDto {
|
||||
/// Project registry id.
|
||||
pub project_id: String,
|
||||
/// New colour, or null to restore the product default.
|
||||
#[serde(default)]
|
||||
pub theme_color: Option<String>,
|
||||
/// Missing leaves the colour unchanged; null restores the product default.
|
||||
pub theme_color: Option<Option<String>>,
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for UpdateProjectSettingsRequestDto {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let mut value = Value::deserialize(deserializer)?;
|
||||
let object = value
|
||||
.as_object_mut()
|
||||
.ok_or_else(|| serde::de::Error::custom("expected project settings update object"))?;
|
||||
let project_id =
|
||||
take_required_string(object, "projectId").map_err(serde::de::Error::custom)?;
|
||||
let theme_color = take_optional_value::<String>(object, "themeColor")
|
||||
.map_err(serde::de::Error::custom)?;
|
||||
Ok(Self {
|
||||
project_id,
|
||||
theme_color,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Request DTO for `launch_agent`.
|
||||
|
||||
Reference in New Issue
Block a user