@collabdt/core 0.0.56 → 0.2.0
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/README.md +4 -26
- package/dist/core/components/AppSidebarContent.d.ts +2 -1
- package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
- package/dist/core/components/AppSidebarContent.js +10 -7
- package/dist/core/components/AppSidebarContent.js.map +1 -1
- package/dist/core/components/Toolbar.d.ts +7 -1
- package/dist/core/components/Toolbar.d.ts.map +1 -1
- package/dist/core/components/Toolbar.js +3 -3
- package/dist/core/components/Toolbar.js.map +1 -1
- package/dist/core/components/TopNavigationBar.d.ts +6 -1
- package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
- package/dist/core/components/TopNavigationBar.js +2 -2
- package/dist/core/components/TopNavigationBar.js.map +1 -1
- package/dist/core/components/authentication/AuthPage.d.ts +2 -1
- package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
- package/dist/core/components/authentication/AuthPage.js +3 -5
- package/dist/core/components/authentication/AuthPage.js.map +1 -1
- package/dist/core/components/authentication/Signin.d.ts +2 -1
- package/dist/core/components/authentication/Signin.d.ts.map +1 -1
- package/dist/core/components/authentication/Signin.js +2 -2
- package/dist/core/components/authentication/Signin.js.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.js +109 -36
- package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
- package/dist/core/components/settings/index.d.ts +3 -1
- package/dist/core/components/settings/index.d.ts.map +1 -1
- package/dist/core/components/settings/index.js +2 -2
- package/dist/core/components/settings/index.js.map +1 -1
- package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/AccountSettingsPanel.js +9 -2
- package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts +5 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.js +7 -5
- package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/SettingsContent.d.ts +2 -1
- package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsContent.js +2 -2
- package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
- package/dist/core/components/support/BugReportDialog.d.ts +3 -2
- package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
- package/dist/core/components/support/BugReportDialog.js +103 -25
- package/dist/core/components/support/BugReportDialog.js.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.d.ts +3 -1
- package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.js +39 -4
- package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
- package/dist/core/components/support/SupportMenu.d.ts.map +1 -1
- package/dist/core/components/support/SupportMenu.js +1 -4
- package/dist/core/components/support/SupportMenu.js.map +1 -1
- package/dist/core/components/ui/AnimatedBackground.d.ts +2 -1
- package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
- package/dist/core/components/ui/AnimatedBackground.js +2 -5
- package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.d.ts +3 -1
- package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.js +4 -2
- package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Header.d.ts +3 -2
- package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Header.js +5 -6
- package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.d.ts +7 -1
- package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.js +4 -4
- package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +2 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -4
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts +3 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js +3 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
- package/dist/core/components/ui/Sidebar.d.ts +8 -0
- package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
- package/dist/core/components/ui/Sidebar.js +21 -7
- package/dist/core/components/ui/Sidebar.js.map +1 -1
- package/dist/core/components/ui/ToolbarButton.js +18 -1
- package/dist/core/components/ui/ToolbarButton.js.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.d.ts +5 -1
- package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.js +15 -4
- package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.d.ts +3 -1
- package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.js +11 -14
- package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.js +14 -27
- package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts +3 -1
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +4 -2
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +13 -18
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts +3 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +3 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.d.ts +2 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.js +3 -5
- package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.js +13 -3
- package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts +2 -0
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +84 -3
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +23 -2
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
- package/dist/core/components/viewers/Viewer.d.ts +7 -1
- package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
- package/dist/core/components/viewers/Viewer.js +6 -6
- package/dist/core/components/viewers/Viewer.js.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.d.ts +3 -1
- package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.js +2 -2
- package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +3 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts +5 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +3 -2
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +3 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +2 -2
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +3 -5
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +3 -1
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -2
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.d.ts +3 -1
- package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.js +2 -2
- package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.d.ts +2 -1
- package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.js +5 -6
- package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.d.ts +5 -1
- package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.js +15 -16
- package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.d.ts +3 -1
- package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.js +5 -1
- package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +6 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.js +5 -3
- package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts +5 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +6 -10
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +3 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +4 -6
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts +19 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +163 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts +3 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +310 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts +30 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js +122 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts +13 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js +58 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +6 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.js +5 -4
- package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +5 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +5 -8
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +3 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts +3 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js +2 -2
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts +3 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +4 -7
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +8 -8
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts +18 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +102 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +243 -176
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts +24 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +46 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +8 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -3
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +11 -1
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +5 -3
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +10 -1
- package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/mapTools.js +5 -3
- package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +14 -5
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/config.js +22 -11
- package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/index.js +2 -2
- package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/osm.js +5 -4
- package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js +7 -5
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts +3 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +11 -14
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts +3 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +37 -52
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts +3 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js +5 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts +2 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +5 -6
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts +2 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +15 -9
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts +5 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +3 -2
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts +3 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -2
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +12 -23
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.js +0 -1
- package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
- package/dist/core/hooks/useCaptureScreenshot.d.ts +2 -0
- package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -0
- package/dist/core/hooks/useCaptureScreenshot.js +110 -0
- package/dist/core/hooks/useCaptureScreenshot.js.map +1 -0
- package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +3 -0
- package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -0
- package/dist/core/hooks/useGeocodingRuntimeConfig.js +17 -0
- package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -0
- package/dist/core/store/AppConfig/context.d.ts +5 -0
- package/dist/core/store/AppConfig/context.d.ts.map +1 -1
- package/dist/core/store/AppConfig/context.js.map +1 -1
- package/dist/core/store/CombineProviders.d.ts +6 -1
- package/dist/core/store/CombineProviders.d.ts.map +1 -1
- package/dist/core/store/CombineProviders.js +6 -3
- package/dist/core/store/CombineProviders.js.map +1 -1
- package/dist/core/store/MapSites/context.d.ts +16 -0
- package/dist/core/store/MapSites/context.d.ts.map +1 -0
- package/dist/core/store/MapSites/context.js +29 -0
- package/dist/core/store/MapSites/context.js.map +1 -0
- package/dist/core/store/MapSites/reducer.d.ts +52 -0
- package/dist/core/store/MapSites/reducer.d.ts.map +1 -0
- package/dist/core/store/MapSites/reducer.js +70 -0
- package/dist/core/store/MapSites/reducer.js.map +1 -0
- package/dist/core/store/index.d.ts +1 -0
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js +1 -0
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/types/tools.d.ts +2 -1
- package/dist/core/types/tools.d.ts.map +1 -1
- package/dist/core/utils/imageUtils.d.ts.map +1 -1
- package/dist/core/utils/imageUtils.js +2 -1
- package/dist/core/utils/imageUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { booleanPointInPolygon, polygon as turfPolygon } from "@turf/turf";
|
|
2
|
+
import { uploadToPresignedUrl } from "../../../tools/AddTools/AddFile/utils/uploadToPresignedURLS";
|
|
3
|
+
const polygonCentroid = (pts) => {
|
|
4
|
+
let x = 0, y = 0, area = 0;
|
|
5
|
+
for (let i = 0; i < pts.length; i++) {
|
|
6
|
+
const [x0, y0] = pts[i];
|
|
7
|
+
const [x1, y1] = pts[(i + 1) % pts.length];
|
|
8
|
+
const cross = x0 * y1 - x1 * y0;
|
|
9
|
+
area += cross;
|
|
10
|
+
x += (x0 + x1) * cross;
|
|
11
|
+
y += (y0 + y1) * cross;
|
|
12
|
+
}
|
|
13
|
+
area *= 0.5;
|
|
14
|
+
if (area === 0) {
|
|
15
|
+
const n = pts.length || 1;
|
|
16
|
+
return [pts.reduce((s, p) => s + p[0], 0) / n, pts.reduce((s, p) => s + p[1], 0) / n];
|
|
17
|
+
}
|
|
18
|
+
return [x / (6 * area), y / (6 * area)];
|
|
19
|
+
};
|
|
20
|
+
const ringBounds = (ring) => {
|
|
21
|
+
let minLng = Infinity, minLat = Infinity, maxLng = -Infinity, maxLat = -Infinity;
|
|
22
|
+
for (const [lng, lat] of ring) {
|
|
23
|
+
if (lng < minLng) minLng = lng;
|
|
24
|
+
if (lat < minLat) minLat = lat;
|
|
25
|
+
if (lng > maxLng) maxLng = lng;
|
|
26
|
+
if (lat > maxLat) maxLat = lat;
|
|
27
|
+
}
|
|
28
|
+
return [[minLng, minLat], [maxLng, maxLat]];
|
|
29
|
+
};
|
|
30
|
+
const pointToSegmentDistance = (px, py, ax, ay, bx, by) => {
|
|
31
|
+
const dx = bx - ax;
|
|
32
|
+
const dy = by - ay;
|
|
33
|
+
const lenSq = dx * dx + dy * dy;
|
|
34
|
+
let t = lenSq === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / lenSq;
|
|
35
|
+
t = Math.max(0, Math.min(1, t));
|
|
36
|
+
return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
|
|
37
|
+
};
|
|
38
|
+
const ringToFeatureCollection = (ring, name) => ({
|
|
39
|
+
type: "FeatureCollection",
|
|
40
|
+
features: [
|
|
41
|
+
{
|
|
42
|
+
type: "Feature",
|
|
43
|
+
geometry: { type: "Polygon", coordinates: [[...ring, ring[0]]] },
|
|
44
|
+
properties: { type: "site", name }
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
const filterPointsInRing = (ring, items, getLngLat) => {
|
|
49
|
+
if (ring.length < 3) return [];
|
|
50
|
+
try {
|
|
51
|
+
const poly = turfPolygon([[...ring, ring[0]]]);
|
|
52
|
+
return (items != null ? items : []).filter((item) => {
|
|
53
|
+
const c = getLngLat(item);
|
|
54
|
+
return c != null && booleanPointInPolygon(c, poly);
|
|
55
|
+
});
|
|
56
|
+
} catch (e) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const ringFromGeoJson = (geo) => {
|
|
61
|
+
var _a, _b, _c;
|
|
62
|
+
const geometry = (() => {
|
|
63
|
+
var _a2, _b2, _c2;
|
|
64
|
+
if (!geo) return null;
|
|
65
|
+
if (geo.type === "FeatureCollection") {
|
|
66
|
+
const f = ((_a2 = geo.features) != null ? _a2 : []).find(
|
|
67
|
+
(feat) => {
|
|
68
|
+
var _a3, _b3;
|
|
69
|
+
return ((_a3 = feat == null ? void 0 : feat.geometry) == null ? void 0 : _a3.type) === "Polygon" || ((_b3 = feat == null ? void 0 : feat.geometry) == null ? void 0 : _b3.type) === "MultiPolygon";
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
return (_b2 = f == null ? void 0 : f.geometry) != null ? _b2 : null;
|
|
73
|
+
}
|
|
74
|
+
if (geo.type === "Feature") return (_c2 = geo.geometry) != null ? _c2 : null;
|
|
75
|
+
return geo;
|
|
76
|
+
})();
|
|
77
|
+
if (!geometry) return null;
|
|
78
|
+
let coords;
|
|
79
|
+
if (geometry.type === "Polygon") coords = (_a = geometry.coordinates) == null ? void 0 : _a[0];
|
|
80
|
+
else if (geometry.type === "MultiPolygon") coords = (_c = (_b = geometry.coordinates) == null ? void 0 : _b[0]) == null ? void 0 : _c[0];
|
|
81
|
+
if (!Array.isArray(coords) || coords.length < 3) return null;
|
|
82
|
+
const ring = coords.map((c) => [c[0], c[1]]);
|
|
83
|
+
const first = ring[0];
|
|
84
|
+
const last = ring[ring.length - 1];
|
|
85
|
+
if (ring.length > 1 && first[0] === last[0] && first[1] === last[1]) ring.pop();
|
|
86
|
+
return ring;
|
|
87
|
+
};
|
|
88
|
+
const fetchSiteBoundaryRing = async (siteId) => {
|
|
89
|
+
var _a;
|
|
90
|
+
try {
|
|
91
|
+
const res = await fetch(`/api/files/site/${siteId}`);
|
|
92
|
+
if (!res.ok) return null;
|
|
93
|
+
const { files } = await res.json();
|
|
94
|
+
const geomFile = (_a = (files != null ? files : []).find((f) => f.tag === "site-geometry" && f.url)) != null ? _a : (files != null ? files : []).find((f) => (f.extension === "geojson" || f.mimeType && String(f.mimeType).includes("geo+json")) && f.url);
|
|
95
|
+
if (!(geomFile == null ? void 0 : geomFile.url)) return null;
|
|
96
|
+
const geo = await fetch(geomFile.url).then((r) => r.json());
|
|
97
|
+
return ringFromGeoJson(geo);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const uploadGeoJsonToAsset = async (assetId, ring, name) => {
|
|
103
|
+
const fc = ringToFeatureCollection(ring, name);
|
|
104
|
+
const file = new File([JSON.stringify(fc)], `${name || "site"}.geojson`, {
|
|
105
|
+
type: "application/geo+json"
|
|
106
|
+
});
|
|
107
|
+
const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`);
|
|
108
|
+
if (!presRes.ok) throw new Error("Failed to get an upload URL");
|
|
109
|
+
const { presignedUrl } = await presRes.json();
|
|
110
|
+
await uploadToPresignedUrl(presignedUrl, file);
|
|
111
|
+
};
|
|
112
|
+
export {
|
|
113
|
+
fetchSiteBoundaryRing,
|
|
114
|
+
filterPointsInRing,
|
|
115
|
+
pointToSegmentDistance,
|
|
116
|
+
polygonCentroid,
|
|
117
|
+
ringBounds,
|
|
118
|
+
ringFromGeoJson,
|
|
119
|
+
ringToFeatureCollection,
|
|
120
|
+
uploadGeoJsonToAsset
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=siteGeometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { booleanPointInPolygon, polygon as turfPolygon } from '@turf/turf'\r\nimport { uploadToPresignedUrl } from '../../../tools/AddTools/AddFile/utils/uploadToPresignedURLS'\r\n\r\nexport type Ring = [number, number][]\r\n\r\n/** Area-weighted centroid of a polygon ring; used to place a single label. */\r\nexport const polygonCentroid = (pts: Ring): [number, number] => {\r\n let x = 0, y = 0, area = 0\r\n for (let i = 0; i < pts.length; i++) {\r\n const [x0, y0] = pts[i]\r\n const [x1, y1] = pts[(i + 1) % pts.length]\r\n const cross = x0 * y1 - x1 * y0\r\n area += cross\r\n x += (x0 + x1) * cross\r\n y += (y0 + y1) * cross\r\n }\r\n area *= 0.5\r\n if (area === 0) {\r\n const n = pts.length || 1\r\n return [pts.reduce((s, p) => s + p[0], 0) / n, pts.reduce((s, p) => s + p[1], 0) / n]\r\n }\r\n return [x / (6 * area), y / (6 * area)]\r\n}\r\n\r\n/** Bounding box of a ring as [[minLng, minLat], [maxLng, maxLat]]. */\r\nexport const ringBounds = (ring: Ring): [[number, number], [number, number]] => {\r\n let minLng = Infinity, minLat = Infinity, maxLng = -Infinity, maxLat = -Infinity\r\n for (const [lng, lat] of ring) {\r\n if (lng < minLng) minLng = lng\r\n if (lat < minLat) minLat = lat\r\n if (lng > maxLng) maxLng = lng\r\n if (lat > maxLat) maxLat = lat\r\n }\r\n return [[minLng, minLat], [maxLng, maxLat]]\r\n}\r\n\r\n/** Shortest distance from point (px,py) to the segment (ax,ay)-(bx,by). */\r\nexport const pointToSegmentDistance = (\r\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\r\n): number => {\r\n const dx = bx - ax\r\n const dy = by - ay\r\n const lenSq = dx * dx + dy * dy\r\n let t = lenSq === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / lenSq\r\n t = Math.max(0, Math.min(1, t))\r\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy))\r\n}\r\n\r\n/** Build the GeoJSON FeatureCollection stored in minio for a site polygon. */\r\nexport const ringToFeatureCollection = (ring: Ring, name: string): GeoJSON.FeatureCollection => ({\r\n type: 'FeatureCollection',\r\n features: [\r\n {\r\n type: 'Feature',\r\n geometry: { type: 'Polygon', coordinates: [[...ring, ring[0]]] },\r\n properties: { type: 'site', name },\r\n },\r\n ],\r\n})\r\n\r\n/**\r\n * Return the items whose [lng, lat] point falls inside the polygon ring.\r\n * The Turf polygon is built once, so this is cheap for many points.\r\n */\r\nexport const filterPointsInRing = <T>(\r\n ring: Ring,\r\n items: T[],\r\n getLngLat: (item: T) => [number, number] | null,\r\n): T[] => {\r\n if (ring.length < 3) return []\r\n try {\r\n const poly = turfPolygon([[...ring, ring[0]]])\r\n return (items ?? []).filter((item) => {\r\n const c = getLngLat(item)\r\n return c != null && booleanPointInPolygon(c, poly)\r\n })\r\n }\r\n catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Extract the outer ring (open, no repeated closing point) from a stored\r\n * GeoJSON value, accepting a FeatureCollection, Feature, or bare geometry.\r\n */\r\nexport const ringFromGeoJson = (geo: any): Ring | null => {\r\n const geometry = (() => {\r\n if (!geo) return null\r\n if (geo.type === 'FeatureCollection') {\r\n const f = (geo.features ?? []).find(\r\n (feat: any) => feat?.geometry?.type === 'Polygon' || feat?.geometry?.type === 'MultiPolygon',\r\n )\r\n return f?.geometry ?? null\r\n }\r\n if (geo.type === 'Feature') return geo.geometry ?? null\r\n return geo\r\n })()\r\n\r\n if (!geometry) return null\r\n\r\n let coords: any\r\n if (geometry.type === 'Polygon') coords = geometry.coordinates?.[0]\r\n else if (geometry.type === 'MultiPolygon') coords = geometry.coordinates?.[0]?.[0]\r\n if (!Array.isArray(coords) || coords.length < 3) return null\r\n\r\n const ring: Ring = coords.map((c: number[]) => [c[0], c[1]] as [number, number])\r\n // Drop the closing point if it duplicates the first.\r\n const first = ring[0]\r\n const last = ring[ring.length - 1]\r\n if (ring.length > 1 && first[0] === last[0] && first[1] === last[1]) ring.pop()\r\n return ring\r\n}\r\n\r\n/**\r\n * Load a site's saved boundary ring from minio (via its attached geometry\r\n * file). Returns null if the site has no saved boundary or it can't be read.\r\n */\r\nexport const fetchSiteBoundaryRing = async (siteId: number): Promise<Ring | null> => {\r\n try {\r\n const res = await fetch(`/api/files/site/${siteId}`)\r\n if (!res.ok) return null\r\n const { files } = await res.json()\r\n const geomFile = (files ?? []).find((f: any) => f.tag === 'site-geometry' && f.url)\r\n ?? (files ?? []).find((f: any) =>\r\n (f.extension === 'geojson' || (f.mimeType && String(f.mimeType).includes('geo+json'))) && f.url)\r\n if (!geomFile?.url) return null\r\n const geo = await fetch(geomFile.url).then(r => r.json())\r\n return ringFromGeoJson(geo)\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * (Over)write a site's GeoJSON object in minio under the given asset key.\r\n * Mirrors the presigned-upload flow used by FileAdder/DatasetAdder.\r\n */\r\nexport const uploadGeoJsonToAsset = async (\r\n assetId: string,\r\n ring: Ring,\r\n name: string,\r\n): Promise<void> => {\r\n const fc = ringToFeatureCollection(ring, name)\r\n const file = new File([JSON.stringify(fc)], `${name || 'site'}.geojson`, {\r\n type: 'application/geo+json',\r\n })\r\n const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`)\r\n if (!presRes.ok) throw new Error('Failed to get an upload URL')\r\n const { presignedUrl } = await presRes.json()\r\n await uploadToPresignedUrl(presignedUrl, file)\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Site } from '../../../../../../../types/dbTypes';
|
|
2
|
+
/**
|
|
3
|
+
* Shared "show site(s) on the map" action used by the sites table row menu and
|
|
4
|
+
* the "View All on Map" header button. It switches to the map viewer FIRST (so
|
|
5
|
+
* the action always navigates, even if a boundary fails to load), then loads
|
|
6
|
+
* each site's polygon GeoJSON from minio, hands it to the SiteLayer via the
|
|
7
|
+
* MapSites store, and fits the camera to the loaded boundaries. Sites without a
|
|
8
|
+
* saved boundary fall back to flying to their point.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useShowSitesOnMap(): (sites: Site[], opts?: {
|
|
11
|
+
switchViewer?: boolean;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
//# sourceMappingURL=useShowSitesOnMap.d.ts.map
|
package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useShowSitesOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.ts"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAG3E;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,YAMQ,IAAI,EAAE,SAAS;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,mBAmDjF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { MapContext, useMenusContext, useMapSitesContext } from "../../../../../../../store";
|
|
4
|
+
import { ViewerNames } from "../../../../../../../types/dbTypes";
|
|
5
|
+
import { ringFromGeoJson, ringBounds } from "./siteGeometry";
|
|
6
|
+
function useShowSitesOnMap() {
|
|
7
|
+
const { dispatch: mapSitesDispatch } = useMapSitesContext();
|
|
8
|
+
const { dispatch: menusDispatch } = useMenusContext();
|
|
9
|
+
const { state: mapState } = React.useContext(MapContext);
|
|
10
|
+
const { map } = mapState.map;
|
|
11
|
+
return React.useCallback(async (sites, opts) => {
|
|
12
|
+
var _a;
|
|
13
|
+
if ((_a = opts == null ? void 0 : opts.switchViewer) != null ? _a : true) {
|
|
14
|
+
menusDispatch({ type: "SET_VIEWER", payload: { currentViewer: ViewerNames.map } });
|
|
15
|
+
}
|
|
16
|
+
const valid = sites.filter((s) => s == null ? void 0 : s.id);
|
|
17
|
+
const rings = await Promise.all(valid.map(async (site) => {
|
|
18
|
+
var _a2, _b;
|
|
19
|
+
try {
|
|
20
|
+
const res = await fetch(`/api/files/site/${site.id}`);
|
|
21
|
+
if (!res.ok) return null;
|
|
22
|
+
const { files } = await res.json();
|
|
23
|
+
const geomFile = (_a2 = (files != null ? files : []).find((f) => f.tag === "site-geometry" && f.url)) != null ? _a2 : (files != null ? files : []).find((f) => (f.extension === "geojson" || f.mimeType && String(f.mimeType).includes("geo+json")) && f.url);
|
|
24
|
+
if (!(geomFile == null ? void 0 : geomFile.url)) return null;
|
|
25
|
+
const geo = await fetch(geomFile.url).then((r) => r.json());
|
|
26
|
+
const ring = ringFromGeoJson(geo);
|
|
27
|
+
if (!ring) return null;
|
|
28
|
+
mapSitesDispatch({
|
|
29
|
+
type: "SHOW_SITE",
|
|
30
|
+
payload: {
|
|
31
|
+
site: {
|
|
32
|
+
id: site.id,
|
|
33
|
+
name: (_b = site.siteName) != null ? _b : "Site",
|
|
34
|
+
ring,
|
|
35
|
+
assetId: geomFile.assetId,
|
|
36
|
+
fileId: geomFile.id
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return ring;
|
|
41
|
+
} catch (e) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
45
|
+
if (!map) return;
|
|
46
|
+
const foundRings = rings.filter((r) => !!r);
|
|
47
|
+
if (foundRings.length > 0) {
|
|
48
|
+
map.fitBounds(ringBounds(foundRings.flat()), { padding: 60, duration: 1e3 });
|
|
49
|
+
} else {
|
|
50
|
+
const pt = valid.find((s) => typeof s.siteLongitude === "number" && typeof s.siteLatitude === "number");
|
|
51
|
+
if (pt) map.flyTo({ center: [pt.siteLongitude, pt.siteLatitude], zoom: 18, duration: 1e3 });
|
|
52
|
+
}
|
|
53
|
+
}, [map, mapSitesDispatch, menusDispatch]);
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
useShowSitesOnMap
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=useShowSitesOnMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.ts"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { MapContext, useMenusContext, useMapSitesContext } from '../../../../../../../store'\r\nimport { ViewerNames, type Site } from '../../../../../../../types/dbTypes'\r\nimport { ringFromGeoJson, ringBounds, type Ring } from './siteGeometry'\r\n\r\n/**\r\n * Shared \"show site(s) on the map\" action used by the sites table row menu and\r\n * the \"View All on Map\" header button. It switches to the map viewer FIRST (so\r\n * the action always navigates, even if a boundary fails to load), then loads\r\n * each site's polygon GeoJSON from minio, hands it to the SiteLayer via the\r\n * MapSites store, and fits the camera to the loaded boundaries. Sites without a\r\n * saved boundary fall back to flying to their point.\r\n */\r\nexport function useShowSitesOnMap() {\r\n const { dispatch: mapSitesDispatch } = useMapSitesContext()\r\n const { dispatch: menusDispatch } = useMenusContext()\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n return React.useCallback(async (sites: Site[], opts?: { switchViewer?: boolean }) => {\r\n if (opts?.switchViewer ?? true) {\r\n menusDispatch({ type: 'SET_VIEWER', payload: { currentViewer: ViewerNames.map } })\r\n }\r\n\r\n const valid = sites.filter(s => s?.id)\r\n const rings = await Promise.all(valid.map(async (site): Promise<Ring | null> => {\r\n try {\r\n const res = await fetch(`/api/files/site/${site.id}`)\r\n if (!res.ok) return null\r\n const { files } = await res.json()\r\n // Prefer the file tagged as the site boundary; fall back to any geojson\r\n // attachment so older sites (saved before tagging) still resolve.\r\n const geomFile = (files ?? []).find((f: any) => f.tag === 'site-geometry' && f.url)\r\n ?? (files ?? []).find((f: any) =>\r\n (f.extension === 'geojson' || (f.mimeType && String(f.mimeType).includes('geo+json'))) && f.url)\r\n if (!geomFile?.url) return null\r\n const geo = await fetch(geomFile.url).then(r => r.json())\r\n const ring = ringFromGeoJson(geo)\r\n if (!ring) return null\r\n mapSitesDispatch({\r\n type: 'SHOW_SITE',\r\n payload: {\r\n site: {\r\n id: site.id,\r\n name: site.siteName ?? 'Site',\r\n ring,\r\n assetId: geomFile.assetId,\r\n fileId: geomFile.id,\r\n },\r\n },\r\n })\r\n return ring\r\n }\r\n catch {\r\n return null\r\n }\r\n }))\r\n\r\n if (!map) return\r\n const foundRings = rings.filter((r): r is Ring => !!r)\r\n if (foundRings.length > 0) {\r\n // Fit to the combined extent of every loaded boundary.\r\n map.fitBounds(ringBounds(foundRings.flat() as Ring), { padding: 60, duration: 1000 })\r\n }\r\n else {\r\n // No boundaries found — fly to the first site that has a point.\r\n const pt = valid.find(s => typeof s.siteLongitude === 'number' && typeof s.siteLatitude === 'number')\r\n if (pt) map.flyTo({ center: [pt.siteLongitude as number, pt.siteLatitude as number], zoom: 18, duration: 1000 })\r\n }\r\n }, [map, mapSitesDispatch, menusDispatch])\r\n}\r\n"],"mappings":";AAKA,YAAY,WAAW;AACvB,SAAS,YAAY,iBAAiB,0BAA0B;AAChE,SAAS,mBAA8B;AACvC,SAAS,iBAAiB,kBAA6B;AAUhD,SAAS,oBAAoB;AAClC,QAAM,EAAE,UAAU,iBAAiB,IAAI,mBAAmB;AAC1D,QAAM,EAAE,UAAU,cAAc,IAAI,gBAAgB;AACpD,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,SAAO,MAAM,YAAY,OAAO,OAAe,SAAsC;AAxBvF;AAyBI,SAAI,kCAAM,iBAAN,YAAsB,MAAM;AAC9B,oBAAc,EAAE,MAAM,cAAc,SAAS,EAAE,eAAe,YAAY,IAAI,EAAE,CAAC;AAAA,IACnF;AAEA,UAAM,QAAQ,MAAM,OAAO,OAAK,uBAAG,EAAE;AACrC,UAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,SAA+B;AA9BpF,UAAAA,KAAA;AA+BM,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,mBAAmB,KAAK,EAAE,EAAE;AACpD,YAAI,CAAC,IAAI,GAAI,QAAO;AACpB,cAAM,EAAE,MAAM,IAAI,MAAM,IAAI,KAAK;AAGjC,cAAM,YAAYA,OAAA,wBAAS,CAAC,GAAG,KAAK,CAAC,MAAW,EAAE,QAAQ,mBAAmB,EAAE,GAAG,MAAhE,OAAAA,OACZ,wBAAS,CAAC,GAAG,KAAK,CAAC,OACpB,EAAE,cAAc,aAAc,EAAE,YAAY,OAAO,EAAE,QAAQ,EAAE,SAAS,UAAU,MAAO,EAAE,GAAG;AACnG,YAAI,EAAC,qCAAU,KAAK,QAAO;AAC3B,cAAM,MAAM,MAAM,MAAM,SAAS,GAAG,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC;AACxD,cAAM,OAAO,gBAAgB,GAAG;AAChC,YAAI,CAAC,KAAM,QAAO;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,cACJ,IAAI,KAAK;AAAA,cACT,OAAM,UAAK,aAAL,YAAiB;AAAA,cACvB;AAAA,cACA,SAAS,SAAS;AAAA,cAClB,QAAQ,SAAS;AAAA,YACnB;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT,SACM;AACJ,eAAO;AAAA,MACT;AAAA,IACF,CAAC,CAAC;AAEF,QAAI,CAAC,IAAK;AACV,UAAM,aAAa,MAAM,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AACrD,QAAI,WAAW,SAAS,GAAG;AAEzB,UAAI,UAAU,WAAW,WAAW,KAAK,CAAS,GAAG,EAAE,SAAS,IAAI,UAAU,IAAK,CAAC;AAAA,IACtF,OACK;AAEH,YAAM,KAAK,MAAM,KAAK,OAAK,OAAO,EAAE,kBAAkB,YAAY,OAAO,EAAE,iBAAiB,QAAQ;AACpG,UAAI,GAAI,KAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,eAAyB,GAAG,YAAsB,GAAG,MAAM,IAAI,UAAU,IAAK,CAAC;AAAA,IACjH;AAAA,EACF,GAAG,CAAC,KAAK,kBAAkB,aAAa,CAAC;AAC3C;","names":["_a"]}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
|
|
2
|
+
import { Organization } from '../../../../../types/dbTypes';
|
|
3
|
+
export declare function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }: {
|
|
4
|
+
minioBaseUrl?: string;
|
|
5
|
+
martinBaseUrl?: string;
|
|
6
|
+
organization?: Organization;
|
|
7
|
+
}): React.JSX.Element;
|
|
3
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,wBAAgB,UAAU,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,qBA4BvJ"}
|
|
@@ -9,7 +9,7 @@ import { SettingsTab } from "./src/SettingsTab";
|
|
|
9
9
|
import { InfoSidebarContainer } from "../../../../../components/ui/InfoSidebar/Container";
|
|
10
10
|
import { CommunicationTab } from "./src/CommunicationTab";
|
|
11
11
|
import { SensorsTab } from "./src/SensorsTab";
|
|
12
|
-
function MapSidebar() {
|
|
12
|
+
function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }) {
|
|
13
13
|
const { ability } = usePermissions();
|
|
14
14
|
const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext);
|
|
15
15
|
const { selectedTab } = menusState.menus;
|
|
@@ -19,6 +19,7 @@ function MapSidebar() {
|
|
|
19
19
|
return /* @__PURE__ */ jsxs(
|
|
20
20
|
InfoSidebarContainer,
|
|
21
21
|
{
|
|
22
|
+
organization,
|
|
22
23
|
tabSelector: /* @__PURE__ */ jsx(
|
|
23
24
|
TabSelector,
|
|
24
25
|
{
|
|
@@ -28,10 +29,10 @@ function MapSidebar() {
|
|
|
28
29
|
),
|
|
29
30
|
children: [
|
|
30
31
|
selectedTab === "file" && ability.can("read", "File") && /* @__PURE__ */ jsx(FileTab, {}),
|
|
31
|
-
selectedTab === "layers" && ability.can("read", "File") && /* @__PURE__ */ jsx(LayersTab, {}),
|
|
32
|
+
selectedTab === "layers" && ability.can("read", "File") && /* @__PURE__ */ jsx(LayersTab, { martinBaseUrl, organization }),
|
|
32
33
|
selectedTab === "communication" && ability.can("read", "Comment") && /* @__PURE__ */ jsx(CommunicationTab, {}),
|
|
33
|
-
selectedTab === "sensors" && ability.can("read", "Sensor") && /* @__PURE__ */ jsx(SensorsTab, {}),
|
|
34
|
-
selectedTab === "settings" && /* @__PURE__ */ jsx(SettingsTab, {})
|
|
34
|
+
selectedTab === "sensors" && ability.can("read", "Sensor") && /* @__PURE__ */ jsx(SensorsTab, { minioBaseUrl }),
|
|
35
|
+
selectedTab === "settings" && /* @__PURE__ */ jsx(SettingsTab, { countryCode: organization == null ? void 0 : organization.country })
|
|
35
36
|
]
|
|
36
37
|
}
|
|
37
38
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\n\r\nexport function MapSidebar() {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab />}\r\n {selectedTab === 'settings' && <SettingsTab />}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\nexport function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }: { minioBaseUrl?: string; martinBaseUrl?: string; organization?: Organization }) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n organization={organization}\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab martinBaseUrl={martinBaseUrl} organization={organization} />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab minioBaseUrl={minioBaseUrl} />}\r\n {selectedTab === 'settings' && <SettingsTab countryCode={organization?.country} />}\r\n </InfoSidebarContainer>\r\n )\r\n}"],"mappings":";AA8BI,SAGI,KAHJ;AAzBJ,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,sBAAsB;AAE7C,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAGpB,SAAS,WAAW,EAAE,cAAc,eAAe,aAAa,GAAmF;AAExJ,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,kBAAkB,CAACA,iBAAgC;AACvD,kBAAc,EAAE,MAAM,4BAA4B,SAAS,EAAE,aAAAA,aAAY,EAAE,CAAC;AAAA,EAC9E;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAmB;AAAA;AAAA,MACrB;AAAA,MAGD;AAAA,wBAAgB,UAAU,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,WAAQ;AAAA,QAClE,gBAAgB,YAAY,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,aAAU,eAA8B,cAA4B;AAAA,QAChI,gBAAgB,mBAAmB,QAAQ,IAAI,QAAQ,SAAS,KAAK,oBAAC,oBAAiB;AAAA,QACvF,gBAAgB,aAAa,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAC,cAAW,cAA4B;AAAA,QACtG,gBAAgB,cAAc,oBAAC,eAAY,aAAa,6CAAc,SAAS;AAAA;AAAA;AAAA,EAClF;AAEJ;","names":["selectedTab"]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
|
|
2
|
+
import { Organization } from '../../../../../../../types/dbTypes';
|
|
3
|
+
export declare function LayersTab({ martinBaseUrl, organization }: {
|
|
4
|
+
martinBaseUrl?: string;
|
|
5
|
+
organization?: Organization;
|
|
6
|
+
}): React.JSX.Element;
|
|
3
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAgB,YAAY,EAAE,MAAM,oCAAoC,CAAA;AA+E/E,wBAAgB,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,qBAuJjH"}
|
|
@@ -3,7 +3,6 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { usePathname } from "next/navigation";
|
|
5
5
|
import { DatasetsContext, MenusContext, useMapContext } from "../../../../../../../store";
|
|
6
|
-
import { useAppConfigContext } from "../../../../../../../store/AppConfig/context";
|
|
7
6
|
import {
|
|
8
7
|
useOpenDataPortalsByCountrySubdivision,
|
|
9
8
|
useOpenDataPortalsByGroup,
|
|
@@ -74,14 +73,13 @@ function sanitizeDatasets(list) {
|
|
|
74
73
|
});
|
|
75
74
|
return filtered.sort((a, b) => (a.name || "").localeCompare(b.name || ""));
|
|
76
75
|
}
|
|
77
|
-
function LayersTab() {
|
|
76
|
+
function LayersTab({ martinBaseUrl, organization }) {
|
|
78
77
|
var _a, _b, _c, _d;
|
|
79
78
|
const [searchQuery, setSearchQuery] = React.useState("");
|
|
80
79
|
const [favourites, setFavourites] = React.useState([]);
|
|
81
80
|
const { state: mapState } = useMapContext();
|
|
82
81
|
const { currentLocation } = mapState.map;
|
|
83
|
-
const
|
|
84
|
-
const org = appConfigState.appConfig.organization;
|
|
82
|
+
const org = organization;
|
|
85
83
|
const orgCountry = ((org == null ? void 0 : org.country) || "").toUpperCase();
|
|
86
84
|
const municipality = (_b = (_a = currentLocation == null ? void 0 : currentLocation.municipality) != null ? _a : org == null ? void 0 : org.municipality) != null ? _b : null;
|
|
87
85
|
const countrySubdivision = (_d = (_c = currentLocation == null ? void 0 : currentLocation.countrySubdivision) != null ? _c : org == null ? void 0 : org.countrySubdivision) != null ? _d : null;
|
|
@@ -118,11 +116,10 @@ function LayersTab() {
|
|
|
118
116
|
const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage });
|
|
119
117
|
React.useEffect(() => {
|
|
120
118
|
const loadOrganizationalDatasets = async () => {
|
|
121
|
-
var _a2;
|
|
122
119
|
try {
|
|
123
|
-
const
|
|
124
|
-
if (!
|
|
125
|
-
const datasetsUrl =
|
|
120
|
+
const martinBaseUrlClean = (martinBaseUrl != null ? martinBaseUrl : "").replace(/\/+$/, "");
|
|
121
|
+
if (!martinBaseUrlClean) return;
|
|
122
|
+
const datasetsUrl = martinBaseUrlClean.includes("/tiles/index.json") ? martinBaseUrlClean : `${martinBaseUrlClean}/tiles/index.json`;
|
|
126
123
|
const localPortal = {
|
|
127
124
|
id: -1,
|
|
128
125
|
name: "Organizational Datasets",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../../../../store'\r\nimport { useAppConfigContext } from '../../../../../../../store/AppConfig/context'\r\nimport {\r\n useOpenDataPortalsByCountrySubdivision,\r\n useOpenDataPortalsByGroup,\r\n useOpenDataPortalsByMunicipality,\r\n} from '../../../../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetGroup } from '../../../../../../../types/dbTypes'\r\nimport type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { useDatasetsForPortals } from '../../../../datasets/src/useDatasetsForPortals'\r\nimport { fetchLocalDatasets } from '../../../../datasets/src/localDatasets'\r\nimport { SearchInput } from '../../../../../../ui'\r\nimport { AppliedDatasetsSection } from './src/AppliedDatasetsSection'\r\nimport { AvailableDatasetsSection } from './src/AvailableDatasetsSection'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return { isAdmin: true, currentOrgId: 1, allowedOrgIds: ADMIN_ALLOWED_ORGS }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n return { isAdmin: false, currentOrgId, allowedOrgIds: Array.from(new Set([2, currentOrgId])) }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\nconst BLOCKLIST_URLS = [\r\n '/2021_statistics_canada_boundaries/featureserver',\r\n '/limites_du_recensement_de_statistique_canada_(2021)/featureserver',\r\n]\r\nconst BLOCKLIST_NAMES = [\r\n '2021 statistics canada boundaries',\r\n 'limites du recensement de statistique canada (2021)',\r\n]\r\n\r\nfunction isBlocklisted(ds: Dataset) {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return BLOCKLIST_URLS.some(u => url.includes(u)) || BLOCKLIST_NAMES.some(n => name.includes(n))\r\n}\r\n\r\nfunction sanitizeDatasets(list: Dataset[]) {\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of list) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) uniqueByName.set(name, ds)\r\n }\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding') && !isBlocklisted(ds)\r\n })\r\n return filtered.sort((a, b) => (a.name || '').localeCompare(b.name || ''))\r\n}\r\n\r\nexport function LayersTab() {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const [favourites, setFavourites] = React.useState<Dataset[]>([])\r\n\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const { state: appConfigState } = useAppConfigContext()\r\n const org = appConfigState.appConfig.organization\r\n const orgCountry = (org?.country || '').toUpperCase()\r\n\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true\r\n if (!portalCountry) return true\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(\r\n () => (Array.isArray(municipalPortals) ? municipalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [municipalPortals, matchesOrgCountry],\r\n )\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(\r\n () => (Array.isArray(nationalPortals) ? nationalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [nationalPortals, matchesOrgCountry],\r\n )\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n try {\r\n const martinBaseUrl = appConfigState.runtimeConfig.martinUrl?.replace(/\\/+$/, '')\r\n if (!martinBaseUrl) return\r\n\r\n const datasetsUrl = martinBaseUrl.includes('/tiles/index.json')\r\n ? martinBaseUrl\r\n : `${martinBaseUrl}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n const organizationalDatasets = await fetchLocalDatasets(localPortal as any)\r\n const visible = organizationalDatasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n if (visible.length > 0) {\r\n datasetDispatch({ type: 'SET_DATASETS', payload: { datasets: visible } })\r\n }\r\n }\r\n catch (error) {\r\n console.error('Failed to load organizational datasets:', error)\r\n }\r\n }\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility])\r\n\r\n const nationalDatasets = React.useMemo(\r\n () => sanitizeDatasets(national.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [national.datasets, orgVisibility],\r\n )\r\n const subdivisionDatasets = React.useMemo(\r\n () => sanitizeDatasets(subdivision.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [subdivision.datasets, orgVisibility],\r\n )\r\n const municipalDatasets = React.useMemo(\r\n () => sanitizeDatasets(municipal.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [municipal.datasets, orgVisibility],\r\n )\r\n const orgDatasets = React.useMemo(\r\n () => sanitizeDatasets((datasetState.datasets.datasets || []).filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [datasetState.datasets.datasets, orgVisibility],\r\n )\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const combined = [...nationalDatasets, ...subdivisionDatasets, ...municipalDatasets, ...orgDatasets]\r\n return sanitizeDatasets(combined)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, orgDatasets])\r\n\r\n const liveDatasets = React.useMemo(\r\n () => allDatasets.filter(ds => ds.portal?.live === true),\r\n [allDatasets],\r\n )\r\n\r\n const toggleFavourite = React.useCallback((dataset: Dataset) => {\r\n setFavourites(prev => (\r\n prev.some(f => f.name === dataset.name)\r\n ? prev.filter(f => f.name !== dataset.name)\r\n : [...prev, dataset]\r\n ))\r\n }, [])\r\n\r\n const showMunicipal = Boolean(municipality)\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 overflow-y-auto space-y-2 divide-y\">\r\n <div className=\"pb-2\">\r\n <AppliedDatasetsSection />\r\n </div>\r\n <div className=\"pt-2\">\r\n <AvailableDatasetsSection\r\n query={searchQuery}\r\n allDatasets={allDatasets}\r\n nationalDatasets={nationalDatasets}\r\n subdivisionDatasets={subdivisionDatasets}\r\n municipalDatasets={municipalDatasets}\r\n organizationalDatasets={orgDatasets}\r\n liveDatasets={liveDatasets}\r\n showMunicipal={showMunicipal}\r\n favourites={favourites}\r\n onFavouriteToggle={toggleFavourite}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../../../../store'\r\n// import { useAppConfigContext } from '../../../../../../../store/AppConfig/context'\r\nimport {\r\n useOpenDataPortalsByCountrySubdivision,\r\n useOpenDataPortalsByGroup,\r\n useOpenDataPortalsByMunicipality,\r\n} from '../../../../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetGroup, Organization } from '../../../../../../../types/dbTypes'\r\nimport type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { useDatasetsForPortals } from '../../../../datasets/src/useDatasetsForPortals'\r\nimport { fetchLocalDatasets } from '../../../../datasets/src/localDatasets'\r\nimport { SearchInput } from '../../../../../../ui'\r\nimport { AppliedDatasetsSection } from './src/AppliedDatasetsSection'\r\nimport { AvailableDatasetsSection } from './src/AvailableDatasetsSection'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return { isAdmin: true, currentOrgId: 1, allowedOrgIds: ADMIN_ALLOWED_ORGS }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n return { isAdmin: false, currentOrgId, allowedOrgIds: Array.from(new Set([2, currentOrgId])) }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\nconst BLOCKLIST_URLS = [\r\n '/2021_statistics_canada_boundaries/featureserver',\r\n '/limites_du_recensement_de_statistique_canada_(2021)/featureserver',\r\n]\r\nconst BLOCKLIST_NAMES = [\r\n '2021 statistics canada boundaries',\r\n 'limites du recensement de statistique canada (2021)',\r\n]\r\n\r\nfunction isBlocklisted(ds: Dataset) {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return BLOCKLIST_URLS.some(u => url.includes(u)) || BLOCKLIST_NAMES.some(n => name.includes(n))\r\n}\r\n\r\nfunction sanitizeDatasets(list: Dataset[]) {\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of list) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) uniqueByName.set(name, ds)\r\n }\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding') && !isBlocklisted(ds)\r\n })\r\n return filtered.sort((a, b) => (a.name || '').localeCompare(b.name || ''))\r\n}\r\n\r\nexport function LayersTab({ martinBaseUrl, organization }: { martinBaseUrl?: string; organization?: Organization }) {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const [favourites, setFavourites] = React.useState<Dataset[]>([])\r\n\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const org = organization\r\n const orgCountry = (org?.country || '').toUpperCase()\r\n\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true\r\n if (!portalCountry) return true\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(\r\n () => (Array.isArray(municipalPortals) ? municipalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [municipalPortals, matchesOrgCountry],\r\n )\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(\r\n () => (Array.isArray(nationalPortals) ? nationalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [nationalPortals, matchesOrgCountry],\r\n )\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n try {\r\n const martinBaseUrlClean = (martinBaseUrl ?? '').replace(/\\/+$/, '')\r\n if (!martinBaseUrlClean) return\r\n\r\n const datasetsUrl = martinBaseUrlClean.includes('/tiles/index.json')\r\n ? martinBaseUrlClean\r\n : `${martinBaseUrlClean}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n const organizationalDatasets = await fetchLocalDatasets(localPortal as any)\r\n const visible = organizationalDatasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n if (visible.length > 0) {\r\n datasetDispatch({ type: 'SET_DATASETS', payload: { datasets: visible } })\r\n }\r\n }\r\n catch (error) {\r\n console.error('Failed to load organizational datasets:', error)\r\n }\r\n }\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility])\r\n\r\n const nationalDatasets = React.useMemo(\r\n () => sanitizeDatasets(national.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [national.datasets, orgVisibility],\r\n )\r\n const subdivisionDatasets = React.useMemo(\r\n () => sanitizeDatasets(subdivision.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [subdivision.datasets, orgVisibility],\r\n )\r\n const municipalDatasets = React.useMemo(\r\n () => sanitizeDatasets(municipal.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [municipal.datasets, orgVisibility],\r\n )\r\n const orgDatasets = React.useMemo(\r\n () => sanitizeDatasets((datasetState.datasets.datasets || []).filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [datasetState.datasets.datasets, orgVisibility],\r\n )\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const combined = [...nationalDatasets, ...subdivisionDatasets, ...municipalDatasets, ...orgDatasets]\r\n return sanitizeDatasets(combined)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, orgDatasets])\r\n\r\n const liveDatasets = React.useMemo(\r\n () => allDatasets.filter(ds => ds.portal?.live === true),\r\n [allDatasets],\r\n )\r\n\r\n const toggleFavourite = React.useCallback((dataset: Dataset) => {\r\n setFavourites(prev => (\r\n prev.some(f => f.name === dataset.name)\r\n ? prev.filter(f => f.name !== dataset.name)\r\n : [...prev, dataset]\r\n ))\r\n }, [])\r\n\r\n const showMunicipal = Boolean(municipality)\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 overflow-y-auto space-y-2 divide-y\">\r\n <div className=\"pb-2\">\r\n <AppliedDatasetsSection />\r\n </div>\r\n <div className=\"pt-2\">\r\n <AvailableDatasetsSection\r\n query={searchQuery}\r\n allDatasets={allDatasets}\r\n nationalDatasets={nationalDatasets}\r\n subdivisionDatasets={subdivisionDatasets}\r\n municipalDatasets={municipalDatasets}\r\n organizationalDatasets={orgDatasets}\r\n liveDatasets={liveDatasets}\r\n showMunicipal={showMunicipal}\r\n favourites={favourites}\r\n onFavouriteToggle={toggleFavourite}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA0NQ,cAMF,YANE;AArNR,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAE5B,SAAS,iBAAiB,cAAc,qBAAqB;AAE7D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAkC;AAE3C,SAAS,6BAA6B;AACtC,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AACvC,SAAS,gCAAgC;AAQzC,MAAM,qBAAqB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,MAAM,qBAA6C;AAAA,EACjD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,SAAS,eAAe,KAA8B;AACpD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,QAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,OAAO,SAAS,OAAO,GAAG,GAAG,EAAE;AAC9E,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,yBAAyB,UAAyC;AA5C3E;AA6CE,QAAM,kBAAkB,YAAY,IAAI,YAAY;AACpD,QAAM,eAAe,eAAe,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAChE,QAAM,SAAS,eAAe,IAAI,YAAY,KAAK;AAEnD,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,SAAS,MAAM,cAAc,GAAG,eAAe,mBAAmB;AAAA,EAC7E;AAEA,QAAM,gBAAe,wBAAmB,MAAM,MAAzB,YAA8B;AACnD,SAAO,EAAE,SAAS,OAAO,cAAc,eAAe,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;AAC/F;AAEA,SAAS,qBAAqB,SAAkB,YAA2B;AACzE,MAAI,WAAW,QAAS,QAAO;AAC/B,MAAI,QAAQ,UAAU,aAAa,eAAgB,QAAO;AAC1D,QAAM,QAAQ,eAAe,QAAQ,YAAY;AACjD,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,WAAW,cAAc,SAAS,KAAK;AAChD;AAEA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AACF;AACA,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AACF;AAEA,SAAS,cAAc,IAAa;AAClC,QAAM,OAAO,GAAG,OAAO,IAAI,YAAY;AACvC,QAAM,QAAQ,GAAG,QAAQ,IAAI,YAAY;AACzC,SAAO,eAAe,KAAK,OAAK,IAAI,SAAS,CAAC,CAAC,KAAK,gBAAgB,KAAK,OAAK,KAAK,SAAS,CAAC,CAAC;AAChG;AAEA,SAAS,iBAAiB,MAAiB;AAhF3C;AAiFE,QAAM,eAAe,oBAAI,IAAqB;AAC9C,aAAW,MAAM,MAAM;AACrB,UAAM,SAAO,QAAG,SAAH,mBAAS,kBAAiB;AACvC,QAAI,CAAC,aAAa,IAAI,IAAI,EAAG,cAAa,IAAI,MAAM,EAAE;AAAA,EACxD;AACA,QAAM,WAAW,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO;AAtF7D,QAAAA,KAAA;AAuFI,UAAM,SAAOA,MAAA,GAAG,SAAH,gBAAAA,IAAS,kBAAiB;AACvC,UAAM,SAAO,QAAG,SAAH,mBAAS,kBAAiB;AACvC,WAAO,CAAC,KAAK,SAAS,SAAS,KAAK,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,cAAc,EAAE;AAAA,EACtF,CAAC;AACD,SAAO,SAAS,KAAK,CAAC,GAAG,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC3E;AAEO,SAAS,UAAU,EAAE,eAAe,aAAa,GAA4D;AA9FpH;AA+FE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAoB,CAAC,CAAC;AAEhE,QAAM,EAAE,OAAO,SAAS,IAAI,cAAc;AAC1C,QAAM,EAAE,gBAAgB,IAAI,SAAS;AACrC,QAAM,MAAM;AACZ,QAAM,eAAc,2BAAK,YAAW,IAAI,YAAY;AAEpD,QAAM,gBAAe,8DAAiB,iBAAjB,YAAiC,2BAAK,iBAAtC,YAAsD;AAC3E,QAAM,sBAAqB,8DAAiB,uBAAjB,YAAuC,2BAAK,uBAA5C,YAAkE;AAE7F,QAAM,EAAE,OAAO,cAAc,UAAU,gBAAgB,IAAI,MAAM,WAAW,eAAe;AAC3F,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,WAAW,YAAY;AAC7B,QAAM,gBAAgB,MAAM,QAAQ,MAAM,yBAAyB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAExF,QAAM,EAAE,iBAAiB,iBAAiB,IAAI,iCAAiC,YAAY;AAC3F,QAAM,EAAE,iBAAiB,mBAAmB,IAAI,uCAAuC,kBAAkB;AACzG,QAAM,EAAE,iBAAiB,gBAAgB,IAAI,0BAA0B,aAAa,QAAQ;AAE5F,QAAM,oBAAoB,MAAM;AAAA,IAC9B,CAAC,kBAA6C;AAC5C,UAAI,CAAC,WAAY,QAAO;AACxB,UAAI,CAAC,cAAe,QAAO;AAC3B,aAAO,cAAc,YAAY,MAAM;AAAA,IACzC;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,MAAO,MAAM,QAAQ,gBAAgB,IAAI,iBAAiB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;AAAA,IACvG,CAAC,kBAAkB,iBAAiB;AAAA,EACtC;AACA,QAAM,6BAA6B,MAAM;AAAA,IACvC,MAAO,MAAM,QAAQ,kBAAkB,IACnC,mBAAmB,OAAO,OAAK,EAAE,gBAAgB,QAAQ,kBAAkB,EAAE,OAAO,CAAC,IACrF,CAAC;AAAA,IACL,CAAC,oBAAoB,iBAAiB;AAAA,EACxC;AACA,QAAM,0BAA0B,MAAM;AAAA,IACpC,MAAO,MAAM,QAAQ,eAAe,IAAI,gBAAgB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;AAAA,IACrG,CAAC,iBAAiB,iBAAiB;AAAA,EACrC;AAEA,QAAM,YAAY,sBAAsB,0BAA0B,EAAE,YAAY,CAAC;AACjF,QAAM,cAAc,sBAAsB,4BAA4B,EAAE,YAAY,CAAC;AACrF,QAAM,WAAW,sBAAsB,yBAAyB,EAAE,YAAY,CAAC;AAE/E,QAAM,UAAU,MAAM;AACpB,UAAM,6BAA6B,YAAY;AAC7C,UAAI;AACF,cAAM,sBAAsB,wCAAiB,IAAI,QAAQ,QAAQ,EAAE;AACnE,YAAI,CAAC,mBAAoB;AAEzB,cAAM,cAAc,mBAAmB,SAAS,mBAAmB,IAC/D,qBACA,GAAG,kBAAkB;AAEzB,cAAM,cAAc;AAAA,UAClB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,sBAAsB;AAAA,UACtB,oBAAoB;AAAA,UACpB,cAAc;AAAA,UACd,OAAO;AAAA,QACT;AAEA,cAAM,yBAAyB,MAAM,mBAAmB,WAAkB;AAC1E,cAAM,UAAU,uBAAuB,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC;AAC3F,YAAI,QAAQ,SAAS,GAAG;AACtB,0BAAgB,EAAE,MAAM,gBAAgB,SAAS,EAAE,UAAU,QAAQ,EAAE,CAAC;AAAA,QAC1E;AAAA,MACF,SACO,OAAO;AACZ,gBAAQ,MAAM,2CAA2C,KAAK;AAAA,MAChE;AAAA,IACF;AACA,+BAA2B;AAAA,EAC7B,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,mBAAmB,MAAM;AAAA,IAC7B,MAAM,iBAAiB,SAAS,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IAC9F,CAAC,SAAS,UAAU,aAAa;AAAA,EACnC;AACA,QAAM,sBAAsB,MAAM;AAAA,IAChC,MAAM,iBAAiB,YAAY,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IACjG,CAAC,YAAY,UAAU,aAAa;AAAA,EACtC;AACA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAM,iBAAiB,UAAU,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IAC/F,CAAC,UAAU,UAAU,aAAa;AAAA,EACpC;AACA,QAAM,cAAc,MAAM;AAAA,IACxB,MAAM,kBAAkB,aAAa,SAAS,YAAY,CAAC,GAAG,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IACnH,CAAC,aAAa,SAAS,UAAU,aAAa;AAAA,EAChD;AAEA,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,WAAW,CAAC,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,mBAAmB,GAAG,WAAW;AACnG,WAAO,iBAAiB,QAAQ;AAAA,EAClC,GAAG,CAAC,kBAAkB,qBAAqB,mBAAmB,WAAW,CAAC;AAE1E,QAAM,eAAe,MAAM;AAAA,IACzB,MAAM,YAAY,OAAO,QAAG;AAzMhC,UAAAA;AAyMmC,eAAAA,MAAA,GAAG,WAAH,gBAAAA,IAAW,UAAS;AAAA,KAAI;AAAA,IACvD,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,kBAAkB,MAAM,YAAY,CAAC,YAAqB;AAC9D,kBAAc,UACZ,KAAK,KAAK,OAAK,EAAE,SAAS,QAAQ,IAAI,IAClC,KAAK,OAAO,OAAK,EAAE,SAAS,QAAQ,IAAI,IACxC,CAAC,GAAG,MAAM,OAAO,CACtB;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,QAAQ,YAAY;AAE1C,SACE,qBAAC,SAAI,WAAU,uDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,qDACb;AAAA,0BAAC,SAAI,WAAU,QACb,8BAAC,0BAAuB,GAC1B;AAAA,MACA,oBAAC,SAAI,WAAU,QACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAwB;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA,mBAAmB;AAAA;AAAA,MACrB,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["_a"]}
|
|
@@ -5,5 +5,7 @@ export interface FileItem {
|
|
|
5
5
|
icon: React.ElementType;
|
|
6
6
|
visible: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function SensorsTab(
|
|
8
|
+
export declare function SensorsTab({ minioBaseUrl }: {
|
|
9
|
+
minioBaseUrl?: string;
|
|
10
|
+
}): React.JSX.Element;
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,qBAMrE"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { SensorsSection } from "../../../../../../ui/Sensors/SensorsSection";
|
|
4
|
-
function SensorsTab() {
|
|
5
|
-
return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col space-y-6 py-4 overflow-hidden", children: /* @__PURE__ */ jsx(SensorsSection, {}) });
|
|
4
|
+
function SensorsTab({ minioBaseUrl }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col space-y-6 py-4 overflow-hidden", children: /* @__PURE__ */ jsx(SensorsSection, { minioBaseUrl }) });
|
|
6
6
|
}
|
|
7
7
|
export {
|
|
8
8
|
SensorsTab
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { SensorsSection } from '../../../../../../ui/Sensors/SensorsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function SensorsTab() {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <SensorsSection />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAiBM;AAVN,SAAS,sBAAsB;AAOxB,SAAS,aAAa;
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { SensorsSection } from '../../../../../../ui/Sensors/SensorsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function SensorsTab({ minioBaseUrl }: { minioBaseUrl?: string }) {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <SensorsSection minioBaseUrl={minioBaseUrl} />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAiBM;AAVN,SAAS,sBAAsB;AAOxB,SAAS,WAAW,EAAE,aAAa,GAA8B;AACtE,SACE,oBAAC,SAAI,WAAU,uDACb,8BAAC,kBAAe,cAA4B,GAC9C;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,qBAOpE"}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { LocationSettings } from "./src/LocationSettings";
|
|
4
4
|
import { MapCustomization } from "./src/MapCustomization";
|
|
5
|
-
function SettingsTab() {
|
|
5
|
+
function SettingsTab({ countryCode }) {
|
|
6
6
|
return /* @__PURE__ */ jsxs("div", { className: "w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point", children: [
|
|
7
7
|
/* @__PURE__ */ jsx(MapCustomization, {}),
|
|
8
|
-
/* @__PURE__ */ jsx(LocationSettings, {})
|
|
8
|
+
/* @__PURE__ */ jsx(LocationSettings, { countryCode })
|
|
9
9
|
] });
|
|
10
10
|
}
|
|
11
11
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { LocationSettings } from './src/LocationSettings';\r\nimport { MapCustomization } from './src/MapCustomization';\r\n\r\nexport function SettingsTab() {\r\n return (\r\n <div className=\"w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point\">\r\n <MapCustomization />\r\n <LocationSettings />\r\n </div>\r\n )\r\n}"],"mappings":";AAWI,SACE,KADF;AALJ,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { LocationSettings } from './src/LocationSettings';\r\nimport { MapCustomization } from './src/MapCustomization';\r\n\r\nexport function SettingsTab({ countryCode }: { countryCode?: string }) {\r\n return (\r\n <div className=\"w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point\">\r\n <MapCustomization />\r\n <LocationSettings countryCode={countryCode} />\r\n </div>\r\n )\r\n}"],"mappings":";AAWI,SACE,KADF;AALJ,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,YAAY,EAAE,YAAY,GAA6B;AACrE,SACE,qBAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,oBAAiB;AAAA,IAClB,oBAAC,oBAAiB,aAA0B;AAAA,KAC9C;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationSettings.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LocationSettings.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,qBAiUzE"}
|
package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js
CHANGED
|
@@ -23,19 +23,16 @@ import * as React from "react";
|
|
|
23
23
|
import { useTranslations } from "next-intl";
|
|
24
24
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../../../../../../ui/Select";
|
|
25
25
|
import { MapContext } from "../../../../../../../../store";
|
|
26
|
-
import { useAppConfigContext } from "../../../../../../../../store/AppConfig/context";
|
|
27
26
|
import { Input, CollapsibleSection } from "../../../../../../../ui/";
|
|
28
27
|
import { useState } from "react";
|
|
29
|
-
function LocationSettings() {
|
|
30
|
-
var _a;
|
|
28
|
+
function LocationSettings({ countryCode }) {
|
|
31
29
|
const [municipalityInput, setMunicipalityInput] = useState("");
|
|
32
30
|
const [municipalitySuggestions, setMunicipalitySuggestions] = useState([]);
|
|
33
31
|
const [showSuggestions, setShowSuggestions] = useState(false);
|
|
34
32
|
const t = useTranslations("SettingsTab");
|
|
35
33
|
const { dispatch: mapDispatch, state: mapState } = React.useContext(MapContext);
|
|
36
34
|
const { currentLocation, map, countrySubdivisionsData } = mapState.map;
|
|
37
|
-
const
|
|
38
|
-
const orgCountryCode = (((_a = appConfigState.appConfig.organization) == null ? void 0 : _a.country) || "CA").toLowerCase();
|
|
35
|
+
const orgCountryCode = (countryCode || "CA").toLowerCase();
|
|
39
36
|
const [currentLat, setCurrentLat] = React.useState();
|
|
40
37
|
const [currentLng, setCurrentLng] = React.useState();
|
|
41
38
|
const [currentZoom, setCurrentZoom] = React.useState();
|
|
@@ -286,8 +283,8 @@ function LocationSettings() {
|
|
|
286
283
|
children: [
|
|
287
284
|
/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("selectCountrySubdivision") }) }),
|
|
288
285
|
/* @__PURE__ */ jsx(SelectContent, { children: Object.entries(countrySubdivisionsData != null ? countrySubdivisionsData : {}).map(([code, sub]) => {
|
|
289
|
-
var
|
|
290
|
-
return /* @__PURE__ */ jsx(SelectItem, { value: code, children: (
|
|
286
|
+
var _a;
|
|
287
|
+
return /* @__PURE__ */ jsx(SelectItem, { value: code, children: (_a = sub == null ? void 0 : sub.name) != null ? _a : code }, code);
|
|
291
288
|
}) })
|
|
292
289
|
]
|
|
293
290
|
}
|