From cd1a9c58e6e769ab3027500e0b5afaf9e1f9dc2a Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 6 Feb 2025 17:01:34 -0500 Subject: [PATCH] ui log scroll to bottom Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 1 + javascript/logger.js | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f49aebfa3..4944c97fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - force browser cache-invalidate on page load - use correct timezone for log display - improve settings search behavior + - log scroll to bottom ## Update for 2025-02-05 diff --git a/javascript/logger.js b/javascript/logger.js index 08baf1165..111899005 100644 --- a/javascript/logger.js +++ b/javascript/logger.js @@ -1,23 +1,37 @@ const timeout = 30000; +const scrollBottom = async (el) => { + const lastChild = el.lastElementChild; + if (lastChild) lastChild.scrollIntoView({ behavior: 'smooth' }); +}; + const log = async (...msg) => { const dt = new Date(); const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`; - if (window.logger) window.logger.innerHTML += window.logPrettyPrint(...msg); + if (window.logger) { + window.logger.innerHTML += window.logPrettyPrint(...msg); + scrollBottom(window.logger); + } console.log(ts, ...msg); // eslint-disable-line no-console }; const debug = async (...msg) => { const dt = new Date(); const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`; - if (window.logger) window.logger.innerHTML += window.logPrettyPrint(...msg); + if (window.logger) { + window.logger.innerHTML += window.logPrettyPrint(...msg); + scrollBottom(window.logger); + } console.debug(ts, ...msg); // eslint-disable-line no-console }; const error = async (...msg) => { const dt = new Date(); const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`; - if (window.logger) window.logger.innerHTML += window.logPrettyPrint(...msg); + if (window.logger) { + window.logger.innerHTML += window.logPrettyPrint(...msg); + scrollBottom(window.logger); + } console.error(ts, ...msg); // eslint-disable-line no-console // const txt = msg.join(' '); // if (!txt.includes('asctime') && !txt.includes('xhr.')) xhrPost('/sdapi/v1/log', { error: txt }); // eslint-disable-line no-use-before-define