diff --git a/webapp/templates/_imaging_tiles.html b/webapp/templates/_imaging_tiles.html index d9410d9..3f1c534 100644 --- a/webapp/templates/_imaging_tiles.html +++ b/webapp/templates/_imaging_tiles.html @@ -200,9 +200,9 @@ {% endif %} {% if s.log_tail %} -
+
{% if is_inferred %}Evidence{% else %}Log tail{% endif %} ({{ s.log_tail | length }} line{{ 's' if s.log_tail | length != 1 }}) -
{% for line in s.log_tail %}{{ line }}
+        
{% for line in s.log_tail %}{{ line }}
 {% endfor %}
{% endif %} diff --git a/webapp/templates/imaging.html b/webapp/templates/imaging.html index cdf8a9a..ec82e6d 100644 --- a/webapp/templates/imaging.html +++ b/webapp/templates/imaging.html @@ -321,14 +321,18 @@ document.addEventListener('keydown', function(e) { // it replaces the innerHTML of #imaging-tiles. (function() { var EXPANDED_KEY = 'imaging-expanded'; - function loadExpandedSet() { - try { return new Set(JSON.parse(localStorage.getItem(EXPANDED_KEY) || '[]')); } + var LOG_EXPANDED_KEY = 'imaging-log-expanded'; + function loadExpandedSet(key) { + try { return new Set(JSON.parse(localStorage.getItem(key || EXPANDED_KEY) || '[]')); } catch (e) { return new Set(); } } - function saveExpandedSet(set) { - try { localStorage.setItem(EXPANDED_KEY, JSON.stringify(Array.from(set))); } + function saveExpandedSet(set, key) { + try { localStorage.setItem(key || EXPANDED_KEY, JSON.stringify(Array.from(set))); } catch (e) {} } + // Log-tail scroll per tile, in memory only. A tile followed at the + // bottom keeps following new lines; one scrolled up stays put. + var logScroll = {}; function restoreExpandedState() { var expanded = loadExpandedSet(); @@ -344,6 +348,32 @@ document.addEventListener('keydown', function(e) { card._toggleBound = true; } }); + // The nested "Log tail"
is re-rendered closed on every + // refresh; keep it open (and its scroll) the same way as the tile. + var logExpanded = loadExpandedSet(LOG_EXPANDED_KEY); + document.querySelectorAll('.imaging-log').forEach(function(log) { + var key = log.getAttribute('data-key'); + if (!key) return; + if (logExpanded.has(key)) log.open = true; + var pre = log.querySelector('.imaging-log-pre'); + if (pre) { + var saved = logScroll[key]; + if (!saved || saved.atBottom) pre.scrollTop = pre.scrollHeight; + else pre.scrollTop = saved.top; + pre.addEventListener('scroll', function() { + logScroll[key] = { + top: pre.scrollTop, + atBottom: pre.scrollTop + pre.clientHeight >= pre.scrollHeight - 4 + }; + }); + } + log.addEventListener('toggle', function() { + var s = loadExpandedSet(LOG_EXPANDED_KEY); + if (log.open) s.add(key); else s.delete(key); + saveExpandedSet(s, LOG_EXPANDED_KEY); + if (log.open && pre) pre.scrollTop = pre.scrollHeight; + }); + }); } function autoRenderLapsQRs() {