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" },