From 6c218757388801c1c2a6c5850a0196ab36fd2bfc Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Mon, 18 May 2026 18:35:27 +0000 Subject: [PATCH] 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. --- src/central/gui/templates/events_list.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/central/gui/templates/events_list.html b/src/central/gui/templates/events_list.html index 6619648..d66d4cc 100644 --- a/src/central/gui/templates/events_list.html +++ b/src/central/gui/templates/events_list.html @@ -213,6 +213,7 @@ var highlightedRow = null; var highlightedLayer = null; var isInitialLoad = true; + var programmaticMove = false; // Region input elements var northInput = document.getElementById("region_north"); @@ -224,6 +225,10 @@ var viewportDebounceTimer = null; map.on("moveend", function() { + if (programmaticMove) { + programmaticMove = false; + return; + } if (viewportDebounceTimer) clearTimeout(viewportDebounceTimer); viewportDebounceTimer = setTimeout(applyViewportFilter, 400); }); @@ -339,6 +344,7 @@ function fitToAllLayers() { var layers = eventLayerGroup.getLayers(); if (layers.length === 0) return; + programmaticMove = true; var group = L.featureGroup(layers); map.fitBounds(group.getBounds(), { padding: [20, 20] }); } @@ -379,6 +385,7 @@ if (row && row._mapLayer) { highlightRow(row, row._mapLayer, row._mapColor); try { + programmaticMove = true; map.fitBounds(row._mapLayer.getBounds(), { padding: [50, 50] }); } catch (err) { // Point geometries @@ -386,6 +393,7 @@ if (geomStr) { var geom = JSON.parse(geomStr); if (geom && geom.type === "Point" && geom.coordinates) { + programmaticMove = true; map.setView([geom.coordinates[1], geom.coordinates[0]], 10); } }