From 3b0c24e79559d98c79936e568b24d59998daaac8 Mon Sep 17 00:00:00 2001 From: Pierre Gironde Date: Fri, 16 Oct 2026 08:49:12 +0200 Subject: [PATCH] display proper time stamp on log message --- vscode-appdaemon/media/logExplorer.js | 4 ++-- vscode-appdaemon/tests/logUi.test.js | 4 +++- vscode-appdaemon/vscode-appdaemon-0.2.0.vsix | Bin 55823 -> 56685 bytes 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/vscode-appdaemon/media/logExplorer.js b/vscode-appdaemon/media/logExplorer.js index ff22749..039845b 100644 --- a/vscode-appdaemon/media/logExplorer.js +++ b/vscode-appdaemon/media/logExplorer.js @@ -84,7 +84,7 @@ const relative = node('span', timeSince(e.time), 'relative-time'); relative.dataset.time = String(e.time); relative.title = `${formatTime(e, true)} · Exact: ${e.timestamp}`; - meta.append(relative, node('span', e.level, `badge ${normalLevel(e)}`)); + meta.append(node('span', e.timestamp, 'exact-time'), relative, node('span', e.level, `badge ${normalLevel(e)}`)); if (e.cause_ids.length) meta.append(node('span', 'View causes ↗', 'link-hint')); item.append(blockTitle([e]), meta, logMessages([e], 'row-message')); item.onclick = () => { if (!window.getSelection()?.toString()) choose(e.event_id); }; @@ -115,7 +115,7 @@ const relative = node('span', timeSince(unit.entries[0].time), 'relative-time'); relative.dataset.time = String(unit.entries[0].time); relative.title = `${formatTime(unit.entries[0], true)} · Exact: ${unit.entries[0].timestamp}`; - meta.append(relative); + meta.append(node('span', unit.entries[0].timestamp, 'exact-time'), relative); for (const level of ['INFO', 'WARNING', 'ERROR']) { const count = unit.entries.filter(e => normalLevel(e) === level).length; if (count) meta.append(node('span', count === 1 ? level : `${level} ${count}`, `badge ${level}`)); diff --git a/vscode-appdaemon/tests/logUi.test.js b/vscode-appdaemon/tests/logUi.test.js index 228d159..0f7b67d 100644 --- a/vscode-appdaemon/tests/logUi.test.js +++ b/vscode-appdaemon/tests/logUi.test.js @@ -88,6 +88,7 @@ test('shows same-event log lines together with one causes link and keeps newer e const alpha=d.querySelector('[data-app="alpha"]');alpha.open=true;alpha.dispatchEvent(new dom.window.Event('toggle')); const rows=alpha.querySelector('.rows'),combined=rows.children[0]; assert.ok(combined.classList.contains('event-log-group')); + assert.equal(combined.querySelector('.exact-time').textContent,trigger.timestamp); assert.match(combined.querySelector('.row-message').textContent,/Callback trigger by sensor.kitchen_last_motion/); assert.match(combined.querySelector('.row-message').textContent,/Triggered by \(sensor.kitchen_last_motion/); assert.equal(combined.querySelectorAll('.link-hint').length,1); @@ -172,7 +173,7 @@ test('distinguishes log lines from supplemental records when configured',()=>{ dom.window.close(); }); -test('shows and refreshes relative time on each log entry while retaining exact time on hover',async()=>{ +test('shows and refreshes relative time on each log entry while displaying exact time alongside it',async()=>{ const {dom,d,entries}=setup(); const entry=entries.find(e=>e.event_id==='a'); dom.window.Date.now=()=>entry.time+120000; @@ -182,6 +183,7 @@ test('shows and refreshes relative time on each log entry while retaining exact const row=[...d.querySelectorAll('[data-app="alpha"] .row')].find(item=>item.textContent.includes('Température déjà disponible')); const relativeTime=()=>[...app.querySelectorAll('.row')].find(item=>item.textContent.includes('Température déjà disponible')).querySelector('.relative-time'); assert.equal(relativeTime().textContent,'2 minutes ago'); + assert.equal(relativeTime().previousElementSibling.textContent,entries[3].timestamp); assert.match(relativeTime().title,/10:00:10/); dom.window.Date.now=()=>entry.time+3600000; await new Promise(resolve=>setTimeout(resolve,1600)); diff --git a/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix b/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix index a033bcc8ee0d941a6596dd19aa9734b672e40d55..e2cdbf6980452c589c78c1644adc9c4a6b114773 100644 GIT binary patch delta 7824 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 delta 6986 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 Gwfi3kjoGLG