@collabdt/core 0.0.55 → 0.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/components/AppSidebarContent.d.ts +2 -1
- package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
- package/dist/core/components/AppSidebarContent.js +8 -5
- 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 +2 -3
- package/dist/core/components/authentication/AuthPage.js.map +1 -1
- package/dist/core/components/authentication/Signin.d.ts +6 -1
- package/dist/core/components/authentication/Signin.d.ts.map +1 -1
- package/dist/core/components/authentication/Signin.js +17 -6
- 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 -3
- 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 +71 -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 +7 -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 -3
- package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
- package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
- package/dist/core/components/ui/AppSidebar.js +11 -11
- package/dist/core/components/ui/AppSidebar.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 -2
- 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 +6 -3
- 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 +6 -2
- package/dist/core/components/viewers/Data/HeaderButtons.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/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/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 +2 -2
- 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 -4
- 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/datasets/src/minioDatasets.d.ts +1 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +3 -5
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.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 +3 -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 +2 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
- 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/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/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 -12
- 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 -50
- 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 +8 -7
- 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 +22 -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 -22
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.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 +63 -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 +15 -1
- package/dist/core/store/AppConfig/context.d.ts.map +1 -1
- package/dist/core/store/AppConfig/context.js +26 -5
- 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 +4 -3
- package/dist/core/store/CombineProviders.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
|
@@ -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":[]}
|
|
@@ -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 : [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/pelias.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/pelias.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\n\r\n// Geocode Earth and self-hosted Pelias share this dialect; only the base URL and\r\n// the (optional) api_key differ. Responses already match the shape the app expects.\r\n\r\nexport const peliasAutocomplete = async (text: string, countryCode: string | undefined, size: number): Promise<Feature[]> => {\r\n const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig()\r\n\r\n const params = new URLSearchParams({\r\n 'text': text,\r\n 'size': String(size),\r\n })\r\n if (countryCode) params.set('boundary.country', countryCode.toUpperCase())\r\n if (geocodeEarthApiKey) params.set('api_key', geocodeEarthApiKey)\r\n\r\n const response = await fetch(`${peliasBase}/v1/autocomplete?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const geojson = await response.json()\r\n return geojson.features?.length ? geojson.features : []\r\n}\r\n\r\nexport const peliasReverse = async (\r\n latitude: string,\r\n longitude: string,\r\n countryCode: string | undefined,\r\n { size, coarse, layers }: { size: number; coarse: boolean; layers?: string },\r\n): Promise<Feature[]> => {\r\n const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig()\r\n\r\n const params = new URLSearchParams({\r\n 'point.lat': latitude,\r\n 'point.lon': longitude,\r\n 'size': String(size),\r\n })\r\n if (countryCode) params.set('boundary.country', countryCode.toUpperCase())\r\n if (coarse) params.set('layers', 'coarse')\r\n else if (layers) params.set('layers', layers)\r\n if (geocodeEarthApiKey) params.set('api_key', geocodeEarthApiKey)\r\n\r\n const response = await fetch(`${peliasBase}/v1/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 return data.features?.length ? data.features : []\r\n}\r\n"],"mappings":"AAIA,SAAS,0BAA0B;AAK5B,MAAM,qBAAqB,OAAO,MAAc,aAAiC,SAAqC;AAT7H;AAUE,QAAM,EAAE,oBAAoB,WAAW,IAAI,mBAAmB;AAE9D,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,QAAQ;AAAA,IACR,QAAQ,OAAO,IAAI;AAAA,EACrB,CAAC;AACD,MAAI,YAAa,QAAO,IAAI,oBAAoB,YAAY,YAAY,CAAC;AACzE,MAAI,mBAAoB,QAAO,IAAI,WAAW,kBAAkB;AAEhE,QAAM,WAAW,MAAM,MAAM,GAAG,UAAU,oBAAoB,MAAM,EAAE;AACtE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,UAAU,MAAM,SAAS,KAAK;AACpC,WAAO,aAAQ,aAAR,mBAAkB,UAAS,QAAQ,WAAW,CAAC;AACxD;AAEO,MAAM,gBAAgB,OAC3B,UACA,WACA,aACA,EAAE,MAAM,QAAQ,OAAO,MACA;AA/BzB;AAgCE,QAAM,EAAE,oBAAoB,WAAW,IAAI,mBAAmB;AAE9D,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ,OAAO,IAAI;AAAA,EACrB,CAAC;AACD,MAAI,YAAa,QAAO,IAAI,oBAAoB,YAAY,YAAY,CAAC;AACzE,MAAI,OAAQ,QAAO,IAAI,UAAU,QAAQ;AAAA,WAChC,OAAQ,QAAO,IAAI,UAAU,MAAM;AAC5C,MAAI,mBAAoB,QAAO,IAAI,WAAW,kBAAkB;AAEhE,QAAM,WAAW,MAAM,MAAM,GAAG,UAAU,eAAe,MAAM,EAAE;AACjE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,UAAK,aAAL,mBAAe,UAAS,KAAK,WAAW,CAAC;AAClD;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PointCloudViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,wBAAgB,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,qBAuOnF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
var _a;
|
|
4
3
|
import * as React from "react";
|
|
5
4
|
import { useSearchParams } from "next/navigation";
|
|
6
5
|
import { loadAllAssets } from "./utils/potreeLoader";
|
|
@@ -10,9 +9,9 @@ import { PointCloudLoadingState } from "./src/PointCloudLoadingState";
|
|
|
10
9
|
import { useFilesByBuildingId } from "../../../hooks/files/files";
|
|
11
10
|
import { ViewportGizmo } from "./src/ViewportGizmo";
|
|
12
11
|
import { usePointCloudCoordinateSystem } from "../useCoordinateSystem";
|
|
13
|
-
|
|
14
|
-
function PointCloudViewer() {
|
|
12
|
+
function PointCloudViewer({ pointcloudApiUrl }) {
|
|
15
13
|
usePointCloudCoordinateSystem();
|
|
14
|
+
const API_BASE = pointcloudApiUrl != null ? pointcloudApiUrl : "http://localhost:5101";
|
|
16
15
|
const containerRef = React.useRef(null);
|
|
17
16
|
const viewerRef = React.useRef(null);
|
|
18
17
|
const gizmoRef = React.useRef(null);
|
|
@@ -27,8 +26,8 @@ function PointCloudViewer() {
|
|
|
27
26
|
const { files, isError: filesError } = useFilesByBuildingId(building == null ? void 0 : building.id);
|
|
28
27
|
const hasPointCloudFiles = React.useMemo(
|
|
29
28
|
() => !filesError && files.some((file) => {
|
|
30
|
-
var
|
|
31
|
-
const ext = (
|
|
29
|
+
var _a;
|
|
30
|
+
const ext = (_a = file.extension) == null ? void 0 : _a.toLowerCase();
|
|
32
31
|
if (!ext) return false;
|
|
33
32
|
return ext === "laz" || ext === "las";
|
|
34
33
|
}),
|
|
@@ -71,7 +70,7 @@ function PointCloudViewer() {
|
|
|
71
70
|
}
|
|
72
71
|
});
|
|
73
72
|
return () => {
|
|
74
|
-
var
|
|
73
|
+
var _a, _b, _c;
|
|
75
74
|
try {
|
|
76
75
|
if (gizmoRef.current) {
|
|
77
76
|
gizmoRef.current.dispose();
|
|
@@ -84,10 +83,10 @@ function PointCloudViewer() {
|
|
|
84
83
|
v.update = () => {
|
|
85
84
|
};
|
|
86
85
|
}
|
|
87
|
-
if ((
|
|
86
|
+
if ((_a = v == null ? void 0 : v.scene) == null ? void 0 : _a.pointclouds) {
|
|
88
87
|
v.scene.pointclouds.forEach((pc) => {
|
|
89
|
-
var
|
|
90
|
-
(_e = (_b2 = (
|
|
88
|
+
var _a2, _b2, _c2, _d, _e;
|
|
89
|
+
(_e = (_b2 = (_a2 = v.scene).removePointCloud) == null ? void 0 : _b2.call(_a2, pc)) != null ? _e : (_d = (_c2 = v.scene.scene) == null ? void 0 : _c2.remove) == null ? void 0 : _d.call(_c2, pc);
|
|
91
90
|
});
|
|
92
91
|
}
|
|
93
92
|
(_c = (_b = v == null ? void 0 : v.renderer) == null ? void 0 : _b.dispose) == null ? void 0 : _c.call(_b);
|
|
@@ -100,7 +99,7 @@ function PointCloudViewer() {
|
|
|
100
99
|
};
|
|
101
100
|
}, [PointCloudGlobalState.ready]);
|
|
102
101
|
React.useEffect(() => {
|
|
103
|
-
var
|
|
102
|
+
var _a, _b;
|
|
104
103
|
const viewer = viewerRef.current;
|
|
105
104
|
if (!PointCloudGlobalState.ready || !viewer) return;
|
|
106
105
|
const Potree = window.Potree;
|
|
@@ -112,7 +111,7 @@ function PointCloudViewer() {
|
|
|
112
111
|
const pc = loadedCloudsRef.current.get(id);
|
|
113
112
|
if (pc) {
|
|
114
113
|
try {
|
|
115
|
-
const pcs = (
|
|
114
|
+
const pcs = (_a = viewer.scene.pointclouds) != null ? _a : [];
|
|
116
115
|
const idx = pcs.indexOf(pc);
|
|
117
116
|
if (idx !== -1) pcs.splice(idx, 1);
|
|
118
117
|
(_b = viewer.scene.scene) == null ? void 0 : _b.remove(pc);
|
|
@@ -200,7 +199,7 @@ function PointCloudViewer() {
|
|
|
200
199
|
}
|
|
201
200
|
)
|
|
202
201
|
] }),
|
|
203
|
-
!hasPointCloudFiles && !hasLoadedClouds && /* @__PURE__ */ jsx("div", { className: "absolute inset-0", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(PointCloudLoadingState, {}) })
|
|
202
|
+
!hasPointCloudFiles && !hasLoadedClouds && /* @__PURE__ */ jsx("div", { className: "absolute inset-0", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(PointCloudLoadingState, { pointcloudApiUrl }) })
|
|
204
203
|
]
|
|
205
204
|
}
|
|
206
205
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.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 * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nexport function PointCloudViewer() {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n // Potree's render loop re-schedules itself via requestAnimationFrame with no stop API;\r\n // shadow it with a no-op so it halts on unmount instead of running forever against a\r\n // disposed renderer (otherwise a new loop accumulates on every visit).\r\n if (v) {\r\n v.loop = () => { };\r\n v.update = () => { };\r\n }\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ; (async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n // Bail if the viewer was torn down (or re-init'd) while this load was in flight —\r\n // the init-effect cleanup nulls viewerRef, so this guard avoids attaching to a dead viewer.\r\n if (viewerRef.current !== viewer) return;\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.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 * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\n// import { useAppConfigContext } from '../../../store/AppConfig/context'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nexport function PointCloudViewer({ pointcloudApiUrl }: { pointcloudApiUrl?: string }) {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n const API_BASE = pointcloudApiUrl ?? 'http://localhost:5101'\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n // Potree's render loop re-schedules itself via requestAnimationFrame with no stop API;\r\n // shadow it with a no-op so it halts on unmount instead of running forever against a\r\n // disposed renderer (otherwise a new loop accumulates on every visit).\r\n if (v) {\r\n v.loop = () => { };\r\n v.update = () => { };\r\n }\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ; (async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n // Bail if the viewer was torn down (or re-init'd) while this load was in flight —\r\n // the init-effect cleanup nulls viewerRef, so this guard avoids attaching to a dead viewer.\r\n if (viewerRef.current !== viewer) return;\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState pointcloudApiUrl={pointcloudApiUrl} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export type pointCloudViewerState = 'opening' | 'loading' | 'ready' | 'error' | 'noPointCloudFiles' | 'noBuilding';
|
|
3
|
-
export declare function PointCloudLoadingState(
|
|
3
|
+
export declare function PointCloudLoadingState({ pointcloudApiUrl }: {
|
|
4
|
+
pointcloudApiUrl?: string;
|
|
5
|
+
}): React.JSX.Element;
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAsBzB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,GAAG,YAAY,CAAA;AAElH,wBAAgB,sBAAsB,CAAC,EAAE,gBAAgB,EAAE,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,qBAqVzF"}
|