diff --git a/hbd/server/templates/live.html b/hbd/server/templates/live.html index d9fc0ea..ceeacdb 100644 --- a/hbd/server/templates/live.html +++ b/hbd/server/templates/live.html @@ -201,6 +201,43 @@ .log-recover .log-level { color: #2a7a2a; } .log-info .log-level { color: #555; } + .log-section-header { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + margin-bottom: 10px; + background: white; + border-radius: 6px; + box-shadow: 0 1px 4px rgba(0,0,0,0.1); + padding: 8px 15px; + } + + .log-section-title { + font-size: 1.2em; + font-weight: bold; + color: #333; + white-space: nowrap; + } + + .log-filter-bar { + display: flex; + gap: 6px; + align-items: center; + flex-wrap: wrap; + } + + .log-filter-bar input[type="text"], + .log-filter-bar select { + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 0.85em; + color: #333; + } + + .log-filter-bar input[type="text"] { width: 110px; } + /* Modal for connection status messages */ .connection-modal { display: none; @@ -445,6 +482,22 @@ updateRowAlert(name_idx[data.name], data); } + function applyLogFilters() { + var hostFilter = document.getElementById('filter-host').value.toLowerCase().trim(); + var levelFilter = document.getElementById('filter-level').value; + var msgFilter = document.getElementById('filter-msg').value.toLowerCase().trim(); + document.querySelectorAll('#messages .log-entry').forEach(function(entry) { + var show = true; + if (hostFilter && !(entry.dataset.host || '').toLowerCase().includes(hostFilter)) show = false; + if (levelFilter && entry.dataset.level !== levelFilter) show = false; + if (msgFilter) { + var msgEl = entry.querySelector('.log-msg'); + if (!msgEl || !msgEl.textContent.toLowerCase().includes(msgFilter)) show = false; + } + entry.style.display = show ? '' : 'none'; + }); + } + function WS_Connect() { if ("WebSocket" in window) { //N.B: subprotocol field causes chrome to error 1006 @@ -479,7 +532,8 @@ var ts_str = _d.getFullYear() + '-' + _p(_d.getMonth()+1) + '-' + _p(_d.getDate()) + ' ' + _p(_d.getHours()) + ':' + _p(_d.getMinutes()) + ':' + _p(_d.getSeconds()); var lvl = (msg.level || "INFO").toLowerCase(); - var html = '
'; + var hostVal = msg.host || ''; + var html = '
'; html += '' + ts_str + ''; html += '' + (msg.level || "") + ''; if (msg.host) html += '' + msg.host + ''; @@ -487,6 +541,7 @@ html += '' + msg.message + ''; html += '
'; msgs.insertAdjacentHTML("afterbegin", html); + applyLogFilters(); } cnt++; }; @@ -575,7 +630,20 @@
-

Log of Events

+
+ Log of Events +
+ + + +
+
@@ -591,6 +659,9 @@