diff --git a/containers/libreportal/frontend/components/apps/overview/js/overview-manager.js b/containers/libreportal/frontend/components/apps/overview/js/overview-manager.js index 794aba7..4c49cf3 100644 --- a/containers/libreportal/frontend/components/apps/overview/js/overview-manager.js +++ b/containers/libreportal/frontend/components/apps/overview/js/overview-manager.js @@ -417,7 +417,11 @@ class OverviewManager { '/core/backup-card/js/backup-app-card.js', ]; const load = (url) => (window.spaClean && window.spaClean.loadScript) ? window.spaClean.loadScript(url) : Promise.resolve(); - this._backupAssets = scripts.reduce((p, url) => p.then(() => load(url)), Promise.resolve()); + const chain = scripts.reduce((p, url) => p.then(() => load(url)), Promise.resolve()); + // Don't memoize a rejection — a transient script-load failure would otherwise + // brick the backup center for the whole session. Clear the memo on failure so + // the next open retries. + this._backupAssets = chain.catch((e) => { this._backupAssets = null; throw e; }); return this._backupAssets; } diff --git a/containers/libreportal/frontend/components/backup/core/js/backup-page.js b/containers/libreportal/frontend/components/backup/core/js/backup-page.js index 7fa9427..f20053f 100644 --- a/containers/libreportal/frontend/components/backup/core/js/backup-page.js +++ b/containers/libreportal/frontend/components/backup/core/js/backup-page.js @@ -79,7 +79,11 @@ class BackupPage { match: (d) => ['backup', 'restore', 'delete', 'delete_all'].includes(d.action) || /^libreportal\s+(backup|restore)\b/.test((d.task && d.task.command) || ''), run: () => { - if (window.backupPage === this && document.getElementById('backup-page')) { + // Works whether this is the standalone page (window.backupPage) or + // the instance embedded in the Overview Backups tab + // (window.overviewBackupPage) — the hard-coded global alone would + // make the embedded center's auto-refresh dead. + if ((window.backupPage === this || window.overviewBackupPage === this) && document.getElementById('backup-page')) { return this.refreshAll().then(() => this.render()); } }, diff --git a/containers/libreportal/frontend/core/kernel/js/spa.js b/containers/libreportal/frontend/core/kernel/js/spa.js index ab61a81..5aaad27 100755 --- a/containers/libreportal/frontend/core/kernel/js/spa.js +++ b/containers/libreportal/frontend/core/kernel/js/spa.js @@ -544,7 +544,9 @@ class LibrePortalSPAClean { script.src = src; script.id = scriptId; script.onload = resolve; - script.onerror = reject; + // Remove the element on failure so the getElementById() dedupe above can't + // make a later retry resolve instantly without re-fetching. + script.onerror = (e) => { try { script.remove(); } catch (_) {} reject(e); }; document.head.appendChild(script); }); }