Pour certains organismes, aucun point ne s'affiche sur la carte #121
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exemple :
Le problème touche aussi de nombreuses configurations (ensembles de filtres) de l'observatoire, particulièrement lorsqu'il y a beaucoup de marchés. Mais celle-ci fonctionne: /observatoire?annee=2020&titulaire_id=32933888301011. C'est suprenant puisque la page du titulaire filtré (/titulaires/32933888301011 et filtré sur l'année 2020 comme dans le filtre observatoire), ne fonctionne pas.
Par contre pour ce titulaire pas de problème : /titulaires/32420439500028. J'ai du mal à voir un pattern.
Diagnostic
La carte dash-leaflet s'affichait sans aucun point (fond de carte + zoom OK, 0 marqueur) sur certains organismes / certaines vues de l'observatoire.
Cause racine : le bundle dash-ag-grid (
async-community.js, chargé en lazy chunk dès qu'une AgGrid monte) fuit un helper esbuild__spreadValuessous le nom globalL, ce qui écrase lewindow.Lde Leaflet. Nos fonctions clientsidepointToLayer/clusterToLayer(src/assets/dash_clientside.js) lisent leLglobal → récupèrent le helper au lieu de Leaflet →L.point/L.circleMarker is not a function→ l'exception casse tout le calque GeoJSON → carte vide.dash-leaflet appelle
pointToLayer(feature, latlng)sans passer Leaflet en argument : ces fonctions dépendent donc forcément du global.Pourquoi le pattern semblait aléatoire (« surtout quand beaucoup de marchés ») : c'est une course entre le chargement du chunk AG Grid et le rendu de la carte. Plus il y a de points, plus la carte rend tard, plus le clobber a déjà eu lieu. D'où :
/observatoire?annee=2020&titulaire_id=…(peu de points) → marche parfois ;/titulaires/…(tous millésimes, beaucoup de points) → cassé.Symptôme diagnostique dans la console :
typeof window.L === "function"etwindow.L.version === undefined(le vraiLde Leaflet est un objet avec.version,.circleMarker,.point…).À noter : impossible à reproduire avec un repro dash-leaflet minimal (sans AG Grid,
window.Lreste Leaflet). Il a fallu lancer la vraie app avec les données de prod et lire la console navigateur.Solution
Dans
src/assets/dash_clientside.js, une IIFE en tête intercepte les affectations dewindow.LviaObject.definePropertyet mémorise en privé le vrai Leaflet (celui exposantcircleMarker), sans changer ce quewindow.Lrenvoie (AG Grid continue d'utiliser son helper).window.leafletReal()rend le vrai Leaflet ;pointToLayer/clusterToLayerfontconst L = window.leafletReal();en première ligne.Vérifié sur la vraie app (données de prod) : carte peuplée, plus d'erreur console, rendu OK après changement d'année. S'applique aussi à
/acheteuret/observatoire(même fichier).