diff --git a/frontend/packages/dashboard/src/call.js b/frontend/packages/dashboard/src/call.js index 88ea4588..c0b478ff 100644 --- a/frontend/packages/dashboard/src/call.js +++ b/frontend/packages/dashboard/src/call.js @@ -615,6 +615,27 @@ function buildQuestionLi(q) { return li; } +// Snapshot / restore open `
` state across a re-render, scoped to +// one section root. renderQuestions only manages `#questions-section`, so it +// keeps its own section-local pair rather than reaching into tabs.js's +// `MANAGED_SECTION_IDS`-based helpers (which aren't in this module's scope — +// referencing them threw `ReferenceError: snapshotOpenDetails is not defined` +// and aborted refreshState). Sections that should survive a refresh carry a +// stable `data-restore-key`. +function snapshotOpenDetails(root) { + const open = new Set(); + for (const d of root.querySelectorAll('details[data-restore-key]')) { + if (d.open) open.add(d.dataset.restoreKey); + } + return open; +} +function restoreOpenDetails(root, open) { + if (!open.size) return; + for (const d of root.querySelectorAll('details[data-restore-key]')) { + if (open.has(d.dataset.restoreKey)) d.open = true; + } +} + export function renderQuestions() { const root = $('questions-section'); // #questions-section only lives on /dashboard.html (Y3R C4LL tab); @@ -625,7 +646,7 @@ export function renderQuestions() { // any expanded sections. The keyed-cache approach reuses question //
  • nodes (preserving textarea/checkbox state) and only rebuilds // cache-miss rows, so we no longer wipe the DOM at the start. - const openDetails = snapshotOpenDetails(); + const openDetails = snapshotOpenDetails(root); const fmt = (n) => new Date(n * 1000).toISOString().replace('T', ' ').slice(0, 19); const allPending = questionsState.pending; @@ -750,7 +771,7 @@ export function renderQuestions() { const histEl = root.querySelector('.q-history'); if (histEl) histEl.open = true; } - restoreOpenDetails(openDetails); + restoreOpenDetails(root, openDetails); } // Format a remaining-seconds count as the `⏳ …` TTL chip text on a