feat(webui): deep-link auto-expand for Overview Updates rows

Open the per-app row named by ?app=<name> on load/repaint and write it back on
toggle, so an expanded Updates row is a shareable URL — mirrors the Tasks page's
?task=<id> pattern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
librelad 2026-05-31 23:46:34 +01:00
parent fd65c1b43a
commit dbc5e64505

View File

@ -122,12 +122,21 @@ class OverviewManager {
if (!pane) return;
switch (id) {
case 'overview': pane.innerHTML = this.renderOverview(); break;
case 'updates': pane.innerHTML = this.renderUpdates(); break;
case 'updates': pane.innerHTML = this.renderUpdates(); this._honorAppDeepLink(); break;
case 'improvements': pane.innerHTML = this.renderImprovements(); break;
case 'backups': pane.innerHTML = this.renderBackups(); break;
}
}
// Open the row named by ?app=<name> on load / repaint — makes an expanded row
// a shareable URL, mirroring the Tasks page's ?task=<id> deep-link.
_honorAppDeepLink() {
const app = new URLSearchParams(window.location.search).get('app');
if (!app) return;
const details = document.getElementById(`ov-detail-${app}`);
if (details && details.hidden) this.toggleAppDetails(app);
}
// ---- clicks --------------------------------------------------------------
_handleClick(e) {
@ -268,10 +277,12 @@ class OverviewManager {
const head = root && root.querySelector(`.ov-row[data-app="${(window.CSS && CSS.escape) ? CSS.escape(app) : app}"] .ov-row-head`);
if (!details) return;
const isOpen = !details.hidden;
const base = `/overview/${this.current || 'updates'}`;
if (isOpen) {
details.hidden = true;
details.classList.remove('ov-open');
if (head) { head.setAttribute('aria-expanded', 'false'); head.classList.remove('ov-open'); }
window.history.replaceState({ route: base }, '', base);
} else {
if (!details.dataset.filled && this.updater) {
const appObj = (this.updater.apps || []).find((x) => x.name === app);
@ -281,6 +292,7 @@ class OverviewManager {
details.hidden = false;
details.classList.add('ov-open');
if (head) { head.setAttribute('aria-expanded', 'true'); head.classList.add('ov-open'); }
window.history.replaceState({ route: `${base}?app=${encodeURIComponent(app)}` }, '', `${base}?app=${encodeURIComponent(app)}`);
}
}