Corriger la revue finale : onglets non tronqués, fiche de dalle à jour, clics et lien fiables
Onglet Dalle libellé fixe (col·row dans le title), Affichage/Export PDF/ Génération raccourcis pour tenir dans le panneau ; fiche de dalle rechargée après un run sans désélection et dès que /api/status révèle le bouton Régénérer ; double-clic et réponses en retard ignorés sur la sélection ; curseur d'intensité visible hors mode précision ; lien complet sans &I remis à 1× ; applyCompareClip sort tôt hors mode Comparer ; docs/MAPS.md et AGENTS.md à jour (modes Comparer, &I=, « Comment lire »). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@ -267,6 +267,10 @@ function loadState(meta) {
|
||||
if (hash.compare) st.compare = hash.compare;
|
||||
if (hash.base) st.base = hash.base;
|
||||
if (hash.intensity != null) st.intensity = hash.intensity;
|
||||
// Lien complet (couche ou mode dans le hash) sans &I : l'export du lien
|
||||
// n'écrit &I que si ≠ 1 (viewHash), donc son absence signifie 1×, jamais
|
||||
// l'intensité de confort restée dans le localStorage de ce navigateur.
|
||||
else if (hash.main || hash.view) st.intensity = 1;
|
||||
}
|
||||
return st;
|
||||
}
|
||||
@ -463,9 +467,15 @@ function compareBounds() {
|
||||
// à chaque déplacement. Même couche des deux côtés : aucune découpe.
|
||||
// STATE.compare.pos garde la valeur demandée (lien, glisser) ; la séparation
|
||||
// affichée, barre et découpe ensemble, est bornée à compareBounds().
|
||||
// Mode différent de « compare » et calques déjà sans découpe : rien à faire.
|
||||
// Sans cette garde, chaque déplacement de carte (map.on('move', …)) relit et
|
||||
// réécrit le style de tous les calques pour ne poser que des clip-path vides,
|
||||
// à chaque frame, même quand Comparer n'a jamais été ouvert.
|
||||
let compareClipsCleared = true;
|
||||
function applyCompareClip() {
|
||||
if (!STATE) return;
|
||||
const on = effectiveMode() === 'compare';
|
||||
if (!on && compareClipsCleared) { el('compareBar').hidden = true; return; }
|
||||
el('compareBar').hidden = !on;
|
||||
const size = map.getSize();
|
||||
let x = size.x * (on ? STATE.compare.pos : 50) / 100;
|
||||
@ -485,6 +495,7 @@ function applyCompareClip() {
|
||||
}
|
||||
c.style.clipPath = clip;
|
||||
}
|
||||
compareClipsCleared = !on;
|
||||
if (on) el('compareBar').style.left = (bounds.left + x) + 'px';
|
||||
}
|
||||
map.on('move', applyCompareClip);
|
||||
@ -729,15 +740,17 @@ function showTileInfo(data, latlng) {
|
||||
|
||||
let SELECTED_TILE = null; // données de la dalle sélectionnée (ou null)
|
||||
|
||||
// Libellé de l'onglet : « Dalle » sans sélection, « Dalle col · row » avec.
|
||||
function tileTabLabel() {
|
||||
return SELECTED_TILE ? 'Dalle ' + SELECTED_TILE.col + ' · ' + SELECTED_TILE.row : 'Dalle';
|
||||
// Le libellé de l'onglet reste « Dalle » (5 onglets dans 340 px : un libellé
|
||||
// variable déborderait) ; col · row va dans le title de l'onglet (survol) et
|
||||
// dans #tileTitle, toujours lisible dans la fiche elle-même.
|
||||
function tileTabTitle() {
|
||||
return (SELECTED_TILE ? 'Dalle ' + SELECTED_TILE.col + ' · ' + SELECTED_TILE.row : 'Dalle') + ' (2)';
|
||||
}
|
||||
|
||||
// Rafraîchit l'onglet Dalle (libellé + bascule hint/fiche) qu'il soit visible
|
||||
// ou non : son contenu doit être à jour dès qu'on l'ouvre.
|
||||
function renderTabTile() {
|
||||
el('tileTabLbl').textContent = tileTabLabel();
|
||||
document.querySelector('button[data-tab="tile"]').title = tileTabTitle();
|
||||
el('tileHint').hidden = !!SELECTED_TILE;
|
||||
el('tileCard').hidden = !SELECTED_TILE;
|
||||
if (SELECTED_TILE) showTileInfo(SELECTED_TILE, lastTileQuery);
|
||||
@ -1067,6 +1080,14 @@ function genAfterRun() {
|
||||
renderUseCard();
|
||||
}).catch(() => {});
|
||||
fetch('api/map/background', { method: 'POST' }).catch(() => {});
|
||||
// Fiche de dalle restée sélectionnée pendant le run : périmée (résolution,
|
||||
// date de génération, couches…) — on la recharge sans jamais désélectionner.
|
||||
if (SELECTED_TILE && lastTileQuery) {
|
||||
fetch('api/map/tile?lat=' + lastTileQuery.lat + '&lng=' + lastTileQuery.lng)
|
||||
.then(r => r.ok ? r.json() : null)
|
||||
.catch(() => null)
|
||||
.then(d => { if (d) selectTile(d, lastTileQuery); });
|
||||
}
|
||||
}
|
||||
|
||||
function genUpdateStatus(d) {
|
||||
@ -1488,6 +1509,9 @@ fetch('api/map/meta').then(r => r.json()).then(meta => {
|
||||
GEN.allowed = d.regen_allowed !== false;
|
||||
const show = GEN.available && GEN.allowed;
|
||||
panelRender();
|
||||
// La fiche de dalle a pu s'afficher avant que /api/status ne réponde
|
||||
// (bouton « Régénérer » absent, GEN encore inconnu) : la ré-émettre.
|
||||
if (SELECTED_TILE) renderTabTile();
|
||||
if (show) { genUpdateStatus(d); genPollNow(); }
|
||||
}).catch(() => {});
|
||||
}).catch(() => {
|
||||
@ -1516,14 +1540,22 @@ window.addEventListener('hashchange', () => {
|
||||
});
|
||||
|
||||
map.on('moveend zoomend', saveHashSoon);
|
||||
// Jeton de séquence : une réponse arrivée après un clic plus récent (double
|
||||
// clic, requête lente) ne doit jamais écraser l'état de la sélection.
|
||||
let tileClickSeq = 0;
|
||||
map.on('click', (e) => {
|
||||
// Pas de sélection pendant un tracé de zone ni juste après le relâchement
|
||||
// de la poignée du cadre d'export.
|
||||
// de la poignée du cadre d'export. Un double-clic (zoom Leaflet) arrive ici
|
||||
// comme deux clics simples : le second (detail > 1) ne doit pas rebasculer
|
||||
// la sélection qui vient d'être posée par le premier.
|
||||
if (genDrawing || Date.now() < genIgnoreClickUntil || PRINT.dragging) return;
|
||||
if (e.originalEvent && e.originalEvent.detail > 1) return;
|
||||
const seq = ++tileClickSeq;
|
||||
fetch('api/map/tile?lat=' + e.latlng.lat + '&lng=' + e.latlng.lng)
|
||||
.then(r => r.ok ? r.json() : null)
|
||||
.catch(() => null)
|
||||
.then(d => {
|
||||
if (seq !== tileClickSeq) return; // clic plus récent déjà traité
|
||||
if (!d) { toast('Serveur injoignable : réessayez dans un instant.', 5000); return; }
|
||||
// Re-clic sur la dalle déjà sélectionnée : désélection. Sinon la
|
||||
// sélection se déplace, sans changer l'onglet affiché.
|
||||
|
||||
Reference in New Issue
Block a user