From 99422d8cfc44d7a5f09708b0f97607405c2aacc8 Mon Sep 17 00:00:00 2001 From: Pierre Gironde Date: Sun, 4 Oct 2026 13:12:14 +0200 Subject: [PATCH] added a scrollbox for each app logs --- vscode-appdaemon/media/logExplorer.css | 1 + vscode-appdaemon/media/logExplorer.js | 25 +++++++++++++-- vscode-appdaemon/tests/logUi.test.js | 32 ++++++++++++++++++- vscode-appdaemon/vscode-appdaemon-0.2.0.vsix | Bin 58649 -> 58892 bytes 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/vscode-appdaemon/media/logExplorer.css b/vscode-appdaemon/media/logExplorer.css index b767e2b..cc804bc 100644 --- a/vscode-appdaemon/media/logExplorer.css +++ b/vscode-appdaemon/media/logExplorer.css @@ -12,3 +12,4 @@ .last-log{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} summary{display:grid;grid-template-columns:auto minmax(0,1fr) repeat(3,max-content);align-items:center;column-gap:10px;row-gap:5px} summary .last-log{grid-column:1/-1;min-width:0} +.rows{max-height:min(45vh,420px);overflow-y:auto;scrollbar-gutter:stable;overflow-anchor:none} diff --git a/vscode-appdaemon/media/logExplorer.js b/vscode-appdaemon/media/logExplorer.js index aaab556..1089fc4 100644 --- a/vscode-appdaemon/media/logExplorer.js +++ b/vscode-appdaemon/media/logExplorer.js @@ -16,6 +16,7 @@ let entries = [], latest, appliedMessage, displayZone = 'Europe/Berlin', paused = false, selected = saved.selected, mode = saved.mode || 'graph', origin = saved.origin || saved.selected; const expanded = new Set(saved.expanded || []); const visibleEventGroups = new Map(); + const logScrollPositions = new Map(); const recentEvents = new Set(); const recentApps = new Set(); const appFlashTokens = new Map(); @@ -138,6 +139,16 @@ }); } function renderApps() { + const appList = $('apps').parentElement; + const appListTop = appList.scrollTop; + document.querySelectorAll('#apps details[data-app]').forEach(detail => { + const rows = detail.querySelector('.rows'); + if (!rows) return; + logScrollPositions.set(detail.dataset.app, { + top: rows.scrollTop, + follow: rows.scrollHeight - rows.clientHeight - rows.scrollTop <= 24 + }); + }); visibleEventGroups.clear(); const container = $('apps'); container.replaceChildren(); const groups = new Map(); @@ -195,15 +206,23 @@ ? (entries.find(e => e.app === app && e.initialization_id === unit.id && e.kind === 'initialization_started') || unit.entries[0]).time : unit.entries[0].time; units.sort((a, b) => startTime(a) - startTime(b)); + if (units.length > 150) rows.append(node('div', `${units.length - 150} older rows/groups: narrow the time range or search.`, 'more')); units.slice(-150).forEach(unit => { appendEventRows(rows, unit.entries, unit.id ? `initialization:${unit.id}` : undefined); }); - if (units.length > 150) rows.append(node('div', `${units.length - 150} older rows/groups: narrow the time range or search.`, 'more')); detail.append(rows); + const position = logScrollPositions.get(app); + rows.scrollTop = !position || position.follow ? rows.scrollHeight : position.top; } - detail.addEventListener('toggle', event => { if (event.target !== detail) return; detail.open ? expanded.add(app) : expanded.delete(app); save(); fill(); }); - fill(); container.append(detail); + detail.addEventListener('toggle', event => { + if (event.target !== detail) return; + if (detail.open) expanded.add(app); + else { expanded.delete(app); logScrollPositions.delete(app); } + save(); fill(); + }); + container.append(detail); fill(); }); + appList.scrollTop = appListTop; } function renderDetail() { $('graph-mode').setAttribute('aria-pressed', String(mode === 'graph')); diff --git a/vscode-appdaemon/tests/logUi.test.js b/vscode-appdaemon/tests/logUi.test.js index b029020..dd1ef70 100644 --- a/vscode-appdaemon/tests/logUi.test.js +++ b/vscode-appdaemon/tests/logUi.test.js @@ -25,7 +25,8 @@ test('English interface, latest timestamps, sorting and separate initialization assert.match(d.querySelector('[data-app="alpha"] .last-age').title,/10:00:10/); assert.match(d.querySelector('[data-app="alpha"] summary .last-log').textContent,/ : Température déjà disponible$/); const summary=d.querySelector('[data-app="alpha"] summary'); - assert.deepEqual([...summary.children].map(child=>child.className),['app-label','badge INFO','badge WARNING','badge ERROR','last-log']); + assert.deepEqual([...summary.children].slice(0,4).map(child=>child.className),['app-label','badge INFO','badge WARNING','badge ERROR']); + assert.ok(summary.children[4].classList.contains('last-log')); assert.equal(summary.querySelector('.app-label .last-log'),null); d.getElementById('sort').value='oldest';d.getElementById('sort').dispatchEvent(new dom.window.Event('input')); assert.equal(d.querySelector('[data-app]').dataset.app,'alpha'); @@ -122,6 +123,35 @@ test('pulses an app when a new log arrives and refreshes its last-log age',async dom.window.close(); }); +test('expanded logs follow new events at the bottom and keep position while reading history',async()=>{ + const {dom,d,entries,send}=setup(); + Object.defineProperty(dom.window.HTMLElement.prototype,'scrollHeight',{configurable:true,get(){return this.classList.contains('rows') ? this.children.length*100 : 0;}}); + Object.defineProperty(dom.window.HTMLElement.prototype,'clientHeight',{configurable:true,get(){return this.classList.contains('rows') ? 100 : 0;}}); + const app=d.querySelector('[data-app="alpha"]');app.open=true;app.dispatchEvent(new dom.window.Event('toggle')); + const rows=()=>d.querySelector('[data-app="alpha"] .rows'); + assert.equal(rows().scrollTop,rows().scrollHeight); + const first={...entries[3],event_id:'new-tail',time:entries[3].time+1000,message:'Newest'}; + send([...entries,first]); + assert.equal(rows().scrollTop,rows().scrollHeight); + rows().scrollTop=20; + const second={...entries[3],event_id:'new-tail-2',time:entries[3].time+2000,message:'Newer'}; + send([...entries,first,second]); + assert.equal(rows().scrollTop,20); + assert.match(rows().textContent,/Newer/); + dom.window.close(); +}); + +test('the newest log stays at the bottom when older groups are omitted',()=>{ + const {dom,d,entries,send}=setup(); + const base=entries[3]; + send(Array.from({length:152},(_,index)=>({...base,event_id:`event-${index}`,time:base.time+index*1000,message:`Message ${index}`}))); + const app=d.querySelector('[data-app="alpha"]');app.open=true;app.dispatchEvent(new dom.window.Event('toggle')); + const rows=app.querySelector('.rows'); + assert.ok(rows.firstElementChild.classList.contains('more')); + assert.match(rows.lastElementChild.textContent,/Message 151/); + dom.window.close(); +}); + test('distinguishes log lines from supplemental records when configured',()=>{ const {dom,d,entries,send}=setup(); const trace={...entries[3],event_id:'trace-evaluation',kind:'evaluation',message:'Condition was evaluated'}; diff --git a/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix b/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix index f27ab5ece859745a22303514ad17e9524beef4cb..dc730f698a49bca0479cf53284e92303e5fd7033 100644 GIT binary patch delta 10736 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 delta 10523 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