feat(sidecars): restyle migration result as a summary modal

Follow the app's existing operation-summary convention (Metadata Fetch
Summary / Batch Download Summary): a self-managed modal appended to
document.body with a 3-state summary header, stat cards (moved /
models / skipped / conflicts / errors), and a failure table listing
per-model errors that were previously swallowed into a single count.

The storage location line and Open Folder action move into the modal
actions; the page reload still happens only when the modal is
dismissed. ESC is captured so it never reaches the settings modal
underneath. The obsolete migrateSuccess toast key is dropped — the
modal is the success feedback now.
This commit is contained in:
Will Miao
2026-09-27 10:05:18 +08:00
parent 485679223b
commit e7c1c07db0
7 changed files with 293 additions and 164 deletions
+12 -4
View File
@@ -805,7 +805,6 @@
"migrateButton": "Migrate Sidecars Now",
"migratingButton": "Migrating...",
"migrating": "Migrating sidecars...",
"migrateSuccess": "Sidecar migration completed successfully",
"migrateFailed": "Sidecar migration failed: {message}",
"migrationDeferred": "Existing sidecars were not moved. You can migrate them later from Settings → Library → Sidecar Storage.",
"confirmToCentralized": "The storage mode changed, but existing .metadata.json sidecars and preview images are not moved automatically. Move them into the centralized storage directory now? You can also do this later with the \"Migrate Sidecars Now\" button.",
@@ -1680,9 +1679,18 @@
"destination": "Destination: {path}"
},
"sidecarMigrationResult": {
"title": "Sidecar migration completed",
"titleWithErrors": "Sidecar migration completed with {count} error(s)",
"summary": "Moved {moved} files for {models} models. Skipped: {skipped}, conflicts resolved: {conflicts}.",
"title": "Sidecar Migration Summary",
"completedSuccessfully": "Migration completed successfully",
"completedWithErrors": "Completed with {count} error(s)",
"statMoved": "Moved Files",
"statModels": "Models",
"statSkipped": "Skipped",
"statConflicts": "Conflicts Resolved",
"statErrors": "Errors",
"failedItems": "Failed Items ({count})",
"columnModel": "Model",
"columnError": "Error",
"successMessage": "Moved {moved} files for {models} models",
"location": "Storage location: {path}"
},
"bulkAddTags": {