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:
@ -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"'):
|
||||
|
||||
Reference in New Issue
Block a user