feat(backup): .picpeak download + upload-restore UI in Backup Manager

Adds a self-contained "Portable backup (.picpeak)" card to the Restore
tab, completing the GUI-only roundtrip:
- Download: optional "include original photos" toggle + a prominent
  plaintext-secrets warning, streams the file via a blob download.
- Restore: file picker → destructive confirmation modal ("replaces ALL
  data except your current account, cannot be undone") → multipart upload
  to /admin/backup/picpeak/import → success summary. If the backup uses
  external media, shows a banner to reconfigure the mount, with a docs link.
Kept separate from the legacy RestoreWizard (different format/flow). en+de
strings added; dark-mode variants throughout.
This commit is contained in:
Luca
2026-07-02 19:45:16 +02:00
parent 2b66f6d889
commit 66d61c87ca
4 changed files with 257 additions and 3 deletions
@@ -23,6 +23,7 @@ import { BackupDashboard } from '../../components/admin/BackupDashboard';
import { BackupConfiguration } from '../../components/admin/BackupConfiguration';
import { BackupHistory } from '../../components/admin/BackupHistory';
import { RestoreWizard } from '../../components/admin/RestoreWizard';
import { PicpeakBackupCard } from '../../components/admin/PicpeakBackupCard';
import { BackupIntegrityCard } from '../../components/admin/BackupIntegrityCard';
import { BackupCoverageCard } from '../../components/admin/BackupCoverageCard';
import { api } from '../../config/api';
@@ -225,7 +226,10 @@ export const BackupManagement: React.FC = () => {
)}
{activeTab === 'restore' && (
<RestoreWizard onVerifyIntegrity={() => setActiveTab('integrity')} />
<div className="space-y-6">
<PicpeakBackupCard />
<RestoreWizard onVerifyIntegrity={() => setActiveTab('integrity')} />
</div>
)}
{activeTab === 'integrity' && (