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.
This commit is contained in:
Matt Johnson 2026-05-18 18:35:27 +00:00
commit 6c21875738

View file

@ -213,6 +213,7 @@
var highlightedRow = null; var highlightedRow = null;
var highlightedLayer = null; var highlightedLayer = null;
var isInitialLoad = true; var isInitialLoad = true;
var programmaticMove = false;
// Region input elements // Region input elements
var northInput = document.getElementById("region_north"); var northInput = document.getElementById("region_north");
@ -224,6 +225,10 @@
var viewportDebounceTimer = null; var viewportDebounceTimer = null;
map.on("moveend", function() { map.on("moveend", function() {
if (programmaticMove) {
programmaticMove = false;
return;
}
if (viewportDebounceTimer) clearTimeout(viewportDebounceTimer); if (viewportDebounceTimer) clearTimeout(viewportDebounceTimer);
viewportDebounceTimer = setTimeout(applyViewportFilter, 400); viewportDebounceTimer = setTimeout(applyViewportFilter, 400);
}); });
@ -339,6 +344,7 @@
function fitToAllLayers() { function fitToAllLayers() {
var layers = eventLayerGroup.getLayers(); var layers = eventLayerGroup.getLayers();
if (layers.length === 0) return; if (layers.length === 0) return;
programmaticMove = true;
var group = L.featureGroup(layers); var group = L.featureGroup(layers);
map.fitBounds(group.getBounds(), { padding: [20, 20] }); map.fitBounds(group.getBounds(), { padding: [20, 20] });
} }
@ -379,6 +385,7 @@
if (row && row._mapLayer) { if (row && row._mapLayer) {
highlightRow(row, row._mapLayer, row._mapColor); highlightRow(row, row._mapLayer, row._mapColor);
try { try {
programmaticMove = true;
map.fitBounds(row._mapLayer.getBounds(), { padding: [50, 50] }); map.fitBounds(row._mapLayer.getBounds(), { padding: [50, 50] });
} catch (err) { } catch (err) {
// Point geometries // Point geometries
@ -386,6 +393,7 @@
if (geomStr) { if (geomStr) {
var geom = JSON.parse(geomStr); var geom = JSON.parse(geomStr);
if (geom && geom.type === "Point" && geom.coordinates) { if (geom && geom.type === "Point" && geom.coordinates) {
programmaticMove = true;
map.setView([geom.coordinates[1], geom.coordinates[0]], 10); map.setView([geom.coordinates[1], geom.coordinates[0]], 10);
} }
} }