From 35cc4bfc96f8f2fed62ef46d48acd20728631388 Mon Sep 17 00:00:00 2001 From: you Date: Sun, 3 May 2026 03:43:25 +0000 Subject: [PATCH] fix(packets): preserve scroll position on filter change + group expand/collapse (#431) Save scrollTop from #pktLeft before re-render, restore after DOM rebuild. Covers both the empty-results path (tbody.innerHTML) and the virtual-scroll path (renderVisibleRows). Fix lines: packets.js ~1748-1749 (save), ~1821 (restore empty path), ~1840 (restore normal path). --- public/packets.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/packets.js b/public/packets.js index 1582fcaf..a0c4fdeb 100644 --- a/public/packets.js +++ b/public/packets.js @@ -1743,6 +1743,10 @@ const tbody = document.getElementById('pktBody'); if (!tbody) return; + // Preserve scroll position across re-render (#431) + const scrollContainer = document.getElementById('pktLeft'); + const savedScrollTop = scrollContainer ? scrollContainer.scrollTop : 0; + // Update dynamic parts of the header const countEl = document.querySelector('#pktLeft .count'); const groupBtn = document.getElementById('fGroup'); @@ -1812,6 +1816,8 @@ detachVScrollListener(); const colCount = _getColCount(); tbody.innerHTML = '' + (filters.myNodes ? 'No packets from your claimed/favorited nodes' : 'No packets found') + ''; + // Restore scroll position after DOM rebuild (#431) + if (scrollContainer) scrollContainer.scrollTop = savedScrollTop; return; } @@ -1829,6 +1835,9 @@ attachVScrollListener(); renderVisibleRows(); + + // Restore scroll position after re-render (#431) + if (scrollContainer) scrollContainer.scrollTop = savedScrollTop; } function getDetailPreview(decoded) {