From 989123322b2f69e47e025ec21543e186c794be24 Mon Sep 17 00:00:00 2001 From: librelad Date: Thu, 28 May 2026 00:42:08 +0100 Subject: [PATCH] =?UTF-8?q?copy(backup):=20user-facing=20"snapshot"=20?= =?UTF-8?q?=E2=86=92=20"backup"=20across=20the=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Snapshot" is restic's term and leaks the tool's vocabulary into the WebUI. Users think in "backups" — the on-page label even says "Backups" already; only the secondary copy still said "snapshot". Renames the remaining user-visible mentions while leaving code identifiers, API keys, data attributes, CSS class names, and the ?snapshot= deep-link param untouched (those are internal contracts and changing them would churn for no user-visible win). Renamed surfaces: - Per-app Backups tab header: "Snapshots for " → "Backups for " "across all configured repositories" → "across all configured locations" - BackupAppCard: "No snapshots yet" → "No backups yet" "No snapshots found" → "No backups found" "Showing the most recent 50 of N snapshots" → "...of N backups" ID-chip tooltip "Snapshot ID" → "Backup ID" Detail panel "Snapshot ID:" → "Backup ID:" - Backup retention preset descriptions (KEEP_LAST/DAILY/WEEKLY/MONTHLY/ YEARLY) — "snapshot per day/week/..." → "backup per day/week/..." - Personal preset hint: "6 monthly snapshots" → "6 monthly backups" - Restore confirmation modal hint: "snapshot restored in place" → "backup restored in place" - Config-warning banner copy adjusted so it doesn't introduce "snapshots" as a noun - Retention "Keep last" input suffix: "snapshots" → "backups" - Cross-host migrate tooltip: "snapshot" → "backup" Signed-off-by: librelad --- .../frontend/html/apps-unified-layout.html | 2 +- .../frontend/html/backup-content.html | 2 +- .../js/components/backup/backup-app-card.js | 12 +++++------ .../js/components/backup/backup-page.js | 20 +++++++++---------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/containers/libreportal/frontend/html/apps-unified-layout.html b/containers/libreportal/frontend/html/apps-unified-layout.html index 25fea05..ae3cc8d 100755 --- a/containers/libreportal/frontend/html/apps-unified-layout.html +++ b/containers/libreportal/frontend/html/apps-unified-layout.html @@ -181,7 +181,7 @@

💾 Backups

-

Snapshots for this app across all configured repositories.

+

Backups for this app across all configured locations.

Loading…
diff --git a/containers/libreportal/frontend/html/backup-content.html b/containers/libreportal/frontend/html/backup-content.html index 9149243..6945117 100644 --- a/containers/libreportal/frontend/html/backup-content.html +++ b/containers/libreportal/frontend/html/backup-content.html @@ -134,7 +134,7 @@
-

Cross-host migrate ℹ️

+

Cross-host migrate ℹ️

