map: port master popup-guard fix — real popup state via events, close on zoom/drag

Master's b2369bc fixed cameras vanishing after opening a popup and zooming:
Leaflet 1.9.4's Map.closePopup() never nulls map._popup, so the old
'if (map._popup) return' guard skipped every overlay reload forever after
the first popup. Port the fix into the redesigned frontend: track popup
state via popupopen/popupclose, close on user zoom/drag so moveend reloads
always run, and keep the autopan skip for the popup's own pan.
This commit is contained in:
Sirius DevOps 2026-08-27 17:48:39 -04:00
parent 8560884bbd
commit 2a433a41e9

View file

@ -1621,11 +1621,22 @@ async function initMap() {
if (activeHls) { try { activeHls.destroy(); } catch (_) {} activeHls = null; } if (activeHls) { try { activeHls.destroy(); } catch (_) {} activeHls = null; }
}); });
updateHeatLegend(); updateHeatLegend();
// Reload overlays when the user pans/zooms. Skip when a popup is open: // Reload overlays when the user pans/zooms. A live popup makes the
// opening a camera popup auto-pans the map to fit it, and that moveend // rebuild skip (so the popup's autopan doesn't destroy it), but user
// must NOT rebuild the marker group under the open popup. // zoom/drag must close the popup FIRST — otherwise zooming out with a
// camera popup open leaves the stale, zoomed-in marker group on the
// map and the cameras "vanish" until a refresh.
//
// NOTE: `map._popup` is NOT a reliable open-check in Leaflet 1.9.4 —
// Map.closePopup() never nulls it, so once any popup has been opened
// it stays truthy forever. Track the real state via popupopen/close.
let camPopupOpen = false;
map.on('popupopen', () => { camPopupOpen = true; });
map.on('popupclose', () => { camPopupOpen = false; });
map.on('zoomstart', () => { if (camPopupOpen) map.closePopup(); });
map.on('dragstart', () => { if (camPopupOpen) map.closePopup(); });
map.on('moveend', () => { map.on('moveend', () => {
if (map._popup) return; if (camPopupOpen) return; // only the popup's own autopan now
if (firesOn) loadFires(); if (firesOn) loadFires();
if (camsOn) loadCams(); if (camsOn) loadCams();
if (blipsOn) loadBlips(); if (blipsOn) loadBlips();