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:
@ -3920,12 +3920,12 @@ async fn invoke_update_project_settings(
|
||||
let project = resolve_project_readonly(&request.project_id, state).await?;
|
||||
let theme_color = request
|
||||
.theme_color
|
||||
.map(domain::ThemeColor::new)
|
||||
.map(|value| value.map(domain::ThemeColor::new).transpose())
|
||||
.transpose()
|
||||
.map_err(|message| ErrorDto::from(AppError::Invalid(message)))?;
|
||||
let output: ProjectSettingsDto = state
|
||||
.update_project_settings
|
||||
.execute(&project, domain::ProjectSettings { theme_color })
|
||||
.execute(&project, theme_color)
|
||||
.await
|
||||
.map_err(ErrorDto::from)?
|
||||
.into();
|
||||
@ -10627,6 +10627,26 @@ mod tests {
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
assert_eq!(saved_project["themeColor"], "#AA3366");
|
||||
|
||||
let (status, unchanged_project) = invoke_request_for_test(
|
||||
Arc::clone(&state),
|
||||
&cookie,
|
||||
"update_project_settings",
|
||||
json!({ "request": { "projectId": project_id } }),
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
assert_eq!(unchanged_project["themeColor"], "#AA3366");
|
||||
|
||||
let (status, reset_project) = invoke_request_for_test(
|
||||
Arc::clone(&state),
|
||||
&cookie,
|
||||
"update_project_settings",
|
||||
json!({ "request": { "projectId": project_id, "themeColor": null } }),
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
assert_eq!(reset_project["themeColor"], Value::Null);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
|
||||
Reference in New Issue
Block a user