From caf905186455947c829739751637c67859bfb83e Mon Sep 17 00:00:00 2001 From: Pierre Gironde Date: Sun, 4 Oct 2026 20:01:17 +0200 Subject: [PATCH] added a warning button --- vscode-appdaemon/media/logExplorer.css | 2 +- vscode-appdaemon/media/logExplorer.html | 2 +- vscode-appdaemon/media/logExplorer.js | 35 ++++++++++++------- vscode-appdaemon/vscode-appdaemon-0.2.0.vsix | Bin 55470 -> 55621 bytes 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/vscode-appdaemon/media/logExplorer.css b/vscode-appdaemon/media/logExplorer.css index 8f58d02..7ed7e7d 100644 --- a/vscode-appdaemon/media/logExplorer.css +++ b/vscode-appdaemon/media/logExplorer.css @@ -7,7 +7,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)} +#error-count,#warning-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)}#warning-count.has-warnings{color:var(--vscode-editorWarning-foreground,#f3cd80);border-color:currentColor;background:var(--vscode-inputValidation-warningBackground,#594925)} .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} diff --git a/vscode-appdaemon/media/logExplorer.html b/vscode-appdaemon/media/logExplorer.html index 36d78e8..00a5fe3 100644 --- a/vscode-appdaemon/media/logExplorer.html +++ b/vscode-appdaemon/media/logExplorer.html @@ -3,7 +3,7 @@ AppDaemon · Logs -

AppDaemon Logs

Reading logs…

+

AppDaemon Logs

Reading logs…

Applications

Log details

Select a log to view its details.

The base AppDaemon log format does not include causal links.

diff --git a/vscode-appdaemon/media/logExplorer.js b/vscode-appdaemon/media/logExplorer.js index 9121205..ff22749 100644 --- a/vscode-appdaemon/media/logExplorer.js +++ b/vscode-appdaemon/media/logExplorer.js @@ -13,7 +13,8 @@ const appFlashTokens = new Map(); let receivedInitialData = false; let pointerSelecting = false; - let errorView; + let countView; + let activeCountLevel; const $ = id => document.getElementById(id); const node = (tag, text, cls) => { const e = document.createElement(tag); if (text !== undefined) e.textContent = text; if (cls) e.className = cls; return e; }; const normalLevel = e => e.level === 'CRITICAL' ? 'ERROR' : e.level; @@ -149,6 +150,7 @@ }); const timeOf = (app, logs) => (lastLogs.get(app) || logs[logs.length - 1]).time; $('error-count').setAttribute('aria-pressed', String($('level').value === 'ERROR')); + $('warning-count').setAttribute('aria-pressed', String($('level').value === 'WARNING')); [...groups].sort(([a, al], [b, bl]) => { const order = $('sort').value; if (order === 'name') return a.localeCompare(b); @@ -363,6 +365,10 @@ $('error-count').textContent = `${errorCount} error${errorCount === 1 ? '' : 's'}`; $('error-count').classList.toggle('has-errors', errorCount > 0); $('error-count').title = 'Errors and critical logs across all apps in loaded history. Click to show them.'; + const warningCount = entries.filter(e => (e.kind === 'log' || e.kind.startsWith('initialization_')) && normalLevel(e) === 'WARNING').length; + $('warning-count').textContent = `${warningCount} warning${warningCount === 1 ? '' : 's'}`; + $('warning-count').classList.toggle('has-warnings', warningCount > 0); + $('warning-count').title = 'Warnings across all apps in loaded history. Click to show them.'; $('warnings').textContent = (message.warnings || []).join(' · '); renderApps(); renderDetail(); } function refreshLastLogAges() { @@ -387,21 +393,22 @@ document.addEventListener('pointerup', () => { pointerSelecting = false; }); document.addEventListener('selectionchange', () => { if (!selectionActive() && latest && latest !== appliedMessage) setTimeout(() => { if (!selectionActive() && latest !== appliedMessage) apply(latest); }, 0); }); ['search', 'period', 'level', 'sort'].forEach(id => $(id).addEventListener('input', () => { - errorView = undefined; selected = undefined; origin = undefined; + countView = undefined; activeCountLevel = undefined; selected = undefined; origin = undefined; save(); renderApps(); renderDetail(); })); - $('error-count').onclick = () => { - const leaving = $('level').value === 'ERROR'; + function toggleCountView(level) { + const leaving = activeCountLevel === level; if (leaving) { - $('search').value = errorView?.search || ''; - $('period').value = errorView?.period || '0'; - $('level').value = errorView?.level || 'all'; - if (errorView) { expanded.clear(); errorView.expanded.forEach(app => expanded.add(app)); } - errorView = undefined; + $('search').value = countView?.search || ''; + $('period').value = countView?.period || '0'; + $('level').value = countView?.level || 'all'; + if (countView) { expanded.clear(); countView.expanded.forEach(app => expanded.add(app)); } + countView = undefined; activeCountLevel = undefined; } else { - errorView = { search: $('search').value, period: $('period').value, level: $('level').value, expanded: [...expanded] }; - $('search').value = ''; $('period').value = '0'; $('level').value = 'ERROR'; - entries.filter(e => normalLevel(e) === 'ERROR').forEach(e => expanded.add(e.app)); + if (!activeCountLevel) countView = { search: $('search').value, period: $('period').value, level: $('level').value, expanded: [...expanded] }; + activeCountLevel = level; + $('search').value = ''; $('period').value = '0'; $('level').value = level; + entries.filter(e => normalLevel(e) === level).forEach(e => expanded.add(e.app)); } selected = undefined; origin = undefined; save(); renderApps(); renderDetail(); @@ -409,7 +416,9 @@ const first = document.querySelector('#apps .row'); if (first) { first.click(); first.closest('.rows').scrollTop = 0; first.focus({ preventScroll: true }); } } - }; + } + $('error-count').onclick = () => toggleCountView('ERROR'); + $('warning-count').onclick = () => toggleCountView('WARNING'); $('clear').onclick = () => { selected = undefined; origin = undefined; save(); $('clear').disabled = true; $('clear').textContent = 'Clearing…'; vscode.postMessage({ type: 'clear' }); }; $('graph-mode').onclick = () => { mode = 'graph'; save(); renderDetail(); }; $('tree-mode').onclick = () => { mode = 'tree'; save(); renderDetail(); }; diff --git a/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix b/vscode-appdaemon/vscode-appdaemon-0.2.0.vsix index 4332377af78041b7a8cea108fd5d5af94e92a036..65755590bc5b094a683baeb683db836c2fad60cd 100644 GIT binary patch delta 12003 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
a%zPa#O0+PS5@lr?Wiw5buVH(a;U|wWy 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 delta 11853 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