web-mojo 2.2.70 → 2.2.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +1 -1
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.es.js +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +1 -1
- package/dist/chunks/ChatView-Cwwb-A47.js +2 -0
- package/dist/chunks/ChatView-Cwwb-A47.js.map +1 -0
- package/dist/chunks/ChatView-DCW_0GFg.js +2 -0
- package/dist/chunks/ChatView-DCW_0GFg.js.map +1 -0
- package/dist/chunks/Dialog-CdIM9IyH.js +3 -0
- package/dist/chunks/Dialog-CdIM9IyH.js.map +1 -0
- package/dist/chunks/Dialog-DZ4cPzBO.js +3 -0
- package/dist/chunks/Dialog-DZ4cPzBO.js.map +1 -0
- package/dist/chunks/{FormView-OgrZ7x0z.js → FormView-BG-huF2q.js} +2 -2
- package/dist/chunks/{FormView-OgrZ7x0z.js.map → FormView-BG-huF2q.js.map} +1 -1
- package/dist/chunks/{FormView-Dw7HDwzy.js → FormView-BGkZo_M5.js} +2 -2
- package/dist/chunks/{FormView-Dw7HDwzy.js.map → FormView-BGkZo_M5.js.map} +1 -1
- package/dist/chunks/MetricsCountryMapView-C5kQA6xw.js +2 -0
- package/dist/chunks/{MetricsCountryMapView-DDdDJQFA.js.map → MetricsCountryMapView-C5kQA6xw.js.map} +1 -1
- package/dist/chunks/MetricsCountryMapView-D1WtxmEc.js +2 -0
- package/dist/chunks/{MetricsCountryMapView-DIlezla0.js.map → MetricsCountryMapView-D1WtxmEc.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-Dt2V0eXP.js → MetricsMiniChartWidget-BVCILe9D.js} +2 -2
- package/dist/chunks/{MetricsMiniChartWidget-Dt2V0eXP.js.map → MetricsMiniChartWidget-BVCILe9D.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-_N4kzNY_.js → MetricsMiniChartWidget-C56xbSvN.js} +2 -2
- package/dist/chunks/{MetricsMiniChartWidget-_N4kzNY_.js.map → MetricsMiniChartWidget-C56xbSvN.js.map} +1 -1
- package/dist/chunks/Modal-BRy52L0q.js +2 -0
- package/dist/chunks/Modal-BRy52L0q.js.map +1 -0
- package/dist/chunks/Modal-Bk391x8U.js +2 -0
- package/dist/chunks/Modal-Bk391x8U.js.map +1 -0
- package/dist/chunks/{PDFViewer-BruR1RFn.js → PDFViewer-BOlzz1xw.js} +2 -2
- package/dist/chunks/{PDFViewer-BruR1RFn.js.map → PDFViewer-BOlzz1xw.js.map} +1 -1
- package/dist/chunks/{PDFViewer-CyGFVcvX.js → PDFViewer-D86bl2rr.js} +2 -2
- package/dist/chunks/{PDFViewer-CyGFVcvX.js.map → PDFViewer-D86bl2rr.js.map} +1 -1
- package/dist/chunks/{TableView-DemRVhnX.js → Passkeys-BMlPoiNU.js} +2 -2
- package/dist/chunks/Passkeys-BMlPoiNU.js.map +1 -0
- package/dist/chunks/Passkeys-BOgPdzUP.js +2 -0
- package/dist/chunks/Passkeys-BOgPdzUP.js.map +1 -0
- package/dist/chunks/{TokenManager-BFaxNsXO.js → TokenManager-Bt369_RQ.js} +2 -2
- package/dist/chunks/{TokenManager-BFaxNsXO.js.map → TokenManager-Bt369_RQ.js.map} +1 -1
- package/dist/chunks/{TokenManager-IlBEFXqZ.js → TokenManager-CQz0jHA7.js} +2 -2
- package/dist/chunks/{TokenManager-IlBEFXqZ.js.map → TokenManager-CQz0jHA7.js.map} +1 -1
- package/dist/chunks/UserProfileView-C-acS9nw.js +2 -0
- package/dist/chunks/UserProfileView-C-acS9nw.js.map +1 -0
- package/dist/chunks/UserProfileView-_PYRQ7e-.js +2 -0
- package/dist/chunks/UserProfileView-_PYRQ7e-.js.map +1 -0
- package/dist/chunks/WebApp-Bcm_5W7o.js +2 -0
- package/dist/chunks/WebApp-Bcm_5W7o.js.map +1 -0
- package/dist/chunks/WebApp-XII3ai1e.js +2 -0
- package/dist/chunks/WebApp-XII3ai1e.js.map +1 -0
- package/dist/chunks/index-BlmLfc7i.js +2 -0
- package/dist/chunks/{index-BdfwxVMZ.js.map → index-BlmLfc7i.js.map} +1 -1
- package/dist/chunks/index-CR7lDflX.js +2 -0
- package/dist/chunks/{index-BaPQHxbL.js.map → index-CR7lDflX.js.map} +1 -1
- package/dist/chunks/{version-C2yYRyPn.js → version-7FRWIcUM.js} +2 -2
- package/dist/chunks/{version-C2yYRyPn.js.map → version-7FRWIcUM.js.map} +1 -1
- package/dist/chunks/{version-CaiqhdME.js → version-CrZ_Be4I.js} +2 -2
- package/dist/chunks/{version-CaiqhdME.js.map → version-CrZ_Be4I.js.map} +1 -1
- package/dist/css/web-mojo.css +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.es.js +1 -1
- package/dist/mojo-auth.es.js +101 -50
- package/dist/mojo-auth.umd.js +1 -1
- package/dist/toast.css +106 -74
- package/dist/user-profile.cjs.js +1 -1
- package/dist/user-profile.es.js +1 -1
- package/dist/web-mojo.lite.iife.js +15602 -15356
- package/dist/web-mojo.lite.iife.js.map +1 -1
- package/dist/web-mojo.lite.iife.min.js +280 -238
- package/dist/web-mojo.lite.iife.min.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/ChatView-DH42WXgV.js +0 -2
- package/dist/chunks/ChatView-DH42WXgV.js.map +0 -1
- package/dist/chunks/ChatView-_8eQTETQ.js +0 -2
- package/dist/chunks/ChatView-_8eQTETQ.js.map +0 -1
- package/dist/chunks/Dialog-BVCCpLPw.js +0 -3
- package/dist/chunks/Dialog-BVCCpLPw.js.map +0 -1
- package/dist/chunks/Dialog-BYiynSW-.js +0 -3
- package/dist/chunks/Dialog-BYiynSW-.js.map +0 -1
- package/dist/chunks/MetricsCountryMapView-DDdDJQFA.js +0 -2
- package/dist/chunks/MetricsCountryMapView-DIlezla0.js +0 -2
- package/dist/chunks/TableView-CxYpxZvr.js +0 -2
- package/dist/chunks/TableView-CxYpxZvr.js.map +0 -1
- package/dist/chunks/TableView-DemRVhnX.js.map +0 -1
- package/dist/chunks/UserProfileView-9vkfCPsp.js +0 -2
- package/dist/chunks/UserProfileView-9vkfCPsp.js.map +0 -1
- package/dist/chunks/UserProfileView-tcBT6XcE.js +0 -2
- package/dist/chunks/UserProfileView-tcBT6XcE.js.map +0 -1
- package/dist/chunks/WebApp-BFR1zozS.js +0 -2
- package/dist/chunks/WebApp-BFR1zozS.js.map +0 -1
- package/dist/chunks/WebApp-C82womPC.js +0 -2
- package/dist/chunks/WebApp-C82womPC.js.map +0 -1
- package/dist/chunks/index-BaPQHxbL.js +0 -2
- package/dist/chunks/index-BdfwxVMZ.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const a=require("./Collection-BUv4E9op.js");class MapView extends a.View{constructor(a={}){super({className:"map-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.showZoomControl=!1!==a.showZoomControl,this.tileLayer=a.tileLayer||"osm",this.showLeafletBranding=!0===a.showLeafletBranding,this.showLayerControl=!0===a.showLayerControl,this.layerOptions=a.layerOptions||{osm:"OSM",satellite:"Satellite",terrain:"Terrain",dark:"Dark",light:"Light",watercolor:"Watercolor",bw:"B/W",streets:"Streets"},this.map=null,this.leafletMarkers=[],this._tileLayer=null,this.template='\n <div class="map-container">\n <div id="map-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadLeaflet(),await this.initializeMap()}async loadLeaflet(){if(window.L)return;const a=new Promise(a=>{const t=document.createElement("link");t.rel="stylesheet",t.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",t.onload=a,t.onerror=a,document.head.appendChild(t)}),t=new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",e.onload=a,e.onerror=t,document.head.appendChild(e)});await Promise.all([a,t])}getTileLayerUrl(){const a={osm:{url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",attribution:"© OpenStreetMap contributors",maxZoom:19},satellite:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attribution:"© Esri",maxZoom:19},terrain:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",attribution:"© OpenTopoMap contributors",maxZoom:17},dark:{url:"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},light:{url:"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},watercolor:{url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg",attribution:"© Stadia Maps © Stamen Design © OpenStreetMap contributors",maxZoom:16},bw:{url:"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},streets:{url:"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20}};return a[this.tileLayer]||a.osm}async initializeMap(){const a=this.element.querySelector(`#map-${this.id}`);if(!a||!window.L)return;let t=this.center;if(!t&&this.markers.length>0&&(t=[this.markers[0].lat,this.markers[0].lng]),t||(t=[0,0]),this.map=window.L.map(a,{center:t,zoom:this.zoom,zoomControl:this.showZoomControl}),this.map&&this.map.attributionControl&&!1===this.showLeafletBranding)try{this.map.attributionControl.setPrefix("")}catch(n){}const e=this.getTileLayerUrl();if(this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.showLayerControl){const t=a.parentElement||this.element.querySelector(".map-container");if(t){t.style.position=t.style.position||"relative";const a=document.createElement("select");a.className="form-select form-select-sm",a.style.position="absolute",a.style.top="8px",a.style.right="8px",a.style.zIndex="1000",a.style.maxWidth="180px",a.setAttribute("aria-label","Map tile layer"),Object.entries(this.layerOptions||{}).forEach(([t,e])=>{const n=document.createElement("option");n.value=t,n.textContent=e,t===this.tileLayer&&(n.selected=!0),a.appendChild(n)}),a.addEventListener("change",()=>this.setTileLayer(a.value)),t.appendChild(a)}}this.addMarkers(this.markers),this.markers.length>1&&this.fitBounds(),setTimeout(()=>{this.map&&this.map.invalidateSize()},300)}addMarkers(a){this.map&&Array.isArray(a)&&a.forEach(a=>{const{lat:t,lng:e,popup:n,icon:l}=a;if(!t||!e)return;const i={};l&&(i.icon=window.L.icon(l));const s=window.L.marker([t,e],i).addTo(this.map);n&&s.bindPopup(n),this.leafletMarkers.push(s)})}fitBounds(){if(!this.map||0===this.leafletMarkers.length)return;const a=new window.L.featureGroup(this.leafletMarkers);this.map.fitBounds(a.getBounds().pad(.1))}updateMarkers(a){this.clearMarkers(),this.markers=a,this.addMarkers(a),a.length>1?this.fitBounds():1===a.length&&this.map.setView([a[0].lat,a[0].lng],this.zoom)}clearMarkers(){this.leafletMarkers.forEach(a=>{this.map.removeLayer(a)}),this.leafletMarkers=[]}setView(a,t,e=null){this.map&&this.map.setView([a,t],e||this.zoom)}setZoom(a){this.map&&this.map.setZoom(a)}setTileLayer(a){if(!this.map)return;const t=this.tileLayer;this.tileLayer=a||this.tileLayer;const e=this.getTileLayerUrl();try{this._tileLayer&&this.map.removeLayer(this._tileLayer)}catch(n){}this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.tileLayer=a||t,setTimeout(()=>{try{this.map.invalidateSize()}catch(n){}},150)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}static async showAsDialog(a={}){const t=new MapView(a),e={title:"Map View",header:!0,body:t,size:"lg",centered:!1,...a.dialogOptions||{}};await t.init(),await t.getApp().showDialog(e)}}class MapLibreView extends a.View{constructor(a={}){super({className:"maplibre-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.pitch=a.pitch||0,this.bearing=a.bearing||0,this.mapStyle=a.style||"streets",this.showNavigationControl=!1!==a.showNavigationControl,this.autoFitBounds=!1!==a.autoFitBounds,this.map=null,this.mapMarkers=[],this.pendingMarkers=[...this.markers],this.lineSources=a.lineSources||[],this.pendingLineData=/* @__PURE__ */new Map,this.template='\n <div class="maplibre-container">\n <div id="maplibre-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadMapLibre(),await this.initializeMap()}async loadMapLibre(){if(window.maplibregl)return;const a=document.createElement("link");return a.rel="stylesheet",a.href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css",document.head.appendChild(a),new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js",e.onload=a,e.onerror=t,document.head.appendChild(e)})}getMapStyle(){const a={streets:"https://demotiles.maplibre.org/style.json",dark:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},light:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},satellite:{version:8,sources:{satellite:{type:"raster",tiles:["https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"],tileSize:256,attribution:"© Esri"}},layers:[{id:"satellite",type:"raster",source:"satellite"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},terrain:{version:8,sources:{terrain:{type:"raster",tiles:["https://a.tile.opentopomap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenTopoMap contributors"}},layers:[{id:"terrain",type:"raster",source:"terrain"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"}};return a[this.mapStyle]||a.streets}async initializeMap(){const a=this.element.querySelector(`#maplibre-${this.id}`);if(!a||!window.maplibregl)return;let t=this.center;!t&&this.markers.length>0&&(t=[this.markers[0].lng,this.markers[0].lat]),t||(t=[0,0]),this.map=new window.maplibregl.Map({container:a,style:this.getMapStyle(),center:t,zoom:this.zoom,pitch:this.pitch,bearing:this.bearing}),this.showNavigationControl&&this.map.addControl(new window.maplibregl.NavigationControl,"top-right"),this.map.on("load",()=>{const a=this.pendingMarkers.length?this.pendingMarkers:this.markers;this.updateMarkers(a),this.lineSources.forEach(a=>this.addLineSource(a)),this.pendingLineData.forEach(a=>this.addLineSource(a)),this.pendingLineData.clear()})}addMarkers(a){this.map&&Array.isArray(a)?a.forEach(a=>{const{lng:t,lat:e,popup:n,color:l,icon:i,size:s}=a;if(!t||!e)return;const r=document.createElement("div");r.className="maplibre-marker";const o=Number(s)||30;r.style.width=`${o}px`,r.style.height=`${o}px`,r.style.borderRadius="50%",r.style.backgroundColor=l||"#3b82f6",r.style.border="3px solid white",r.style.boxShadow="0 2px 4px rgba(0,0,0,0.3)",r.style.cursor="pointer",r.style.display="flex",r.style.alignItems="center",r.style.justifyContent="center",i&&(r.innerHTML=`<i class="${i}" style="color: white;"></i>`);const m=new window.maplibregl.Marker({element:r}).setLngLat([t,e]).addTo(this.map);if(n){const a=new window.maplibregl.Popup({offset:25}).setHTML(n);m.setPopup(a)}this.mapMarkers.push(m)}):this.pendingMarkers=Array.isArray(a)?a:[]}fitBounds(){if(!this.map||0===this.markers.length)return;const a=new window.maplibregl.LngLatBounds;this.markers.forEach(t=>{a.extend([t.lng,t.lat])}),this.map.fitBounds(a,{padding:50,maxZoom:15})}updateMarkers(a){const t=Array.isArray(a)?a:[];this.markers=t,this.pendingMarkers=t,this.map&&(this.clearMarkers(),this.addMarkers(t),this.autoFitBounds&&t.length>1?this.fitBounds():1===t.length&&this.map&&this.map.flyTo({center:[t[0].lng,t[0].lat],zoom:this.zoom}))}clearMarkers(){this.mapMarkers.forEach(a=>{a.remove()}),this.mapMarkers=[]}addLineSource({id:a,data:t,paint:e,layout:n}){if(!a||!t)return;const l=`${a}-source`;this.map?(this.map.getLayer(a)&&this.map.removeLayer(a),this.map.getSource(l)&&this.map.removeSource(l),this.map.addSource(l,{type:"geojson",data:t}),this.map.addLayer({id:a,type:"line",source:l,paint:{"line-color":"#3b82f6","line-width":2,"line-opacity":.6,...e},layout:{"line-cap":"round","line-join":"round",...n}})):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}updateLineSource(a,{data:t,paint:e,layout:n}={}){if(!a||!t)return;const l=`${a}-source`;this.map?this.map.getSource(l)?(this.map.getSource(l).setData(t),(e||n)&&(e&&Object.entries(e).forEach(([t,e])=>{this.map.setPaintProperty(a,t,e)}),n&&Object.entries(n).forEach(([t,e])=>{this.map.setLayoutProperty(a,t,e)}))):this.addLineSource({id:a,data:t,paint:e,layout:n}):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}setView(a,t,e=null){this.map&&this.map.flyTo({center:[a,t],zoom:e||this.zoom})}setZoom(a){this.map&&this.map.setZoom(a)}setPitch(a){this.map&&this.map.setPitch(a)}setBearing(a){this.map&&this.map.setBearing(a)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}}const t={AD:{name:"Andorra",lat:42.54859834854764,lng:1.5802243611232873},AE:{name:"United Arab Emirates",lat:24.18250292309135,lng:54.27920525789581},AF:{name:"Afghanistan",lat:34.13402601376932,lng:66.59216131095278},AG:{name:"Antigua and Barbuda",lat:17.07146759372967,lng:-61.78530823226373},AI:{name:"Anguilla",lat:18.222874004219086,lng:-63.06008343771806},AL:{name:"Albania",lat:41.14165894891656,lng:20.061082767269493},AM:{name:"Armenia",lat:40.17841274230679,lng:45.05490831965259},AO:{name:"Angola",lat:-12.167424062667942,lng:17.651768783079},AQ:{name:"Antarctica",lat:-77.16987521415838,lng:-177.56451613408842},AR:{name:"Argentina",lat:-35.697270518120085,lng:-64.53238503843076},AS:{name:"American Samoa",lat:-14.305711987770538,lng:-170.7007316174498},AT:{name:"Austria",lat:47.631858269895794,lng:13.797778364631036},AU:{name:"Australia",lat:-25.697337673983082,lng:134.02277170916162},AW:{name:"Aruba",lat:12.515625722992898,lng:-69.97564014284046},AZ:{name:"Azerbaijan",lat:40.3920509942049,lng:48.634592670644324},BA:{name:"Bosnia and Herzegovina",lat:44.14415356126429,lng:17.83467240787538},BB:{name:"Barbados",lat:13.183219369337529,lng:-59.557383949150285},BD:{name:"Bangladesh",lat:23.673728665121,lng:90.43212562608613},BE:{name:"Belgium",lat:50.6182138854095,lng:4.675010154696485},BF:{name:"Burkina Faso",lat:12.108709036312737,lng:-1.6932816211842325},BG:{name:"Bulgaria",lat:42.82043677302438,lng:25.251739122561908},BH:{name:"Bahrain",lat:26.04798501537066,lng:50.540695402276775},BI:{name:"Burundi",lat:-3.261251993278643,lng:29.88518227845293},BJ:{name:"Benin",lat:9.503013199615893,lng:2.305714528830206},BL:{name:"Saint Barthelemy",lat:17.90561691241738,lng:-62.83051610005156},BM:{name:"Bermuda",lat:32.315067430740726,lng:-64.7458500599169},BN:{name:"Brunei Darussalam",lat:4.543205889917609,lng:114.6430958360464},BO:{name:"Bolivia",lat:-16.7312488393574,lng:-64.45209597511206},BQ:{name:"Bonaire",lat:12.180844982440338,lng:-68.29350445958761},BQ:{name:"Saba",lat:17.632512616389718,lng:-63.23739481909494},BQ:{name:"Saint Eustatius",lat:17.4919042294197,lng:-62.978230589445026},BR:{name:"Brazil",lat:-11.524630416426652,lng:-54.355206608256424},BS:{name:"Bahamas",lat:24.72162633646784,lng:-78.07275370060313},BT:{name:"Bhutan",lat:27.42163933959824,lng:90.46716647173861},BV:{name:"Bouvet Island",lat:-54.42316679395248,lng:3.411969465057627},BW:{name:"Botswana",lat:-22.236609002062902,lng:23.85779956995608},BY:{name:"Belarus",lat:53.46791374543163,lng:27.964252054715104},BZ:{name:"Belize",lat:17.24252476647155,lng:-88.68273510023441},CA:{name:"Canada",lat:57.550480044655636,lng:-98.41680517868062},CC:{name:"Cocos Islands",lat:-12.171249450199545,lng:96.83688767323002},CD:{name:"Congo DRC",lat:-3.338629596207896,lng:23.419827574282188},CF:{name:"Central African Republic",lat:6.331390033944319,lng:20.520743419397256},CG:{name:"Congo",lat:-.7294391595233845,lng:14.879732849491393},CH:{name:"Switzerland",lat:46.73678128684938,lng:8.286928794895285},CI:{name:"Côte d'Ivoire",lat:7.536779279421307,lng:-5.571710194917734},CK:{name:"Cook Islands",lat:-21.222613253399842,lng:-159.78768870952257},CL:{name:"Chile",lat:-37.82938283049967,lng:-70.76863431739216},CM:{name:"Cameroon",lat:6.294168487480992,lng:12.948474142398263},CN:{name:"China",lat:38.07325481105728,lng:104.69113855849604},CO:{name:"Colombia",lat:4.187753877352739,lng:-72.6445066243485},CR:{name:"Costa Rica",lat:9.863467407406214,lng:-84.14673625701816},CU:{name:"Cuba",lat:21.476176522869448,lng:-79.69817857618705},CV:{name:"Cabo Verde",lat:15.076411518651643,lng:-23.63401005900474},CW:{name:"Curacao",lat:12.199996647939832,lng:-68.96939768599042},CX:{name:"Christmas Island",lat:-10.446440802183416,lng:105.70209512200549},CY:{name:"Cyprus",lat:35.11700416345239,lng:33.375346009199205},CZ:{name:"Czech Republic",lat:49.74917370930982,lng:15.383273292023533},DE:{name:"Germany",lat:51.08304539800482,lng:10.426171427430804},DJ:{name:"Djibouti",lat:11.750235727618804,lng:42.613496898789506},DK:{name:"Denmark",lat:56.00118817971057,lng:9.378670542409406},DM:{name:"Dominica",lat:15.429269860940513,lng:-61.360471946942994},DO:{name:"Dominican Republic",lat:18.77954818522993,lng:-70.43495198520012},DZ:{name:"Algeria",lat:28.350969744889056,lng:2.6558464719769135},EC:{name:"Ecuador",lat:-1.5642721388853116,lng:-78.4630326109714},EE:{name:"Estonia",lat:58.648108311231034,lng:25.916870250633806},EG:{name:"Egypt",lat:26.60517034450628,lng:30.240135435012338},ER:{name:"Eritrea",lat:15.005533147667684,lng:39.2672401449901},ES:{name:"Spain",lat:40.365008336683836,lng:-3.6516251409956983},ES:{name:"Canarias",lat:28.297665106525546,lng:-16.53799441021647},ET:{name:"Ethiopia",lat:8.729389557048396,lng:39.914902886544276},FI:{name:"Finland",lat:65.01578959749911,lng:25.65738433454702},FJ:{name:"Fiji",lat:-17.822470952336204,lng:177.98144613732626},FK:{name:"Falkland Islands",lat:-51.75901312766726,lng:-58.746646363799854},FM:{name:"Micronesia",lat:6.8789448129255435,lng:158.2291899444527},FO:{name:"Faroe Islands",lat:62.130896281495346,lng:-6.9811060913122835},FR:{name:"France",lat:46.6423682169416,lng:2.1940236627886227},GA:{name:"Gabon",lat:-.628448459921234,lng:11.839410898545754},GB:{name:"United Kingdom",lat:53.97844735080214,lng:-2.852943909329258},GD:{name:"Grenada",lat:12.112926656338907,lng:-61.67937937204098},GE:{name:"Georgia",lat:42.17986277737226,lng:43.378866534112234},GF:{name:"French Guiana",lat:3.857429742497078,lng:-53.32232307156624},GG:{name:"Guernsey",lat:49.45870771378872,lng:-2.576392582891568},GH:{name:"Ghana",lat:7.94530467243628,lng:-1.219233362526581},GI:{name:"Gibraltar",lat:36.14022671336082,lng:-5.345549484594358},GL:{name:"Greenland",lat:74.16847218965994,lng:-42.07567788066985},GM:{name:"Gambia",lat:13.428617959189328,lng:-15.383380385869662},GN:{name:"Guinea",lat:10.255986541378112,lng:-10.986948848040218},GP:{name:"Guadeloupe",lat:16.24420002705553,lng:-61.54382262282755},GQ:{name:"Equatorial Guinea",lat:1.5954643936590733,lng:10.425456672353823},GR:{name:"Greece",lat:39.42012261727978,lng:23.110368936161876},GS:{name:"South Georgia and South Sandwich Islands",lat:-54.37666443862139,lng:-36.77509575898928},GT:{name:"Guatemala",lat:15.820878515352684,lng:-90.31219349119617},GU:{name:"Guam",lat:13.445430479945276,lng:144.78024458298802},GW:{name:"Guinea-Bissau",lat:11.980075324820504,lng:-14.980186756910847},GY:{name:"Guyana",lat:4.68211981385056,lng:-58.91352612754667},HM:{name:"Heard Island and McDonald Islands",lat:-53.084170035513736,lng:73.49298560844045},HN:{name:"Honduras",lat:14.740370695750006,lng:-86.49251679006962},HR:{name:"Croatia",lat:44.91192100856702,lng:16.625761129583374},HT:{name:"Haiti",lat:18.883520486983567,lng:-72.89291379842},HU:{name:"Hungary",lat:47.22527332486294,lng:19.39620048366142},ID:{name:"Indonesia",lat:.15591979959037652,lng:113.96538246847302},IE:{name:"Ireland",lat:53.30489539816495,lng:-8.241128545554096},IL:{name:"Israel",lat:31.513542220043195,lng:35.027923472437024},IM:{name:"Isle of Man",lat:54.22855301008011,lng:-4.532995055468449},IN:{name:"India",lat:23.586300567746722,lng:81.17300408530181},IO:{name:"British Indian Ocean Territory",lat:-7.323548444385743,lng:72.43501618476016},IQ:{name:"Iraq",lat:33.105075667527906,lng:43.832529181056884},IR:{name:"Iran",lat:32.906023742890056,lng:54.237077001065444},IS:{name:"Iceland",lat:65.12360920205514,lng:-19.05682967106099},IT:{name:"Italy",lat:42.98201127614267,lng:12.763657166123137},JE:{name:"Jersey",lat:49.215396925724306,lng:-2.1291601162653575},JM:{name:"Jamaica",lat:18.12207889341651,lng:-77.30358894542778},JO:{name:"Jordan",lat:31.387064884449156,lng:36.95728884547246},JP:{name:"Japan",lat:36.76738832597829,lng:137.46934234351835},KE:{name:"Kenya",lat:.6899182318376179,lng:37.95309411262371},KG:{name:"Kyrgyzstan",lat:41.35698905438358,lng:74.17532903468319},KH:{name:"Cambodia",lat:12.699186865507775,lng:105.03973078680701},KI:{name:"Kiribati",lat:1.8676673749241066,lng:-157.39024189323504},KM:{name:"Comoros",lat:-11.658861474508491,lng:43.34826587429403},KN:{name:"Saint Kitts and Nevis",lat:17.314736299587768,lng:-62.74560385895787},KP:{name:"North Korea",lat:40.19198091470839,lng:127.3379805653744},KR:{name:"South Korea",lat:36.402386712544114,lng:127.76224551357649},KW:{name:"Kuwait",lat:29.281360965443092,lng:47.56311109320184},KY:{name:"Cayman Islands",lat:19.311231805620288,lng:-81.25203208977878},KZ:{name:"Kazakhstan",lat:47.641465195176835,lng:66.3759193479301},LA:{name:"Laos",lat:18.117282736873282,lng:103.76375899026448},LB:{name:"Lebanon",lat:33.91160170722086,lng:35.89651946324749},LC:{name:"Saint Lucia",lat:13.895749185129906,lng:-60.9689510935251},LI:{name:"Liechtenstein",lat:47.14627562133036,lng:9.547674672376376},LK:{name:"Sri Lanka",lat:7.696630939329944,lng:80.66931169770622},LR:{name:"Liberia",lat:6.52012979398834,lng:-9.258988935497618},LS:{name:"Lesotho",lat:-29.60168116924817,lng:28.24475317864227},LT:{name:"Lithuania",lat:55.29437393417175,lng:23.946021605013534},LU:{name:"Luxembourg",lat:49.77523454542369,lng:6.103230338458876},LV:{name:"Latvia",lat:56.813853047554154,lng:24.693671325654403},LY:{name:"Libya",lat:27.202915771690794,lng:17.91133392454237},MA:{name:"Morocco",lat:28.687598134979325,lng:-8.817212587250811},MC:{name:"Monaco",lat:43.74798224995656,lng:7.412820873271196},MD:{name:"Moldova",lat:47.0725674580696,lng:28.391111865941348},ME:{name:"Montenegro",lat:42.73694835210454,lng:19.29505087156758},MF:{name:"Saint Martin",lat:18.078012113224464,lng:-63.06678525361946},MG:{name:"Madagascar",lat:-19.04163612493041,lng:46.68493466832544},MH:{name:"Marshall Islands",lat:7.307929900994344,lng:168.72016025351076},MK:{name:"North Macedonia",lat:41.59402890143112,lng:21.70998923872772},ML:{name:"Mali",lat:17.168146208584837,lng:-4.346399841781153},MM:{name:"Myanmar",lat:19.901227931399873,lng:97.08892285397344},MN:{name:"Mongolia",lat:47.08644454604851,lng:103.3987360327455},MP:{name:"Northern Mariana Islands",lat:15.178063516432115,lng:145.74119737203134},MQ:{name:"Martinique",lat:14.642697353597645,lng:-61.01432380875083},MR:{name:"Mauritania",lat:20.466731212820022,lng:-10.495079045035716},MS:{name:"Montserrat",lat:16.735363391460357,lng:-62.18693281256255},MT:{name:"Malta",lat:35.890522650899314,lng:14.441922442508494},MU:{name:"Mauritius",lat:-20.28142317475198,lng:57.56415671066546},MV:{name:"Maldives",lat:-.6065577168009924,lng:73.10076245140479},MW:{name:"Malawi",lat:-13.128986464184024,lng:34.23441182298881},MX:{name:"Mexico",lat:23.87436068093592,lng:-101.55399731630118},MY:{name:"Malaysia",lat:3.6716608556387857,lng:114.63330303992869},MZ:{name:"Mozambique",lat:-17.525230309488748,lng:35.208577031290176},NA:{name:"Namibia",lat:-21.90858163281473,lng:18.16451345845268},NC:{name:"New Caledonia",lat:-21.33003372660827,lng:165.50767040438612},NE:{name:"Niger",lat:17.08105392407292,lng:8.86863247002646},NF:{name:"Norfolk Island",lat:-29.037654445046282,lng:167.95259597483337},NG:{name:"Nigeria",lat:9.61029352034213,lng:8.147714845256194},NI:{name:"Nicaragua",lat:12.893566631930554,lng:-85.016088327669},NL:{name:"Netherlands",lat:52.134054128923886,lng:5.554136426128487},NO:{name:"Norway",lat:64.97775882947745,lng:16.670259272390894},NP:{name:"Nepal",lat:28.300920699755657,lng:84.1338898313567},NR:{name:"Nauru",lat:-.5221021440668993,lng:166.92937633139178},NU:{name:"Niue",lat:-19.05230921680393,lng:-169.86878106699083},NZ:{name:"New Zealand",lat:-43.82765432544426,lng:170.69035541428696},OM:{name:"Oman",lat:20.7242833183209,lng:55.841088119829},PA:{name:"Panama",lat:8.439536749576892,lng:-80.14428761482796},PE:{name:"Peru",lat:-8.522717984240291,lng:-74.11416196781884},PF:{name:"French Polynesia",lat:-17.674684080120677,lng:-149.40041671099763},PG:{name:"Papua New Guinea",lat:-7.156912819152135,lng:144.8348942994695},PH:{name:"Philippines",lat:15.586542251094242,lng:121.82208941416745},PK:{name:"Pakistan",lat:30.116188371410882,lng:69.08835090769651},PL:{name:"Poland",lat:52.06848055692473,lng:19.43573279234468},PM:{name:"Saint Pierre and Miquelon",lat:46.95153913615198,lng:-56.32465353437558},PN:{name:"Pitcairn",lat:-24.366121747565458,lng:-128.3149848627581},PR:{name:"Puerto Rico",lat:18.216224086610914,lng:-66.49425339593509},PS:{name:"Palestinian Territory",lat:31.930818736453883,lng:35.24251184154588},PT:{name:"Portugal",lat:39.67529214702138,lng:-7.933662183874006},PW:{name:"Palau",lat:7.534775852547396,lng:134.57965086721052},PY:{name:"Paraguay",lat:-23.42190559259428,lng:-58.38906357428651},QA:{name:"Qatar",lat:25.318528486425386,lng:51.19794918743203},RE:{name:"Réunion",lat:-21.119825460665105,lng:55.54393506194689},RO:{name:"Romania",lat:45.82454894397586,lng:25.094158201563292},RS:{name:"Serbia",lat:44.02679870131969,lng:20.85677444395745},RU:{name:"Russian Federation",lat:59.039434214106194,lng:98.6704990698032},RW:{name:"Rwanda",lat:-2.014687460047154,lng:29.919439681764082},SA:{name:"Saudi Arabia",lat:24.136038144757897,lng:44.600958178225596},SB:{name:"Solomon Islands",lat:-9.613104734596515,lng:160.16475795033884},SC:{name:"Seychelles",lat:-4.660002318822744,lng:55.47250789595527},SD:{name:"Sudan",lat:15.67060230984256,lng:29.951458283594064},SE:{name:"Sweden",lat:62.73420986108448,lng:17.062431988004956},SG:{name:"Singapore",lat:1.3528251890006349,lng:103.81025757634053},SH:{name:"Saint Helena",lat:-15.962963318340398,lng:-5.717391620813109},SI:{name:"Slovenia",lat:46.13759229564504,lng:14.890636899973781},SJ:{name:"Svalbard",lat:78.57318936469626,lng:16.036378851505283},SK:{name:"Slovakia",lat:48.69808390520484,lng:19.581015362490966},SL:{name:"Sierra Leone",lat:8.561330384750587,lng:-11.78656695731115},SM:{name:"San Marino",lat:43.942820729097896,lng:12.461278349581722},SN:{name:"Senegal",lat:14.228861491763402,lng:-14.610875368352305},SO:{name:"Somalia",lat:6.524534573103924,lng:45.40037867243972},SR:{name:"Suriname",lat:4.098723595920171,lng:-55.855514311561286},SS:{name:"South Sudan",lat:7.657782041763295,lng:30.3851856901788},ST:{name:"Sao Tome and Principe",lat:.22744704294793774,lng:6.606158796857607},SV:{name:"El Salvador",lat:13.758041517055418,lng:-88.85911489238985},SX:{name:"Sint Maarten",lat:18.03942608463078,lng:-63.06883135915303},SY:{name:"Syria",lat:35.09751106058316,lng:38.5117323139514},SZ:{name:"Eswatini",lat:-26.562540935608702,lng:31.510685746082007},TC:{name:"Turks and Caicos Islands",lat:21.799865427483745,lng:-71.74058946811508},TD:{name:"Chad",lat:15.283493546654503,lng:18.427113900363025},TF:{name:"Juan De Nova Island",lat:-17.06449193630804,lng:42.74374761089645},TF:{name:"French Southern Territories",lat:-49.26329687105643,lng:69.54686984724839},TF:{name:"Glorioso Islands",lat:-11.566224871643417,lng:47.290948081543384},TG:{name:"Togo",lat:8.660743037717811,lng:.8990857571109684},TH:{name:"Thailand",lat:13.66222784745538,lng:101.08675116214552},TJ:{name:"Tajikistan",lat:38.56933138382972,lng:70.94215281065698},TK:{name:"Tokelau",lat:-9.195174767256544,lng:-171.85265950722743},TL:{name:"Timor-Leste",lat:-8.809894630601962,lng:125.95024049562659},TM:{name:"Turkmenistan",lat:39.06069118001429,lng:58.4577357627054},TN:{name:"Tunisia",lat:34.08636179565723,lng:9.65587551697984},TO:{name:"Tonga",lat:-21.15927212823853,lng:-175.20415878511247},TR:{name:"Turkey",lat:38.93207363123396,lng:35.56886764076691},TT:{name:"Trinidad and Tobago",lat:10.415515638298093,lng:-61.37236579976247},TV:{name:"Tuvalu",lat:-8.514701506447222,lng:179.217833977593},TZ:{name:"Tanzania",lat:-6.355794440041147,lng:34.81832206060381},UA:{name:"Ukraine",lat:48.657532515563794,lng:31.27377208442636},UG:{name:"Uganda",lat:1.2821729218416205,lng:32.34371768463123},UM:{name:"United States Minor Outlying Islands",lat:19.302045812215958,lng:166.63800339749642},US:{name:"United States",lat:38.8208089190304,lng:-96.33161660829639},UY:{name:"Uruguay",lat:-32.78195043831093,lng:-56.01919523458085},UZ:{name:"Uzbekistan",lat:41.4879065244633,lng:63.8548297593985},VA:{name:"Vatican City",lat:41.90402351316735,lng:12.451312917026133},VC:{name:"Saint Vincent and the Grenadines",lat:13.254808122970651,lng:-61.193766354393034},VE:{name:"Venezuela",lat:7.148324760507107,lng:-66.36492135985132},VG:{name:"British Virgin Islands",lat:18.42195819619707,lng:-64.62406519257699},VI:{name:"US Virgin Islands",lat:17.738009708772523,lng:-64.76155341409797},VN:{name:"Vietnam",lat:16.517347170839393,lng:105.91338832758704},VU:{name:"Vanuatu",lat:-15.189132121699332,lng:166.84912735669738},WF:{name:"Wallis and Futuna",lat:-14.283442307826677,lng:-178.12735555777184},WS:{name:"Samoa",lat:-13.634252953274622,lng:-172.44107655740137},YE:{name:"Yemen",lat:16.001392616307445,lng:47.46815793206386},YT:{name:"Mayotte",lat:-12.824468416301052,lng:45.128142327031064},ZA:{name:"South Africa",lat:-28.55361930679731,lng:24.75252746489084},ZM:{name:"Zambia",lat:-13.162832953186246,lng:27.75521363430896},ZW:{name:"Zimbabwe",lat:-18.92700121981475,lng:29.717829640720844}};class MetricsCountryMapView extends a.View{constructor(a={}){const t=a.height||320;super({className:"metrics-country-map-view",...a}),this.endpoint=a.endpoint||"/api/metrics/fetch",this.account=a.account||"global",this.category=a.category||null,this.slugs=a.slugs||null,this.granularity=a.granularity||"days",this.maxCountries=a.maxCountries||12,this.metricLabel=a.metricLabel||"Events",this.height=t,this.mapStyle=a.mapStyle||"dark",this.mapOptions=a.mapOptions||{},this.showRoutes=!1!==a.showRoutes,this.routeOrigin=a.routeOrigin||{lng:-77.346,lat:38.958,name:"Reston, VA"},this._refreshing=!1}async getTemplate(){return`\n <div class="metrics-country-map">\n <div class="map-container mb-3" data-container="${this.id}-map" style="height:${this.height}px"></div>\n <div class="map-legend small" data-region="legend"></div>\n </div>\n `}async onInit(){this.statusEl=document.createElement("div"),this.statusEl.className="text-muted small px-3 pb-2",this.element.appendChild(this.statusEl),this.mapView=new MapLibreView({containerId:`${this.id}-map`,height:this.height,style:this.mapStyle,zoom:this.mapOptions.zoom??1.3,center:this.mapOptions.center||[10,20],pitch:this.mapOptions.pitch??20,bearing:this.mapOptions.bearing??0,showNavigationControl:this.mapOptions.showNavigationControl??!0,autoFitBounds:this.mapOptions.autoFitBounds??!1}),this.addChild(this.mapView),await this.refresh()}async refresh(){if(!this._refreshing){this._refreshing=!0,this.setStatus("Loading hotspots…");try{const a=await this.fetchMetrics();await this.applyMetrics(a),this.setStatus("")}catch(a){console.error("MetricsCountryMapView refresh error",a),this.setStatus("Unable to load country metrics.")}finally{this._refreshing=!1}}}async fetchMetrics(){const a=this.getApp()?.rest;if(!a)throw new Error("REST client unavailable");const t={account:this.account,granularity:this.granularity,with_labels:!0};if(this.category&&(t.category=this.category),this.slugs){const a=Array.isArray(this.slugs)?this.slugs:[this.slugs];t["slugs[]"]=a}const e=await a.GET(this.endpoint,t);if(!e.success||!e.data?.status)throw new Error(e.data?.error||"Metrics API error");return e.data.data}async applyMetrics(a){const e=a?.data||{},n=a?.labels||[],l=[];if(Object.entries(e).forEach(([a,e])=>{const n=e.reduce((a,t)=>a+(Number(t)||0),0);if(!n)return;const i=t[a.toUpperCase()];i&&l.push({code:a.toUpperCase(),total:n,values:e,centroid:i})}),!l.length)return this.mapView.updateMarkers([]),this.renderLegend([]),void this.setStatus("No country data available for the selected range.");l.sort((a,t)=>t.total-a.total);const i=l.slice(0,this.maxCountries),s=i[0]?.total||1,r=i.map(a=>{const t=a.total/s,e=Math.round(18+24*t);return{lng:a.centroid.lng,lat:a.centroid.lat,size:e,color:this.getMarkerColor(t),popup:`\n <div class="text-center">\n <strong>${a.centroid.name}</strong><br/>\n <span class="text-muted">${a.total.toLocaleString()} ${this.metricLabel}</span>\n </div>\n `}});this.showRoutes&&this.routeOrigin?.lng&&this.routeOrigin?.lat&&r.push({lng:this.routeOrigin.lng,lat:this.routeOrigin.lat,size:26,color:"#0d6efd",icon:"bi bi-broadcast-pin",popup:`\n <div class="text-center">\n <strong>${this.routeOrigin.name||"Operations Hub"}</strong><br/>\n <span class="text-muted">Origin</span>\n </div>\n `}),this.mapView.updateMarkers(r),this.renderLegend(i,n),this.showRoutes&&this.renderRoutes(i,s)}getMarkerColor(a){const t=[255,193,7],e=[32,201,151].map((e,n)=>Math.round(e+(t[n]-e)*a));return`rgba(${e[0]}, ${e[1]}, ${e[2]}, 0.9)`}renderLegend(a){const t=this.element.querySelector('[data-region="legend"]');if(!t)return;if(!a.length)return void(t.innerHTML="");const e=a[0]?.total||1,n=a.map(a=>{const t=(a.total/e*100).toFixed(0);return`\n <div class="d-flex justify-content-between align-items-center py-1 border-top">\n <div>\n <span class="fw-semibold">${a.centroid.name}</span>\n <span class="text-muted ms-1">(${a.code})</span>\n </div>\n <div class="text-end">\n <div class="fw-semibold">${a.total.toLocaleString()}</div>\n <small class="text-muted">${t}% of top</small>\n </div>\n </div>\n `}).join("");t.innerHTML=n}renderRoutes(a,t){const e=this.routeOrigin||null;if(!(e&&e.lng&&e.lat&&this.mapView))return;const n={type:"FeatureCollection",features:a.map(a=>({type:"Feature",geometry:{type:"LineString",coordinates:[[e.lng,e.lat],[a.centroid.lng,a.centroid.lat]]},properties:{total:a.total,intensity:a.total/t}}))};this.mapView.lineSources=this.mapView.lineSources.filter(a=>a.id!==`${this.id}-routes`),this.mapView.updateLineSource(`${this.id}-routes`,{data:n,paint:{"line-color":["interpolate",["linear"],["get","intensity"],0,"rgba(32, 201, 151, 0.6)",1,"rgba(255, 193, 7, 0.95)"],"line-width":["interpolate",["linear"],["get","intensity"],0,1.75,1,6],"line-opacity":["interpolate",["linear"],["get","intensity"],0,.45,1,.95]}})}setStatus(a){this.statusEl&&(this.statusEl.textContent=a||"",this.statusEl.style.display=a?"block":"none")}}exports.MapLibreView=MapLibreView,exports.MapView=MapView,exports.MetricsCountryMapView=MetricsCountryMapView;
|
|
2
|
-
//# sourceMappingURL=MetricsCountryMapView-DDdDJQFA.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{V as a}from"./Collection-r1ACzUeh.js";class MapView extends a{constructor(a={}){super({className:"map-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.showZoomControl=!1!==a.showZoomControl,this.tileLayer=a.tileLayer||"osm",this.showLeafletBranding=!0===a.showLeafletBranding,this.showLayerControl=!0===a.showLayerControl,this.layerOptions=a.layerOptions||{osm:"OSM",satellite:"Satellite",terrain:"Terrain",dark:"Dark",light:"Light",watercolor:"Watercolor",bw:"B/W",streets:"Streets"},this.map=null,this.leafletMarkers=[],this._tileLayer=null,this.template='\n <div class="map-container">\n <div id="map-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadLeaflet(),await this.initializeMap()}async loadLeaflet(){if(window.L)return;const a=new Promise(a=>{const t=document.createElement("link");t.rel="stylesheet",t.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",t.onload=a,t.onerror=a,document.head.appendChild(t)}),t=new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",e.onload=a,e.onerror=t,document.head.appendChild(e)});await Promise.all([a,t])}getTileLayerUrl(){const a={osm:{url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",attribution:"© OpenStreetMap contributors",maxZoom:19},satellite:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attribution:"© Esri",maxZoom:19},terrain:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",attribution:"© OpenTopoMap contributors",maxZoom:17},dark:{url:"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},light:{url:"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},watercolor:{url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg",attribution:"© Stadia Maps © Stamen Design © OpenStreetMap contributors",maxZoom:16},bw:{url:"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},streets:{url:"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20}};return a[this.tileLayer]||a.osm}async initializeMap(){const a=this.element.querySelector(`#map-${this.id}`);if(!a||!window.L)return;let t=this.center;if(!t&&this.markers.length>0&&(t=[this.markers[0].lat,this.markers[0].lng]),t||(t=[0,0]),this.map=window.L.map(a,{center:t,zoom:this.zoom,zoomControl:this.showZoomControl}),this.map&&this.map.attributionControl&&!1===this.showLeafletBranding)try{this.map.attributionControl.setPrefix("")}catch(n){}const e=this.getTileLayerUrl();if(this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.showLayerControl){const t=a.parentElement||this.element.querySelector(".map-container");if(t){t.style.position=t.style.position||"relative";const a=document.createElement("select");a.className="form-select form-select-sm",a.style.position="absolute",a.style.top="8px",a.style.right="8px",a.style.zIndex="1000",a.style.maxWidth="180px",a.setAttribute("aria-label","Map tile layer"),Object.entries(this.layerOptions||{}).forEach(([t,e])=>{const n=document.createElement("option");n.value=t,n.textContent=e,t===this.tileLayer&&(n.selected=!0),a.appendChild(n)}),a.addEventListener("change",()=>this.setTileLayer(a.value)),t.appendChild(a)}}this.addMarkers(this.markers),this.markers.length>1&&this.fitBounds(),setTimeout(()=>{this.map&&this.map.invalidateSize()},300)}addMarkers(a){this.map&&Array.isArray(a)&&a.forEach(a=>{const{lat:t,lng:e,popup:n,icon:l}=a;if(!t||!e)return;const i={};l&&(i.icon=window.L.icon(l));const s=window.L.marker([t,e],i).addTo(this.map);n&&s.bindPopup(n),this.leafletMarkers.push(s)})}fitBounds(){if(!this.map||0===this.leafletMarkers.length)return;const a=new window.L.featureGroup(this.leafletMarkers);this.map.fitBounds(a.getBounds().pad(.1))}updateMarkers(a){this.clearMarkers(),this.markers=a,this.addMarkers(a),a.length>1?this.fitBounds():1===a.length&&this.map.setView([a[0].lat,a[0].lng],this.zoom)}clearMarkers(){this.leafletMarkers.forEach(a=>{this.map.removeLayer(a)}),this.leafletMarkers=[]}setView(a,t,e=null){this.map&&this.map.setView([a,t],e||this.zoom)}setZoom(a){this.map&&this.map.setZoom(a)}setTileLayer(a){if(!this.map)return;const t=this.tileLayer;this.tileLayer=a||this.tileLayer;const e=this.getTileLayerUrl();try{this._tileLayer&&this.map.removeLayer(this._tileLayer)}catch(n){}this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.tileLayer=a||t,setTimeout(()=>{try{this.map.invalidateSize()}catch(n){}},150)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}static async showAsDialog(a={}){const t=new MapView(a),e={title:"Map View",header:!0,body:t,size:"lg",centered:!1,...a.dialogOptions||{}};await t.init(),await t.getApp().showDialog(e)}}class MapLibreView extends a{constructor(a={}){super({className:"maplibre-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.pitch=a.pitch||0,this.bearing=a.bearing||0,this.mapStyle=a.style||"streets",this.showNavigationControl=!1!==a.showNavigationControl,this.autoFitBounds=!1!==a.autoFitBounds,this.map=null,this.mapMarkers=[],this.pendingMarkers=[...this.markers],this.lineSources=a.lineSources||[],this.pendingLineData=/* @__PURE__ */new Map,this.template='\n <div class="maplibre-container">\n <div id="maplibre-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadMapLibre(),await this.initializeMap()}async loadMapLibre(){if(window.maplibregl)return;const a=document.createElement("link");return a.rel="stylesheet",a.href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css",document.head.appendChild(a),new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js",e.onload=a,e.onerror=t,document.head.appendChild(e)})}getMapStyle(){const a={streets:"https://demotiles.maplibre.org/style.json",dark:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},light:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},satellite:{version:8,sources:{satellite:{type:"raster",tiles:["https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"],tileSize:256,attribution:"© Esri"}},layers:[{id:"satellite",type:"raster",source:"satellite"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},terrain:{version:8,sources:{terrain:{type:"raster",tiles:["https://a.tile.opentopomap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenTopoMap contributors"}},layers:[{id:"terrain",type:"raster",source:"terrain"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"}};return a[this.mapStyle]||a.streets}async initializeMap(){const a=this.element.querySelector(`#maplibre-${this.id}`);if(!a||!window.maplibregl)return;let t=this.center;!t&&this.markers.length>0&&(t=[this.markers[0].lng,this.markers[0].lat]),t||(t=[0,0]),this.map=new window.maplibregl.Map({container:a,style:this.getMapStyle(),center:t,zoom:this.zoom,pitch:this.pitch,bearing:this.bearing}),this.showNavigationControl&&this.map.addControl(new window.maplibregl.NavigationControl,"top-right"),this.map.on("load",()=>{const a=this.pendingMarkers.length?this.pendingMarkers:this.markers;this.updateMarkers(a),this.lineSources.forEach(a=>this.addLineSource(a)),this.pendingLineData.forEach(a=>this.addLineSource(a)),this.pendingLineData.clear()})}addMarkers(a){this.map&&Array.isArray(a)?a.forEach(a=>{const{lng:t,lat:e,popup:n,color:l,icon:i,size:s}=a;if(!t||!e)return;const r=document.createElement("div");r.className="maplibre-marker";const o=Number(s)||30;r.style.width=`${o}px`,r.style.height=`${o}px`,r.style.borderRadius="50%",r.style.backgroundColor=l||"#3b82f6",r.style.border="3px solid white",r.style.boxShadow="0 2px 4px rgba(0,0,0,0.3)",r.style.cursor="pointer",r.style.display="flex",r.style.alignItems="center",r.style.justifyContent="center",i&&(r.innerHTML=`<i class="${i}" style="color: white;"></i>`);const m=new window.maplibregl.Marker({element:r}).setLngLat([t,e]).addTo(this.map);if(n){const a=new window.maplibregl.Popup({offset:25}).setHTML(n);m.setPopup(a)}this.mapMarkers.push(m)}):this.pendingMarkers=Array.isArray(a)?a:[]}fitBounds(){if(!this.map||0===this.markers.length)return;const a=new window.maplibregl.LngLatBounds;this.markers.forEach(t=>{a.extend([t.lng,t.lat])}),this.map.fitBounds(a,{padding:50,maxZoom:15})}updateMarkers(a){const t=Array.isArray(a)?a:[];this.markers=t,this.pendingMarkers=t,this.map&&(this.clearMarkers(),this.addMarkers(t),this.autoFitBounds&&t.length>1?this.fitBounds():1===t.length&&this.map&&this.map.flyTo({center:[t[0].lng,t[0].lat],zoom:this.zoom}))}clearMarkers(){this.mapMarkers.forEach(a=>{a.remove()}),this.mapMarkers=[]}addLineSource({id:a,data:t,paint:e,layout:n}){if(!a||!t)return;const l=`${a}-source`;this.map?(this.map.getLayer(a)&&this.map.removeLayer(a),this.map.getSource(l)&&this.map.removeSource(l),this.map.addSource(l,{type:"geojson",data:t}),this.map.addLayer({id:a,type:"line",source:l,paint:{"line-color":"#3b82f6","line-width":2,"line-opacity":.6,...e},layout:{"line-cap":"round","line-join":"round",...n}})):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}updateLineSource(a,{data:t,paint:e,layout:n}={}){if(!a||!t)return;const l=`${a}-source`;this.map?this.map.getSource(l)?(this.map.getSource(l).setData(t),(e||n)&&(e&&Object.entries(e).forEach(([t,e])=>{this.map.setPaintProperty(a,t,e)}),n&&Object.entries(n).forEach(([t,e])=>{this.map.setLayoutProperty(a,t,e)}))):this.addLineSource({id:a,data:t,paint:e,layout:n}):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}setView(a,t,e=null){this.map&&this.map.flyTo({center:[a,t],zoom:e||this.zoom})}setZoom(a){this.map&&this.map.setZoom(a)}setPitch(a){this.map&&this.map.setPitch(a)}setBearing(a){this.map&&this.map.setBearing(a)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}}const t={AD:{name:"Andorra",lat:42.54859834854764,lng:1.5802243611232873},AE:{name:"United Arab Emirates",lat:24.18250292309135,lng:54.27920525789581},AF:{name:"Afghanistan",lat:34.13402601376932,lng:66.59216131095278},AG:{name:"Antigua and Barbuda",lat:17.07146759372967,lng:-61.78530823226373},AI:{name:"Anguilla",lat:18.222874004219086,lng:-63.06008343771806},AL:{name:"Albania",lat:41.14165894891656,lng:20.061082767269493},AM:{name:"Armenia",lat:40.17841274230679,lng:45.05490831965259},AO:{name:"Angola",lat:-12.167424062667942,lng:17.651768783079},AQ:{name:"Antarctica",lat:-77.16987521415838,lng:-177.56451613408842},AR:{name:"Argentina",lat:-35.697270518120085,lng:-64.53238503843076},AS:{name:"American Samoa",lat:-14.305711987770538,lng:-170.7007316174498},AT:{name:"Austria",lat:47.631858269895794,lng:13.797778364631036},AU:{name:"Australia",lat:-25.697337673983082,lng:134.02277170916162},AW:{name:"Aruba",lat:12.515625722992898,lng:-69.97564014284046},AZ:{name:"Azerbaijan",lat:40.3920509942049,lng:48.634592670644324},BA:{name:"Bosnia and Herzegovina",lat:44.14415356126429,lng:17.83467240787538},BB:{name:"Barbados",lat:13.183219369337529,lng:-59.557383949150285},BD:{name:"Bangladesh",lat:23.673728665121,lng:90.43212562608613},BE:{name:"Belgium",lat:50.6182138854095,lng:4.675010154696485},BF:{name:"Burkina Faso",lat:12.108709036312737,lng:-1.6932816211842325},BG:{name:"Bulgaria",lat:42.82043677302438,lng:25.251739122561908},BH:{name:"Bahrain",lat:26.04798501537066,lng:50.540695402276775},BI:{name:"Burundi",lat:-3.261251993278643,lng:29.88518227845293},BJ:{name:"Benin",lat:9.503013199615893,lng:2.305714528830206},BL:{name:"Saint Barthelemy",lat:17.90561691241738,lng:-62.83051610005156},BM:{name:"Bermuda",lat:32.315067430740726,lng:-64.7458500599169},BN:{name:"Brunei Darussalam",lat:4.543205889917609,lng:114.6430958360464},BO:{name:"Bolivia",lat:-16.7312488393574,lng:-64.45209597511206},BQ:{name:"Bonaire",lat:12.180844982440338,lng:-68.29350445958761},BQ:{name:"Saba",lat:17.632512616389718,lng:-63.23739481909494},BQ:{name:"Saint Eustatius",lat:17.4919042294197,lng:-62.978230589445026},BR:{name:"Brazil",lat:-11.524630416426652,lng:-54.355206608256424},BS:{name:"Bahamas",lat:24.72162633646784,lng:-78.07275370060313},BT:{name:"Bhutan",lat:27.42163933959824,lng:90.46716647173861},BV:{name:"Bouvet Island",lat:-54.42316679395248,lng:3.411969465057627},BW:{name:"Botswana",lat:-22.236609002062902,lng:23.85779956995608},BY:{name:"Belarus",lat:53.46791374543163,lng:27.964252054715104},BZ:{name:"Belize",lat:17.24252476647155,lng:-88.68273510023441},CA:{name:"Canada",lat:57.550480044655636,lng:-98.41680517868062},CC:{name:"Cocos Islands",lat:-12.171249450199545,lng:96.83688767323002},CD:{name:"Congo DRC",lat:-3.338629596207896,lng:23.419827574282188},CF:{name:"Central African Republic",lat:6.331390033944319,lng:20.520743419397256},CG:{name:"Congo",lat:-.7294391595233845,lng:14.879732849491393},CH:{name:"Switzerland",lat:46.73678128684938,lng:8.286928794895285},CI:{name:"Côte d'Ivoire",lat:7.536779279421307,lng:-5.571710194917734},CK:{name:"Cook Islands",lat:-21.222613253399842,lng:-159.78768870952257},CL:{name:"Chile",lat:-37.82938283049967,lng:-70.76863431739216},CM:{name:"Cameroon",lat:6.294168487480992,lng:12.948474142398263},CN:{name:"China",lat:38.07325481105728,lng:104.69113855849604},CO:{name:"Colombia",lat:4.187753877352739,lng:-72.6445066243485},CR:{name:"Costa Rica",lat:9.863467407406214,lng:-84.14673625701816},CU:{name:"Cuba",lat:21.476176522869448,lng:-79.69817857618705},CV:{name:"Cabo Verde",lat:15.076411518651643,lng:-23.63401005900474},CW:{name:"Curacao",lat:12.199996647939832,lng:-68.96939768599042},CX:{name:"Christmas Island",lat:-10.446440802183416,lng:105.70209512200549},CY:{name:"Cyprus",lat:35.11700416345239,lng:33.375346009199205},CZ:{name:"Czech Republic",lat:49.74917370930982,lng:15.383273292023533},DE:{name:"Germany",lat:51.08304539800482,lng:10.426171427430804},DJ:{name:"Djibouti",lat:11.750235727618804,lng:42.613496898789506},DK:{name:"Denmark",lat:56.00118817971057,lng:9.378670542409406},DM:{name:"Dominica",lat:15.429269860940513,lng:-61.360471946942994},DO:{name:"Dominican Republic",lat:18.77954818522993,lng:-70.43495198520012},DZ:{name:"Algeria",lat:28.350969744889056,lng:2.6558464719769135},EC:{name:"Ecuador",lat:-1.5642721388853116,lng:-78.4630326109714},EE:{name:"Estonia",lat:58.648108311231034,lng:25.916870250633806},EG:{name:"Egypt",lat:26.60517034450628,lng:30.240135435012338},ER:{name:"Eritrea",lat:15.005533147667684,lng:39.2672401449901},ES:{name:"Spain",lat:40.365008336683836,lng:-3.6516251409956983},ES:{name:"Canarias",lat:28.297665106525546,lng:-16.53799441021647},ET:{name:"Ethiopia",lat:8.729389557048396,lng:39.914902886544276},FI:{name:"Finland",lat:65.01578959749911,lng:25.65738433454702},FJ:{name:"Fiji",lat:-17.822470952336204,lng:177.98144613732626},FK:{name:"Falkland Islands",lat:-51.75901312766726,lng:-58.746646363799854},FM:{name:"Micronesia",lat:6.8789448129255435,lng:158.2291899444527},FO:{name:"Faroe Islands",lat:62.130896281495346,lng:-6.9811060913122835},FR:{name:"France",lat:46.6423682169416,lng:2.1940236627886227},GA:{name:"Gabon",lat:-.628448459921234,lng:11.839410898545754},GB:{name:"United Kingdom",lat:53.97844735080214,lng:-2.852943909329258},GD:{name:"Grenada",lat:12.112926656338907,lng:-61.67937937204098},GE:{name:"Georgia",lat:42.17986277737226,lng:43.378866534112234},GF:{name:"French Guiana",lat:3.857429742497078,lng:-53.32232307156624},GG:{name:"Guernsey",lat:49.45870771378872,lng:-2.576392582891568},GH:{name:"Ghana",lat:7.94530467243628,lng:-1.219233362526581},GI:{name:"Gibraltar",lat:36.14022671336082,lng:-5.345549484594358},GL:{name:"Greenland",lat:74.16847218965994,lng:-42.07567788066985},GM:{name:"Gambia",lat:13.428617959189328,lng:-15.383380385869662},GN:{name:"Guinea",lat:10.255986541378112,lng:-10.986948848040218},GP:{name:"Guadeloupe",lat:16.24420002705553,lng:-61.54382262282755},GQ:{name:"Equatorial Guinea",lat:1.5954643936590733,lng:10.425456672353823},GR:{name:"Greece",lat:39.42012261727978,lng:23.110368936161876},GS:{name:"South Georgia and South Sandwich Islands",lat:-54.37666443862139,lng:-36.77509575898928},GT:{name:"Guatemala",lat:15.820878515352684,lng:-90.31219349119617},GU:{name:"Guam",lat:13.445430479945276,lng:144.78024458298802},GW:{name:"Guinea-Bissau",lat:11.980075324820504,lng:-14.980186756910847},GY:{name:"Guyana",lat:4.68211981385056,lng:-58.91352612754667},HM:{name:"Heard Island and McDonald Islands",lat:-53.084170035513736,lng:73.49298560844045},HN:{name:"Honduras",lat:14.740370695750006,lng:-86.49251679006962},HR:{name:"Croatia",lat:44.91192100856702,lng:16.625761129583374},HT:{name:"Haiti",lat:18.883520486983567,lng:-72.89291379842},HU:{name:"Hungary",lat:47.22527332486294,lng:19.39620048366142},ID:{name:"Indonesia",lat:.15591979959037652,lng:113.96538246847302},IE:{name:"Ireland",lat:53.30489539816495,lng:-8.241128545554096},IL:{name:"Israel",lat:31.513542220043195,lng:35.027923472437024},IM:{name:"Isle of Man",lat:54.22855301008011,lng:-4.532995055468449},IN:{name:"India",lat:23.586300567746722,lng:81.17300408530181},IO:{name:"British Indian Ocean Territory",lat:-7.323548444385743,lng:72.43501618476016},IQ:{name:"Iraq",lat:33.105075667527906,lng:43.832529181056884},IR:{name:"Iran",lat:32.906023742890056,lng:54.237077001065444},IS:{name:"Iceland",lat:65.12360920205514,lng:-19.05682967106099},IT:{name:"Italy",lat:42.98201127614267,lng:12.763657166123137},JE:{name:"Jersey",lat:49.215396925724306,lng:-2.1291601162653575},JM:{name:"Jamaica",lat:18.12207889341651,lng:-77.30358894542778},JO:{name:"Jordan",lat:31.387064884449156,lng:36.95728884547246},JP:{name:"Japan",lat:36.76738832597829,lng:137.46934234351835},KE:{name:"Kenya",lat:.6899182318376179,lng:37.95309411262371},KG:{name:"Kyrgyzstan",lat:41.35698905438358,lng:74.17532903468319},KH:{name:"Cambodia",lat:12.699186865507775,lng:105.03973078680701},KI:{name:"Kiribati",lat:1.8676673749241066,lng:-157.39024189323504},KM:{name:"Comoros",lat:-11.658861474508491,lng:43.34826587429403},KN:{name:"Saint Kitts and Nevis",lat:17.314736299587768,lng:-62.74560385895787},KP:{name:"North Korea",lat:40.19198091470839,lng:127.3379805653744},KR:{name:"South Korea",lat:36.402386712544114,lng:127.76224551357649},KW:{name:"Kuwait",lat:29.281360965443092,lng:47.56311109320184},KY:{name:"Cayman Islands",lat:19.311231805620288,lng:-81.25203208977878},KZ:{name:"Kazakhstan",lat:47.641465195176835,lng:66.3759193479301},LA:{name:"Laos",lat:18.117282736873282,lng:103.76375899026448},LB:{name:"Lebanon",lat:33.91160170722086,lng:35.89651946324749},LC:{name:"Saint Lucia",lat:13.895749185129906,lng:-60.9689510935251},LI:{name:"Liechtenstein",lat:47.14627562133036,lng:9.547674672376376},LK:{name:"Sri Lanka",lat:7.696630939329944,lng:80.66931169770622},LR:{name:"Liberia",lat:6.52012979398834,lng:-9.258988935497618},LS:{name:"Lesotho",lat:-29.60168116924817,lng:28.24475317864227},LT:{name:"Lithuania",lat:55.29437393417175,lng:23.946021605013534},LU:{name:"Luxembourg",lat:49.77523454542369,lng:6.103230338458876},LV:{name:"Latvia",lat:56.813853047554154,lng:24.693671325654403},LY:{name:"Libya",lat:27.202915771690794,lng:17.91133392454237},MA:{name:"Morocco",lat:28.687598134979325,lng:-8.817212587250811},MC:{name:"Monaco",lat:43.74798224995656,lng:7.412820873271196},MD:{name:"Moldova",lat:47.0725674580696,lng:28.391111865941348},ME:{name:"Montenegro",lat:42.73694835210454,lng:19.29505087156758},MF:{name:"Saint Martin",lat:18.078012113224464,lng:-63.06678525361946},MG:{name:"Madagascar",lat:-19.04163612493041,lng:46.68493466832544},MH:{name:"Marshall Islands",lat:7.307929900994344,lng:168.72016025351076},MK:{name:"North Macedonia",lat:41.59402890143112,lng:21.70998923872772},ML:{name:"Mali",lat:17.168146208584837,lng:-4.346399841781153},MM:{name:"Myanmar",lat:19.901227931399873,lng:97.08892285397344},MN:{name:"Mongolia",lat:47.08644454604851,lng:103.3987360327455},MP:{name:"Northern Mariana Islands",lat:15.178063516432115,lng:145.74119737203134},MQ:{name:"Martinique",lat:14.642697353597645,lng:-61.01432380875083},MR:{name:"Mauritania",lat:20.466731212820022,lng:-10.495079045035716},MS:{name:"Montserrat",lat:16.735363391460357,lng:-62.18693281256255},MT:{name:"Malta",lat:35.890522650899314,lng:14.441922442508494},MU:{name:"Mauritius",lat:-20.28142317475198,lng:57.56415671066546},MV:{name:"Maldives",lat:-.6065577168009924,lng:73.10076245140479},MW:{name:"Malawi",lat:-13.128986464184024,lng:34.23441182298881},MX:{name:"Mexico",lat:23.87436068093592,lng:-101.55399731630118},MY:{name:"Malaysia",lat:3.6716608556387857,lng:114.63330303992869},MZ:{name:"Mozambique",lat:-17.525230309488748,lng:35.208577031290176},NA:{name:"Namibia",lat:-21.90858163281473,lng:18.16451345845268},NC:{name:"New Caledonia",lat:-21.33003372660827,lng:165.50767040438612},NE:{name:"Niger",lat:17.08105392407292,lng:8.86863247002646},NF:{name:"Norfolk Island",lat:-29.037654445046282,lng:167.95259597483337},NG:{name:"Nigeria",lat:9.61029352034213,lng:8.147714845256194},NI:{name:"Nicaragua",lat:12.893566631930554,lng:-85.016088327669},NL:{name:"Netherlands",lat:52.134054128923886,lng:5.554136426128487},NO:{name:"Norway",lat:64.97775882947745,lng:16.670259272390894},NP:{name:"Nepal",lat:28.300920699755657,lng:84.1338898313567},NR:{name:"Nauru",lat:-.5221021440668993,lng:166.92937633139178},NU:{name:"Niue",lat:-19.05230921680393,lng:-169.86878106699083},NZ:{name:"New Zealand",lat:-43.82765432544426,lng:170.69035541428696},OM:{name:"Oman",lat:20.7242833183209,lng:55.841088119829},PA:{name:"Panama",lat:8.439536749576892,lng:-80.14428761482796},PE:{name:"Peru",lat:-8.522717984240291,lng:-74.11416196781884},PF:{name:"French Polynesia",lat:-17.674684080120677,lng:-149.40041671099763},PG:{name:"Papua New Guinea",lat:-7.156912819152135,lng:144.8348942994695},PH:{name:"Philippines",lat:15.586542251094242,lng:121.82208941416745},PK:{name:"Pakistan",lat:30.116188371410882,lng:69.08835090769651},PL:{name:"Poland",lat:52.06848055692473,lng:19.43573279234468},PM:{name:"Saint Pierre and Miquelon",lat:46.95153913615198,lng:-56.32465353437558},PN:{name:"Pitcairn",lat:-24.366121747565458,lng:-128.3149848627581},PR:{name:"Puerto Rico",lat:18.216224086610914,lng:-66.49425339593509},PS:{name:"Palestinian Territory",lat:31.930818736453883,lng:35.24251184154588},PT:{name:"Portugal",lat:39.67529214702138,lng:-7.933662183874006},PW:{name:"Palau",lat:7.534775852547396,lng:134.57965086721052},PY:{name:"Paraguay",lat:-23.42190559259428,lng:-58.38906357428651},QA:{name:"Qatar",lat:25.318528486425386,lng:51.19794918743203},RE:{name:"Réunion",lat:-21.119825460665105,lng:55.54393506194689},RO:{name:"Romania",lat:45.82454894397586,lng:25.094158201563292},RS:{name:"Serbia",lat:44.02679870131969,lng:20.85677444395745},RU:{name:"Russian Federation",lat:59.039434214106194,lng:98.6704990698032},RW:{name:"Rwanda",lat:-2.014687460047154,lng:29.919439681764082},SA:{name:"Saudi Arabia",lat:24.136038144757897,lng:44.600958178225596},SB:{name:"Solomon Islands",lat:-9.613104734596515,lng:160.16475795033884},SC:{name:"Seychelles",lat:-4.660002318822744,lng:55.47250789595527},SD:{name:"Sudan",lat:15.67060230984256,lng:29.951458283594064},SE:{name:"Sweden",lat:62.73420986108448,lng:17.062431988004956},SG:{name:"Singapore",lat:1.3528251890006349,lng:103.81025757634053},SH:{name:"Saint Helena",lat:-15.962963318340398,lng:-5.717391620813109},SI:{name:"Slovenia",lat:46.13759229564504,lng:14.890636899973781},SJ:{name:"Svalbard",lat:78.57318936469626,lng:16.036378851505283},SK:{name:"Slovakia",lat:48.69808390520484,lng:19.581015362490966},SL:{name:"Sierra Leone",lat:8.561330384750587,lng:-11.78656695731115},SM:{name:"San Marino",lat:43.942820729097896,lng:12.461278349581722},SN:{name:"Senegal",lat:14.228861491763402,lng:-14.610875368352305},SO:{name:"Somalia",lat:6.524534573103924,lng:45.40037867243972},SR:{name:"Suriname",lat:4.098723595920171,lng:-55.855514311561286},SS:{name:"South Sudan",lat:7.657782041763295,lng:30.3851856901788},ST:{name:"Sao Tome and Principe",lat:.22744704294793774,lng:6.606158796857607},SV:{name:"El Salvador",lat:13.758041517055418,lng:-88.85911489238985},SX:{name:"Sint Maarten",lat:18.03942608463078,lng:-63.06883135915303},SY:{name:"Syria",lat:35.09751106058316,lng:38.5117323139514},SZ:{name:"Eswatini",lat:-26.562540935608702,lng:31.510685746082007},TC:{name:"Turks and Caicos Islands",lat:21.799865427483745,lng:-71.74058946811508},TD:{name:"Chad",lat:15.283493546654503,lng:18.427113900363025},TF:{name:"Juan De Nova Island",lat:-17.06449193630804,lng:42.74374761089645},TF:{name:"French Southern Territories",lat:-49.26329687105643,lng:69.54686984724839},TF:{name:"Glorioso Islands",lat:-11.566224871643417,lng:47.290948081543384},TG:{name:"Togo",lat:8.660743037717811,lng:.8990857571109684},TH:{name:"Thailand",lat:13.66222784745538,lng:101.08675116214552},TJ:{name:"Tajikistan",lat:38.56933138382972,lng:70.94215281065698},TK:{name:"Tokelau",lat:-9.195174767256544,lng:-171.85265950722743},TL:{name:"Timor-Leste",lat:-8.809894630601962,lng:125.95024049562659},TM:{name:"Turkmenistan",lat:39.06069118001429,lng:58.4577357627054},TN:{name:"Tunisia",lat:34.08636179565723,lng:9.65587551697984},TO:{name:"Tonga",lat:-21.15927212823853,lng:-175.20415878511247},TR:{name:"Turkey",lat:38.93207363123396,lng:35.56886764076691},TT:{name:"Trinidad and Tobago",lat:10.415515638298093,lng:-61.37236579976247},TV:{name:"Tuvalu",lat:-8.514701506447222,lng:179.217833977593},TZ:{name:"Tanzania",lat:-6.355794440041147,lng:34.81832206060381},UA:{name:"Ukraine",lat:48.657532515563794,lng:31.27377208442636},UG:{name:"Uganda",lat:1.2821729218416205,lng:32.34371768463123},UM:{name:"United States Minor Outlying Islands",lat:19.302045812215958,lng:166.63800339749642},US:{name:"United States",lat:38.8208089190304,lng:-96.33161660829639},UY:{name:"Uruguay",lat:-32.78195043831093,lng:-56.01919523458085},UZ:{name:"Uzbekistan",lat:41.4879065244633,lng:63.8548297593985},VA:{name:"Vatican City",lat:41.90402351316735,lng:12.451312917026133},VC:{name:"Saint Vincent and the Grenadines",lat:13.254808122970651,lng:-61.193766354393034},VE:{name:"Venezuela",lat:7.148324760507107,lng:-66.36492135985132},VG:{name:"British Virgin Islands",lat:18.42195819619707,lng:-64.62406519257699},VI:{name:"US Virgin Islands",lat:17.738009708772523,lng:-64.76155341409797},VN:{name:"Vietnam",lat:16.517347170839393,lng:105.91338832758704},VU:{name:"Vanuatu",lat:-15.189132121699332,lng:166.84912735669738},WF:{name:"Wallis and Futuna",lat:-14.283442307826677,lng:-178.12735555777184},WS:{name:"Samoa",lat:-13.634252953274622,lng:-172.44107655740137},YE:{name:"Yemen",lat:16.001392616307445,lng:47.46815793206386},YT:{name:"Mayotte",lat:-12.824468416301052,lng:45.128142327031064},ZA:{name:"South Africa",lat:-28.55361930679731,lng:24.75252746489084},ZM:{name:"Zambia",lat:-13.162832953186246,lng:27.75521363430896},ZW:{name:"Zimbabwe",lat:-18.92700121981475,lng:29.717829640720844}};class MetricsCountryMapView extends a{constructor(a={}){const t=a.height||320;super({className:"metrics-country-map-view",...a}),this.endpoint=a.endpoint||"/api/metrics/fetch",this.account=a.account||"global",this.category=a.category||null,this.slugs=a.slugs||null,this.granularity=a.granularity||"days",this.maxCountries=a.maxCountries||12,this.metricLabel=a.metricLabel||"Events",this.height=t,this.mapStyle=a.mapStyle||"dark",this.mapOptions=a.mapOptions||{},this.showRoutes=!1!==a.showRoutes,this.routeOrigin=a.routeOrigin||{lng:-77.346,lat:38.958,name:"Reston, VA"},this._refreshing=!1}async getTemplate(){return`\n <div class="metrics-country-map">\n <div class="map-container mb-3" data-container="${this.id}-map" style="height:${this.height}px"></div>\n <div class="map-legend small" data-region="legend"></div>\n </div>\n `}async onInit(){this.statusEl=document.createElement("div"),this.statusEl.className="text-muted small px-3 pb-2",this.element.appendChild(this.statusEl),this.mapView=new MapLibreView({containerId:`${this.id}-map`,height:this.height,style:this.mapStyle,zoom:this.mapOptions.zoom??1.3,center:this.mapOptions.center||[10,20],pitch:this.mapOptions.pitch??20,bearing:this.mapOptions.bearing??0,showNavigationControl:this.mapOptions.showNavigationControl??!0,autoFitBounds:this.mapOptions.autoFitBounds??!1}),this.addChild(this.mapView),await this.refresh()}async refresh(){if(!this._refreshing){this._refreshing=!0,this.setStatus("Loading hotspots…");try{const a=await this.fetchMetrics();await this.applyMetrics(a),this.setStatus("")}catch(a){console.error("MetricsCountryMapView refresh error",a),this.setStatus("Unable to load country metrics.")}finally{this._refreshing=!1}}}async fetchMetrics(){const a=this.getApp()?.rest;if(!a)throw new Error("REST client unavailable");const t={account:this.account,granularity:this.granularity,with_labels:!0};if(this.category&&(t.category=this.category),this.slugs){const a=Array.isArray(this.slugs)?this.slugs:[this.slugs];t["slugs[]"]=a}const e=await a.GET(this.endpoint,t);if(!e.success||!e.data?.status)throw new Error(e.data?.error||"Metrics API error");return e.data.data}async applyMetrics(a){const e=a?.data||{},n=a?.labels||[],l=[];if(Object.entries(e).forEach(([a,e])=>{const n=e.reduce((a,t)=>a+(Number(t)||0),0);if(!n)return;const i=t[a.toUpperCase()];i&&l.push({code:a.toUpperCase(),total:n,values:e,centroid:i})}),!l.length)return this.mapView.updateMarkers([]),this.renderLegend([]),void this.setStatus("No country data available for the selected range.");l.sort((a,t)=>t.total-a.total);const i=l.slice(0,this.maxCountries),s=i[0]?.total||1,r=i.map(a=>{const t=a.total/s,e=Math.round(18+24*t);return{lng:a.centroid.lng,lat:a.centroid.lat,size:e,color:this.getMarkerColor(t),popup:`\n <div class="text-center">\n <strong>${a.centroid.name}</strong><br/>\n <span class="text-muted">${a.total.toLocaleString()} ${this.metricLabel}</span>\n </div>\n `}});this.showRoutes&&this.routeOrigin?.lng&&this.routeOrigin?.lat&&r.push({lng:this.routeOrigin.lng,lat:this.routeOrigin.lat,size:26,color:"#0d6efd",icon:"bi bi-broadcast-pin",popup:`\n <div class="text-center">\n <strong>${this.routeOrigin.name||"Operations Hub"}</strong><br/>\n <span class="text-muted">Origin</span>\n </div>\n `}),this.mapView.updateMarkers(r),this.renderLegend(i,n),this.showRoutes&&this.renderRoutes(i,s)}getMarkerColor(a){const t=[255,193,7],e=[32,201,151].map((e,n)=>Math.round(e+(t[n]-e)*a));return`rgba(${e[0]}, ${e[1]}, ${e[2]}, 0.9)`}renderLegend(a){const t=this.element.querySelector('[data-region="legend"]');if(!t)return;if(!a.length)return void(t.innerHTML="");const e=a[0]?.total||1,n=a.map(a=>{const t=(a.total/e*100).toFixed(0);return`\n <div class="d-flex justify-content-between align-items-center py-1 border-top">\n <div>\n <span class="fw-semibold">${a.centroid.name}</span>\n <span class="text-muted ms-1">(${a.code})</span>\n </div>\n <div class="text-end">\n <div class="fw-semibold">${a.total.toLocaleString()}</div>\n <small class="text-muted">${t}% of top</small>\n </div>\n </div>\n `}).join("");t.innerHTML=n}renderRoutes(a,t){const e=this.routeOrigin||null;if(!(e&&e.lng&&e.lat&&this.mapView))return;const n={type:"FeatureCollection",features:a.map(a=>({type:"Feature",geometry:{type:"LineString",coordinates:[[e.lng,e.lat],[a.centroid.lng,a.centroid.lat]]},properties:{total:a.total,intensity:a.total/t}}))};this.mapView.lineSources=this.mapView.lineSources.filter(a=>a.id!==`${this.id}-routes`),this.mapView.updateLineSource(`${this.id}-routes`,{data:n,paint:{"line-color":["interpolate",["linear"],["get","intensity"],0,"rgba(32, 201, 151, 0.6)",1,"rgba(255, 193, 7, 0.95)"],"line-width":["interpolate",["linear"],["get","intensity"],0,1.75,1,6],"line-opacity":["interpolate",["linear"],["get","intensity"],0,.45,1,.95]}})}setStatus(a){this.statusEl&&(this.statusEl.textContent=a||"",this.statusEl.style.display=a?"block":"none")}}export{MapView as M,MapLibreView as a,MetricsCountryMapView as b};
|
|
2
|
-
//# sourceMappingURL=MetricsCountryMapView-DIlezla0.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("./Collection-BUv4E9op.js"),e=require("./ListView-2M4I8KHF.js"),i=require("./Dialog-BYiynSW-.js"),n=require("./FormView-OgrZ7x0z.js");class Log extends t.Model{constructor(t={}){super(t,{endpoint:"/api/logs"})}}class LogList extends t.Collection{constructor(t={}){super({ModelClass:Log,endpoint:"/api/logs",size:10,...t})}}class Member extends t.Model{constructor(t={}){super(t,{endpoint:"/api/group/member"})}hasPermission(t){if(Array.isArray(t))return t.some(t=>this.hasPermission(t));const e=this.get("permissions");return!!e&&1==e[t]}async fetchForGroup(t){return await this.fetch({url:`/api/group/${t}/member`})}}class MemberList extends t.Collection{constructor(t={}){super({ModelClass:Member,endpoint:"/api/group/member",size:10,...t})}}const s={edit:{title:"Edit Membership",fields:[{name:"user.display_name",type:"text",label:"Display Name",placeholder:"Enter Display Name"},{name:"metadata.role",type:"text",label:"Role",placeholder:"Enter role"},{name:"is_active",type:"switch",label:"Is Enabled",columns:12}]}};Member.EDIT_FORM=s.edit,Member.ADD_FORM=s.create;class TableRow extends e.ListViewItem{constructor(t={}){super({tagName:"tr",className:"table-row",enableTooltips:!0,...t}),this.columns=t.columns||[],this.actions=t.actions||null,this.contextMenu=t.contextMenu||null,this.batchActions=t.batchActions||null,this.tableView=t.tableView||t.listView||null,this.editingCells=/* @__PURE__ */new Set,this.template=this.buildRowTemplate()}getResponsiveClasses(t){if(!t)return"";const e=["sm","md","lg","xl","xxl"];if("string"==typeof t)return e.includes(t)?`d-none d-${t}-table-cell`:(console.warn(`Invalid visibility breakpoint: ${t}. Valid options are: ${e.join(", ")}`),"");if("object"==typeof t){const i=[];if(t.hide){if(!e.includes(t.hide))return console.warn(`Invalid hide breakpoint: ${t.hide}. Valid options are: ${e.join(", ")}`),"";i.push(`d-table-cell d-${t.hide}-none`)}if(t.show){if(!e.includes(t.show))return console.warn(`Invalid show breakpoint: ${t.show}. Valid options are: ${e.join(", ")}`),"";t.hide?i.push(`d-${t.show}-table-cell`):i.push(`d-none d-${t.show}-table-cell`)}return i.join(" ")}return""}buildRowTemplate(){let t="";return this.tableView&&this.tableView.isSelectable()&&(t+='\n <td style="padding: 0;">\n <div class="mojo-select-cell {{#selected}}selected{{/selected}}"\n data-action="select">\n <div class="mojo-checkbox">\n <i class="bi bi-check"></i>\n </div>\n </div>\n </td>\n '),this.columns.forEach((e,i)=>{const n=[e.class||e.className||"",this.getResponsiveClasses(e.visibility),e.editable?"editable-cell":""].filter(t=>t).join(" "),s=this.buildCellTemplate(e,i);let l=e.action;!l&&e.editable?l="edit-cell":!l&&this.tableView.rowAction&&(l=this.tableView.rowAction),t+=l?`<td class="${n}" data-action="${l}" data-column="${e.key}">${s}</td>`:`<td class="${n}" data-column="${e.key}">${s}</td>`}),this.actions?t+=this.buildActionsTemplate():this.contextMenu&&(t+=this.buildContextMenuTemplate()),t}buildCellTemplate(t,e=0){const i=`model.${t.key}`,n=t.formatter||t.format;if(n){if("string"==typeof n)return`{{{${i}|${n}}}}`;if("function"==typeof n)return`<span data-formatter="${t.key}" data-formatter-id="${e}">{{${i}}}</span>`}return t.template?t.template:t.editable?`<span class="cell-content" data-field="${t.key}">{{{${i}}}}</span>`:`{{{${i}}}}`}buildActionsTemplate(){return this.actions&&0!==this.actions.length?`<td><div class="btn-group btn-group-sm">${this.actions.map(t=>{if("string"==typeof t)switch(t){case"view":return'\n <button class="btn btn-sm btn-outline-primary"\n data-action="view"\n title="View">\n <i class="bi bi-eye"></i>\n </button>\n ';case"edit":return'\n <button class="btn btn-sm btn-outline-secondary"\n data-action="edit"\n title="Edit">\n <i class="bi bi-pencil"></i>\n </button>\n ';case"delete":return'\n <button class="btn btn-sm btn-outline-danger"\n data-action="delete"\n title="Delete">\n <i class="bi bi-trash"></i>\n </button>\n ';default:return""}else if("object"==typeof t)return`\n <button class="btn btn-sm ${t.class||"btn-outline-primary"}"\n data-id="${this.model.id}"\n data-action="${t.action}"\n title="${t.label||""}">\n ${t.icon?`<i class="${t.icon}"></i>`:""}\n ${t.label&&!t.icon?t.label:""}\n </button>\n `;return""}).join("")}</div></td>`:""}buildContextMenuTemplate(){return this.contextMenu&&0!==this.contextMenu.length?`\n <td class="text-end" style="width: 1px;">\n <div class="dropdown">\n <button class="btn btn-sm btn-link border-0"\n type="button"\n data-bs-toggle="dropdown"\n aria-expanded="false"\n style="color: #6c757d;">\n <i class="bi bi-three-dots-vertical"></i>\n </button>\n <ul class="dropdown-menu dropdown-menu-end shadow-sm">\n ${this.buildContextMenuItems()}\n </ul>\n </div>\n </td>\n `:""}buildContextMenuItems(){return this.contextMenu.map(t=>{if(t.separator||t.divider)return'<li><hr class="dropdown-divider"></li>';let e="dropdown-item";return("delete"===t.action||t.danger)&&(e+=" text-danger"),t.disabled&&(e+=" disabled"),`\n <li>\n <a class="${e}" href="#"\n data-id="{{model.id}}"\n data-action="${t.action}"\n ${t.disabled?'aria-disabled="true" tabindex="-1"':""}>\n ${t.icon?`<i class="${t.icon} me-2"></i>`:""}\n ${t.label}\n </a>\n </li>\n `}).join("")}async onAfterRender(){await super.onAfterRender(),this.columns.forEach((t,e)=>{if(t.formatter&&"function"==typeof t.formatter){let n=this.element.querySelector(`[data-formatter-id="${e}"]`);if(n||(n=this.element.querySelector(`[data-formatter="${t.key}"]`)),n){const e=this.model.get?this.model.get(t.key):this.model[t.key],s={value:e,row:this.model,model:this.model,column:t,table:this.tableView,index:this.index};try{n.innerHTML=t.formatter(e,s)}catch(i){console.error(`Error formatting cell for column ${t.key}:`,i)}}}}),this.selected&&this.element.classList.add("selected");const t=this.model.get?this.model.get("id"):this.model.id;t&&this.element.setAttribute("data-id",t)}async onActionEditCell(t,e){t.stopPropagation();const i=e.getAttribute("data-column"),n=this.columns.find(t=>t.key===i);n&&n.editable&&(this.editingCells.has(i)||await this.enterEditMode(i,n,e))}async onActionRowClick(t,e){t.target.closest(".btn-group")||t.target.closest(".dropdown")||t.target.closest(".cell-editor")||(this.emit("row:click",{row:this,model:this.model,column:e.getAttribute("data-column"),event:t}),this.tableView&&this.tableView.emit("row:click",{row:this,model:this.model,column:e.getAttribute("data-column"),event:t}))}async onActionView(t,e){t.stopPropagation(),this.emit("row:view",{row:this,model:this.model,event:t}),this.tableView&&this.tableView.emit("row:view",{row:this,model:this.model,event:t})}async onActionEdit(t,e){return t.stopPropagation(),this.emit("row:edit",{row:this,model:this.model,event:t}),this.tableView&&this.tableView.emit("row:edit",{row:this,model:this.model,event:t}),!0}async onActionDelete(t,e){t.stopPropagation(),this.emit("row:delete",{row:this,model:this.model,event:t}),this.tableView&&this.tableView.emit("row:delete",{row:this,model:this.model,event:t})}async enterEditMode(t,e,i){const n=i.querySelector(".cell-content");if(!n)return;this.editingCells.add(t);const s=this.model.get?this.model.get(t):this.model[t],l=this.createCellEditor(e,s),o=n.innerHTML;n.style.display="none";const a=document.createElement("div");a.className="cell-editor",a.innerHTML=l,i.appendChild(a);const r=a.querySelector("input, select, .form-check-input");r&&(r.focus(),"text"!==r.type&&"textarea"!==r.type||r.select()),a.dataset.originalContent=o,a.dataset.columnKey=t,this.setupEditorEvents(a,t,e),this.emit("cell:edit",{row:this,model:this.model,column:t,originalValue:s})}createCellEditor(t,e){const i=t.editableOptions||{};switch(i.type){case"select":return this.createSelectEditor(i,e);case"switch":case"checkbox":return this.createSwitchEditor(i,e);case"textarea":return this.createTextareaEditor(i,e);default:return this.createTextEditor(i,e)}}createTextEditor(t,e){const i=t.placeholder||"";return`\n <div class="d-flex gap-1 align-items-center">\n <input type="${t.inputType||"text"}"\n class="form-control form-control-sm cell-input"\n value="${this.escapeHtml(e||"")}"\n placeholder="${i}">\n <button type="button" class="btn btn-sm btn-success cell-save" title="Save">\n <i class="bi bi-check"></i>\n </button>\n <button type="button" class="btn btn-sm btn-outline-secondary cell-cancel" title="Cancel">\n <i class="bi bi-x"></i>\n </button>\n </div>\n `}createTextareaEditor(t,e){const i=t.placeholder||"";return`\n <div class="d-flex gap-1">\n <textarea class="form-control form-control-sm cell-input"\n rows="${t.rows||2}"\n placeholder="${i}">${this.escapeHtml(e||"")}</textarea>\n <div class="d-flex flex-column gap-1">\n <button type="button" class="btn btn-sm btn-success cell-save" title="Save">\n <i class="bi bi-check"></i>\n </button>\n <button type="button" class="btn btn-sm btn-outline-secondary cell-cancel" title="Cancel">\n <i class="bi bi-x"></i>\n </button>\n </div>\n </div>\n `}createSelectEditor(t,e){const i=t.options||[];let n="";return i.forEach(t=>{if("string"==typeof t)n+=`<option value="${t}" ${t===e?"selected":""}>${t}</option>`;else if("object"==typeof t&&void 0!==t.value){const i=t.value===e?"selected":"";n+=`<option value="${t.value}" ${i}>${t.label||t.value}</option>`}}),`\n <div class="d-flex gap-1 align-items-center">\n <select class="form-select form-select-sm cell-input">\n ${n}\n </select>\n <button type="button" class="btn btn-sm btn-success cell-save" title="Save">\n <i class="bi bi-check"></i>\n </button>\n <button type="button" class="btn btn-sm btn-outline-secondary cell-cancel" title="Cancel">\n <i class="bi bi-x"></i>\n </button>\n </div>\n `}createSwitchEditor(t,e){const i=e?"checked":"";return`\n <div class="d-flex gap-2 align-items-center">\n <div class="form-check ${"switch"===t.type?"form-switch":""}">\n <input class="form-check-input cell-input" type="checkbox" ${i}>\n </div>\n <div class="d-flex gap-1">\n <button type="button" class="btn btn-sm btn-success cell-save" title="Save">\n <i class="bi bi-check"></i>\n </button>\n <button type="button" class="btn btn-sm btn-outline-secondary cell-cancel" title="Cancel">\n <i class="bi bi-x"></i>\n </button>\n </div>\n </div>\n `}setupEditorEvents(t,e,i){const n=t.querySelector(".cell-input"),s=t.querySelector(".cell-save"),l=t.querySelector(".cell-cancel");!n||"text"!==n.type&&"email"!==n.type&&"number"!==n.type||n.addEventListener("keydown",n=>{"Enter"===n.key?(n.preventDefault(),this.saveCellEdit(t,e,i)):"Escape"===n.key&&(n.preventDefault(),this.cancelCellEdit(t,e))}),!n||"checkbox"!==n.type&&"SELECT"!==n.tagName||!1===i.autoSave||n.addEventListener("change",()=>{this.saveCellEdit(t,e,i)}),s?.addEventListener("click",()=>{this.saveCellEdit(t,e,i)}),l?.addEventListener("click",()=>{this.cancelCellEdit(t,e)})}async saveCellEdit(t,e,i){const n=t.querySelector(".cell-input");if(!n)return;let s;s="checkbox"===n.type?n.checked:(n.tagName,n.value);const l=this.model.get?this.model.get(e):this.model[e];try{this.model.save?await this.model.save({[e]:s}):this.model[e]=s,this.exitEditMode(t,e,s),this.emit("cell:save",{row:this,model:this.model,column:e,oldValue:l,newValue:s})}catch(o){console.error("Failed to save cell edit:",o),this.emit("cell:save:error",{row:this,model:this.model,column:e,oldValue:l,newValue:s,error:o}),t.classList.add("saving-error"),setTimeout(()=>t.classList.remove("saving-error"),3e3)}}cancelCellEdit(t,e){const i=t.dataset.originalContent;this.exitEditMode(t,e,null,i),this.emit("cell:cancel",{row:this,model:this.model,column:e})}exitEditMode(e,i,n=null,s=null){const l=e.closest("td").querySelector(".cell-content");if(l){if(null!==n){const e=this.columns.find(t=>t.key===i);let s=n;e&&e.formatter&&"string"==typeof e.formatter&&(s=t.dataFormatter.pipe(n,e.formatter)),l.innerHTML=this.escapeHtml(s)}else s&&(l.innerHTML=s);l.style.display=""}e.remove(),this.editingCells.delete(i)}escapeHtml(t){if(null==t)return"";const e=document.createElement("div");return e.textContent=t,e.innerHTML}select(){super.select(),this.addClass("selected");const t=this.element?.querySelector(".mojo-select-cell");t&&t.classList.add("selected")}deselect(){super.deselect(),this.removeClass("selected");const t=this.element?.querySelector(".mojo-select-cell");t&&t.classList.remove("selected")}}const l={exact:{display:"is",description:"Exact match"},in:{display:"in",description:"Match any of the values (comma-separated)"},not:{display:"is not",description:"Does not match"},not_in:{display:"not in",description:"Does not match any of the values"},gt:{display:">",description:"Greater than"},gte:{display:">=",description:"Greater than or equal to"},lt:{display:"<",description:"Less than"},lte:{display:"<=",description:"Less than or equal to"},contains:{display:"contains",description:"Contains substring (case-sensitive)"},icontains:{display:"contains",description:"Contains substring (case-insensitive)"},startswith:{display:"starts with",description:"Starts with substring (case-sensitive)"},istartswith:{display:"starts with",description:"Starts with substring (case-insensitive)"},endswith:{display:"ends with",description:"Ends with substring (case-sensitive)"},iendswith:{display:"ends with",description:"Ends with substring (case-insensitive)"},isnull:{display:t=>"true"===t||!0===t?"is null":"is not null",description:"Check if value is null or not"},range:{display:"between",description:"Between two values (comma-separated)"}};function o(t){if(!t||"string"!=typeof t)return{field:t,lookup:null};const e=t.split("__");if(1===e.length)return{field:t,lookup:null};const i=e[e.length-1];return l[i]?{field:e.slice(0,-1).join("__"),lookup:i}:{field:t,lookup:null}}function a(t,e,i){if(!t||null==e)return"";const{field:n,lookup:s}=o(t),a=l[s];if(e&&"object"==typeof e&&!Array.isArray(e)){const t=void 0!==e.start&&null!==e.start&&""!==e.start,n=void 0!==e.end&&null!==e.end&&""!==e.end;return t||n?t&&n?`${i} between '${e.start}' and '${e.end}'`:t?`${i} from '${e.start}'`:`${i} until '${e.end}'`:`${i} is '${JSON.stringify(e)}'`}const r=Array.isArray(e)?e.join(","):String(e);if(!s||"exact"===s)return`${i} is '${r}'`;if("in"===s||"not_in"===s){const t=r.split(",").map(t=>t.trim()).filter(t=>t);if(0===t.length)return`${i} ${a.display}`;const e=t.map(t=>`'${t}'`).join(", ");return`${i} ${a.display} ${e}`}if("range"===s){const t=r.split(",").map(t=>t.trim()).filter(t=>t);return 2===t.length?`${i} between '${t[0]}' and '${t[1]}'`:`${i} ${a.display} '${r}'`}return"isnull"===s?`${i} ${"function"==typeof a.display?a.display(r):a.display}`:a?`${i} ${a.display} '${r}'`:`${i} is '${r}'`}const r={LOOKUPS:l,parseFilterKey:o,formatFilterDisplay:a,getLookupDescription:function(t){const e=l[t];return e?e.description:"Exact match"},isValidLookup:function(t){return t&&l.hasOwnProperty(t)},getAvailableLookups:function(){return Object.keys(l)},buildFilterKey:function(t,e=null){return t?e?`${t}__${e}`:t:""}};class TableView extends e.ListView{constructor(t={}){super({className:"table-view-component",itemClass:t.itemClass||TableRow,selectionMode:t.selectable?"multiple":"none",emptyMessage:t.emptyMessage||"No data available",addButtonIcon:t.addButtonIcon||"bi bi-plus-circle",...t}),this.isFullscreen=!1,this.columns=t.columns||[],this.actions=t.actions||null,this.contextMenu=t.contextMenu||null,this.batchActions=t.batchActions||null,this.searchable=!1!==t.searchable,this.sortable=!1!==t.sortable,this.filterable=!1!==t.filterable,this.paginated=!1!==t.paginated,this.clickAction=t.clickAction||"view",this.itemView=t.itemView,this.addForm=t.addForm,this.editForm=t.editForm,this.deleteTemplate=t.deleteTemplate,this.formDialogConfig=t.formDialogConfig||{},this.viewDialogOptions=t.viewDialogOptions||{},this.exportOptions=t.exportOptions||null,this.options.showExport&&!this.exportOptions&&(this.exportOptions=[{format:"csv",label:"Export as CSV",icon:"bi bi-file-earmark-spreadsheet"},{format:"json",label:"Export as JSON",icon:"bi bi-file-earmark-code"}]),this.exportSource=t.exportSource||"remote",this.filters={},this.additionalFilters=t.filters||[],this.hideActivePills=t.hideActivePills||!1,this.hideActivePillNames=t.hideActivePillNames||[],this.rowAction=t.rowAction||"row-click",this.batchBarLocation=t.batchBarLocation||"bottom",this.options.addButtonLabel=t.addButtonLabel||"Add",this.toolbarButtons=t.toolbarButtons||[],this.tableOptions={striped:!0,bordered:!1,hover:!0,responsive:!1,size:null,...t.tableOptions},this.searchPlacement=t.searchPlacement||"toolbar",this.searchPlaceholder=t.searchPlaceholder||"Search...",this.initializeColumns(),this.extractColumnFilters(),this.footerTotalColumns=this.columns.filter(t=>!0===t.footer_total),this.hasFooterTotals=this.footerTotalColumns.length>0,this.template=this.buildTableTemplate(),this.setupCollectionListeners()}setupCollectionListeners(){this.hasFooterTotals&&this.collection&&this.collection.on("reset add remove change",()=>{this.updateFooterTotals()})}initializeColumns(){this.columns.forEach(t=>{!t.key&&t.name&&(t.key=t.name),t.label||t.title||(t.label=t.key.charAt(0).toUpperCase()+t.key.slice(1))})}getResponsiveClasses(t){if(!t)return"";const e=["sm","md","lg","xl","xxl"];if("string"==typeof t)return e.includes(t)?`d-none d-${t}-table-cell`:(console.warn(`Invalid visibility breakpoint: ${t}. Valid options are: ${e.join(", ")}`),"");if("object"==typeof t){const i=[];if(t.hide){if(!e.includes(t.hide))return console.warn(`Invalid hide breakpoint: ${t.hide}. Valid options are: ${e.join(", ")}`),"";i.push(`d-table-cell d-${t.hide}-none`)}if(t.show){if(!e.includes(t.show))return console.warn(`Invalid show breakpoint: ${t.show}. Valid options are: ${e.join(", ")}`),"";t.hide?i.push(`d-${t.show}-table-cell`):i.push(`d-none d-${t.show}-table-cell`)}return i.join(" ")}return""}parseColumnKey(t){const e=t.split("|");return{fieldKey:e[0],formatter:e[1]||null}}updateFooterTotals(){if(!this.hasFooterTotals||!this.element)return;const t=this.calculateFooterTotals();let e=0;this.columns.forEach(i=>{if(i.footer_total){const n=`col_${e}`,s=this.element.querySelector(`[data-total-column="${n}"]`);if(s&&t[n]){const e=this.parseColumnKey(i.key).formatter||i.formatter;let l;l=e&&"string"==typeof e?this.formatValue(t[n].value,e):t[n].value,s.textContent=l}e++}})}formatValue(e,i){try{return t.dataFormatter.pipe(e,i)}catch(n){return console.warn("Error formatting value:",n),e}}calculateFooterTotals(){if(!this.hasFooterTotals||!this.collection||0===this.collection.length)return{};const t={};return this.footerTotalColumns.forEach((e,i)=>{const{fieldKey:n,formatter:s}=this.parseColumnKey(e.key);let l=0;this.collection.forEach(t=>{const e=t.get?t.get(n):t[n],i=parseFloat(e)||0;l+=i}),e.key,this.collection.length,t[`col_${i}`]={value:l,formatter:s||e.formatter,fieldKey:n,originalKey:e.key}}),t}extractColumnFilters(){this.filters={},this.columns.forEach(t=>{if(t.filter){const{fieldKey:e}=this.parseColumnKey(t.key);this.filters[e]=t.filter}})}isSelectable(){return this.batchActions&&this.batchActions.length>0&&"multiple"==this.selectionMode}buildTableTemplate(){const t="top"===this.batchBarLocation?this.buildBatchActionsPanel():"",e="bottom"===this.batchBarLocation?this.buildBatchActionsPanel():"";return`\n <div class="mojo-table-wrapper">\n ${this.buildToolbarTemplate()}\n ${t}\n <div class="table-container"${(()=>{const t=this.tableOptions&&null!=this.tableOptions.fontSize?this.tableOptions.fontSize:this.options&&this.options.fontSize,e="sm"===t?"0.9rem":"xs"===t?"0.8rem":t?String(t):null;return e?` style="font-size: ${e};"`:""})()}>\n {{#loading}}\n <div class="mojo-table-loading d-flex justify-content-center align-items-center py-5">\n <div class="spinner-border" role="status">\n <span class="visually-hidden">Loading...</span>\n </div>\n </div>\n {{/loading}}\n {{^loading}}\n {{#isEmpty}}\n <div class="table-empty text-center py-5">\n <i class="bi bi-inbox fa-2x mb-2 text-muted"></i>\n <p class="text-muted">{{emptyMessage}}</p>\n </div>\n {{/isEmpty}}\n {{^isEmpty}}\n <table class="${this.buildTableClasses()}">\n ${this.buildTableHeaderTemplate()}\n <tbody data-container="items"></tbody>\n ${this.hasFooterTotals?this.buildTableFooterTemplate():""}\n </table>\n {{/isEmpty}}\n {{/loading}}\n </div>\n ${e}\n ${this.buildPaginationTemplate()}\n </div>\n `}buildTableClasses(){let t=["table"];return this.tableOptions.striped&&t.push("table-striped"),this.tableOptions.bordered&&t.push("table-bordered"),this.tableOptions.hover&&t.push("table-hover"),this.tableOptions.responsive&&t.push("table-responsive"),this.tableOptions.background&&t.push(`table-${this.tableOptions.background}`),"sm"===this.tableOptions.size&&t.push("table-sm"),"lg"===this.tableOptions.size&&t.push("table-lg"),t.join(" ")}buildToolbarTemplate(){return this.searchable||this.filterable?`\n <div class="table-action-buttons mb-3">\n <div class="d-flex align-items-center gap-2">\n ${this.buildActionButtonsTemplate()}\n ${this.filterable?this.buildFilterDropdownTemplate():""}\n ${this.searchable&&"toolbar"===this.searchPlacement?this.buildSearchTemplate():""}\n\n </div>\n <div data-container="filter-pills"></div>\n </div>\n `:""}buildActionButtonsTemplate(){let t=[];if(t.push('\n <button class="btn btn-sm btn-outline-secondary btn-refresh"\n data-action="refresh"\n title="Refresh">\n <i class="bi bi-arrow-clockwise"></i>\n </button>\n '),this.isFullscreenSupported()&&t.push('\n <button class="btn btn-sm btn-outline-secondary btn-fullscreen"\n data-action="toggle-fullscreen"\n title="Toggle Fullscreen">\n <i class="bi bi-fullscreen"></i>\n </button>\n '),this.options.showAdd&&t.push(`\n <button class="btn btn-sm btn-success btn-add"\n data-action="add"\n title="${this.options.addButtonLabel}">\n <i class="${this.options.addButtonIcon} me-1"></i>\n <span class="d-none d-lg-inline">${this.options.addButtonLabel}</span>\n </button>\n `),this.options.showExport)if(this.exportOptions&&this.exportOptions.length>1){const e=this.exportOptions.map(t=>`\n <li>\n <a class="dropdown-item" href="#" data-action="export" data-format="${t.format}">\n <i class="${t.icon||"bi bi-file-earmark-arrow-down"} me-2"></i>${t.label}\n </a>\n </li>\n `).join("");t.push(`\n <div class="dropdown">\n <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button"\n data-bs-toggle="dropdown" aria-expanded="false" title="Export">\n <i class="bi bi-download me-1"></i>\n <span class="d-none d-lg-inline">Export</span>\n </button>\n <ul class="dropdown-menu">\n ${e}\n </ul>\n </div>\n `)}else{const e=this.exportOptions&&1===this.exportOptions.length?this.exportOptions[0].format:"json";t.push(`\n <button class="btn btn-sm btn-outline-secondary btn-export"\n data-action="export"\n data-format="${e}"\n title="Export">\n <i class="bi bi-download me-1"></i>\n <span class="d-none d-lg-inline">Export</span>\n </button>\n `)}return this.toolbarButtons&&this.toolbarButtons.length>0&&this.toolbarButtons.forEach((e,i)=>{const{label:n="Button",icon:s="",action:l="",handler:o=null,variant:a="outline-secondary",title:r=n,className:c="",permissions:d=null}=e;if(d&&!this.checkPermissions(d))return;const h=s?`<i class="${s} me-1"></i>`:"",u=`<span class="d-none d-lg-inline">${n}</span>`;let m="";o?m=`data-action="custom-toolbar-button" data-button-index="${i}"`:l&&(m=`data-action="${l}"`);const p=`btn btn-sm btn-${a} ${c}`.trim();t.push(`\n <button class="${p}"\n ${m}\n title="${r}">\n ${h}${u}\n </button>\n `)}),t.join("")}buildSearchTemplate(){return'\n <div class="flex-grow-1" style="max-width: 400px;">\n <div class="input-group input-group-sm">\n <span class="input-group-text">\n <i class="bi bi-search"></i>\n </span>\n <input type="search"\n class="form-control"\n placeholder="{{searchPlaceholder}}"\n data-filter="search"\n data-change-action="apply-search"\n value="{{collection.params.search}}"\n aria-label="Search">\n {{#searchValue}}\n <button class="btn btn-outline-secondary" type="button"\n data-action="clear-search"\n title="Clear search">\n <i class="bi bi-x"></i>\n </button>\n {{/searchValue}}\n </div>\n </div>\n '}buildFilterDropdownTemplate(){return this.filters&&Object.keys(this.filters).length>0||this.additionalFilters&&this.additionalFilters.length>0?`\n <div class="dropdown">\n <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button"\n data-bs-toggle="dropdown" aria-expanded="false">\n <i class="bi bi-filter me-1"></i>\n <span class="d-none d-lg-inline">Add Filter</span>\n </button>\n <div class="dropdown-menu" style="min-width: 250px;">\n ${this.buildFilterList()}\n </div>\n </div>\n `:""}buildFilterList(){const t=this.getAllAvailableFilters(),e=this.getActiveFilters();return 0===t.length?'<div class="dropdown-item-text text-muted">No filters available</div>':`\n ${t.map(t=>{const i=e.hasOwnProperty(t.key),n=i?"active":"",s=this.getFilterIcon(t.type||t.config?.type);return`\n <button class="dropdown-item ${n}"\n data-action="add-filter"\n data-filter-key="${t.key}">\n <i class="bi bi-${s} me-2"></i>\n ${t.label}\n ${i?'<i class="bi bi-check-circle ms-auto"></i>':""}\n </button>\n `}).join("")}\n ${Object.keys(e).length>0?'\n <div class="dropdown-divider"></div>\n <button class="dropdown-item text-danger" data-action="clear-all-filters">\n <i class="bi bi-x-circle me-2"></i>Clear All Filters\n </button>\n ':""}\n `}updateFilterPills(){const t=this.element?.querySelector('[data-container="filter-pills"]');if(!t)return;this.getActiveFilters();const e=this.buildActivePills();t.innerHTML=e}updateSearchInputs(t){const e=this.element?.querySelectorAll('[data-filter="search"]');e&&e.forEach(e=>{e.value=t||""})}buildActivePills(){if(this.hideActivePills)return"";const t=this.getActiveFilters(),e=t.search&&""!==t.search.toString().trim();let i=Object.entries(t).filter(([t,e])=>e&&""!==e.toString().trim()&&"search"!==t);return this.hideActivePillNames&&this.hideActivePillNames.length>0&&(i=i.filter(([t])=>!this.hideActivePillNames.includes(t))),0!==i.length||e?`\n <div class="row mt-2">\n <div class="col-12">\n <div class="d-flex flex-wrap align-items-center">\n ${i.map(([t,e])=>{const{field:i}=o(t);return`\n <span class="badge bg-primary me-1 mb-1 py-1 px-2 position-relative" style="font-size: 0.75rem;">\n <i class="bi bi-filter me-1" style="font-size: 0.65rem;"></i>\n\n <button type="button" class="btn btn-link text-white p-0 ms-1"\n style="font-size: 0.65rem; line-height: 1;"\n data-action="edit-filter"\n data-filter="${t}"\n title="Edit filter">\n ${a(t,e,this.getFilterLabel(i))}\n </button>\n\n <button type="button" class="btn-close btn-close-white ms-1"\n style="font-size: 0.6rem; width: 0.5rem; height: 0.5rem;"\n data-action="remove-filter"\n data-filter="${t}"\n title="Remove filter">\n </button>\n </span>\n `}).join("")}\n ${i.length>1||i.length>0&&e||0===i.length&&e?'\n <button class="btn btn-sm btn-outline-secondary mb-1 py-0 px-2" style="font-size: 0.75rem;" data-action="clear-all-filters">\n <i class="bi bi-x-circle me-1" style="font-size: 0.7rem;"></i>\n <small>Clear All</small>\n </button>\n ':""}\n </div>\n </div>\n </div>\n `:""}buildTableHeaderTemplate(){let t="";return this.isSelectable()&&(t+='\n <th style="width: 40px; padding: 0;">\n <div class="mojo-select-all-cell" data-action="select-all">\n <div class="mojo-checkbox">\n <i class="bi bi-check"></i>\n </div>\n </div>\n </th>\n '),this.columns.forEach(e=>{const{fieldKey:i}=this.parseColumnKey(e.key),n=this.sortable&&!1!==e.sortable,s=this.getSortBy()===i?this.getSortDirection():null,l=this.getSortIcon(s),o=e.label||e.title||i,a=this.getResponsiveClasses(e.visibility);t+=`\n <th class="${n?"sortable":""} ${a}">\n <div class="d-flex align-items-center">\n <span>${o}</span>\n ${n?`\n <div class="dropdown d-inline-block ms-2">\n <button class="btn btn-sm btn-link p-0 text-decoration-none" type="button"\n data-bs-toggle="dropdown" aria-expanded="false"\n data-column="${i}">\n ${l}\n </button>\n <ul class="dropdown-menu dropdown-menu-end">\n <li><a class="dropdown-item ${"asc"===s?"active":""}"\n data-action="sort" data-field="${i}" data-direction="asc">\n <i class="bi bi-sort-alpha-down me-2"></i>Sort A-Z\n </a></li>\n <li><a class="dropdown-item ${"desc"===s?"active":""}"\n data-action="sort" data-field="${i}" data-direction="desc">\n <i class="bi bi-sort-alpha-down-alt me-2"></i>Sort Z-A\n </a></li>\n <li><a class="dropdown-item ${null===s?"active":""}"\n data-action="sort" data-field="${i}" data-direction="none">\n <i class="bi bi-x-circle me-2"></i>No Sort\n </a></li>\n </ul>\n </div>\n `:""}\n </div>\n </th>\n `}),this.actions?t+="<th>Actions</th>":this.contextMenu&&(t+='<th style="width: 1px;"></th>'),`\n <thead>\n <tr>\n ${t}\n </tr>\n </thead>\n `}buildTableFooterTemplate(){let t="";this.isSelectable()&&(t+="<td></td>");let e=0;return this.columns.forEach((i,n)=>{const s=this.getResponsiveClasses(i.visibility);if(i.footer_total){const n=`col_${e}`,l=this.parseColumnKey(i.key).formatter||i.formatter;let o;o=l&&"string"==typeof l?`{{{footerTotals.${n}.value|${l}}}}`:`{{footerTotals.${n}.value}}`,t+=`<td class="table-footer-total ${s}" data-total-column="${n}">${o}</td>`,e++}else t+=0===n?`<td class="table-footer-label ${s}"><strong>Totals</strong></td>`:`<td class="${s}"></td>`}),(this.actions||this.contextMenu)&&(t+="<td></td>"),`\n <tfoot>\n <tr class="table-totals-row">\n ${t}\n </tr>\n </tfoot>\n `}buildBatchActionsPanel(){if(!this.batchActions||0===this.batchActions.length)return"";if("top"===this.batchBarLocation){let t="";return this.batchActions.forEach(e=>{t+=`\n <button class="btn btn-sm btn-outline-secondary" data-action="batch-${e.action}" title="${e.label}">\n <i class="${e.icon} me-1"></i>\n <span class="d-none d-lg-inline">${e.label}</span>\n </button>\n `}),`\n <div class="batch-actions-panel-top alert alert-info d-none mb-3" role="alert">\n <div class="d-flex justify-content-between align-items-center">\n <div class="d-flex align-items-center">\n <strong class="me-2">\n <span class="batch-select-count">0</span> ${this.options.batchPanelTitle||"items"} selected\n </strong>\n </div>\n <div class="d-flex gap-2 align-items-center">\n ${t}\n <button class="btn btn-sm btn-outline-secondary" data-action="clear-selection" title="Clear Selection">\n <i class="bi bi-x-circle me-1"></i>\n <span class="d-none d-lg-inline">Clear</span>\n </button>\n </div>\n </div>\n </div>\n `}{let t="";return this.batchActions.forEach(e=>{t+=`\n <div class="batch-select-action text-center px-2" data-action="batch-${e.action}">\n <div class="batch-action-icon fs-3">\n <i class="${e.icon}"></i>\n </div>\n <div class="batch-action-title small">${e.label}</div>\n </div>\n `}),`\n <div class="batch-actions-panel rounded-start rounded-end" style="display: none;">\n <div class="batch-select-panel rounded-start rounded-end">\n <div class="row g-0">\n <div class="col-auto">\n <div class="batch-select-count rounded-start">0</div>\n </div>\n <div class="col">\n <div class="ps-2 batch-select-title">${this.options.batchPanelTitle||"Rows"}</div>\n </div>\n <div class="col">\n <div class="batch-select-actions d-flex justify-content-end">\n ${t}\n </div>\n </div>\n <div class="col-auto">\n <div class="batch-select-end rounded-end"></div>\n </div>\n </div>\n </div>\n </div>\n `}}buildPaginationTemplate(){return this.paginated?'\n <div class="table-status-bar mt-3">\n <div class="d-flex flex-column flex-lg-row justify-content-center justify-content-lg-between align-items-center gap-3">\n <div class="d-flex flex-column flex-sm-row align-items-center gap-2 gap-sm-3 text-center text-lg-start">\n <span class="text-muted">\n Showing <span data-value="start">0</span> to <span data-value="end">0</span>\n of <span data-value="total">0</span> entries\n </span>\n <div class="d-flex align-items-center">\n <label class="form-label me-2 mb-0">Show:</label>\n <select class="form-select form-select-sm" style="width: auto;" data-change-action="page-size">\n <option value="5">5</option>\n <option value="10">10</option>\n <option value="25">25</option>\n <option value="50">50</option>\n <option value="100">100</option>\n </select>\n </div>\n </div>\n <nav aria-label="Table pagination">\n <ul class="pagination pagination-sm mb-0 justify-content-center" data-container="pagination">\n \x3c!-- Pagination will be rendered here --\x3e\n </ul>\n </nav>\n </div>\n </div>\n ':""}_createItemView(t,e){const i=new this.itemClass({model:t,index:e,listView:this,tableView:this,template:this.itemTemplate,columns:this.columns,actions:this.actions,contextMenu:this.contextMenu,batchActions:this.batchActions,containerId:"items"});return this.itemViews.set(t.id,i),i.on("item:select",t=>{this._onItemSelect(t),this.updateBatchActionsPanel()}),i.on("item:deselect",t=>{this._onItemDeselect(t),this.updateBatchActionsPanel()}),i.on("row:click",this._onRowClick.bind(this)),i.on("row:view",this._onRowView.bind(this)),i.on("row:edit",this._onRowEdit.bind(this)),i.on("row:delete",this._onRowDelete.bind(this)),i.on("cell:edit",this._onCellEdit.bind(this)),i.on("cell:save",this._onCellSave.bind(this)),i.on("cell:cancel",this._onCellCancel.bind(this)),i}async onMounted(){await super.onMounted();const t=this.getActiveFilters();this.collection&&Object.keys(t).length>0&&this.updateFilterPills(),this.setupSearchClearListener()}setupSearchClearListener(){this.element&&this.element.querySelectorAll('input[type="search"][data-filter="search"]').forEach(t=>{t.addEventListener("input",t=>{""===t.target.value&&this.getActiveFilters().search&&this.onActionClearSearch(t,t.target)})})}_onRowClick(t){if(this.emit("row:click",t),this.options.onRowClick)return this.options.onRowClick(t.model,t.event);"view"===this.clickAction?this._onRowView(t):"edit"===this.clickAction&&this._onRowEdit(t)}getModelClass(t){return this.collection?.ModelClass?this.collection.ModelClass:this.collection?.model?this.collection.model:t?.constructor?t.constructor:null}getModelName(t){const e=this.getModelClass(t);return e&&(e.MODEL_NAME||e.name.replace(/Model$/,""))||"Item"}getItemViewClass(t){if(this.itemView)return this.itemView;const e=this.getModelClass(t);return e?.VIEW_CLASS?e.VIEW_CLASS:null}getAddFormConfig(t){return this.addForm||t?.ADD_FORM||this.editForm||t?.EDIT_FORM}getEditFormConfig(t){return this.editForm||t?.EDIT_FORM||this.addForm||t?.ADD_FORM}getFormDialogConfig(t){return{...t?.FORM_DIALOG_CONFIG,...this.formDialogConfig}}renderTemplateString(e,i){return e?t.Mustache.render(e,i):""}async _onRowView(t){if(this.emit("row:view",t),this.options.onItemView)return void(await this.options.onItemView(t.model,t.event));const e=this.getItemViewClass(t.model);if(e){const n=new e({model:t.model,collection:this.collection});await i.Dialog.showDialog({header:!1,body:n,size:"lg",centered:!1,...this.getFormDialogConfig(this.getModelClass(t.model)),...this.viewDialogOptions})}else await i.Dialog.showData({title:`View ${this.getModelName(t.model)} #${t.model.id}`,model:t.model})}async _onRowEdit(t){if(this.emit("row:edit",t),this.options.onItemEdit)return void(await this.options.onItemEdit(t.model,t.event));const e=this.getModelClass(t.model);let s=this.getEditFormConfig(e);if(s){s.fields||(s={title:`Edit ${this.getModelName(t.model)}`,fields:s});const n=await i.Dialog.showModelForm({model:t.model,...s,...this.getFormDialogConfig(e)});if(!n)return;if(!n.success||!n?.result?.data.status)return void i.Dialog.showError(n?.result?.data?.error||n?.result?.message||"An error occurred")}else{const e=await i.Dialog.showDialog({title:`Edit ${this.getModelName(t.model)} #${t.model.id}`,body:new n.FormView({model:t.model,fields:this.options.formFields||[]})});if(e){const n=await t.model.save(e);if(!n.data?.status)return void i.Dialog.showError(n.data.error||"An error occurred");await this.refresh()}}}async _onRowDelete(t){if(this.emit("row:delete",t),this.options.onItemDelete)return void(await this.options.onItemDelete(t.model,t.event));const e=this.getModelClass(t.model),n=this.deleteTemplate||e?.DELETE_TEMPLATE||'Are you sure you want to delete this {{name||"item"}}?',s=this.renderTemplateString(n,t.model);await i.Dialog.confirm({message:s||"Are you sure you want to delete this item?",title:"Confirm Delete",confirmText:"Delete",confirmClass:"btn-danger"})&&(await t.model.destroy(),this.collection.fetch())}_onCellEdit(t){this.emit("cell:edit",t)}async _onCellSave(t){this.emit("cell:save",t)}_onCellCancel(t){this.emit("cell:cancel",t)}isFullscreenSupported(){return!!(document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled||document.msFullscreenEnabled)}async onActionToggleFullscreen(t,e){this.isFullscreen?await this.exitFullscreen():await this.enterFullscreen()}async enterFullscreen(){try{this.element.requestFullscreen?await this.element.requestFullscreen():this.element.mozRequestFullScreen?await this.element.mozRequestFullScreen():this.element.webkitRequestFullscreen?await this.element.webkitRequestFullscreen():this.element.msRequestFullscreen&&await this.element.msRequestFullscreen(),this.isFullscreen=!0,this.element.classList.add("table-fullscreen"),this.updateFullscreenButton(),this.setupFullscreenListeners(),this.emit("table:fullscreen:enter")}catch(t){console.warn("Could not enter fullscreen:",t)}}async exitFullscreen(){try{document.exitFullscreen?await document.exitFullscreen():document.mozCancelFullScreen?await document.mozCancelFullScreen():document.webkitExitFullscreen?await document.webkitExitFullscreen():document.msExitFullscreen&&await document.msExitFullscreen(),this.isFullscreen=!1,this.element.classList.remove("table-fullscreen"),this.updateFullscreenButton(),this.emit("table:fullscreen:exit")}catch(t){console.warn("Could not exit fullscreen:",t)}}updateFullscreenButton(){const t=this.element?.querySelector(".btn-fullscreen"),e=t?.querySelector("i");t&&e&&(this.isFullscreen?(e.className="bi bi-fullscreen-exit",t.title="Exit Fullscreen"):(e.className="bi bi-fullscreen",t.title="Enter Fullscreen"))}setupFullscreenListeners(){if(this._fullscreenHandler)return;const t=()=>{!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement)&&this.isFullscreen&&(this.isFullscreen=!1,this.element.classList.remove("table-fullscreen"),this.updateFullscreenButton(),this.emit("table:fullscreen:exit"))};document.addEventListener("fullscreenchange",t),document.addEventListener("mozfullscreenchange",t),document.addEventListener("webkitfullscreenchange",t),document.addEventListener("msfullscreenchange",t),this._fullscreenHandler=t}cleanupFullscreenListeners(){this._fullscreenHandler&&(document.removeEventListener("fullscreenchange",this._fullscreenHandler),document.removeEventListener("mozfullscreenchange",this._fullscreenHandler),document.removeEventListener("webkitfullscreenchange",this._fullscreenHandler),document.removeEventListener("msfullscreenchange",this._fullscreenHandler),this._fullscreenHandler=null)}destroy(){this.cleanupFullscreenListeners(),super.destroy()}async onActionRefresh(t,e){await this.refresh()}async onActionAdd(t,e){if(this.options.onAdd)return this.emit("table:add",{event:t}),void(await this.options.onAdd(t));this.emit("table:add",{event:t});const s=this.getModelClass();if(!s)return void console.warn("Cannot determine Model class for add operation");let l=this.getAddFormConfig(s);if(l){const t=new s;l.fields||(l={title:`Add ${this.getModelName()}`,fields:l});const e=await i.Dialog.showForm({model:t,...l,...this.getFormDialogConfig(s)});if(e){this.options.addRequiresActiveGroup&&(e.group=this.getApp().activeGroup.id),this.options.addRequiresActiveUser&&(e.user=this.getApp().activeUser.id),this.options.addFormDefaults&&Object.assign(e,this.options.addFormDefaults);const n=await t.save(e);if(!n?.data.status)return void i.Dialog.showError(n?.data.error||"An error occurred");this.collection&&this.collection.add(t),await this.refresh()}}else{const t=new s,e=await i.Dialog.showDialog({title:`Add ${this.getModelName()}`,body:new n.FormView({model:t,fields:this.options.formFields||[]})});if(e){const n=await t.save(e);if(!n?.data.status)return void i.Dialog.showError(n.data.error||"An error occurred");this.collection&&this.collection.add(t),await this.refresh()}}}async onActionExport(t,e){const i=e.getAttribute("data-format")||"json";this.emit("table:export",{format:i,source:this.exportSource,event:t}),"remote"===this.exportSource?this.collection?await this.collection.download(i):console.warn("TableView: Cannot export from remote without a collection."):this.options.onExport?await this.options.onExport(this.collection?.toJSON()||[],i):console.warn("TableView: onExport handler not implemented for local export.")}async onActionApplySearch(t,e){const i=e.value.trim();this.collection&&(this.setFilter("search",i),this.collection.params.start=0,this.collection.restEnabled?await this.collection.fetch():this.render()),this.updateFilterPills(),this.emit("table:search",{searchTerm:i,event:t}),this.emit("params-changed")}async onActionClearSearch(t,e){this.setFilter("search",null),this.collection&&(this.collection.params.start=0,this.collection.restEnabled&&await this.collection.fetch()),await this.render(),this.updateFilterPills(),this.emit("table:search",{searchTerm:"",event:t}),this.emit("params-changed")}getSortBy(){const t=this.collection?.params?.sort;return t?t.startsWith("-")?t.slice(1):t:null}getSortDirection(){const t=this.collection?.params?.sort;return t&&t.startsWith("-")?"desc":"asc"}getSortIcon(t){return"asc"===t?'<i class="bi bi-sort-alpha-down text-primary"></i>':"desc"===t?'<i class="bi bi-sort-alpha-down-alt text-primary"></i>':'<i class="bi bi-three-dots-vertical text-muted"></i>'}async onActionSort(t,e){t.preventDefault();const i=e.getAttribute("data-field"),n=e.getAttribute("data-direction");if(this.collection){let t;if(t="none"===n?void 0:"desc"===n?`-${i}`:i,this.collection.setParams({...this.collection.params,sort:t,start:0}),this.collection.restEnabled)await this.collection.fetch();else{if(t){const e=t.startsWith("-"),i=e?t.slice(1):t;this.collection.sort((t,n)=>{const s=t.get(i),l=n.get(i);return s<l?e?1:-1:s>l?e?-1:1:0})}this.render()}}this.updateSortIcons(),this.emit("table:sort",{field:i,event:t}),this.emit("params-changed")}updateSortIcons(){if(!this.element)return;const t=this.getSortBy(),e=this.getSortDirection();this.columns.forEach(i=>{if(this.sortable&&!1!==i.sortable){const{fieldKey:n}=this.parseColumnKey(i.key),s=this.element.querySelector(`[data-bs-toggle="dropdown"][data-column="${n}"]`);if(s){const i=t===n,l=this.getSortIcon(i?e:null);s.innerHTML=l;const o=s.nextElementSibling;if(o){const s=o.querySelector(`[data-field="${n}"][data-direction="asc"]`),l=o.querySelector(`[data-field="${n}"][data-direction="desc"]`),a=o.querySelector(`[data-field="${n}"][data-direction="none"]`);s&&s.classList.toggle("active",i&&"asc"===e),l&&l.classList.toggle("active",i&&"desc"===e),a&&a.classList.toggle("active",!i||t!==n)}}}})}async onActionSelectAll(t,e){t.stopPropagation();const i=this.itemViews.size>0&&Array.from(this.itemViews.values()).every(t=>t.selected);i?this.clearSelection():this.forEachItem(t=>{t.selected||t.select()});const n=this.element?.querySelector(".mojo-select-all-cell");n&&n.classList.toggle("selected",!i),this.updateBatchActionsPanel()}async onBeforeRender(){this.searchValue=this.getActiveFilters().search||"",this.footerTotals=this.calculateFooterTotals()}async onAfterRender(){if(await super.onAfterRender(),this.hasFooterTotals&&this.updateFooterTotals(),this.paginated&&this.collection){const t=this.collection.meta?.count||this.collection.length(),e=this.collection.params?.start||0,i=this.collection.params?.size||10,n=Math.min(e+i,t),s=this.element.querySelector('[data-value="start"]'),l=this.element.querySelector('[data-value="end"]'),o=this.element.querySelector('[data-value="total"]');s&&(s.textContent=e+1),l&&(l.textContent=n),o&&(o.textContent=t);const a=this.element.querySelector('[data-change-action="page-size"]');a&&(a.value=i),this.renderPagination()}this.updateSortIcons(),this.updateFilterPills(),this.setupSearchClearListener()}renderPagination(){const t=this.element.querySelector('[data-container="pagination"]');if(!t||!this.collection)return;const e=this.collection.meta?.count||this.collection.length(),i=this.collection.params?.size||10,n=this.collection.params?.start||0,s=Math.floor(n/i)+1,l=Math.ceil(e/i);if(l<=1)return void(t.innerHTML="");const o=s>1?s-1:l,a=s<l?s+1:1,r=[];r.push(`\n <li class="page-item">\n <a class="page-link" href="#" data-action="page" data-page="${o}">\n <i class="bi bi-chevron-left"></i>\n </a>\n </li>\n `);const c=/* @__PURE__ */new Set([1,l]);for(let u=s-1;u<=s+1;u++)u>=1&&u<=l&&c.add(u);const d=Array.from(c).sort((t,e)=>t-e);let h=0;for(const u of d)h&&u-h>1&&r.push('\n <li class="page-item disabled"><span class="page-link">…</span></li>\n '),r.push(`\n <li class="page-item ${u===s?"active":""}">\n <a class="page-link" href="#" data-action="page" data-page="${u}">${u}</a>\n </li>\n `),h=u;r.push(`\n <li class="page-item">\n <a class="page-link" href="#" data-action="page" data-page="${a}">\n <i class="bi bi-chevron-right"></i>\n </a>\n </li>\n `),t.innerHTML=r.join("")}async onActionPage(t,e){t.preventDefault();const i=parseInt(e.getAttribute("data-page"),10),n=this.collection.params?.size||10,s=this.collection.meta?.count||this.collection.length(),l=Math.max(1,Math.ceil(s/n));let o=isNaN(i)?1:i;o<1&&(o=l),o>l&&(o=1),this.collection.setParams({...this.collection.params,start:(o-1)*n}),this.collection.restEnabled?await this.collection.fetch():this.render(),this.emit("table:page",{page:o,event:t}),this.emit("params-changed")}async onChangePageSize(t,e){const i=parseInt(e.value);this.collection&&(this.collection.setParams({...this.collection.params,start:0,size:i}),this.collection.restEnabled&&await this.collection.fetch(),this.render()),this.emit("table:pagesize",{size:i,event:t}),this.emit("params-changed")}getActiveFilters(){if(!this.collection?.params)return{};const{start:t,size:e,sort:i,...n}=this.collection.params,s={},l=/* @__PURE__ */new Set;return this.getAllAvailableFilters().forEach(t=>{if("daterange"===t.config.type){const e=t.key,i=t.config.startName||"dr_start",o=t.config.endName||"dr_end",a=t.config.fieldName||"dr_field";n[a]===e&&(n[i]||n[o])&&(s[e]={start:n[i]||"",end:n[o]||""},l.add(i),l.add(o),l.add(a))}}),Object.keys(n).forEach(t=>{l.has(t)||(s[t]=n[t])}),Object.keys(s).forEach(t=>{if(s.hasOwnProperty(t)){const e=`${t}__in`;s.hasOwnProperty(e)&&(delete s[t],s[e]=s[e])}}),s}setFilter(t,e){if(!this.collection)return;const i=this.getFilterConfig(t);if(i&&"daterange"===i.type){const n=i.startName||"dr_start",s=i.endName||"dr_end",l=i.fieldName||"dr_field";delete this.collection.params[n],delete this.collection.params[s],delete this.collection.params[l],e&&"object"==typeof e&&(e.start||e.end)&&(e.start&&(this.collection.params[n]=e.start),e.end&&(this.collection.params[s]=e.end),this.collection.params[l]=t)}else{const{field:i,lookup:n}=o(t);if(delete this.collection.params[t],delete this.collection.params[i],delete this.collection.params[`${i}__in`],!e||Array.isArray(e)&&0===e.length)return;Array.isArray(e)?1===e.length?this.collection.params[i]=e[0]:this.collection.params[`${i}__in`]=e.join(","):this.collection.params[t]=e}}getAllAvailableFilters(){const t=[];return this.columns.forEach(e=>{if(e.filter){const{fieldKey:i}=this.parseColumnKey(e.key);t.push({key:i,label:e.filter.label||e.label||i,type:e.filter.type,config:e.filter})}}),this.additionalFilters&&Array.isArray(this.additionalFilters)&&this.additionalFilters.forEach(e=>{t.push({key:e.name||e.key,label:e.label,type:e.type,config:e})}),t}getFilterConfig(t){const e=this.columns.find(e=>{const{fieldKey:i}=this.parseColumnKey(e.key);return i===t});if(e&&e.filter)return e.filter;if(this.additionalFilters&&Array.isArray(this.additionalFilters)){const e=this.additionalFilters.find(e=>(e.name||e.key)===t);if(e)return e}return null}getFilterLabel(t){if("search"===t)return"Search";const e=this.filters[t];if(e&&e.label)return e.label;const i=this.additionalFilters.find(e=>(e.name||e.key)===t);return i&&i.label?i.label:t.charAt(0).toUpperCase()+t.slice(1)}getFilterDisplayValue(t,e){if("search"===t)return`"${e}"`;const i=this.filters[t]||this.additionalFilters.find(e=>(e.name||e.key)===t);if(i&&"daterange"===i.type&&"object"==typeof e)return`${e.start||""} to ${e.end||""}`;if(i&&"select"===i.type&&i.options){if("object"==typeof i.options[0]){const t=i.options.find(t=>t.value===e);return t?t.label:e}return e}return e}getFilterIcon(t){return{text:"search",select:"funnel",date:"calendar",daterange:"calendar-range",number:"123",boolean:"toggle-on"}[t]||"filter"}async onActionAddFilter(t,e){const n=e.getAttribute("data-filter-key"),s=this.getFilterConfig(n),l=this.getActiveFilters()[n];if(!s)return void console.warn("No filter config found for key:",n);const o=await i.Dialog.showForm({title:`${void 0!==l&&""!==l?"Edit":"Add"} ${this.getFilterLabel(n)} Filter`,size:"md",fields:[this.buildFilterDialogField(s,l,n)]});if(o){const t=this.extractFilterValue(s,o);this.setFilter(n,t),await this.applyFilters()}}buildFilterDialogField(t,e,i){const n={name:"filter_value",label:t.label,value:e,...t,placeholder:t.placeholder||t.placeHolder};if("daterange"===t.type){if(n.startName=n.startName||"dr_start",n.endName=n.endName||"dr_end",n.fieldName=n.fieldName||"dr_field",n.format=n.format||"YYYY-MM-DD",n.displayFormat=n.displayFormat||"MMM DD, YYYY",n.separator=n.separator||" to ",n.label=n.label||"Date Range",e&&"object"==typeof e){const t=t=>{if(!t&&0!==t)return"";if(t instanceof Date&&!isNaN(t))return t.toISOString().slice(0,10);const e=String(t).trim();if(!e)return"";if(/^-?\d+$/.test(e)){const t=Number(e),i=e.length<=10?1e3*t:t,n=new Date(i);if(!isNaN(n))return n.toISOString().slice(0,10)}const i=new Date(e);return isNaN(i)?e:i.toISOString().slice(0,10)};n.startDate=t(e.start||e.from||e.begin||""),n.endDate=t(e.end||e.to||e.finish||"")}}else if("multiselect"===t.type){let i=[];e&&(Array.isArray(e)?i=e:"string"==typeof e&&(i=e.split(",").map(t=>t.trim()).filter(t=>t))),n.value=i,n.placeholder||n.placeHolder||(t.placeholder||t.placeHolder?n.placeholder=t.placeholder||t.placeHolder:t.label&&(n.placeholder=`Select ${t.label}...`))}return n}extractFilterValue(t,e){if("daterange"===t.type){const i=t.startName||"dr_start",n=t.endName||"dr_end";return{start:e[i],end:e[n]}}return t.type,e.filter_value}async applyFilters(){if(this.collection&&(this.collection.params.start=0),this.collection?.restEnabled)try{await this.collection.fetch(),this.render()}catch(t){console.error("Failed to fetch filtered data:",t),this.render()}else this.render();this.updateFilterPills(),this.emit("params-changed")}async onActionEditFilter(t,e){const n=e.getAttribute("data-filter"),{field:s}=o(n);let l=this.getFilterConfig(s)||this.getFilterConfig(n);const a=this.getActiveFilters(),r=a[n]||a[s];if(!l)return void console.warn("No filter config found for key:",n,"or field:",s);const c={filter_value:r};if("daterange"===l.type&&r&&"object"==typeof r){const t=l.startName||"dr_start",e=l.endName||"dr_end";c[t]=r.start||"",c[e]=r.end||""}const d=await i.Dialog.showForm({title:`Edit ${this.getFilterLabel(s)} Filter`,size:"md",data:c,fields:[this.buildFilterDialogField(l,r,s)]});if(d){const t=this.extractFilterValue(l,d);this.setFilter(n,t),await this.applyFilters()}}async onActionRemoveFilter(t,e){const i=e.getAttribute("data-filter"),{field:n}=o(i);this.setFilter(i,null),"search"===i&&this.updateSearchInputs(""),this.collection.restEnabled&&await this.collection.fetch(),this.render(),this.updateFilterPills(),this.emit("filter:remove",{key:i,field:n}),this.emit("params-changed")}async onActionClearAllFilters(t,e){if(!this.collection)return;const{start:i,size:n,sort:s}=this.collection.params;this.collection.params={start:i,size:n},s&&(this.collection.params.sort=s),this.updateSearchInputs(""),this.collection.restEnabled&&await this.collection.fetch(),this.render(),this.updateFilterPills(),this.emit("filters:clear"),this.emit("params-changed")}updateBatchActionsPanel(){if(!this.batchActions||0===this.batchActions.length)return;const t=this.getSelectedItems().length;if("top"===this.batchBarLocation){const e=this.element?.querySelector(".batch-actions-panel-top"),i=this.element?.querySelector(".batch-select-count");e&&i&&(i.textContent=t,t>0?e.classList.remove("d-none"):e.classList.add("d-none"))}else{const e=this.element?.querySelector(".batch-actions-panel"),i=this.element?.querySelector(".batch-select-count");e&&i&&(i.textContent=t,e.style.display=t>0?"block":"none")}const e=this.element?.querySelector(".mojo-select-all-cell");if(e){const t=this.itemViews.size>0&&Array.from(this.itemViews.values()).every(t=>t.selected),i=Array.from(this.itemViews.values()).some(t=>t.selected);e.classList.toggle("selected",t),e.classList.toggle("indeterminate",!t&&i);const n=e.querySelector("i");n&&(n.className=!t&&i?"bi bi-dash":"bi bi-check")}}async onActionBatch(t,e){const i=e.getAttribute("data-action").replace("batch-",""),n=this.getSelectedItems();this.emit("batch:action",{action:i,items:n,event:t})}async onActionClearSelection(t,e){this.clearSelection(),this.updateBatchActionsPanel()}async onActionCustomToolbarButton(t,e){const i=parseInt(e.getAttribute("data-button-index"),10),n=this.toolbarButtons[i];n&&"function"==typeof n.handler&&await n.handler.call(this,t,e)}}exports.DjangoLookups=r,exports.LOOKUPS=l,exports.Log=Log,exports.LogList=LogList,exports.Member=Member,exports.MemberForms=s,exports.MemberList=MemberList,exports.TableRow=TableRow,exports.TableView=TableView,exports.formatFilterDisplay=a,exports.parseFilterKey=o;
|
|
2
|
-
//# sourceMappingURL=TableView-CxYpxZvr.js.map
|