From 3de81f392aecab6124ad2d0b4a405daa11cc176b Mon Sep 17 00:00:00 2001 From: malice Date: Mon, 18 May 2026 14:19:27 -0600 Subject: [PATCH] =?UTF-8?q?1b-9c:=20Events=20feed=20UX=20iteration=20?= =?UTF-8?q?=E2=80=94=20colors,=20popups,=20viewport=20filter,=20expandable?= =?UTF-8?q?=20rows=20(#28)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: events feed UX iteration - colors, popups, viewport filter A. Color-code polygons by adapter (NWS amber, FIRMS red, USGS violet) B. Click popup on polygons showing time + adapter + category + subject C. Map viewport drives spatial filter - pan/zoom updates table via HTMX D. Add legend showing adapter color mapping E. Remove draw-bbox control, region inputs now hidden (auto-managed) Template changes: - _events_rows.html: add data-adapter, data-category, data-time, data-subject - events_list.html: ADAPTER_COLORS mapping, bindPopup, moveend handler Test: verify template renders adapter/category/subject for JS consumption * fix: remove isoformat() call on already-formatted time string * feat: full events feed UX iteration A. Color-code polygons by adapter with legend B. Click popup on polygons with "View details" link C. Viewport-driven spatial filter - pan/zoom updates table via HTMX Map never auto-fits after initial load (user controls viewport) D. Expandable row details showing full event data payload Changes: - _events_rows.html: add data-event-id, expand button, detail row - events_list.html: eventLayerGroup pattern, buildPopup, rebindEventLayers Fit to results button, expand/collapse handlers, CSS.escape for IDs * fix: add programmaticMove flag to prevent viewport refresh loop Suppress moveend handler during fitBounds/setView calls to prevent feedback loop: fitBounds -> moveend -> applyViewportFilter -> HTMX swap -> repeat. * fix: map never auto-fits - user controls viewport - Disable initial fitToAllLayers on page load - Remove fitBounds/setView from row click handler - Map only moves when user pans/zooms - Table filters based on visible viewport * fix: map shows all events always, only table filters Map polygons are drawn once on load and never cleared/redrawn. HTMX swap only updates the table, not the map layers. User viewport is fully preserved. * fix: use htmx.trigger instead of dispatchEvent for HTMX swap dispatchEvent(submit) was triggering native form submission (full page reload). htmx.trigger() properly triggers HTMX swap. Also re-enable initial rebindEventLayers so polygons load on first render. --------- Co-authored-by: Matt Johnson --- src/central/gui/templates/_events_rows.html | 25 +- src/central/gui/templates/events_list.html | 489 +++++++++++--------- tests/test_events_feed_frontend.py | 53 +++ 3 files changed, 351 insertions(+), 216 deletions(-) diff --git a/src/central/gui/templates/_events_rows.html b/src/central/gui/templates/_events_rows.html index 231d7b6..c7f126c 100644 --- a/src/central/gui/templates/_events_rows.html +++ b/src/central/gui/templates/_events_rows.html @@ -8,6 +8,7 @@ + @@ -17,14 +18,36 @@ {% for event in events %} - + + + + {% endfor %}
Time Adapter Category
{{ event.time }} {{ event.adapter }} {{ event.category }} {{ event.geometry_summary }} {{ event.subject or '—' }}
diff --git a/src/central/gui/templates/events_list.html b/src/central/gui/templates/events_list.html index f1fe5be..5c00b94 100644 --- a/src/central/gui/templates/events_list.html +++ b/src/central/gui/templates/events_list.html @@ -4,26 +4,88 @@ {% block head %} -