From 64adfa6cc32984cd66a495466ba9fbd44f8633ad Mon Sep 17 00:00:00 2001 From: izzy Date: Mon, 18 May 2026 12:44:01 +0100 Subject: [PATCH] feat: auto select latest db backup Signed-off-by: izzy --- i18n/en.json | 5 + .../maintenance/MaintenanceBackupCard.svelte | 119 ++++++++++++++++++ .../maintenance/MaintenanceBackupEntry.svelte | 114 +++-------------- .../lib/services/database-backups.service.ts | 23 ++++ .../maintenance/MaintenanceRestoreFlow.svelte | 28 +++-- .../RestoreFlowAutoSelectBackup.svelte | 62 +++++++++ 6 files changed, 239 insertions(+), 112 deletions(-) create mode 100644 web/src/lib/components/maintenance/MaintenanceBackupCard.svelte create mode 100644 web/src/routes/maintenance/RestoreFlowAutoSelectBackup.svelte diff --git a/i18n/en.json b/i18n/en.json index 5e073559ac..5ab56a7a0f 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1466,6 +1466,7 @@ "maintenance_end_error": "Failed to end maintenance mode.", "maintenance_logged_in_as": "Currently logged in as {user}", "maintenance_restore_from_backup": "Restore From Backup", + "maintenance_restore_latest_backup_description": "We'll restore your database from the most recent backup. You can also pick a different one.", "maintenance_restore_library": "Restore Your Library", "maintenance_restore_library_confirm": "If this looks correct, continue to restoring a backup!", "maintenance_restore_library_description": "Restoring Database", @@ -1478,6 +1479,10 @@ "maintenance_restore_library_hint_regenerate_later": "You can regenerate these later in settings", "maintenance_restore_library_hint_storage_template_missing_files": "Using storage template? You may be missing files", "maintenance_restore_library_loading": "Loading integrity checks and heuristics…", + "maintenance_restore_loading_backups": "Loading backups…", + "maintenance_restore_no_backups": "There are no database backups.", + "maintenance_restore_select_another": "Select another backup", + "maintenance_restore_upload_backup": "Upload a backup", "maintenance_task_backup": "Creating a backup of the existing database…", "maintenance_task_migrations": "Running database migrations…", "maintenance_task_restore": "Restoring the chosen backup…", diff --git a/web/src/lib/components/maintenance/MaintenanceBackupCard.svelte b/web/src/lib/components/maintenance/MaintenanceBackupCard.svelte new file mode 100644 index 0000000000..c678c6a32f --- /dev/null +++ b/web/src/lib/components/maintenance/MaintenanceBackupCard.svelte @@ -0,0 +1,119 @@ + + + + + +
+ + {#if status === BackupFileStatus.OK} + + {:else if status === BackupFileStatus.DifferentVersion} + + {:else} + + {/if} + + {#if dateDisplay} + {dateDisplay} + {:else} + {$t('unknown_date')} + {/if} + {#if relativeTime} +
+
+ {relativeTime} +
+ {/if} +
+ + {#if actions} + + {@render actions()} + + {/if} +
+ + + + {filename} + + + {#if status === BackupFileStatus.UnknownVersion} + + {$t('admin.maintenance_restore_backup_unknown_version')} + + {:else if status === BackupFileStatus.DifferentVersion} + + {$t('admin.maintenance_restore_backup_different_version')} + + {/if} + + +
+ {$t('version')}: + {version ? `v${version}` : $t('unknown')} +
+
+ {$t('size')}: + {filesizeText[0]} {filesizeText[1]} +
+
+
+
+
diff --git a/web/src/lib/components/maintenance/MaintenanceBackupEntry.svelte b/web/src/lib/components/maintenance/MaintenanceBackupEntry.svelte index 219956269d..3658d9ad61 100644 --- a/web/src/lib/components/maintenance/MaintenanceBackupEntry.svelte +++ b/web/src/lib/components/maintenance/MaintenanceBackupEntry.svelte @@ -1,12 +1,8 @@ -{#if stage === 0} - (stage = 1)} flowToDatabase={() => (stage = 2)} {end} /> -{:else if stage === 1} - stage++} /> -{:else if stage === 2} - (stage = 0)} /> -{:else} - +{#if stage === 'overview'} + (stage = 'yucca')} flowToDatabase={() => (stage = 'detect-install')} {end} /> +{:else if stage === 'yucca'} + (stage = 'overview')} onFinish={() => (stage = 'auto-select-backup')} /> +{:else if stage === 'detect-install'} + (stage = 'select-backup')} previous={() => (stage = 'overview')} /> +{:else if stage === 'select-backup'} + (stage = 'detect-install')} {end} {expectedVersion} /> +{:else if stage === 'auto-select-backup'} + (stage = 'select-backup')} {end} {expectedVersion} /> {/if} diff --git a/web/src/routes/maintenance/RestoreFlowAutoSelectBackup.svelte b/web/src/routes/maintenance/RestoreFlowAutoSelectBackup.svelte new file mode 100644 index 0000000000..ea5eb31acb --- /dev/null +++ b/web/src/routes/maintenance/RestoreFlowAutoSelectBackup.svelte @@ -0,0 +1,62 @@ + + +{$t('maintenance_restore_from_backup')} + +{#if backups === undefined} + + + {$t('maintenance_restore_loading_backups')} + +{:else if latest === undefined} + + + + + +{:else} + {$t('maintenance_restore_latest_backup_description')} + + + + + + + +{/if}