Restore an app from another LibrePortal
-
Snapshot ID: ${this.escape(sid)}
+
Backup ID: ${this.escape(sid)}
Location: ${this.escape(s.locName)}
When: ${this.escape(this._fmtFull(s.time))}
${s.hostname ? `
Host: ${this.escape(s.hostname)}
` : ''} @@ -213,7 +213,7 @@ class BackupAppCard { async restoreSnapshot(locIdx, snapshot) { const locName = this.locationsByIdx[locIdx]?.name || `Location ${locIdx}`; - if (!confirm(`Restore ${this.appName} from backup ${snapshot} at ${locName}? The app will be stopped, its folder wiped, the backup restored in place, then the app started again.`)) return; + if (!confirm(`Restore ${this.appName} from backup ${snapshot} at ${locName}?\n\nThe app will be stopped, its folder wiped, the backup restored in place, then the app started again.`)) return; if (!this.taskManager) return; await this.taskManager.createTask(`libreportal restore app start ${this.appName} ${snapshot} ${locIdx}`, 'restore', this.appName); } diff --git a/containers/libreportal/frontend/js/components/backup/backup-page.js b/containers/libreportal/frontend/js/components/backup/backup-page.js index 706be4f..3642e11 100644 --- a/containers/libreportal/frontend/js/components/backup/backup-page.js +++ b/containers/libreportal/frontend/js/components/backup/backup-page.js @@ -14,7 +14,7 @@ const BACKUP_RETENTION_PRESETS = { const BACKUP_RETENTION_PRESET_META = { 'inherit-global': { label: 'Inherit global retention', hint: 'Use whatever the Configuration tab specifies. Pick something else here only when this location needs a different policy.' }, 'self-hosting': { label: 'Self-hosting', hint: '30 days of daily backups. Plenty for a homelab — covers accidental deletes and app screw-ups.' }, - 'personal': { label: 'Personal', hint: '30 days of daily backups plus 6 monthly snapshots. Good for personal data where "what did this look like last summer" matters.' }, + 'personal': { label: 'Personal', hint: '30 days of daily backups plus 6 monthly backups. Good for personal data where "what did this look like last summer" matters.' }, 'enterprise': { label: 'Enterprise', hint: '30 daily + 12 monthly + 5 yearly. Compliance-style retention with multi-year history.' }, 'custom': { label: 'Custom…', hint: 'Define each retention tier yourself.' } }; @@ -44,11 +44,11 @@ const BACKUP_LOC_FIELD_DEFS = { B2_ACCOUNT_KEY: { title: 'B2 account key', description: '' }, APPEND_ONLY: { title: 'Append-only', description: 'Ransomware-safe — refuse forget/prune for this location even if LibrePortal itself is compromised. Trades off automatic retention cleanup.' }, CUSTOM_RETENTION: { title: 'Use custom retention', description: 'Otherwise this location inherits the global retention.' }, - KEEP_LAST: { title: 'Keep last', description: 'Snapshots to always retain.' }, - KEEP_DAILY: { title: 'Keep daily', description: 'One snapshot per day for this many days.' }, - KEEP_WEEKLY: { title: 'Keep weekly', description: 'One snapshot per week for this many weeks.' }, - KEEP_MONTHLY: { title: 'Keep monthly', description: 'One snapshot per month for this many months.' }, - KEEP_YEARLY: { title: 'Keep yearly', description: 'One snapshot per year for this many years.' } + KEEP_LAST: { title: 'Keep last', description: 'Backups to always retain.' }, + KEEP_DAILY: { title: 'Keep daily', description: 'One backup per day for this many days.' }, + KEEP_WEEKLY: { title: 'Keep weekly', description: 'One backup per week for this many weeks.' }, + KEEP_MONTHLY: { title: 'Keep monthly', description: 'One backup per month for this many months.' }, + KEEP_YEARLY: { title: 'Keep yearly', description: 'One backup per year for this many years.' } }; // Fallback for the per-type field schema. The live source is the generator- @@ -504,7 +504,7 @@ class BackupPage { subtitleFor(tab) { return { dashboard: "Check what's protected — and when it last ran.", - backups: 'Every snapshot across every enabled location.', + backups: 'Every backup across every enabled location.', locations: 'Where backups are stored. Add, edit, or remove destinations.', migrate: 'Restore an app from another LibrePortal that shares one of your backup locations.', configuration: 'Schedule, retention, and engine settings.' @@ -1113,7 +1113,7 @@ class BackupPage {
Keep your LibrePortal config backed up offline. - Repository passwords live inside the config directory. Without that backup, snapshots cannot be decrypted by anyone — including you. + Repository passwords live inside the config directory. Without that backup, the others cannot be decrypted by anyone — including you.
- ${this.formInput(`${prefix}KEEP_LAST`, 'Keep last', values.last, 'number', '', 'snapshots')} + ${this.formInput(`${prefix}KEEP_LAST`, 'Keep last', values.last, 'number', '', 'backups')} ${this.formInput(`${prefix}KEEP_DAILY`, 'Keep daily', values.daily, 'number', '', 'days')} ${this.formInput(`${prefix}KEEP_WEEKLY`, 'Keep weekly', values.weekly, 'number', '', 'weeks')} ${this.formInput(`${prefix}KEEP_MONTHLY`, 'Keep monthly', values.monthly, 'number', '', 'months')} @@ -1837,7 +1837,7 @@ class BackupPage { if (!modal || !body) return; body.innerHTML = `

Restore ${this.escape(app)} from backup ${this.escape(snapshot)} at ${this.escape(locName)}?

-

The app will be stopped, its folder wiped, the snapshot restored in place, then the app started again. App-specific pre/post-restore hooks run if present.

+

The app will be stopped, its folder wiped, the backup restored in place, then the app started again. App-specific pre/post-restore hooks run if present.

`; modal.dataset.app = app; modal.dataset.locIdx = locIdx;