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
+22 -60
View File
@@ -697,78 +697,40 @@ button:disabled,
flex-shrink: 0;
}
/* Recipe Rematch L4 Results Modal */
#rematchResultsModal .modal-body {
padding: var(--space-3);
/* Recipe Rematch Summary Modal (dynamically built by RematchSummaryModal.js;
stat cards / failure table / summary header come from
metadata-refresh-result.css and download-batch-summary.css). */
.rematch-summary-modal {
max-width: 700px;
}
#rematchResultsModal .confirmation-message {
color: var(--text-color);
margin-bottom: var(--space-3);
font-size: 1em;
line-height: 1.5;
}
#rematchResultsModal .rematch-results-preview {
background: var(--surface-subtle);
border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm);
padding: var(--space-2) var(--space-3);
}
#rematchResultsModal .rematch-results-list {
list-style: none;
padding: 0;
margin: 0;
max-height: 320px;
overflow-y: auto;
}
#rematchResultsModal .rematch-results-row {
.rematch-cancelled-note {
display: flex;
align-items: center;
justify-content: space-between;
align-items: flex-start;
gap: var(--space-2);
padding: var(--space-2) 0;
border-bottom: 1px solid var(--border-color);
font-size: 0.9em;
margin: 0 0 var(--space-2) 0;
font-size: var(--text-sm);
color: var(--color-warning);
}
#rematchResultsModal .rematch-results-row:last-child {
border-bottom: none;
.rematch-cancelled-note i {
margin-top: 2px;
flex-shrink: 0;
}
#rematchResultsModal .rematch-results-info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
flex: 1;
/* Review section heading uses the accent (review, not failure) instead of
the failure-section error color. */
.rematch-review-section h4 {
color: var(--lora-accent);
}
#rematchResultsModal .rematch-results-entry {
font-weight: 500;
color: var(--text-color);
overflow-wrap: anywhere;
#rematchSummaryModal .rematch-undo-btn {
padding: var(--space-1) var(--space-2);
font-size: var(--text-xs);
white-space: nowrap;
}
#rematchResultsModal .rematch-results-file {
color: var(--text-muted);
overflow-wrap: anywhere;
}
#rematchResultsModal .rematch-results-recipe {
font-size: 0.85em;
opacity: 0.7;
color: var(--text-muted);
overflow-wrap: anywhere;
}
#rematchResultsModal .rematch-results-row.undone .rematch-results-info {
#rematchSummaryModal tr.undone td:not(.rematch-undo-cell) {
text-decoration: line-through;
opacity: 0.6;
}
#rematchResultsModal .rematch-results-undo {
flex-shrink: 0;
}