From 6c345ccf8103f52342a7cef389b1b64bff70a35d Mon Sep 17 00:00:00 2001 From: Pierre Gironde Date: Sun, 4 Oct 2026 12:54:31 +0200 Subject: [PATCH] added last log preview --- vscode-appdaemon/media/logExplorer.css | 4 +++ vscode-appdaemon/media/logExplorer.js | 29 +++++++++++++++---- vscode-appdaemon/tests/logUi.test.js | 10 +++++-- vscode-appdaemon/vscode-appdaemon-0.2.0.vsix | Bin 58440 -> 58649 bytes 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/vscode-appdaemon/media/logExplorer.css b/vscode-appdaemon/media/logExplorer.css index fc97ca9..b767e2b 100644 --- a/vscode-appdaemon/media/logExplorer.css +++ b/vscode-appdaemon/media/logExplorer.css @@ -8,3 +8,7 @@ .block-title{font-weight:600;margin-bottom:6px;color:var(--fg);overflow-wrap:anywhere} #error-count{font-weight:700;font-size:14px}#error-count.has-errors{color:var(--vscode-editorError-foreground,#ffacac);border-color:currentColor;background:var(--vscode-inputValidation-errorBackground,#5b3039)} + +.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} diff --git a/vscode-appdaemon/media/logExplorer.js b/vscode-appdaemon/media/logExplorer.js index 0503954..aaab556 100644 --- a/vscode-appdaemon/media/logExplorer.js +++ b/vscode-appdaemon/media/logExplorer.js @@ -56,6 +56,19 @@ const years = Math.floor(days / 365); return `${years} year${years === 1 ? '' : 's'} ago`; } + function shortTimeSince(time) { + const seconds = Math.max(0, Math.floor((Date.now() - Number(time)) / 1000)); + if (seconds < 60) return `${seconds} sec ago`; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes} min ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours} hr ago`; + const days = Math.floor(hours / 24); + if (days < 30) return `${days} d ago`; + const months = Math.floor(days / 30); + if (days < 365) return `${months} mo ago`; + return `${Math.floor(days / 365)} yr ago`; + } function copy(text) { if (text) vscode.postMessage({ type: 'copy', text }); } function logMessages(items, cls) { const container = node('div', undefined, cls); @@ -133,7 +146,7 @@ if (!groups.size) container.append(node('div', 'No logs match these filters. Try a wider time range or clear the search.', 'empty')); const lastLogs = new Map(); entries.filter(e => e.kind === 'log' || e.kind.startsWith('initialization_')).forEach(e => { - if (!lastLogs.has(e.app) || e.time > lastLogs.get(e.app).time) lastLogs.set(e.app, e); + if (!lastLogs.has(e.app) || e.time >= lastLogs.get(e.app).time) lastLogs.set(e.app, e); }); const timeOf = (app, logs) => (lastLogs.get(app) || logs[logs.length - 1]).time; $('error-count').setAttribute('aria-pressed', String($('level').value === 'ERROR')); @@ -146,15 +159,21 @@ if (recentApps.has(app)) detail.classList.add('new-log-app'); const summary = node('summary'), label = node('div', undefined, 'app-label'); const last = lastLogs.get(app); + let preview; label.append(node('span', app, 'name')); if (last) { - const age = node('span', `Last log: ${timeSince(last.time)}`, 'last-log last-age'); + const line = node('span', undefined, `last-log log-message level-${normalLevel(last)}`); + const age = node('span', shortTimeSince(last.time), 'last-age'); age.dataset.time = String(last.time); age.title = `${formatTime(last, true)} · Exact: ${last.timestamp}`; - label.append(age); - } else label.append(node('span', 'No log in loaded history', 'last-log')); + const message = cleanMessage(last); + line.title = message; + line.append(age, document.createTextNode(' : '), node('span', message.split(/\r?\n/, 1)[0].trim() || '—', 'last-message')); + preview = line; + } else preview = node('span', 'No log in loaded history', 'last-log'); summary.append(label); ['INFO', 'WARNING', 'ERROR'].forEach(level => summary.append(node('span', `${level} ${logs.filter(e => normalLevel(e) === level).length}`, `badge ${level}`))); + summary.append(preview); detail.append(summary); function fill() { detail.querySelector('.rows')?.remove(); @@ -332,7 +351,7 @@ $('warnings').textContent = (message.warnings || []).join(' · '); renderApps(); renderDetail(); } function refreshLastLogAges() { - document.querySelectorAll('.last-age[data-time]').forEach(label => { label.textContent = `Last log: ${timeSince(label.dataset.time)}`; }); + document.querySelectorAll('.last-age[data-time]').forEach(label => { label.textContent = shortTimeSince(label.dataset.time); }); document.querySelectorAll('.relative-time[data-time]').forEach(label => { label.textContent = timeSince(label.dataset.time); }); } setInterval(refreshLastLogAges, 1000); diff --git a/vscode-appdaemon/tests/logUi.test.js b/vscode-appdaemon/tests/logUi.test.js index 950d902..b029020 100644 --- a/vscode-appdaemon/tests/logUi.test.js +++ b/vscode-appdaemon/tests/logUi.test.js @@ -23,6 +23,10 @@ test('English interface, latest timestamps, sorting and separate initialization assert.equal(d.getElementById('copy').textContent,'Copy selected log'); assert.deepEqual([...d.querySelectorAll('[data-app]')].map(e=>e.dataset.app),['beta','alpha']); 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.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'); const alpha=d.querySelector('[data-app="alpha"]');alpha.open=true;alpha.dispatchEvent(new dom.window.Event('toggle')); @@ -109,10 +113,12 @@ test('pulses an app when a new log arrives and refreshes its last-log age',async assert.ok(app.classList.contains('new-log-app')); app.open=true;app.dispatchEvent(new dom.window.Event('toggle')); assert.ok(app.querySelector('.recent-log')); - assert.equal(app.querySelector('.last-age').textContent,'Last log: 1 second ago'); + assert.equal(app.querySelector('.last-age').textContent,'1 sec ago'); + assert.equal(app.querySelector('summary .last-log').textContent,'1 sec ago : Fresh log'); dom.window.Date.now=()=>nextTime+65000; await new Promise(resolve=>setTimeout(resolve,1100)); - assert.equal(app.querySelector('.last-age').textContent,'Last log: 1 minute ago'); + assert.equal(app.querySelector('.last-age').textContent,'1 min ago'); + assert.equal(app.querySelector('summary .last-log').textContent,'1 min ago : Fresh log'); dom.window.close(); }); diff --git a/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix b/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix index 4002bd389223de258abe530e1b65910420bdc08e..f27ab5ece859745a22303514ad17e9524beef4cb 100644 GIT binary patch delta 10460 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∈;DKNu?RY@w4gx@M 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