Remplacer la bulle et la fiche détaillée de dalle par un onglet Dalle du panneau

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 20:22:07 +02:00
parent 0df93c2f00
commit 90663405f7
6 changed files with 112 additions and 188 deletions

View File

@ -346,24 +346,26 @@ def test_map_ui_tile_load_indicator_and_selection_pane():
assert "pane: 'tileSel'" in _MAP_JS
def test_ui_tile_popup_and_details_view():
"""La fiche de dalle est une bulle Leaflet + une vue détaillée dans le panneau."""
def test_ui_tile_tab_replaces_popup_and_details_view():
"""Un clic sur la carte sélectionne la dalle (contour) et remplit
l'onglet Dalle : plus de bulle Leaflet ni de vue « Détails » séparée."""
from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS
assert 'id="tilecard"' not in _MAP_HTML
for id_ in ("tileView", "tileBack", "tileTitle", "tileBody"):
assert 'data-tab="tile"' in _MAP_HTML
for id_ in ("tab-tile", "tileHint", "tileCard", "tileTitle", "tileBody", "tileTabLbl"):
assert f'id="{id_}"' in _MAP_HTML, id_
for fn in ("function showTilePopup(", "function openTileDetails(", "function closeTileViews("):
for gone in ("tileView", "tileBack", "showTilePopup", "openTileDetails",
"closeTileViews", "hideTileView", "restoreTabAfterDetails",
"RESTORING_TAB", "tileReturnTab", "L.popup("):
assert gone not in _MAP_JS, gone
assert "leaflet-popup" not in _MAP_CSS and "tile-pop" not in _MAP_CSS
for fn in ("function selectTile(", "function clearTileSelection(", "function renderTabTile("):
assert fn in _MAP_JS, fn
assert "L.popup(" in _MAP_JS and "Détails" in _MAP_JS
# Pas de bulle pendant le déplacement du cadre d'export ni un tracé
# Pas de sélection 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]
# Re-clic sur la dalle déjà sélectionnée : désélection plutôt que bascule
assert "clearTileSelection();" in click[click.index("SELECTED_TILE"):click.index("});")]
def test_defaults_roundtrip(tmp_path, monkeypatch):
@ -567,22 +569,15 @@ def test_ui_base_dark_follows_theme_unless_chosen():
assert "className: themeIsDark() ? 'base-dark' : ''" in _MAP_JS
def test_ui_phone_return_and_escape_keep_sheet_height():
"""« ← Retour » et Échap depuis la fiche de dalle rétablissent l'onglet
précédent SANS repasser par openTab (qui retoucherait la hauteur du volet
en re-touchant l'onglet déjà actif) : la fiche ferme via un rétablissement
direct de PANEL.tab/want, partagé par closeTileViews et showTilePopup."""
def test_ui_escape_deselects_tile_before_collapsing_panel():
"""Échap désélectionne la dalle (si sélection il y a) avant de replier le
panneau ; un tracé de zone en cours est annulé en premier, comme avant."""
from lidar_pipeline.mapui import _MAP_JS
assert "function restoreTabAfterDetails()" in _MAP_JS
restore = _MAP_JS[_MAP_JS.index("function restoreTabAfterDetails("):]
assert "PANEL.tab = PANEL.want = tileReturnTab || 'view';" in restore[:300]
assert "openTab(" not in restore[:300]
close_tiles = _MAP_JS[_MAP_JS.index("function closeTileViews("):]
assert "restoreTabAfterDetails()" in close_tiles[:250]
# Second clic sur la carte pendant que la fiche est ouverte : referme la
# fiche plutôt que de bouger le contour derrière elle (M5)
popup_fn = _MAP_JS[_MAP_JS.index("function showTilePopup("):]
assert "restoreTabAfterDetails()" in popup_fn[:400]
keydown = _MAP_JS[_MAP_JS.index("document.addEventListener('keydown'"):]
esc = keydown[keydown.rindex("if (e.key === 'Escape')"):]
assert "genSetDrawing(false)" in esc[:200]
assert "clearTileSelection()" in esc[:400]
assert "setSheet('closed')" in esc[:600] and "setCollapsed(true)" in esc[:600]
def test_ui_saved_print_tab_does_not_rezoom_shared_link():
@ -594,36 +589,20 @@ def test_ui_saved_print_tab_does_not_rezoom_shared_link():
après une ouverture explicite ultérieure de l'onglet)."""
from lidar_pipeline.mapui import _MAP_JS
assert "let BOOTSTRAPPING = true;" in _MAP_JS
assert "printSetOpen(e.detail.visible === 'print', !BOOTSTRAPPING && !RESTORING_TAB);" in _MAP_JS
assert "printSetOpen(e.detail.visible === 'print', !BOOTSTRAPPING);" in _MAP_JS
then_branch = _MAP_JS[_MAP_JS.index("panelRender();\n BOOTSTRAPPING = false;"):]
assert then_branch.startswith("panelRender();\n BOOTSTRAPPING = false;")
catch_branch = _MAP_JS[_MAP_JS.index(".catch(() => {\n toast('Serveur de tuiles injoignable."):]
assert "BOOTSTRAPPING = false;" in catch_branch[:400]
def test_ui_details_view_hides_print_frame():
"""Ouvrir la fiche détaillée pendant que l'onglet Export est affiché
referme le cadre d'export (sinon cadre + poignée restent visibles
derrière la fiche) — et le reste tant que la fiche est ouverte, quel que
soit ce qui redéclenche un rendu du panneau (grip, redimensionnement,
changement phoneQuery…) puisque panelVisibleTab() renvoie null tant que
#tileView n'est pas masqué."""
def test_ui_tile_selection_does_not_affect_print_frame():
"""La sélection d'une dalle vit à part des onglets : elle ne referme ni
ne rouvre le cadre d'export (contrairement à l'ancienne fiche « Détails »,
qui masquait les autres onglets par-dessus la carte)."""
from lidar_pipeline.mapui import _MAP_JS
open_details = _MAP_JS[_MAP_JS.index("function openTileDetails("):]
assert "printSetOpen(false);" in open_details[:600]
visible_tab = _MAP_JS[_MAP_JS.index("function panelVisibleTab("):]
assert "if (!el('tileView').hidden) return null;" in visible_tab[:300]
def test_ui_restoring_tab_does_not_refit_or_recentre_print_frame():
"""Rétablir l'onglet Export (retour de la fiche détaillée) rouvre le
cadre là où il était, sans recadrer la vue ni le recentrer sur l'écran —
au contraire d'une ouverture explicite de l'onglet par l'utilisateur."""
from lidar_pipeline.mapui import _MAP_JS
assert "let RESTORING_TAB = false;" in _MAP_JS
restore = _MAP_JS[_MAP_JS.index("function restoreTabAfterDetails("):]
assert "RESTORING_TAB = true;" in restore[:400]
assert "panelRender();\n RESTORING_TAB = false;" in restore[:400]
select_fn = _MAP_JS[_MAP_JS.index("function selectTile("):]
assert "printSetOpen" not in select_fn[:select_fn.index("function clearTileSelection(")]
open_fn = _MAP_JS[_MAP_JS.index("function printSetOpen("):]
assert "explicit && !map.getBounds().contains(PRINT.center)" in open_fn[:700]
assert "printRefreshFrame(!!explicit);" in open_fn[:700]
@ -1658,9 +1637,9 @@ def test_ui_tokens_themes_and_components():
def test_ui_single_tabbed_panel():
from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS
for id_ in ("panel", "panelTabs", "panelBody", "panelCollapse", "sheetGrip",
"tab-view", "tab-print", "tab-gen", "tab-share"):
"tab-view", "tab-tile", "tab-print", "tab-gen", "tab-share"):
assert f'id="{id_}"' in _MAP_HTML, id_
for tab in ("view", "print", "gen", "share"):
for tab in ("view", "tile", "print", "gen", "share"):
assert f'data-tab="{tab}"' in _MAP_HTML, tab
# Plus d'éléments flottants : tout passe dans le panneau
for gone in ('id="layercard"', 'id="printcard"', 'id="gencard"', 'id="usecard"',
@ -1675,7 +1654,7 @@ def test_ui_single_tabbed_panel():
"function setCollapsed(", "function panelVisibleTab("):
assert fn in _MAP_JS, fn
assert "'panel:tab'" in _MAP_JS
# Génération masquée : onglet retiré de la liste (touches 1–4 comprises)
# Génération masquée : onglet retiré de la liste (touches 1–5 comprises)
assert "GEN.available && GEN.allowed" in _MAP_JS.split("function panelTabs(")[1].split("}")[0]
assert "@media (max-width: 720px)" in _MAP_CSS and "#panel" in _MAP_CSS
for state in ('data-sheet="closed"', 'data-sheet="half"', 'data-sheet="full"'):