feat(recipes): show a summary modal after rematch runs

Replace the post-run toast cascade and the standalone L4 results modal
with a summary modal modeled on the batch download summary: 3-state
header, stat cards (matched / needs review / unresolved / errors),
an L4 review table with per-entry undo, and a copyable report. Wired
into the global, bulk and single-recipe rematch entries; complete
no-op runs keep the lightweight toast. Obsolete results-modal code,
styles and i18n keys are removed.
This commit is contained in:
Will Miao
2026-09-09 10:38:10 +08:00
parent 51cad6f852
commit 4963bf2b2e
23 changed files with 997 additions and 583 deletions
+21 -9
View File
@@ -216,9 +216,6 @@
"label": "Réassocier les Recipes aux modèles locaux",
"loading": "Réassociation des Recipes aux modèles locaux...",
"success": "{entries} entrées associées dans {recipes} Recipes",
"successErrors": "{entries} entrées associées dans {recipes} Recipes, {failures} échecs",
"allFailed": "Échec de la réassociation de {failures} Recipes sur {total}",
"noMatch": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} Recipes",
"cancelled": "Réassociation annulée. {recipes} Recipes mises à jour ({entries} entrées)",
"error": "Échec de la réassociation des Recipes : {message}"
},
@@ -1511,12 +1508,31 @@
"confirmButton": "Réassocier"
},
"rematchResults": {
"title": "Résultats de la réassociation — Correspondances par nom de fichier",
"message": "Ces entrées ont été reconnectées par nom de fichier et peuvent associer une version différente d'un modèle. Vérifiez-les et annulez celles qui sont incorrectes.",
"undo": "Annuler",
"undone": "Annulé",
"undoFailed": "Échec de l'annulation de la réassociation : {message}"
},
"rematchSummary": {
"title": "[TODO: Translate] Rematch Summary",
"successMessage": "[TODO: Translate] Matched {entries} entries",
"failed": "[TODO: Translate] Rematch failed",
"completedWithWarnings": "[TODO: Translate] Rematch completed — review recommended",
"cancelledNote": "[TODO: Translate] Run cancelled before completion — counts are partial.",
"statMatched": "[TODO: Translate] Matched entries",
"statReview": "[TODO: Translate] Needs review",
"statUnresolved": "[TODO: Translate] Unresolved",
"statErrors": "[TODO: Translate] Errors",
"reviewSection": "[TODO: Translate] Filename matches to review ({count})",
"columnRecipe": "[TODO: Translate] Recipe",
"columnEntry": "[TODO: Translate] Entry",
"columnFile": "[TODO: Translate] Matched file",
"columnUndo": "[TODO: Translate] Undo",
"copyReport": "[TODO: Translate] Copy Report",
"close": "[TODO: Translate] Close",
"scope_global": "[TODO: Translate] All recipes",
"scope_bulk": "[TODO: Translate] Selected recipes",
"scope_single": "[TODO: Translate] Single recipe"
},
"exampleAccess": {
"title": "Images d'exemple locales",
"message": "Aucune image d'exemple locale trouvée pour ce modèle. Options d'affichage :",
@@ -2239,10 +2255,6 @@
"batchImportBrowseFailed": "Échec de la navigation dans le dossier : {message}",
"batchImportDirectorySelected": "Dossier sélectionné : {path}",
"noRecipesSelected": "Aucune Recipe sélectionnée",
"rematchComplete": "{entries} entrées associées dans {recipes} Recipes",
"rematchCompleteErrors": "{entries} entrées associées dans {recipes} Recipes, {failures} échecs",
"rematchAllFailed": "Échec de la réassociation de {failures} Recipes sélectionnées sur {total}",
"rematchUnmatched": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} Recipes",
"rematchSkipped": "Aucune des {total} Recipes sélectionnées ne nécessite de réassociation",
"rematchFailed": "Échec de la réassociation des Recipes sélectionnées : {message}",
"reimporting": "Ré-import de la Recipe depuis la source...",