From 375d53c0b14e17668c98b33d53291b33b330f9ae Mon Sep 17 00:00:00 2001 From: Antoine Jacquin Date: Sun, 27 Sep 2026 18:23:46 +0200 Subject: [PATCH] =?UTF-8?q?Nettoyer=20le=20contour=20de=20dalle=20et=20la?= =?UTF-8?q?=20r=C3=A9f=C3=A9rence=20=C3=A0=20la=20bulle=20quand=20on=20cha?= =?UTF-8?q?nge=20d'onglet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- lidar_pipeline/tests/test_mapserve.py | 6 ++++++ lidar_pipeline/web/map.js | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lidar_pipeline/tests/test_mapserve.py b/lidar_pipeline/tests/test_mapserve.py index 8a15d4f..78797a0 100644 --- a/lidar_pipeline/tests/test_mapserve.py +++ b/lidar_pipeline/tests/test_mapserve.py @@ -336,6 +336,12 @@ def test_ui_tile_popup_and_details_view(): # Pas de bulle pendant le déplacement du cadre d'export ni un tracé click = _MAP_JS[_MAP_JS.index("map.on('click'"):] assert "genDrawing" in click[:400] and "PRINT.dragging" in click[:400] + # Changer d'onglet pendant que la fiche est ouverte nettoie le contour + # de sélection (pas de fuite de tileSel) : openTab passe par le même + # nettoyage que closeTileViews, sans se rappeler lui-même. + assert "function hideTileView(" in _MAP_JS + open_tab = _MAP_JS[_MAP_JS.index("function openTab("):] + assert "hideTileView()" in open_tab[:200] def test_defaults_roundtrip(tmp_path, monkeypatch): diff --git a/lidar_pipeline/web/map.js b/lidar_pipeline/web/map.js index 7c1c4b3..f08d885 100644 --- a/lidar_pipeline/web/map.js +++ b/lidar_pipeline/web/map.js @@ -601,7 +601,10 @@ function showTilePopup(data, latlng) { showTilePopup.data = data; const btn = el('tilePopDetails'); if (btn) btn.addEventListener('click', openTileDetails); - tilePopup.on('remove', () => { if (el('tileView').hidden && tileSel) { map.removeLayer(tileSel); tileSel = null; } }); + tilePopup.on('remove', () => { + tilePopup = null; + if (el('tileView').hidden && tileSel) { map.removeLayer(tileSel); tileSel = null; } + }); } function openTileDetails() { @@ -616,12 +619,19 @@ function openTileDetails() { showTileInfo(data, lastTileQuery); } +// Masque #tileView et retire le contour de sélection, sans toucher aux +// onglets (utilisé par closeTileViews et par openTab, qui ne doit pas +// se rappeler lui-même via closeTileViews). +function hideTileView() { + el('tileView').hidden = true; + if (tileSel) { map.removeLayer(tileSel); tileSel = null; } +} + // Ferme la bulle, sinon la fiche ; renvoie true si quelque chose a été fermé. function closeTileViews() { if (tilePopup) { tilePopup.remove(); tilePopup = null; return true; } if (!el('tileView').hidden) { - el('tileView').hidden = true; - if (tileSel) { map.removeLayer(tileSel); tileSel = null; } + hideTileView(); openTab(tileReturnTab || 'view'); return true; } @@ -1218,7 +1228,7 @@ function panelRender() { function openTab(tab) { if (!panelTabs().includes(tab)) return; - el('tileView').hidden = true; + if (!el('tileView').hidden) hideTileView(); const before = PANEL.sheet; // Onglet actif retouché sur téléphone : le volet change de hauteur. if (isPhone() && tab === PANEL.tab && PANEL.sheet !== 'closed') {