From db2ebd23fb9a4e3eb01948341cb1834997bf43a5 Mon Sep 17 00:00:00 2001 From: kfj001 Date: Sun, 28 Jun 2026 08:29:32 +0000 Subject: [PATCH] adjusts display issues of world map on admin dash --- backend/__pycache__/seed.cpython-312.pyc | Bin 18848 -> 21174 bytes .../admin/admin-stats-dashboard.component.ts | 30 +++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/__pycache__/seed.cpython-312.pyc b/backend/__pycache__/seed.cpython-312.pyc index de7faa2bf5e30d4752ff5553c029c3be86f1f116..f8ae05cb404819e18618949d134a88e3abd87e3b 100644 GIT binary patch delta 4501 zcma)94R9036~5KaNwVaB*_MA0XJarnSjIN^2Mh!ZSQY~z{FTt8%Aq@30-a9TJKu`|q{B{m*YXQRFdsttS@WV^K=>mb`T2 zE#fSd%jEKEu#nxxHq&8eMV|bg>E4RN((K=ZC;4Z{-b%R~EccjuomF|3C(Y}eo;>+O zb8o8phAjQG4`z^lCY_Q@(sPnadj6zUdO>;-q|;I*lU|a34pLewX3{UDUxM_qHEs(u=@~=RipC|ts zWFb#}8{~TFoHP#426&!<=K{G=I(uL-$5D@olga)7Zt_jPc^oJjPR;b4A~{01QPZfY z`F#3)OFtnNqmlO&W}LfXl1xWvM3-rLJFnaMa1fTxUEgjs`VdrE)M5nt7`zuMf)wUvSy2# zi0NV^ChU&LBSJrwrHC%YzFclS8&4?@SGy$-92EJPIW?x2iYx)j{fB^5N$2t*+@oZJ1`pteHBO0af0E=H*4OM3I2 zMPK9K7Ur_7`(SO!vKw?N`&O4!Vs0Uupkd(%rP9A zENXC4AReh5>jW(fOVfP9dJ5j-0)}9eR$Xn?#eGqTNK`xs?!sQ*lzlqv!ED}jEL*n1 zmlQtltHykri5_^HaqZf=VdM6%Y#-dYar=&p1rB2RnD<>m%8h+OJK!TiPt`8WCA)lI zMAN~Sj1`h0rqed#FG9d7gKl@aqkfMmwG8N1dM9ABgYJa~wIDbUzKYO>a2LYe2wy`8 z0yOjV9^^O=6#+6l9Q~olaPEx|^k_VQzP>FtZ<%w>Eq0)9ZOas_h4f2YDxcjlT^5U!;EcTrb3J7ItN9T!o&HwK z-%WSb;N(~ow`OcwSRDyQr2OqG&Y0tBJZ}#%GPylumGpDY;%FIOlA|(InV>P*S|!|r zFR)m%saU`*IMa;phRwIc!-DLZ^_Xezhxf+P0iVsBnk(ElZDD?7T{sELx;fihi>!l{ z9wnIw0$TswA(b&DW_J?a{=&hT%Yrvw zuc&)0cp~_oz3ABeSM9ae?Dbdd^*>&6t)b&eL&s_9)vlMKR~pt|wf9e(O_ltooT-FA zehy+-8n& zk8wIUpZleM*U@5j>vgm82JY@kj(dRU^NsQ4_mVo}-p=xB`wz@FzH20hM4}}Rn7(e> zzrc99t-Q8z_T5>VxiOm97>zgvDKK8^>bzrjH#cTF*2i!mAUXC=hJRxCI>R3^R2ZT? zIVLc4baThvfd*E`;?VX$^BL{kZNzDa-KSE?!u-_Hs0sW^@^Cq*BU-bY!s0pVL%<@8 zH52chj5Q9IhMqA;eh%2$%#JOGu56X6zE&)@zVb z_)_F39=&FBUX}hPbZBM(D9O2kY|-F;rAMIa0wz+EDSf(U4Keojt}{OB-D(;j#_E-w zsn4eD-p{gju5iV5VAr!QuF#ib8wpo3|N8ON@zl}Of3&qQ#)HLyCUSxdHu2vz1ADYO zP-cFC47S)`L^f_GgRT6yqZ4@_8C=GXudV`q#!Uu0`7;$w$f3W>er7e=pRFW=y(#`| zRSyW~ipgM~{agtu&NY+4wfwmj>_6W?0w(+U1=xSSj|8mz`PJBeVFd};?H9VR|6(x- z6z~^I);U3#s3ifHeWDH(6JS)tPjm^uFI76hP-3~%z$0%VfwGkOQY$>nmzFW? zWZ1>9mm$mv+O>$6O$@CJ?FHQEFm!TrH=1mTqR-kgOv^}2)WX67#SXW7Au?$@3mksV}>}gFRp1&a=9X5?^EFW zH!828Pe30=UHcx-8Q<@(w`{x0ZA-u1UtmsoJfY6N^ zmz|G-z=XxwdK4O%Sz~qq3XNPv)l`{#s&*d!tMp9Oc|U0b#i61x%QWX9rfd&aS}|3+ zDE-F3CbE|+ZOxiE&z+_zw`Z!VeX6?VV<&IrVI8F{sMwiP^yMp>P~p!hy7LtaQE_`t y(QAzQYfT%7K?dVORwy7{&+g1}@Hj0^<73*pkaSFMBZXvXRxrLX=(Ri!Vfr5y{?`}) delta 2786 zcma)7ZERE58NTO!9NV#DCvhCxaXt(Q35I+S0!=cK(9}>nghrIHtz!kxa4(68W4qVR zN}?jus8Xqvjj%)aWBape>W`L|(p}d6LRCUOK--VNJ{0-KgtSTf(0<$vX#%NI_rAxB z-fpVImCobmdCxiTdGC4O_xh7}$)o6a!ys^}Rvx ztG=(*s8?0-jI4g}hI~9|(I0}Yx9Dr2Ll*rJ=mv|v4!Y5zKL*{T{!0BN{5Hd{@rL~D z@vycs}-3X_GxJHJeEmQrS#mMo*Un;}6~>ap8iJd@8HX>H#C_o0RLgMLLzrmK?dsY$1!Q zVQwiHlB#x~yRuJY0plMHInj7=Yl)B=*3sGnc(S$M{{lL-Yv)q=LMk&+QnVjvnS$QM zK5RXtoPfC=v?7s4@wZy|ge;X42ks=tIB&(XgN zP@<=^nKP-0@{aF;B~Jmu{Lx=#H`^POBp61FKep$^;z6MNHOBQLK#!GUsIbI<6<3bo z$=at2M8P+m{hBzyX~~zEVH-PYD^w8UkiPsc7}@4!Wakxf(nvp(Ax!S<%Eocl8l3fl zoKJ$oWlt9uoz|vLY5La$#@^`+Dih%BB>SxM3dtMCy8bQ}v9Ze6RI=qKv#%ynsx>4} zNy=q&mP^AcFJBrjk^e~?dMi;?OKSyv=f&5=v(1d`@`l2& zh(G^r=mWxuIzc#33N0)-^a=^HVaQ5f6V)NnVcU_Tqa8q!5Ld5(th8uO7FT>+_gBAj5k{edF(jgH?TJ%)gF ztB)aIz37J#@NG-->1=McWLGsUhfHtB8B9w=vZQqm40#CvT2tqFl=GUV>aT(63bsQD z;IG2N3&Nj04VQ`wMWg!JU4+e#jFTaDZ=|>QaMRxO&~yovU1hdUsA_(Asd%aQR`K(E z2sY1qM&0BxiPzE}OTgX^#s{QpB<{C=glx%9;`MaN(TjYL#2e|-kRSMREs2NevacOE z*jwz&L%9A{9f`NmTmF9FD;^RrM(it9II$8T@eaDO11DCul6bd$wFT{~u(^k>4vjcL ztix%&_H_qNtiz(cbiE}E{I=wT&~Cd)yidOEp~(FN?e!cRIfgm5aBSlUM-IWF4lcSm z_HgXwxR+xeL3aam)M>lDpNxvGJAw`P9h+^`&9YIyxG5PIqkf6_+1+n+k|67k?c4bQ zFO@ltagKFRCVzr)9maVWhhXf15yH}8zm1JGR+dYJf4F%oI}(XP@>E(&B=jk^FTQop ztB_Rv96*Hd639b(gvV)j74(_R>107mB-3fV2os-T`k!Mzi9cf3N9&3{NGxXc(S7^y zqfPrWF#2HZhqMpF7=&@4TmoKe3H%N`&3j@ypah;Df)W7sc2CSFEm0B^=#p&@@_i&G z(WOD;%ezR7(&ZlHx3-a(gWhUGUR;H^uvc^R65QpZv3A?~wh)Omxz-zO zC|YbVQL-lz)5%mOk%)-;IK1X~q=kKPXoj@2xv?!p-m+izDQ{8Uo%oNdClPq>^0vjk zz%rrSruM<tU4HKFF0zMU{LP`%E{>TtjdZBb^rH$0 zO6`WP!wjOR7Zm?SV7D1U(ZEmaHycqj35si@ve9ft5$0mMxdp{mzO2=3LD7oAJonFS zz%RHLQ0;ci+ diff --git a/src/app/admin/admin-stats-dashboard.component.ts b/src/app/admin/admin-stats-dashboard.component.ts index 6c42012..daaebaf 100644 --- a/src/app/admin/admin-stats-dashboard.component.ts +++ b/src/app/admin/admin-stats-dashboard.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, inject, AfterViewInit, OnDestroy, ViewChild, ElementRef, NgZone } from '@angular/core'; +import { Component, OnInit, inject, AfterViewChecked, OnDestroy, ViewChild, ElementRef, NgZone } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { Chart, registerables } from 'chart.js'; @@ -25,7 +25,7 @@ Chart.register(...registerables); templateUrl: './admin-stats-dashboard.component.html', styleUrl: './admin-stats-dashboard.component.scss', }) -export class AdminStatsDashboardComponent implements OnInit, AfterViewInit, OnDestroy { +export class AdminStatsDashboardComponent implements OnInit, AfterViewChecked, OnDestroy { private readonly statsService: StatsService = inject(StatsService); private readonly ngZone = inject(NgZone); @@ -70,13 +70,29 @@ export class AdminStatsDashboardComponent implements OnInit, AfterViewInit, OnDe // ── Leaflet ───────────────────────────────────────────── private map: L.Map | null = null; private markersLayer: L.LayerGroup | null = null; + private mapInitialized = false; ngOnInit(): void { this.loadAll(); } - ngAfterViewInit(): void { - // Initialize Leaflet map + ngAfterViewChecked(): void { + // The map container is inside an @else block gated by loading=true. + // ngAfterViewInit fires before loading completes, so the element + // doesn't exist yet. ngAfterViewChecked detects when it appears. + if (this.mapInitialized) return; + if (!this.mapContainerRef) return; + + this.mapInitialized = true; + this.ngZone.runOutsideAngular(() => { + // Defer one frame so the browser has laid out the container + requestAnimationFrame(() => { + requestAnimationFrame(() => this._initMap()); + }); + }); + } + + private _initMap(): void { this.map = L.map(this.mapContainerRef.nativeElement, { center: [20, 0], zoom: 2, @@ -88,6 +104,12 @@ export class AdminStatsDashboardComponent implements OnInit, AfterViewInit, OnDe attribution: '© OpenStreetMap contributors © CARTO', maxZoom: 19, }).addTo(this.map); + + // Ensure Leaflet uses the correct container size + this.map.invalidateSize(); + + // Data may have loaded in ngOnInit before the view was ready + this._updateMapMarkers(); } ngOnDestroy(): void {