From f336eb65f06e49369eb0f46416d3692f25abc064 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Fri, 16 Oct 2026 23:34:21 +0200 Subject: [PATCH] Let a storage return to the Proxmox default retention and match the job editor labels - An empty policy removes the storage setting with --delete prune-backups, and a storage without a policy opens with that choice - Retention fields use the Keep last, Keep daily... labels of the backup job editor - A retention count of zero is rejected before calling Proxmox - Spanish uses backups for the retention messages --- .../components/backup-storage-retention.tsx | 18 ++++++++++++------ AppImage/messages/en/common.json | 1 + AppImage/messages/es/common.json | 15 ++++++++------- AppImage/scripts/flask_vm_backup_routes.py | 10 ++++++---- tests/test_vm_backup_jobs_api.py | 6 +++++- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/AppImage/components/backup-storage-retention.tsx b/AppImage/components/backup-storage-retention.tsx index f27ae046..4d15c6a5 100644 --- a/AppImage/components/backup-storage-retention.tsx +++ b/AppImage/components/backup-storage-retention.tsx @@ -23,6 +23,7 @@ export function BackupStorageRetention() { const [editing, setEditing] = useState(null) const [fields, setFields] = useState>({}) const [keepAll, setKeepAll] = useState(false) + const [useDefault, setUseDefault] = useState(false) const [busy, setBusy] = useState(false) const [message, setMessage] = useState("") const [saveError, setSaveError] = useState("") @@ -30,7 +31,8 @@ export function BackupStorageRetention() { function edit(storage: StorageRetention) { const policy = parseRetention(storage.prune_backups) setFields(policy.fields) - setKeepAll(policy.keepAll || !storage.prune_backups) + setKeepAll(policy.keepAll) + setUseDefault(!storage.prune_backups) setSaveError("") setMessage("") setEditing(storage) @@ -38,8 +40,8 @@ export function BackupStorageRetention() { async function save() { if (!editing || busy) return - const prune = buildRetention(fields, keepAll) - if (!prune) return setSaveError(t("backup.storageRetention.choosePolicy")) + const prune = useDefault ? "" : buildRetention(fields, keepAll) + if (!useDefault && !prune) return setSaveError(t("backup.storageRetention.choosePolicy")) setBusy(true) setSaveError("") try { @@ -79,14 +81,18 @@ export function BackupStorageRetention() { {t("backup.storageRetention.editTitle", { storage: editing?.id ?? "" })} {t("backup.storageRetention.effect")} -