Files
fusion/packages/dashboard/app/components/settings/sections/DatabaseBackupsSection.css
gsxdsm 873f339ddd FN-9040: show backup status and preserve schedules
Expose database backup inventory and schedule execution evidence while keeping scheduled backups due after unchanged settings saves.

- Display backup files, empty and error states, and automatic schedule details in Settings.
- Reconcile the shared backup routine at engine startup and retain its next run when settings are unchanged.
- Add API, localization, documentation, and regression coverage for backup status and scheduling.

Files changed:
 .changeset/fn-9040-database-backups-visibility.md  |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 docs/settings-reference.md                         |   4 +
 .../src/__tests__/backup-schedule-status.test.ts   | 124 +++++++++++++++++++++
 .../core/src/automation/global-routine-store.ts    |  31 +++++-
 packages/core/src/backup/backup.ts                 |  95 ++++++++++++++--
 packages/core/src/index.gate.ts                    |   4 +-
 packages/core/src/index.ts                         |   4 +-
 .../app/api/agents/agent-import-generation.ts      |  14 +++
 packages/dashboard/app/api/legacy.ts               |   1 +
 .../dashboard/app/components/SettingsModal.tsx     |  12 +-
 .../__tests__/SettingsModal.test-harness.tsx       |   7 +-
 .../__tests__/SettingsModalNodeRouting.test.tsx    |   2 +-
 .../components/__tests__/settings-mobile.test.tsx  |   2 +-
 .../settings/sections/DatabaseBackupsSection.css   |  24 ++++
 .../settings/sections/DatabaseBackupsSection.tsx   |  67 ++++++-----
 .../__tests__/DatabaseBackupsSection.test.tsx      |  45 ++++++++
 .../register-system-maintenance-routes.test.ts     |  47 +++++++-
 .../routes/register-system-maintenance-routes.ts   |  46 ++++++--
 .../src/__tests__/in-process-runtime.pg.test.ts    |  15 ++-
 packages/engine/src/runtimes/in-process-runtime.ts |  13 +++
 packages/i18n/locales/en/app.json                  |  17 ++-
 packages/i18n/locales/es/app.json                  |  17 ++-
 packages/i18n/locales/fr/app.json                  |  17 ++-
 packages/i18n/locales/ko/app.json                  |  17 ++-
 packages/i18n/locales/pt-BR/app.json               |  17 ++-
 packages/i18n/locales/zh-CN/app.json               |  17 ++-
 packages/i18n/locales/zh-TW/app.json               |  17 ++-
 packages/i18n/src/resources.d.ts                   |  28 ++++-
 29 files changed, 623 insertions(+), 90 deletions(-)

Fusion-Task-Id: FN-9040

Fusion-Task-Lineage: 29a803a2-0784-4a99-b7cb-2f67d105254b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-13 17:22:46 -07:00

25 lines
1.6 KiB
CSS

.backup-schedule {
margin: var(--space-md) 0;
padding: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-md);
background: color-mix(in srgb, var(--surface) 85%, transparent);
}
.backup-schedule h5 { margin: 0 0 var(--space-sm); }
.backup-schedule dl { display: grid; gap: var(--space-xs); margin: 0; }
.backup-schedule dl div { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: var(--space-sm); }
.backup-schedule dt, .backup-schedule dd { margin: 0; }
.backup-schedule dt { color: var(--text-muted); }
.backup-schedule-error, .backup-list-error { color: var(--color-error); }
.backup-list { display: flex; flex-direction: column; gap: var(--space-xs); margin: var(--space-sm) 0 0; padding: 0; list-style: none; }
.backup-list li { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: var(--space-sm); align-items: center; padding: var(--space-sm) 0; border-top: var(--btn-border-width) solid color-mix(in srgb, var(--border) 80%, transparent); }
.backup-list li code { min-width: 0; color: var(--text); font-family: var(--font-mono); font-size: var(--font-size-xs); overflow-wrap: anywhere; }
.backup-list time, .backup-size { color: var(--text-muted); font-family: var(--font-mono); font-size: var(--font-size-xs); white-space: nowrap; }
@media (max-width: 768px) {
.backup-schedule dl div { grid-template-columns: 1fr; gap: 0; }
.backup-list { max-height: calc(var(--space-xl) * 9 + var(--space-md)); overflow-y: auto; -webkit-overflow-scrolling: touch; }
.backup-list li { grid-template-columns: 1fr; gap: var(--space-xs); }
}