From 4eb80f603daa62be08fea5c5dfeefd8fae3ff512 Mon Sep 17 00:00:00 2001 From: fds2610-bot Date: Thu, 1 Oct 2026 07:28:16 +0200 Subject: [PATCH] Eventanzeige: Events im Modal auf den aktuellen Tag filtern Das Event-Modal zeigte bisher die volle vom Server gelieferte Liste (bis zu 200 Events) ungefiltert an und war dadurch schnell unuebersichtlich. filterEventsForToday() schraenkt die Anzeige auf Events des aktuellen Kalendertags (lokale Zeitzone, wie formatEventTime()) ein. Schliesst #100 Co-Authored-By: Claude Sonnet 5 --- html/js/office-render.js | 3 ++- html/js/office-scene.js | 26 +++++++++++++++++++++++++- tests/frontend/office-scene.test.js | 23 +++++++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/html/js/office-render.js b/html/js/office-render.js index f8e94d1..a875d6b 100644 --- a/html/js/office-render.js +++ b/html/js/office-render.js @@ -23,6 +23,7 @@ import { formatEventLineText, truncateToWidth, buildEventModalContent, + filterEventsForToday, buildSystemModalContent, buildKpiTiles, buildKpiModalContent, @@ -2386,7 +2387,7 @@ export function renderOfficeScene(container, data = {}) { } const wallGroup = renderMonitorWall(systems, events, displayKpis, { - onEventsClick: () => openModal(buildEventModalContent(events), renderEventModalBody), + onEventsClick: () => openModal(buildEventModalContent(filterEventsForToday(events)), renderEventModalBody), onSystemsClick: () => openModal(buildSystemModalContent(systems), renderSystemModalBody), // Issue #70: die aktuell gezeigten Systeme wandern mit ins Modal - daran erkennt es, // welche Kacheln zu keinem konfigurierten Host mehr gehoeren. diff --git a/html/js/office-scene.js b/html/js/office-scene.js index df6c6b7..928f4c2 100644 --- a/html/js/office-scene.js +++ b/html/js/office-scene.js @@ -335,7 +335,31 @@ export function truncateToWidth(value, availableWidth, charWidth = EVENT_LINE_CH } /** - * Inhaltsmodell fuer das Event-Monitor-Modal: volle Liste (kein MAX_EVENT_LINES-Limit). + * Filtert Events auf den aktuellen Kalendertag (Issue #100: die volle Eventliste im Modal + * lief sonst unbegrenzt zurueck und wurde dadurch unuebersichtlich lang). "Aktueller Tag" + * meint wie bei formatEventTime() die lokale Zeitzone des Browsers (F16), nicht UTC. + * + * @param {Array<{occurred_at: string}>} events + * @param {Date} [now] + * @returns {Array} + */ +export function filterEventsForToday(events = [], now = new Date()) { + return events.filter((event) => { + const occurredAt = new Date(event.occurred_at); + if (Number.isNaN(occurredAt.getTime())) { + return false; + } + return ( + occurredAt.getFullYear() === now.getFullYear() && + occurredAt.getMonth() === now.getMonth() && + occurredAt.getDate() === now.getDate() + ); + }); +} + +/** + * Inhaltsmodell fuer das Event-Monitor-Modal: volle Liste des aktuellen Tages (kein + * MAX_EVENT_LINES-Limit, aber auf heute gefiltert, siehe filterEventsForToday()). * * @param {Array} events */ diff --git a/tests/frontend/office-scene.test.js b/tests/frontend/office-scene.test.js index 663f219..513c2c8 100644 --- a/tests/frontend/office-scene.test.js +++ b/tests/frontend/office-scene.test.js @@ -19,6 +19,7 @@ import { truncateToWidth, EVENT_LINE_CHAR_WIDTH, buildEventModalContent, + filterEventsForToday, buildSystemModalContent, systemsWithoutHostConfig, formatSystemCheckTime, @@ -350,6 +351,28 @@ test("buildEventModalContent zeigt die volle Liste (kein MAX_EVENT_LINES-Limit)" assert.equal(content.items[0].systemId, "srv1"); }); +test("filterEventsForToday behaelt nur Events vom aktuellen Kalendertag (lokale Zeitzone, F16)", () => { + const now = new Date("2026-07-27T10:00:00"); + const events = [ + { id: "heute-frueh", occurred_at: "2026-07-27T00:05:00" }, + { id: "heute-spaet", occurred_at: "2026-07-27T23:55:00" }, + { id: "gestern", occurred_at: "2026-07-26T23:59:00" }, + { id: "morgen", occurred_at: "2026-07-28T00:00:00" }, + { id: "ungueltig", occurred_at: "nicht-valide" }, + ]; + const filtered = filterEventsForToday(events, now); + assert.deepEqual( + filtered.map((e) => e.id), + ["heute-frueh", "heute-spaet"] + ); +}); + +test("filterEventsForToday liefert eine leere Liste, wenn kein Event von heute ist", () => { + const now = new Date("2026-07-27T10:00:00"); + const events = [{ id: "gestern", occurred_at: "2026-07-26T10:00:00" }]; + assert.deepEqual(filterEventsForToday(events, now), []); +}); + test("buildSystemModalContent uebernimmt Status/Detail je System", () => { const content = buildSystemModalContent([ { id: "srv1", name: "Webserver", status: "ok", type: "host", detail: null, last_check_at: "t" },