diff --git a/webapp/templates/imaging.html b/webapp/templates/imaging.html index d04ea72..cdda387 100644 --- a/webapp/templates/imaging.html +++ b/webapp/templates/imaging.html @@ -64,6 +64,7 @@ window.addEventListener('DOMContentLoaded', scheduleImagingReload); {% set border = 'danger' if is_failed else ('success' if is_done else 'primary') %} {% set friendly = stage_labels.get(stage_idx, ('Stage ' ~ stage_idx, '')) %}
@@ -340,6 +341,32 @@ window.addEventListener('DOMContentLoaded', function() { }); }); +// Persist tile expanded/collapsed state across page refresh via +// localStorage. Set of expanded serials lives at 'imaging-expanded'. +(function() { + var KEY = 'imaging-expanded'; + function loadSet() { + try { return new Set(JSON.parse(localStorage.getItem(KEY) || '[]')); } + catch (e) { return new Set(); } + } + function saveSet(set) { + try { localStorage.setItem(KEY, JSON.stringify(Array.from(set))); } + catch (e) {} + } + window.addEventListener('DOMContentLoaded', function() { + var expanded = loadSet(); + document.querySelectorAll('.imaging-card').forEach(function(card) { + var serial = card.getAttribute('data-serial'); + if (serial && expanded.has(serial)) card.open = true; + card.addEventListener('toggle', function() { + var s = loadSet(); + if (card.open) s.add(serial); else s.delete(serial); + saveSet(s); + }); + }); + }); +})(); + // Client-side filter: hide imaging-card elements whose data-filter doesn't // match the search query. Live as user types. Pauses auto-reload while // the input is focused or non-empty so typing isn't interrupted by refresh.