diff --git a/renderer/app.js b/renderer/app.js index 4216db7..d620b5c 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -1177,7 +1177,7 @@ let _recentRenderQueued = false; function scheduleRecentRender() { if (_recentRenderQueued) return; _recentRenderQueued = true; - requestAnimationFrame(() => { _recentRenderQueued = false; renderRecentUploadsPanel(); }); + requestAnimationFrame(() => { _recentRenderQueued = false; renderRecentUploadsPanel(true); }); } // Toggle the .selected class on existing rows without rebuilding the table. @@ -2768,6 +2768,7 @@ function maybeAddSessionFile(job) { }); _recentDataVersion++; _sessionDoneCount++; + _recentPendingAppends++; // Drop oldest entries past the cap to keep render cost bounded. // Without this, sessionFilesData grows unbounded across the session // and every renderRecentUploadsPanel call becomes a megabyte-sized @@ -4672,10 +4673,13 @@ function _buildRecentRowHtml(row) { // accumulating new uploads (the default case: sort=date desc, rows only grow). let _recentLastRenderedSig = ''; let _recentLastRenderedLen = 0; +let _recentPendingAppends = 0; -function renderRecentUploadsPanel() { +function renderRecentUploadsPanel(appendOnly = false) { const tbody = document.getElementById('recentFilesBody'); if (!tbody) return; + const pendingAppends = _recentPendingAppends; + _recentPendingAppends = 0; if (!sessionFilesData.length) { tbody.innerHTML = 'Noch keine Uploads in dieser Session.'; _recentLastRenderedSig = ''; @@ -4685,9 +4689,10 @@ function renderRecentUploadsPanel() { const rows = sortRecentFiles(sessionFilesData); const sig = `${recentSortState.key}|${recentSortState.direction}`; - const dateDescAppendOnly = sig === 'date|desc' + const dateDescAppendOnly = appendOnly + && pendingAppends > 0 + && sig === 'date|desc' && _recentLastRenderedSig === sig - && rows.length > _recentLastRenderedLen && tbody.querySelectorAll('.recent-file-row').length === _recentLastRenderedLen; const wrap = tbody.closest('.recent-files-table-wrap'); @@ -4695,10 +4700,17 @@ function renderRecentUploadsPanel() { let wasAppendOnly = false; if (dateDescAppendOnly) { - const added = rows.length - _recentLastRenderedLen; + const added = Math.min(pendingAppends, rows.length); let html = ''; for (let i = 0; i < added; i++) html += _buildRecentRowHtml(rows[i]); tbody.insertAdjacentHTML('afterbegin', html); + let evict = (_recentLastRenderedLen + added) - rows.length; + while (evict > 0) { + const last = tbody.lastElementChild; + if (!last) break; + last.remove(); + evict--; + } wasAppendOnly = true; } else { tbody.innerHTML = rows.map(_buildRecentRowHtml).join('');