@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,46 @@
|
|
|
1
|
+
import { uploadToPresignedUrl } from "../AddFile/utils/uploadToPresignedURLS";
|
|
2
|
+
import { ringToFeatureCollection } from "../../../MapLayers/src/SiteLayer/siteGeometry";
|
|
3
|
+
const SITE_GEOMETRY_TAG = "site-geometry";
|
|
4
|
+
const persistDrawnSite = async (params) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const { name, ring, centroid, createSite } = params;
|
|
7
|
+
const site = await createSite({
|
|
8
|
+
siteName: name,
|
|
9
|
+
siteLongitude: centroid[0],
|
|
10
|
+
siteLatitude: centroid[1]
|
|
11
|
+
});
|
|
12
|
+
const siteId = site == null ? void 0 : site.id;
|
|
13
|
+
if (!siteId) throw new Error("Site creation did not return an id");
|
|
14
|
+
const assetId = `${crypto.randomUUID()}.geojson`;
|
|
15
|
+
const fc = ringToFeatureCollection(ring, name);
|
|
16
|
+
const file = new File([JSON.stringify(fc)], `${name || "site"}.geojson`, {
|
|
17
|
+
type: "application/geo+json"
|
|
18
|
+
});
|
|
19
|
+
const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`);
|
|
20
|
+
if (!presRes.ok) throw new Error("Failed to get an upload URL");
|
|
21
|
+
const { presignedUrl } = await presRes.json();
|
|
22
|
+
await uploadToPresignedUrl(presignedUrl, file);
|
|
23
|
+
const fileRes = await fetch(`/api/files/site/${siteId}`, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
type: "map-file",
|
|
28
|
+
name: `${name || "site"}.geojson`,
|
|
29
|
+
assetId,
|
|
30
|
+
mimeType: "application/geo+json",
|
|
31
|
+
extension: "geojson",
|
|
32
|
+
sizeBytes: file.size,
|
|
33
|
+
tag: SITE_GEOMETRY_TAG,
|
|
34
|
+
isVisible: false
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
if (!fileRes.ok) throw new Error("Failed to attach the geometry file to the site");
|
|
38
|
+
const data = await fileRes.json().catch(() => null);
|
|
39
|
+
const fileId = (_a = data == null ? void 0 : data.newFile) == null ? void 0 : _a.id;
|
|
40
|
+
return { siteId, assetId, fileId };
|
|
41
|
+
};
|
|
42
|
+
export {
|
|
43
|
+
SITE_GEOMETRY_TAG,
|
|
44
|
+
persistDrawnSite
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=persistSite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { uploadToPresignedUrl } from '../AddFile/utils/uploadToPresignedURLS'\r\nimport { ringToFeatureCollection, type Ring } from '../../../MapLayers/src/SiteLayer/siteGeometry'\r\n\r\n/** Tag stored on the File row so the site's boundary geojson can be found later. */\r\nexport const SITE_GEOMETRY_TAG = 'site-geometry'\r\n\r\nexport interface PersistedSite {\r\n siteId: number\r\n assetId: string\r\n fileId?: number\r\n}\r\n\r\n/**\r\n * Persist a freshly drawn site:\r\n * 1. create the DB Site (via the injected `createSite` hook trigger),\r\n * 2. upload the polygon GeoJSON to minio (presigned PUT),\r\n * 3. create a File row attached to the site that references the minio object.\r\n *\r\n * The polygon geometry lives in minio (there is no geometry column on Site);\r\n * the File row links it to the site via `attachedFilesSiteId` + the geometry tag.\r\n */\r\nexport const persistDrawnSite = async (params: {\r\n name: string\r\n ring: Ring\r\n centroid: [number, number]\r\n createSite: (arg: any) => Promise<any>\r\n}): Promise<PersistedSite> => {\r\n const { name, ring, centroid, createSite } = params\r\n\r\n const site = await createSite({\r\n siteName: name,\r\n siteLongitude: centroid[0],\r\n siteLatitude: centroid[1],\r\n })\r\n const siteId = site?.id\r\n if (!siteId) throw new Error('Site creation did not return an id')\r\n\r\n const assetId = `${crypto.randomUUID()}.geojson`\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\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 const fileRes = await fetch(`/api/files/site/${siteId}`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n type: 'map-file',\r\n name: `${name || 'site'}.geojson`,\r\n assetId,\r\n mimeType: 'application/geo+json',\r\n extension: 'geojson',\r\n sizeBytes: file.size,\r\n tag: SITE_GEOMETRY_TAG,\r\n isVisible: false,\r\n }),\r\n })\r\n // The DB link is required: without it the boundary is orphaned in minio and\r\n // can never be re-shown. Treat failure as fatal so the caller can retry.\r\n if (!fileRes.ok) throw new Error('Failed to attach the geometry file to the site')\r\n const data = await fileRes.json().catch(() => null)\r\n const fileId: number | undefined = data?.newFile?.id\r\n\r\n return { siteId, assetId, fileId }\r\n}\r\n"],"mappings":"AAGA,SAAS,4BAA4B;AACrC,SAAS,+BAA0C;AAG5C,MAAM,oBAAoB;AAiB1B,MAAM,mBAAmB,OAAO,WAKT;AA7B9B;AA8BE,QAAM,EAAE,MAAM,MAAM,UAAU,WAAW,IAAI;AAE7C,QAAM,OAAO,MAAM,WAAW;AAAA,IAC5B,UAAU;AAAA,IACV,eAAe,SAAS,CAAC;AAAA,IACzB,cAAc,SAAS,CAAC;AAAA,EAC1B,CAAC;AACD,QAAM,SAAS,6BAAM;AACrB,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,oCAAoC;AAEjE,QAAM,UAAU,GAAG,OAAO,WAAW,CAAC;AACtC,QAAM,KAAK,wBAAwB,MAAM,IAAI;AAC7C,QAAM,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC,GAAG,GAAG,QAAQ,MAAM,YAAY;AAAA,IACvE,MAAM;AAAA,EACR,CAAC;AAED,QAAM,UAAU,MAAM,MAAM,mCAAmC,mBAAmB,OAAO,CAAC,EAAE;AAC5F,MAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC9D,QAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,KAAK;AAC5C,QAAM,qBAAqB,cAAc,IAAI;AAE7C,QAAM,UAAU,MAAM,MAAM,mBAAmB,MAAM,IAAI;AAAA,IACvD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,GAAG,QAAQ,MAAM;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAGD,MAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,gDAAgD;AACjF,QAAM,OAAO,MAAM,QAAQ,KAAK,EAAE,MAAM,MAAM,IAAI;AAClD,QAAM,UAA6B,kCAAM,YAAN,mBAAe;AAElD,SAAO,EAAE,QAAQ,SAAS,OAAO;AACnC;","names":[]}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { Tool } from '../../../../../../types/tools';
|
|
3
|
+
import { Organization } from '../../../../../../types/dbTypes';
|
|
3
4
|
interface AddToMapToolProps {
|
|
4
5
|
tool: Tool;
|
|
6
|
+
organization?: Organization;
|
|
7
|
+
minioBaseUrl?: string;
|
|
8
|
+
martinBaseUrl?: string;
|
|
9
|
+
geocodeEarthApiKey?: string;
|
|
10
|
+
geocoderUrl?: string;
|
|
11
|
+
[key: string]: unknown;
|
|
5
12
|
}
|
|
6
|
-
export default function AddToMap({ tool }: AddToMapToolProps): React.JSX.Element;
|
|
13
|
+
export default function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }: AddToMapToolProps): React.JSX.Element;
|
|
7
14
|
export {};
|
|
8
15
|
//# sourceMappingURL=AddToMap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAmB,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"AddToMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAmB,MAAM,+BAA+B,CAAA;AAoBrE,OAAO,EAAU,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAIvE,UAAU,iBAAiB;IACzB,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,iBAAiB,qBA+NvI"}
|
|
@@ -19,7 +19,7 @@ import Datasets from "../../../datasets";
|
|
|
19
19
|
import AddBuilding from "../../../../Data/buildingDetails/AddBuilding";
|
|
20
20
|
import { useComments } from "../../../../../../hooks/comments/comments";
|
|
21
21
|
import { useSensors } from "../../../../../../hooks/sensors/sensors";
|
|
22
|
-
function AddToMap({ tool }) {
|
|
22
|
+
function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }) {
|
|
23
23
|
const t = useTranslations("AddToMap");
|
|
24
24
|
const { ability } = usePermissions();
|
|
25
25
|
const [datasetOpen, setDatasetOpen] = React.useState();
|
|
@@ -220,14 +220,19 @@ function AddToMap({ tool }) {
|
|
|
220
220
|
newBuildingFields,
|
|
221
221
|
setNewBuildingFields,
|
|
222
222
|
open: buildingDialogOpen,
|
|
223
|
-
onOpenChange: setBuildingDialogOpen
|
|
223
|
+
onOpenChange: setBuildingDialogOpen,
|
|
224
|
+
geocodeEarthApiKey,
|
|
225
|
+
geocoderUrl
|
|
224
226
|
}
|
|
225
227
|
),
|
|
226
228
|
/* @__PURE__ */ jsx(
|
|
227
229
|
Datasets,
|
|
228
230
|
{
|
|
229
231
|
isOpen: datasetOpen,
|
|
230
|
-
setIsOpenAction: setDatasetOpen
|
|
232
|
+
setIsOpenAction: setDatasetOpen,
|
|
233
|
+
organization,
|
|
234
|
+
minioBaseUrl,
|
|
235
|
+
martinBaseUrl
|
|
231
236
|
}
|
|
232
237
|
)
|
|
233
238
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.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\n// Dependencies\r\nimport * as React from \"react\";\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../../../store'\r\n\r\n// Utilities\r\nimport { ToolsContext, FilesContext, MenusContext } from '../../../../../../store'\r\nimport { Tool, ToolbarToolType } from '../../../../../../types/tools'\r\nimport { ViewerNames } from '../../../../../../types/'\r\nimport { ToolbarSubmenu } from '../../../../../ToolbarSubmenu'\r\n\r\n// Shadcn components\r\nimport { useSidebar, ItemsBadgeButton } from '../../../../../ui/'\r\nimport { DropdownMenuItem } from '../../../../../ui/DropdownMenu'\r\nimport { AddItemDialog } from '../../../../../ui/AddItemDialog'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Adder Components\r\nimport { FileAdder } from './AddFile/FileAdder'\r\nimport { CommentInput } from '../../../../../ui/Comments/CommentInput'\r\nimport { SensorInput } from '../../../../../ui/Sensors/SensorInput'\r\nimport { DatasetAdder } from './AddDataset/DatasetAdder'\r\nimport { SiteAdder } from './AddSite/SiteAdder'\r\nimport Datasets from '../../../datasets'\r\nimport AddBuilding from '../../../../Data/buildingDetails/AddBuilding'\r\nimport { DbFile } from '../../../../../../types/dbTypes';\r\nimport { useComments } from '../../../../../../hooks/comments/comments';\r\nimport { useSensors } from '../../../../../../hooks/sensors/sensors';\r\n\r\ninterface AddToMapToolProps {\r\n tool: Tool\r\n}\r\n\r\nexport default function AddToMap({ tool }: AddToMapToolProps) {\r\n // Translation\r\n const t = useTranslations('AddToMap')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [datasetOpen, setDatasetOpen] = React.useState<boolean>()\r\n\r\n const { dispatch: toolsDispatch, state: toolsState }\r\n = React.useContext(ToolsContext)\r\n const [addingMode, setAddingMode] = React.useState<ToolbarToolType | null>(null)\r\n const { state: fileState } = React.useContext(FilesContext)\r\n const { files } = fileState.files\r\n const mapFiles: DbFile[] = files.filter(file => file.type == 'map-file')\r\n\r\n const {comments} = useComments()\r\n const {sensors} = useSensors()\r\n\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [buildingDialogOpen, setBuildingDialogOpen] = React.useState(false)\r\n\r\n const { currentToolId } = toolsState?.tools || {}\r\n\r\n // Allow other UI (e.g. CommentsSection) to trigger AddToMap modes\r\n React.useEffect(() => {\r\n const isAddToMapMode = (id: any): id is ToolbarToolType => {\r\n return (\r\n id === 'map-add-file'\r\n || id === 'map-add-comment'\r\n || id === 'map-add-building'\r\n || id === 'map-add-dataset'\r\n || id === 'map-add-site'\r\n || id === 'map-add-sensor'\r\n )\r\n }\r\n\r\n if (isAddToMapMode(currentToolId)) {\r\n setAddingMode(currentToolId)\r\n }\r\n else {\r\n setAddingMode(null)\r\n }\r\n }, [currentToolId])\r\n\r\n const handleToolClick = (newTool: ToolbarToolType) => {\r\n setAddingMode(newTool)\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: { currentToolId: newTool },\r\n })\r\n }\r\n\r\n const clearTool = () => {\r\n setAddingMode(null)\r\n toolsDispatch({ type: 'CLEAR-TOOLS' })\r\n }\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const handleCommentsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'communication' } })\r\n }\r\n\r\n const handleSensorsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'sensors' } })\r\n }\r\n\r\n const { currentViewer } = menusState.menus\r\n\r\n const handleOpenFileTab = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'file' } })\r\n }\r\n\r\n return (\r\n <>\r\n <ToolbarSubmenu tool={tool}>\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => handleToolClick('map-add-file')}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.FilePlus />\r\n <span>{t('file')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={mapFiles.length}\r\n onClick={handleOpenFileTab}\r\n />\r\n\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-comment')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.MessageCircle />\r\n <span>{t('comment')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={comments.filter((comment) => currentViewer === comment.viewer).length}\r\n onClick={handleCommentsMenu}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-dataset')\r\n }}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.Database />\r\n <span>{t('dataset')}</span>\r\n </DropdownMenuItem>\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => {\r\n handleToolClick('map-add-site')\r\n }}\r\n disabled={!ability.can('create', 'Site')}\r\n >\r\n <LR.BoxSelect />\r\n <span>{t('site')}</span>\r\n </DropdownMenuItem>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-sensor')\r\n }}\r\n disabled={!ability.can('create', 'Sensor')}\r\n >\r\n <LR.Radio />\r\n <span>{t('sensor')}</span>\r\n </DropdownMenuItem>\r\n {sensors.length > 0 && (\r\n <ItemsBadgeButton\r\n count={sensors.filter((sensor) => currentViewer === sensor.viewer).length}\r\n onClick={handleSensorsMenu}\r\n />\r\n )}\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => setBuildingDialogOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.Building2 />\r\n <span>{t('building')}</span>\r\n </DropdownMenuItem>\r\n\r\n </ToolbarSubmenu>\r\n\r\n {/* File — manages its own dialog and state */}\r\n {addingMode === 'map-add-file' && (\r\n <FileAdder isOpen={addingMode === 'map-add-file'} onClose={clearTool} />\r\n )}\r\n\r\n {/* Comment */}\r\n <CommentInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-comment'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Sensor */}\r\n <SensorInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-sensor'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Site */}\r\n <SiteAdder\r\n isOpen={addingMode === 'map-add-site'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Dataset */}\r\n <AddItemDialog\r\n open={addingMode === 'map-add-dataset'}\r\n onOpenChange={open => !open && clearTool()}\r\n title={t('addDatasetTitle')}\r\n icon={LR.Database}\r\n contentClassName=\"max-w-xl\"\r\n >\r\n <DatasetAdder />\r\n </AddItemDialog>\r\n\r\n {/* Building */}\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={buildingDialogOpen}\r\n onOpenChange={setBuildingDialogOpen}\r\n />\r\n\r\n <Datasets\r\n isOpen={datasetOpen}\r\n setIsOpenAction={setDatasetOpen}\r\n />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.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\n// Dependencies\r\nimport * as React from \"react\";\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../../../store'\r\n\r\n// Utilities\r\nimport { ToolsContext, FilesContext, MenusContext } from '../../../../../../store'\r\nimport { Tool, ToolbarToolType } from '../../../../../../types/tools'\r\nimport { ViewerNames } from '../../../../../../types/'\r\nimport { ToolbarSubmenu } from '../../../../../ToolbarSubmenu'\r\n\r\n// Shadcn components\r\nimport { useSidebar, ItemsBadgeButton } from '../../../../../ui/'\r\nimport { DropdownMenuItem } from '../../../../../ui/DropdownMenu'\r\nimport { AddItemDialog } from '../../../../../ui/AddItemDialog'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Adder Components\r\nimport { FileAdder } from './AddFile/FileAdder'\r\nimport { CommentInput } from '../../../../../ui/Comments/CommentInput'\r\nimport { SensorInput } from '../../../../../ui/Sensors/SensorInput'\r\nimport { DatasetAdder } from './AddDataset/DatasetAdder'\r\nimport { SiteAdder } from './AddSite/SiteAdder'\r\nimport Datasets from '../../../datasets'\r\nimport AddBuilding from '../../../../Data/buildingDetails/AddBuilding'\r\nimport { DbFile, Organization } from '../../../../../../types/dbTypes';\r\nimport { useComments } from '../../../../../../hooks/comments/comments';\r\nimport { useSensors } from '../../../../../../hooks/sensors/sensors';\r\n\r\ninterface AddToMapToolProps {\r\n tool: Tool\r\n organization?: Organization\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport default function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }: AddToMapToolProps) {\r\n // Translation\r\n const t = useTranslations('AddToMap')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [datasetOpen, setDatasetOpen] = React.useState<boolean>()\r\n\r\n const { dispatch: toolsDispatch, state: toolsState }\r\n = React.useContext(ToolsContext)\r\n const [addingMode, setAddingMode] = React.useState<ToolbarToolType | null>(null)\r\n const { state: fileState } = React.useContext(FilesContext)\r\n const { files } = fileState.files\r\n const mapFiles: DbFile[] = files.filter(file => file.type == 'map-file')\r\n\r\n const {comments} = useComments()\r\n const {sensors} = useSensors()\r\n\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [buildingDialogOpen, setBuildingDialogOpen] = React.useState(false)\r\n\r\n const { currentToolId } = toolsState?.tools || {}\r\n\r\n // Allow other UI (e.g. CommentsSection) to trigger AddToMap modes\r\n React.useEffect(() => {\r\n const isAddToMapMode = (id: any): id is ToolbarToolType => {\r\n return (\r\n id === 'map-add-file'\r\n || id === 'map-add-comment'\r\n || id === 'map-add-building'\r\n || id === 'map-add-dataset'\r\n || id === 'map-add-site'\r\n || id === 'map-add-sensor'\r\n )\r\n }\r\n\r\n if (isAddToMapMode(currentToolId)) {\r\n setAddingMode(currentToolId)\r\n }\r\n else {\r\n setAddingMode(null)\r\n }\r\n }, [currentToolId])\r\n\r\n const handleToolClick = (newTool: ToolbarToolType) => {\r\n setAddingMode(newTool)\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: { currentToolId: newTool },\r\n })\r\n }\r\n\r\n const clearTool = () => {\r\n setAddingMode(null)\r\n toolsDispatch({ type: 'CLEAR-TOOLS' })\r\n }\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const handleCommentsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'communication' } })\r\n }\r\n\r\n const handleSensorsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'sensors' } })\r\n }\r\n\r\n const { currentViewer } = menusState.menus\r\n\r\n const handleOpenFileTab = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'file' } })\r\n }\r\n\r\n return (\r\n <>\r\n <ToolbarSubmenu tool={tool}>\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => handleToolClick('map-add-file')}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.FilePlus />\r\n <span>{t('file')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={mapFiles.length}\r\n onClick={handleOpenFileTab}\r\n />\r\n\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-comment')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.MessageCircle />\r\n <span>{t('comment')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={comments.filter((comment) => currentViewer === comment.viewer).length}\r\n onClick={handleCommentsMenu}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-dataset')\r\n }}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.Database />\r\n <span>{t('dataset')}</span>\r\n </DropdownMenuItem>\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => {\r\n handleToolClick('map-add-site')\r\n }}\r\n disabled={!ability.can('create', 'Site')}\r\n >\r\n <LR.BoxSelect />\r\n <span>{t('site')}</span>\r\n </DropdownMenuItem>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-sensor')\r\n }}\r\n disabled={!ability.can('create', 'Sensor')}\r\n >\r\n <LR.Radio />\r\n <span>{t('sensor')}</span>\r\n </DropdownMenuItem>\r\n {sensors.length > 0 && (\r\n <ItemsBadgeButton\r\n count={sensors.filter((sensor) => currentViewer === sensor.viewer).length}\r\n onClick={handleSensorsMenu}\r\n />\r\n )}\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => setBuildingDialogOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.Building2 />\r\n <span>{t('building')}</span>\r\n </DropdownMenuItem>\r\n\r\n </ToolbarSubmenu>\r\n\r\n {/* File — manages its own dialog and state */}\r\n {addingMode === 'map-add-file' && (\r\n <FileAdder isOpen={addingMode === 'map-add-file'} onClose={clearTool} />\r\n )}\r\n\r\n {/* Comment */}\r\n <CommentInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-comment'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Sensor */}\r\n <SensorInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-sensor'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Site */}\r\n <SiteAdder\r\n isOpen={addingMode === 'map-add-site'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Dataset */}\r\n <AddItemDialog\r\n open={addingMode === 'map-add-dataset'}\r\n onOpenChange={open => !open && clearTool()}\r\n title={t('addDatasetTitle')}\r\n icon={LR.Database}\r\n contentClassName=\"max-w-xl\"\r\n >\r\n <DatasetAdder />\r\n </AddItemDialog>\r\n\r\n {/* Building */}\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={buildingDialogOpen}\r\n onOpenChange={setBuildingDialogOpen}\r\n geocodeEarthApiKey={geocodeEarthApiKey}\r\n geocoderUrl={geocoderUrl}\r\n />\r\n\r\n <Datasets\r\n isOpen={datasetOpen}\r\n setIsOpenAction={setDatasetOpen}\r\n organization={organization}\r\n minioBaseUrl={minioBaseUrl}\r\n martinBaseUrl={martinBaseUrl}\r\n />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
|
|
2
|
+
import { Tool } from '../../../../../types/tools';
|
|
3
|
+
import { Organization } from '../../../../../types/dbTypes';
|
|
4
|
+
interface DatasetMapToolProps {
|
|
5
|
+
tool: Tool;
|
|
6
|
+
organization?: Organization;
|
|
7
|
+
minioBaseUrl?: string;
|
|
8
|
+
martinBaseUrl?: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export default function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }: DatasetMapToolProps): React.JSX.Element;
|
|
12
|
+
export {};
|
|
3
13
|
//# sourceMappingURL=DatasetMapTool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatasetMapTool.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DatasetMapTool.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,UAAU,mBAAmB;IAC3B,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,mBAAmB,qBA4B9G"}
|
|
@@ -5,10 +5,9 @@ import { usePermissions } from "../../../../../store";
|
|
|
5
5
|
import * as LR from "lucide-react";
|
|
6
6
|
import { Button } from "../../../../ui/Button";
|
|
7
7
|
import Datasets from "../../datasets";
|
|
8
|
-
function DatasetMapTool(
|
|
8
|
+
function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }) {
|
|
9
9
|
const { ability } = usePermissions();
|
|
10
10
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
11
|
-
const { tool } = props;
|
|
12
11
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13
12
|
/* @__PURE__ */ jsx(
|
|
14
13
|
Button,
|
|
@@ -26,7 +25,10 @@ function DatasetMapTool(props) {
|
|
|
26
25
|
Datasets,
|
|
27
26
|
{
|
|
28
27
|
isOpen,
|
|
29
|
-
setIsOpenAction: setIsOpen
|
|
28
|
+
setIsOpenAction: setIsOpen,
|
|
29
|
+
organization,
|
|
30
|
+
minioBaseUrl,
|
|
31
|
+
martinBaseUrl
|
|
30
32
|
}
|
|
31
33
|
)
|
|
32
34
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.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 { usePermissions } from '../../../../../store'\r\n\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport Datasets from '../../datasets'\r\n\r\nexport default function DatasetMapTool(
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.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 { usePermissions } from '../../../../../store'\r\n\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport Datasets from '../../datasets'\r\nimport { Tool } from '../../../../../types/tools'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\ninterface DatasetMapToolProps {\r\n tool: Tool\r\n organization?: Organization\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport default function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }: DatasetMapToolProps) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n\r\n return (\r\n <>\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n className=\"flex justify-center items-center h-9 w-9 pointer-events-auto\"\r\n onClick={() => setIsOpen(true)}\r\n title={tool?.title}\r\n disabled={!ability.can('read', 'File')}\r\n\r\n >\r\n <LR.Database />\r\n </Button>\r\n <Datasets\r\n isOpen={isOpen}\r\n setIsOpenAction={setIsOpen}\r\n organization={organization}\r\n minioBaseUrl={minioBaseUrl}\r\n martinBaseUrl={martinBaseUrl}\r\n />\r\n </>\r\n )\r\n}"],"mappings":";AA6BI,mBAUI,KAVJ;AAxBJ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAE/B,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,cAAc;AAYN,SAAR,eAAgC,EAAE,MAAM,cAAc,cAAc,cAAc,GAAwB;AAE/G,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAEhD,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,OAAO,6BAAM;AAAA,QACb,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAGrC,8BAAC,GAAG,UAAH,EAAY;AAAA;AAAA,IACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { Tool } from '../../../../../types/tools';
|
|
2
|
+
import { Organization } from '../../../../../types/dbTypes';
|
|
2
3
|
export type MapToolbarToolType = 'map-dimensions' | 'map-media' | 'map-compare' | 'map-database' | 'map-add' | 'map-add-comment' | 'map-add-dataset' | 'map-add-site' | 'map-add-building' | 'map-add-sensor' | 'map-add-file' | 'map-measure' | 'map-share' | 'map-compare-buildings' | 'open-building-page' | 'open-bim-viewer' | 'open-pointcloud';
|
|
3
|
-
|
|
4
|
+
type MapToolsConfig = {
|
|
5
|
+
martinBaseUrl?: string;
|
|
6
|
+
minioBaseUrl?: string;
|
|
7
|
+
organization?: Organization;
|
|
8
|
+
geocodeEarthApiKey?: string;
|
|
9
|
+
geocoderUrl?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function mapToolbarTools(config?: MapToolsConfig): Tool[];
|
|
12
|
+
export {};
|
|
4
13
|
//# sourceMappingURL=mapTools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapTools.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"mapTools.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAa3D,MAAM,MAAM,kBAAkB,GAC9B,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,WAAW,GACX,uBAAuB,GACvB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,CAAA;AAEjB,KAAK,cAAc,GAAG;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAGD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,CA8B/D"}
|
|
@@ -5,16 +5,18 @@ import AddToMap from "./AddTools/AddToMap";
|
|
|
5
5
|
import { ShareMapTool } from "./shareMapTool";
|
|
6
6
|
import DatasetMapTool from "./DatasetMapTool";
|
|
7
7
|
import Compare from "../compare";
|
|
8
|
-
function mapToolbarTools() {
|
|
8
|
+
function mapToolbarTools(config) {
|
|
9
9
|
const t = useTranslations("mapToolbarTools");
|
|
10
|
+
const extraProps = config != null ? config : {};
|
|
10
11
|
return [
|
|
11
12
|
{ id: "map-compare", title: t("compareTitle"), url: "/", icon: LR.Columns3, component: Compare },
|
|
12
|
-
{ id: "map-database", title: t("datasetsTitle"), url: "/", icon: LR.Database, component: DatasetMapTool },
|
|
13
|
+
{ id: "map-database", title: t("datasetsTitle"), url: "/", icon: LR.Database, component: DatasetMapTool, extraProps },
|
|
13
14
|
{
|
|
14
15
|
id: "map-add",
|
|
15
16
|
title: t("addTitle"),
|
|
16
17
|
icon: LR.Plus,
|
|
17
|
-
component: AddToMap
|
|
18
|
+
component: AddToMap,
|
|
19
|
+
extraProps
|
|
18
20
|
},
|
|
19
21
|
{
|
|
20
22
|
id: "map-measure",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Utilities\r\nimport { Tool } from '../../../../../types/tools'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom toolbar buttons\r\nimport { MeasureMapTool } from './measureMapTool'\r\n\r\nimport AddToMap from './AddTools/AddToMap'\r\nimport { ShareMapTool } from './shareMapTool'\r\nimport DatasetMapTool from './DatasetMapTool'\r\nimport Compare from '../compare'\r\n\r\nexport type MapToolbarToolType = \r\n'map-dimensions' | \r\n'map-media' | \r\n'map-compare' | \r\n'map-database' | \r\n'map-add' | \r\n'map-add-comment' |\r\n'map-add-dataset' |\r\n'map-add-site' |\r\n'map-add-building' |\r\n'map-add-sensor' |\r\n'map-add-file' |\r\n'map-measure' | \r\n'map-share' |\r\n'map-compare-buildings' |\r\n'open-building-page' |\r\n'open-bim-viewer' |\r\n'open-pointcloud'\r\n\r\n// Export toolbar configuration\r\nexport function mapToolbarTools(): Tool[] {\r\n // Translation\r\n const t = useTranslations('mapToolbarTools')\r\n\r\n return [\r\n { id: 'map-compare', title: t('compareTitle'), url: '/', icon: LR.Columns3, component: Compare },\r\n { id: 'map-database', title: t('datasetsTitle'), url: '/', icon: LR.Database, component: DatasetMapTool },\r\n {\r\n id: 'map-add',\r\n title: t('addTitle'),\r\n icon: LR.Plus,\r\n component: AddToMap,\r\n },\r\n {\r\n id: 'map-measure',\r\n title: t('measureTitle'),\r\n icon: LR.Ruler,\r\n cursor: 'crosshair',\r\n stayActive: true,\r\n component: MeasureMapTool,\r\n },\r\n { id: 'map-share',\r\n title: t('shareTitle'),\r\n icon: LR.Share2,\r\n component: ShareMapTool,\r\n },\r\n ]\r\n}\r\n"],"mappings":"AAGA,SAAS,uBAAuB;
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Utilities\r\nimport { Tool } from '../../../../../types/tools'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom toolbar buttons\r\nimport { MeasureMapTool } from './measureMapTool'\r\n\r\nimport AddToMap from './AddTools/AddToMap'\r\nimport { ShareMapTool } from './shareMapTool'\r\nimport DatasetMapTool from './DatasetMapTool'\r\nimport Compare from '../compare'\r\n\r\nexport type MapToolbarToolType = \r\n'map-dimensions' | \r\n'map-media' | \r\n'map-compare' | \r\n'map-database' | \r\n'map-add' | \r\n'map-add-comment' |\r\n'map-add-dataset' |\r\n'map-add-site' |\r\n'map-add-building' |\r\n'map-add-sensor' |\r\n'map-add-file' |\r\n'map-measure' | \r\n'map-share' |\r\n'map-compare-buildings' |\r\n'open-building-page' |\r\n'open-bim-viewer' |\r\n'open-pointcloud'\r\n\r\ntype MapToolsConfig = {\r\n martinBaseUrl?: string\r\n minioBaseUrl?: string\r\n organization?: Organization\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\n// Export toolbar configuration\r\nexport function mapToolbarTools(config?: MapToolsConfig): Tool[] {\r\n // Translation\r\n const t = useTranslations('mapToolbarTools')\r\n\r\n const extraProps = (config ?? {}) as unknown as Record<string, unknown>\r\n\r\n return [\r\n { id: 'map-compare', title: t('compareTitle'), url: '/', icon: LR.Columns3, component: Compare },\r\n { id: 'map-database', title: t('datasetsTitle'), url: '/', icon: LR.Database, component: DatasetMapTool, extraProps },\r\n {\r\n id: 'map-add',\r\n title: t('addTitle'),\r\n icon: LR.Plus,\r\n component: AddToMap,\r\n extraProps,\r\n },\r\n {\r\n id: 'map-measure',\r\n title: t('measureTitle'),\r\n icon: LR.Ruler,\r\n cursor: 'crosshair',\r\n stayActive: true,\r\n component: MeasureMapTool,\r\n },\r\n { id: 'map-share',\r\n title: t('shareTitle'),\r\n icon: LR.Share2,\r\n component: ShareMapTool,\r\n },\r\n ]\r\n}\r\n"],"mappings":"AAGA,SAAS,uBAAuB;AAOhC,YAAY,QAAQ;AAGpB,SAAS,sBAAsB;AAE/B,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,OAAO,oBAAoB;AAC3B,OAAO,aAAa;AA8Bb,SAAS,gBAAgB,QAAiC;AAE/D,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,QAAM,aAAc,0BAAU,CAAC;AAE/B,SAAO;AAAA,IACL,EAAE,IAAI,eAAe,OAAO,EAAE,cAAc,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,QAAQ;AAAA,IAC/F,EAAE,IAAI,gBAAgB,OAAO,EAAE,eAAe,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,gBAAgB,WAAW;AAAA,IACpH;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,UAAU;AAAA,MACnB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,MACX;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,cAAc;AAAA,MACvB,MAAM,GAAG;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MAAE,IAAI;AAAA,MACJ,OAAO,EAAE,YAAY;AAAA,MACrB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
|
|
@@ -5,6 +5,7 @@ import type maplibregl from 'maplibre-gl';
|
|
|
5
5
|
* Higher priority is clicked first.
|
|
6
6
|
*/
|
|
7
7
|
export declare enum MapLayerClickPriority {
|
|
8
|
+
SiteLayerClickPriority = 50,
|
|
8
9
|
BuildingLayersClickPriority = 100,
|
|
9
10
|
CommentLayersClickPriority = 200,
|
|
10
11
|
MartinLayerClickPriority = 300,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapClickManager.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC;;;;GAIG;AACH,oBAAY,qBAAqB;
|
|
1
|
+
{"version":3,"file":"MapClickManager.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC;;;;GAIG;AACH,oBAAY,qBAAqB;IAG/B,sBAAsB,KAAK;IAC3B,2BAA2B,MAAM;IACjC,0BAA0B,MAAM;IAChC,wBAAwB,MAAM;IAC9B,0BAA0B,MAAM;IAChC,sBAAsB,MAAM;IAC5B,qBAAqB,MAAM;IAC3B,UAAU,OAAO;CAClB;AACD,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,UAAU,CAAC,aAAa,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,EAAE,KACrC,IAAI,CAAA;AAQT,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,mBAAmB,CAAqC;gBAEpD,GAAG,EAAE,UAAU,CAAC,GAAG;IAOxB,QAAQ,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,aAAa;IAOlB,UAAU,CAAC,OAAO,KAAA;IAKzB,OAAO,CAAC,cAAc;IA4BtB,OAAO;CAIR"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
var MapLayerClickPriority = /* @__PURE__ */ ((MapLayerClickPriority2) => {
|
|
2
|
+
MapLayerClickPriority2[MapLayerClickPriority2["SiteLayerClickPriority"] = 50] = "SiteLayerClickPriority";
|
|
2
3
|
MapLayerClickPriority2[MapLayerClickPriority2["BuildingLayersClickPriority"] = 100] = "BuildingLayersClickPriority";
|
|
3
4
|
MapLayerClickPriority2[MapLayerClickPriority2["CommentLayersClickPriority"] = 200] = "CommentLayersClickPriority";
|
|
4
5
|
MapLayerClickPriority2[MapLayerClickPriority2["MartinLayerClickPriority"] = 300] = "MartinLayerClickPriority";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// MapClickManager.ts\r\nimport type maplibregl from 'maplibre-gl'\r\n\r\n/**\r\n * This is very important. Declare a new priority for your layer in this enum if you need to,\r\n * otherwise, just use the one that has been declared\r\n * Higher priority is clicked first.\r\n */\r\nexport enum MapLayerClickPriority {\r\n BuildingLayersClickPriority = 100,\r\n CommentLayersClickPriority = 200,\r\n MartinLayerClickPriority = 300,\r\n OpenDataLayerClickPriority = 350,\r\n FileLayerCLickPriority = 400,\r\n BimModelLayerPriority = 600,\r\n ActiveTool = 1000, // SPECIAL ONE, MAKE SURE TO DISABLE THE TOOL WHEN YOU ARE FINISH.\r\n}\r\nexport type ClickCallback = (\r\n event: maplibregl.MapMouseEvent,\r\n features: maplibregl.MapGeoJSONFeature[],\r\n) => void\r\n\r\ninterface LayerClickHandler {\r\n layerId: string\r\n priority: number\r\n callback: ClickCallback\r\n}\r\n\r\nexport class MapClickManager {\r\n private map: maplibregl.Map // the instance of the map\r\n private clickHandlers: LayerClickHandler[] // all click handlers for layers that has been registered\r\n private boundedClickHandler: (e: maplibregl.MapMouseEvent) => {} // clickHandler has \"this\" object binded to it, so inside the handleClick private function, we can still access this.map.\r\n\r\n constructor(map: maplibregl.Map) {\r\n this.map = map\r\n this.boundedClickHandler = this.handleMapClick.bind(this)\r\n this.clickHandlers = []\r\n this.map.on('click', this.boundedClickHandler)\r\n }\r\n\r\n public register(\r\n layerId: string,\r\n priority: MapLayerClickPriority,\r\n callback: ClickCallback,\r\n ) {\r\n this.clickHandlers.push({ layerId, priority, callback })\r\n this.clickHandlers.sort((a, b) => b.priority - a.priority)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n public unregister(layerId) {\r\n this.clickHandlers = this.clickHandlers.filter(handler => handler.layerId !== layerId)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n private handleMapClick(e: maplibregl.MapMouseEvent) {\r\n // for active tools\r\n for (const handler of this.clickHandlers) {\r\n if (handler.priority === MapLayerClickPriority.ActiveTool) {\r\n handler.callback(e, [])\r\n console.log('call back return ')\r\n return\r\n }\r\n }\r\n\r\n // console.log(e.point)\r\n const features = this.map.queryRenderedFeatures(e.point)\r\n // console.log(features)\r\n\r\n if (!features) return\r\n\r\n for (let i = 0; i < this.clickHandlers.length; i++) {\r\n const currentHandler = this.clickHandlers[i]\r\n const hits = features.filter(f => f.layer?.id == currentHandler.layerId)\r\n\r\n if (hits.length > 0) {\r\n // console.log(currentHandler)\r\n currentHandler.callback(e, hits)\r\n break\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this.map.off('click', this.boundedClickHandler)\r\n this.clickHandlers = []\r\n }\r\n}\r\n"],"mappings":"AAWO,IAAK,wBAAL,kBAAKA,2BAAL;
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// MapClickManager.ts\r\nimport type maplibregl from 'maplibre-gl'\r\n\r\n/**\r\n * This is very important. Declare a new priority for your layer in this enum if you need to,\r\n * otherwise, just use the one that has been declared\r\n * Higher priority is clicked first.\r\n */\r\nexport enum MapLayerClickPriority {\r\n // Lowest priority: a site polygon only handles a click when no other\r\n // interactive layer (buildings, comments, sensors, files, ...) was hit.\r\n SiteLayerClickPriority = 50,\r\n BuildingLayersClickPriority = 100,\r\n CommentLayersClickPriority = 200,\r\n MartinLayerClickPriority = 300,\r\n OpenDataLayerClickPriority = 350,\r\n FileLayerCLickPriority = 400,\r\n BimModelLayerPriority = 600,\r\n ActiveTool = 1000, // SPECIAL ONE, MAKE SURE TO DISABLE THE TOOL WHEN YOU ARE FINISH.\r\n}\r\nexport type ClickCallback = (\r\n event: maplibregl.MapMouseEvent,\r\n features: maplibregl.MapGeoJSONFeature[],\r\n) => void\r\n\r\ninterface LayerClickHandler {\r\n layerId: string\r\n priority: number\r\n callback: ClickCallback\r\n}\r\n\r\nexport class MapClickManager {\r\n private map: maplibregl.Map // the instance of the map\r\n private clickHandlers: LayerClickHandler[] // all click handlers for layers that has been registered\r\n private boundedClickHandler: (e: maplibregl.MapMouseEvent) => {} // clickHandler has \"this\" object binded to it, so inside the handleClick private function, we can still access this.map.\r\n\r\n constructor(map: maplibregl.Map) {\r\n this.map = map\r\n this.boundedClickHandler = this.handleMapClick.bind(this)\r\n this.clickHandlers = []\r\n this.map.on('click', this.boundedClickHandler)\r\n }\r\n\r\n public register(\r\n layerId: string,\r\n priority: MapLayerClickPriority,\r\n callback: ClickCallback,\r\n ) {\r\n this.clickHandlers.push({ layerId, priority, callback })\r\n this.clickHandlers.sort((a, b) => b.priority - a.priority)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n public unregister(layerId) {\r\n this.clickHandlers = this.clickHandlers.filter(handler => handler.layerId !== layerId)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n private handleMapClick(e: maplibregl.MapMouseEvent) {\r\n // for active tools\r\n for (const handler of this.clickHandlers) {\r\n if (handler.priority === MapLayerClickPriority.ActiveTool) {\r\n handler.callback(e, [])\r\n console.log('call back return ')\r\n return\r\n }\r\n }\r\n\r\n // console.log(e.point)\r\n const features = this.map.queryRenderedFeatures(e.point)\r\n // console.log(features)\r\n\r\n if (!features) return\r\n\r\n for (let i = 0; i < this.clickHandlers.length; i++) {\r\n const currentHandler = this.clickHandlers[i]\r\n const hits = features.filter(f => f.layer?.id == currentHandler.layerId)\r\n\r\n if (hits.length > 0) {\r\n // console.log(currentHandler)\r\n currentHandler.callback(e, hits)\r\n break\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this.map.off('click', this.boundedClickHandler)\r\n this.clickHandlers = []\r\n }\r\n}\r\n"],"mappings":"AAWO,IAAK,wBAAL,kBAAKA,2BAAL;AAGL,EAAAA,8CAAA,4BAAyB,MAAzB;AACA,EAAAA,8CAAA,iCAA8B,OAA9B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,8BAA2B,OAA3B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,4BAAyB,OAAzB;AACA,EAAAA,8CAAA,2BAAwB,OAAxB;AACA,EAAAA,8CAAA,gBAAa,OAAb;AAVU,SAAAA;AAAA,GAAA;AAuBL,MAAM,gBAAgB;AAAA;AAAA,EAK3B,YAAY,KAAqB;AAC/B,SAAK,MAAM;AACX,SAAK,sBAAsB,KAAK,eAAe,KAAK,IAAI;AACxD,SAAK,gBAAgB,CAAC;AACtB,SAAK,IAAI,GAAG,SAAS,KAAK,mBAAmB;AAAA,EAC/C;AAAA,EAEO,SACL,SACA,UACA,UACA;AACA,SAAK,cAAc,KAAK,EAAE,SAAS,UAAU,SAAS,CAAC;AACvD,SAAK,cAAc,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,EAE3D;AAAA,EAEO,WAAW,SAAS;AACzB,SAAK,gBAAgB,KAAK,cAAc,OAAO,aAAW,QAAQ,YAAY,OAAO;AAAA,EAEvF;AAAA,EAEQ,eAAe,GAA6B;AAElD,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI,QAAQ,aAAa,sBAAkC;AACzD,gBAAQ,SAAS,GAAG,CAAC,CAAC;AACtB,gBAAQ,IAAI,mBAAmB;AAC/B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,IAAI,sBAAsB,EAAE,KAAK;AAGvD,QAAI,CAAC,SAAU;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,cAAc,QAAQ,KAAK;AAClD,YAAM,iBAAiB,KAAK,cAAc,CAAC;AAC3C,YAAM,OAAO,SAAS,OAAO,OAAE;AA/ErC;AA+EwC,wBAAE,UAAF,mBAAS,OAAM,eAAe;AAAA,OAAO;AAEvE,UAAI,KAAK,SAAS,GAAG;AAEnB,uBAAe,SAAS,GAAG,IAAI;AAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,IAAI,IAAI,SAAS,KAAK,mBAAmB;AAC9C,SAAK,gBAAgB,CAAC;AAAA,EACxB;AACF;","names":["MapLayerClickPriority"]}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export type GeocodingRuntimeConfig = {
|
|
2
|
+
geocodeEarthApiKey?: string;
|
|
3
|
+
geocoderUrl?: string;
|
|
4
|
+
photonUrl?: string;
|
|
5
|
+
nominatimUrl?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function setGeocodingConfig(cfg: GeocodingRuntimeConfig): void;
|
|
8
|
+
export declare function getGeocodingConfig(): {
|
|
9
|
+
geocodeEarthApiKey: string;
|
|
10
|
+
peliasBase: string;
|
|
11
|
+
usePelias: boolean;
|
|
12
|
+
photonUrl: string;
|
|
13
|
+
nominatimUrl: string;
|
|
14
|
+
};
|
|
6
15
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAMpE;AAED,wBAAgB,kBAAkB;;;;;;EAYjC"}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
let _geocodeEarthApiKey = void 0;
|
|
2
|
+
let _geocoderUrl = void 0;
|
|
3
|
+
let _photonUrl = "https://photon.komoot.io";
|
|
4
|
+
let _nominatimUrl = "https://nominatim.openstreetmap.org";
|
|
5
|
+
function setGeocodingConfig(cfg) {
|
|
6
|
+
_geocodeEarthApiKey = cfg.geocodeEarthApiKey || void 0;
|
|
7
|
+
_geocoderUrl = cfg.geocoderUrl || void 0;
|
|
8
|
+
if (cfg.photonUrl) _photonUrl = cfg.photonUrl;
|
|
9
|
+
if (cfg.nominatimUrl) _nominatimUrl = cfg.nominatimUrl;
|
|
10
|
+
}
|
|
11
|
+
function getGeocodingConfig() {
|
|
12
|
+
const peliasBase = _geocodeEarthApiKey ? "https://api.geocode.earth" : _geocoderUrl || null;
|
|
13
|
+
return {
|
|
14
|
+
geocodeEarthApiKey: _geocodeEarthApiKey,
|
|
15
|
+
peliasBase,
|
|
16
|
+
usePelias: Boolean(peliasBase),
|
|
17
|
+
photonUrl: _photonUrl,
|
|
18
|
+
nominatimUrl: _nominatimUrl
|
|
19
|
+
};
|
|
20
|
+
}
|
|
7
21
|
export {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
PELIAS_BASE,
|
|
11
|
-
PHOTON_URL,
|
|
12
|
-
USE_PELIAS
|
|
22
|
+
getGeocodingConfig,
|
|
23
|
+
setGeocodingConfig
|
|
13
24
|
};
|
|
14
25
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// ---------------------------------------------------------------------------\r\n// Geocoding provider resolution\r\n//\r\n// Geocode Earth is hosted Pelias, so it and a self-hosted Pelias instance share\r\n// one code path (
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// ---------------------------------------------------------------------------\r\n// Geocoding provider resolution\r\n//\r\n// Values are injected at runtime via setGeocodingConfig() (called by\r\n// useGeocodingRuntimeConfig) rather than read from process.env at build time.\r\n// This allows the pre-built Docker image to pick up env vars at container\r\n// start without webpack baking empty strings into the client bundle.\r\n//\r\n// Geocode Earth is hosted Pelias, so it and a self-hosted Pelias instance share\r\n// one code path (/v1/autocomplete, /v1/reverse, and the same response shape).\r\n// When neither a key nor a self-hosted URL is configured we fall back to free,\r\n// no-key public OSM services so self-hosters get working geocoding out of the box:\r\n// - autocomplete -> Photon (komoot), built for per-keystroke search.\r\n// - reverse -> Nominatim, fine for occasional point lookups.\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _geocodeEarthApiKey: string | undefined = undefined\r\nlet _geocoderUrl: string | undefined = undefined\r\nlet _photonUrl: string = 'https://photon.komoot.io'\r\nlet _nominatimUrl: string = 'https://nominatim.openstreetmap.org'\r\n\r\nexport type GeocodingRuntimeConfig = {\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n photonUrl?: string\r\n nominatimUrl?: string\r\n}\r\n\r\nexport function setGeocodingConfig(cfg: GeocodingRuntimeConfig): void {\r\n // Treat empty strings the same as undefined so we don't use blank API keys\r\n _geocodeEarthApiKey = cfg.geocodeEarthApiKey || undefined\r\n _geocoderUrl = cfg.geocoderUrl || undefined\r\n if (cfg.photonUrl) _photonUrl = cfg.photonUrl\r\n if (cfg.nominatimUrl) _nominatimUrl = cfg.nominatimUrl\r\n}\r\n\r\nexport function getGeocodingConfig() {\r\n const peliasBase = _geocodeEarthApiKey\r\n ? 'https://api.geocode.earth'\r\n : _geocoderUrl || null\r\n\r\n return {\r\n geocodeEarthApiKey: _geocodeEarthApiKey,\r\n peliasBase,\r\n usePelias: Boolean(peliasBase),\r\n photonUrl: _photonUrl,\r\n nominatimUrl: _nominatimUrl,\r\n }\r\n}\r\n"],"mappings":"AAmBA,IAAI,sBAA0C;AAC9C,IAAI,eAAmC;AACvC,IAAI,aAAqB;AACzB,IAAI,gBAAwB;AASrB,SAAS,mBAAmB,KAAmC;AAEpE,wBAAsB,IAAI,sBAAsB;AAChD,iBAAe,IAAI,eAAe;AAClC,MAAI,IAAI,UAAW,cAAa,IAAI;AACpC,MAAI,IAAI,aAAc,iBAAgB,IAAI;AAC5C;AAEO,SAAS,qBAAqB;AACnC,QAAM,aAAa,sBACf,8BACA,gBAAgB;AAEpB,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB;AAAA,IACA,WAAW,QAAQ,UAAU;AAAA,IAC7B,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAkCjC,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAU5G,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,2BAAsC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KAC9F,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getGeocodingConfig } from "./config";
|
|
2
2
|
import { peliasAutocomplete, peliasReverse } from "./pelias";
|
|
3
3
|
import { photonAutocomplete, nominatimReverse } from "./osm";
|
|
4
4
|
let peliasAuthFailed = false;
|
|
5
|
-
const peliasActive = () =>
|
|
5
|
+
const peliasActive = () => getGeocodingConfig().usePelias && !peliasAuthFailed;
|
|
6
6
|
const isAuthError = (error) => {
|
|
7
7
|
const message = error instanceof Error ? error.message : String(error);
|
|
8
8
|
return message.includes("401") || message.includes("403");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { getGeocodingConfig } from './config'\r\nimport { peliasAutocomplete, peliasReverse } from './pelias'\r\nimport { photonAutocomplete, nominatimReverse } from './osm'\r\n\r\n// Provider-agnostic entry points. The preferred provider (Geocode Earth or a\r\n// self-hosted Pelias) is resolved in ./config from runtime-injected values;\r\n// if it fails we fall back to the free public OSM services so address search\r\n// keeps working.\r\n//\r\n// A bad/expired/origin-restricted key surfaces as a 401/403. Autocomplete fires\r\n// on every keystroke, so once we see an auth failure we stop retrying the keyed\r\n// provider for the rest of the session and serve results directly from public OSM.\r\nlet peliasAuthFailed = false\r\n\r\nconst peliasActive = (): boolean => getGeocodingConfig().usePelias && !peliasAuthFailed\r\n\r\nconst isAuthError = (error: unknown): boolean => {\r\n const message = error instanceof Error ? error.message : String(error)\r\n return message.includes('401') || message.includes('403')\r\n}\r\n\r\nconst handlePeliasFailure = (error: unknown, fallbackName: string): void => {\r\n if (isAuthError(error)) {\r\n peliasAuthFailed = true\r\n console.warn(\r\n `Geocoder: the configured provider rejected the API key (auth error). ` +\r\n `Falling back to public OSM services (Photon/Nominatim) for the rest of this session.`,\r\n )\r\n } else {\r\n console.warn(`Geocoder: provider request failed; falling back to ${fallbackName}.`, error)\r\n }\r\n}\r\n\r\nexport const autocompleteGeocode = async (text: string, countryCode: string, size: number): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasAutocomplete(text, countryCode, size)\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Photon')\r\n }\r\n }\r\n return photonAutocomplete(text, countryCode, size)\r\n}\r\n\r\nexport const reverseGeocode = async (\r\n latitude: string,\r\n longitude: string,\r\n countryCode: string,\r\n { size = 1, coarse = false, layers }: { size?: number; coarse?: boolean; layers?: string } = {},\r\n): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasReverse(latitude, longitude, countryCode, { size, coarse, layers })\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Nominatim')\r\n }\r\n }\r\n return nominatimReverse(latitude, longitude, { coarse })\r\n}\r\n"],"mappings":"AAIA,SAAS,0BAA0B;AACnC,SAAS,oBAAoB,qBAAqB;AAClD,SAAS,oBAAoB,wBAAwB;AAUrD,IAAI,mBAAmB;AAEvB,MAAM,eAAe,MAAe,mBAAmB,EAAE,aAAa,CAAC;AAEvE,MAAM,cAAc,CAAC,UAA4B;AAC/C,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK;AAC1D;AAEA,MAAM,sBAAsB,CAAC,OAAgB,iBAA+B;AAC1E,MAAI,YAAY,KAAK,GAAG;AACtB,uBAAmB;AACnB,YAAQ;AAAA,MACN;AAAA,IAEF;AAAA,EACF,OAAO;AACL,YAAQ,KAAK,sDAAsD,YAAY,KAAK,KAAK;AAAA,EAC3F;AACF;AAEO,MAAM,sBAAsB,OAAO,MAAc,aAAqB,SAAqC;AAChH,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,mBAAmB,MAAM,aAAa,IAAI;AAAA,IACzD,SACO,OAAO;AACZ,0BAAoB,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF;AACA,SAAO,mBAAmB,MAAM,aAAa,IAAI;AACnD;AAEO,MAAM,iBAAiB,OAC5B,UACA,WACA,aACA,EAAE,OAAO,GAAG,SAAS,OAAO,OAAO,IAA0D,CAAC,MACvE;AACvB,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,cAAc,UAAU,WAAW,aAAa,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IACvF,SACO,OAAO;AACZ,0BAAoB,OAAO,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO,iBAAiB,UAAU,WAAW,EAAE,OAAO,CAAC;AACzD;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"osm.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"osm.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAsBvH,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,YAAY;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,KAC9B,OAAO,CAAC,OAAO,EAAE,CAiBnB,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getGeocodingConfig } from "./config";
|
|
2
2
|
import { normalizePhotonFeature, normalizeNominatimResult } from "./adapters";
|
|
3
3
|
const photonAutocomplete = async (text, countryCode, size) => {
|
|
4
|
+
const { photonUrl } = getGeocodingConfig();
|
|
4
5
|
const params = new URLSearchParams({ q: text, limit: String(size * 2), lang: "en" });
|
|
5
|
-
const response = await fetch(`${
|
|
6
|
+
const response = await fetch(`${photonUrl}/api?${params}`);
|
|
6
7
|
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
7
8
|
const data = await response.json();
|
|
8
9
|
let features = (data.features || []).map(normalizePhotonFeature);
|
|
@@ -18,15 +19,15 @@ const photonAutocomplete = async (text, countryCode, size) => {
|
|
|
18
19
|
return features.slice(0, size);
|
|
19
20
|
};
|
|
20
21
|
const nominatimReverse = async (latitude, longitude, { coarse }) => {
|
|
22
|
+
const { nominatimUrl } = getGeocodingConfig();
|
|
21
23
|
const params = new URLSearchParams({
|
|
22
24
|
format: "jsonv2",
|
|
23
25
|
lat: latitude,
|
|
24
26
|
lon: longitude,
|
|
25
27
|
addressdetails: "1",
|
|
26
28
|
zoom: coarse ? "10" : "18"
|
|
27
|
-
// coarse -> city level, otherwise building level
|
|
28
29
|
});
|
|
29
|
-
const response = await fetch(`${
|
|
30
|
+
const response = await fetch(`${nominatimUrl}/reverse?${params}`);
|
|
30
31
|
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
31
32
|
const data = await response.json();
|
|
32
33
|
if (!data || data.error || data.lat == null) return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { getGeocodingConfig } from './config'\r\nimport { normalizePhotonFeature, normalizeNominatimResult } from './adapters'\r\n\r\n// Free, no-key public OSM fallbacks. Photon serves autocomplete (it is built for\r\n// per-keystroke search); Nominatim serves reverse lookups (occasional, single point).\r\n\r\nexport const photonAutocomplete = async (text: string, countryCode: string | undefined, size: number): Promise<Feature[]> => {\r\n const { photonUrl } = getGeocodingConfig()\r\n\r\n // Photon has no country filter, so over-fetch and post-filter by country code.\r\n const params = new URLSearchParams({ q: text, limit: String(size * 2), lang: 'en' })\r\n\r\n const response = await fetch(`${photonUrl}/api?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n let features: Feature[] = (data.features || []).map(normalizePhotonFeature)\r\n\r\n if (countryCode) {\r\n const cc = countryCode.toUpperCase()\r\n const inCountry = features.filter(f => {\r\n const ca = (f.properties as any)?.country_a\r\n return !ca || ca === cc\r\n })\r\n if (inCountry.length) features = inCountry\r\n }\r\n\r\n return features.slice(0, size)\r\n}\r\n\r\nexport const nominatimReverse = async (\r\n latitude: string,\r\n longitude: string,\r\n { coarse }: { coarse: boolean },\r\n): Promise<Feature[]> => {\r\n const { nominatimUrl } = getGeocodingConfig()\r\n\r\n const params = new URLSearchParams({\r\n format: 'jsonv2',\r\n lat: latitude,\r\n lon: longitude,\r\n addressdetails: '1',\r\n zoom: coarse ? '10' : '18',\r\n })\r\n\r\n const response = await fetch(`${nominatimUrl}/reverse?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n if (!data || data.error || data.lat == null) return []\r\n return [normalizeNominatimResult(data)]\r\n}\r\n"],"mappings":"AAIA,SAAS,0BAA0B;AACnC,SAAS,wBAAwB,gCAAgC;AAK1D,MAAM,qBAAqB,OAAO,MAAc,aAAiC,SAAqC;AAC3H,QAAM,EAAE,UAAU,IAAI,mBAAmB;AAGzC,QAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC;AAEnF,QAAM,WAAW,MAAM,MAAM,GAAG,SAAS,QAAQ,MAAM,EAAE;AACzD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,YAAuB,KAAK,YAAY,CAAC,GAAG,IAAI,sBAAsB;AAE1E,MAAI,aAAa;AACf,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,YAAY,SAAS,OAAO,OAAK;AAxB3C;AAyBM,YAAM,MAAM,OAAE,eAAF,mBAAsB;AAClC,aAAO,CAAC,MAAM,OAAO;AAAA,IACvB,CAAC;AACD,QAAI,UAAU,OAAQ,YAAW;AAAA,EACnC;AAEA,SAAO,SAAS,MAAM,GAAG,IAAI;AAC/B;AAEO,MAAM,mBAAmB,OAC9B,UACA,WACA,EAAE,OAAO,MACc;AACvB,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAE5C,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,MAAM,SAAS,OAAO;AAAA,EACxB,CAAC;AAED,QAAM,WAAW,MAAM,MAAM,GAAG,YAAY,YAAY,MAAM,EAAE;AAChE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAM,QAAO,CAAC;AACrD,SAAO,CAAC,yBAAyB,IAAI,CAAC;AACxC;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pelias.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/pelias.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pelias.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/pelias.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAevH,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,GAAG,SAAS,EAC/B,0BAA0B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC3E,OAAO,CAAC,OAAO,EAAE,CAkBnB,CAAA"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getGeocodingConfig } from "./config";
|
|
2
2
|
const peliasAutocomplete = async (text, countryCode, size) => {
|
|
3
3
|
var _a;
|
|
4
|
+
const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig();
|
|
4
5
|
const params = new URLSearchParams({
|
|
5
6
|
"text": text,
|
|
6
7
|
"size": String(size)
|
|
7
8
|
});
|
|
8
9
|
if (countryCode) params.set("boundary.country", countryCode.toUpperCase());
|
|
9
|
-
if (
|
|
10
|
-
const response = await fetch(`${
|
|
10
|
+
if (geocodeEarthApiKey) params.set("api_key", geocodeEarthApiKey);
|
|
11
|
+
const response = await fetch(`${peliasBase}/v1/autocomplete?${params}`);
|
|
11
12
|
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
12
13
|
const geojson = await response.json();
|
|
13
14
|
return ((_a = geojson.features) == null ? void 0 : _a.length) ? geojson.features : [];
|
|
14
15
|
};
|
|
15
16
|
const peliasReverse = async (latitude, longitude, countryCode, { size, coarse, layers }) => {
|
|
16
17
|
var _a;
|
|
18
|
+
const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig();
|
|
17
19
|
const params = new URLSearchParams({
|
|
18
20
|
"point.lat": latitude,
|
|
19
21
|
"point.lon": longitude,
|
|
@@ -22,8 +24,8 @@ const peliasReverse = async (latitude, longitude, countryCode, { size, coarse, l
|
|
|
22
24
|
if (countryCode) params.set("boundary.country", countryCode.toUpperCase());
|
|
23
25
|
if (coarse) params.set("layers", "coarse");
|
|
24
26
|
else if (layers) params.set("layers", layers);
|
|
25
|
-
if (
|
|
26
|
-
const response = await fetch(`${
|
|
27
|
+
if (geocodeEarthApiKey) params.set("api_key", geocodeEarthApiKey);
|
|
28
|
+
const response = await fetch(`${peliasBase}/v1/reverse?${params}`);
|
|
27
29
|
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
|
28
30
|
const data = await response.json();
|
|
29
31
|
return ((_a = data.features) == null ? void 0 : _a.length) ? data.features : [];
|