@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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/DataMenu.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 { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { handleApiError } from '../../../utils/errorHandler'\r\n\r\n// Utils\r\nimport { useViewerData } from './utils/useViewerData'\r\nimport { VIEWER_CONFIG } from './utils/viewerConfig'\r\n\r\nimport type { Building, Site, User, Infrastructure } from '../../../types/dbTypes'\r\nimport type { FilterState } from '../../../types/global'\r\n\r\n// Custom hooks\r\nimport { useBuildings, useCreateBuilding } from '../../../hooks/buildings/buildings'\r\nimport { useCreateSite, useSites } from '../../../hooks/sites/sites'\r\nimport { useFiles } from '../../../hooks/files/files'\r\nimport { useUsers } from '../../../hooks/users/users'\r\n\r\n// Context\r\nimport { useMenusContext } from '../../../store'\r\nimport { useBuildingsContext } from '../../../store'\r\nimport { useFilesContext } from '../../../store'\r\n\r\n// Types\r\nimport type { FileRow } from '../../../types/files'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../ui/Breadcrumb'\r\nimport { Button, Checkbox, DataTable, Input, Separator } from '../../ui/'\r\n\r\nimport type { BuildingDetailsRef } from './buildingDetails/BuildingDetails'\r\nimport type { SiteDetailsRef } from './siteDetails/SiteDetails'\r\nimport type { InfrastructureDetailsRef } from './infrastructureDetails/InfrastructureDetails'\r\n\r\nimport BuildingDetails from './buildingDetails/BuildingDetails'\r\nimport { FileDetails } from './files/FileDetails'\r\n\r\n// Custom Components\r\nimport DetailActions from './details/DetailActions'\r\nimport DetailHeader from './details/DetailHeader'\r\nimport FilterButtons from './FilterButtons'\r\nimport HeaderButtons from './HeaderButtons'\r\nimport MoreOptions from './MoreOptions'\r\nimport SiteDetails from './siteDetails/SiteDetails'\r\nimport UserDetails from './userDetails/UserDetails'\r\n\r\n// Data\r\nimport { useColumns, useUserColumns } from './utils/Columns'\r\nimport { useBuildingHeaders, useInfrastructureHeaders, useSiteHeaders } from './utils/Headers'\r\nimport { DataTypes, DataTypesNames, ViewerNames } from '../../../types'\r\nimport { useSession } from 'next-auth/react'\r\nimport InfrastructureDetails from './infrastructureDetails/InfrastructureDetails'\r\nimport { useCreateInfrastructure, useInfrastructures } from '../../../hooks/infrastructures/infrastructures'\r\n\r\ntype DataMenuProps = {\r\n currentViewer: ViewerNames\r\n height?: string\r\n hideFrame?: boolean\r\n hideTitle?: boolean\r\n hideActions?: boolean\r\n}\r\n\r\nexport function DataMenu({ currentViewer, height, hideTitle, hideActions, hideFrame }: DataMenuProps) {\r\n // Translations\r\n const t = useTranslations('DataMenu')\r\n\r\n // View state\r\n const { view, setView } = useMenusContext()\r\n const { selectedItem, setSelectedItem } = useMenusContext()\r\n const { selectedSite, setSelectedSite } = useMenusContext()\r\n const { selectedInfrastructure, setSelectedInfrastructure } = useMenusContext()\r\n const { selectedFile, setSelectedFile } = useMenusContext()\r\n const { selectedUser, setSelectedUser } = useMenusContext()\r\n const { state: fileState } = useFilesContext()\r\n const { currentFile } = fileState.files\r\n\r\n // Search / filter state\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [activeFilters, setActiveFilters] = React.useState<FilterState[]>([])\r\n const [filters, setFilters] = React.useState([\r\n { id: 1, field: '', fieldType: null, operator: null, value: null, secondValue: null },\r\n ])\r\n\r\n const [dataType, setDataType] = React.useState<DataTypes>(DataTypesNames.building)\r\n const [editing, setEditing] = React.useState(false)\r\n const [activeChanges, setActiveChanges] = React.useState(false)\r\n\r\n // Tab headers\r\n const buildingHeaders = useBuildingHeaders()\r\n const siteHeaders = useSiteHeaders()\r\n const infrastructureHeaders = useInfrastructureHeaders()\r\n\r\n const buildingTabOptions = buildingHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n const siteTabOptions = siteHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n const infrastructureTabOptions = infrastructureHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n\r\n const [activeBuildingTab, setActiveBuildingTab] = React.useState(buildingTabOptions[0]?.key || '')\r\n const [activeSiteTab, setActiveSiteTab] = React.useState(siteTabOptions[0]?.key || '')\r\n const [activeInfrastructureTab, setActiveInfrastructureTab] = React.useState(infrastructureTabOptions[0]?.key || '')\r\n\r\n // Reset active tab only when selected item ID changes\r\n const prevBuildingId = React.useRef<number | undefined>(undefined)\r\n const prevInfrastructureId = React.useRef<number | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n if (currentViewer === ViewerNames.buildings && selectedItem?.id !== prevBuildingId.current) {\r\n setActiveBuildingTab(buildingTabOptions[0]?.key || '')\r\n prevBuildingId.current = selectedItem?.id\r\n }\r\n if (currentViewer === ViewerNames.infrastructure && selectedInfrastructure?.id !== prevInfrastructureId.current) {\r\n setActiveInfrastructureTab(infrastructureTabOptions[0]?.key || '')\r\n prevInfrastructureId.current = selectedInfrastructure?.id\r\n }\r\n }, [selectedItem?.id, selectedInfrastructure?.id, currentViewer])\r\n\r\n const [newItemName, setNewItemName] = React.useState('')\r\n\r\n // Compare state\r\n const {\r\n compareItems,\r\n setCompareItems,\r\n comparing,\r\n setComparing,\r\n addItemToCompare,\r\n removeItemFromCompare,\r\n } = useBuildingsContext()\r\n\r\n // Sync dataType with current viewer\r\n React.useEffect(() => {\r\n setDataType(DataTypesNames[currentViewer])\r\n }, [currentViewer])\r\n\r\n // Reset compare state when viewer changes\r\n React.useEffect(() => {\r\n setComparing(false)\r\n setCompareItems([])\r\n }, [currentViewer, setComparing, setCompareItems])\r\n\r\n // Data fetching\r\n const { buildings, isLoading: buildingsLoading, isError: buildingsError } = useBuildings()\r\n const { sites, isLoading: sitesLoading, isError: sitesError } = useSites()\r\n const { infrastructures, isLoading: infrastructuresLoading, isError: infrastructuresError } = useInfrastructures()\r\n const { files, isLoading: filesLoading, isError: filesError } = useFiles()\r\n const { users, isLoading: usersLoading, isError: usersError } = useUsers()\r\n\r\n const { createError: createSiteError } = useCreateSite()\r\n const { createError: createBuildingError } = useCreateBuilding()\r\n const { createError: createInfrastructureError } = useCreateInfrastructure()\r\n\r\n React.useEffect(() => {\r\n handleApiError(buildingsError)\r\n handleApiError(sitesError)\r\n handleApiError(filesError)\r\n handleApiError(infrastructuresError)\r\n handleApiError(usersError)\r\n handleApiError(createSiteError)\r\n handleApiError(createBuildingError)\r\n handleApiError(createInfrastructureError)\r\n }, [buildingsError, sitesError, infrastructuresError, filesError, usersError, createSiteError, createBuildingError, createInfrastructureError])\r\n\r\n const tableColumns = useColumns(buildings || [])\r\n const userColumns = useUserColumns()\r\n\r\n const { user } = useSession().data\r\n\r\n // Viewer config — resolves icon and i18n title key\r\n const viewerConfig = VIEWER_CONFIG[currentViewer]\r\n const headerTitle = t(viewerConfig.titleKey)\r\n const MenuIcon = viewerConfig.icon\r\n\r\n // Derived data, filtered data, and filter options — all per-viewer logic lives in this hook\r\n const { data, filteredData, filtersOptions, isLoading } = useViewerData({\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n files,\r\n users,\r\n loadingFlags: {\r\n buildings: buildingsLoading,\r\n sites: sitesLoading,\r\n infrastructures: infrastructuresLoading,\r\n files: filesLoading,\r\n users: usersLoading,\r\n },\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n userEmail: user?.email || '',\r\n })\r\n\r\n const openedCurrentFileIdRef = React.useRef<number | null>(null)\r\n\r\n React.useEffect(() => {\r\n if (currentViewer !== ViewerNames.files || !currentFile) return\r\n if (openedCurrentFileIdRef.current === currentFile.id) return\r\n\r\n const fileRow = data.find((item): item is FileRow => String(item.id) === String(currentFile.id))\r\n if (!fileRow) return\r\n\r\n openedCurrentFileIdRef.current = currentFile.id\r\n setSelectedFile(fileRow)\r\n setView('detail')\r\n }, [currentViewer, currentFile, data, setSelectedFile, setView])\r\n\r\n // Breadcrumb title — derives the detail page label from whichever item is selected\r\n const breadcrumbTitle = React.useMemo(() => {\r\n if (selectedItem) return selectedItem.buildingName || selectedItem.buildingAddress\r\n if (selectedSite) return selectedSite.siteName || selectedSite.siteAddress\r\n if (selectedInfrastructure) return selectedInfrastructure.infrastructureName || selectedInfrastructure.infrastructureType\r\n if (selectedFile) return selectedFile.name\r\n if (selectedUser) return selectedUser.name\r\n if (currentViewer === ViewerNames.extensions) return 'Extension Details'\r\n return undefined\r\n }, [selectedItem, selectedSite, selectedInfrastructure, selectedFile, selectedUser, currentViewer])\r\n\r\n // Row click handlers — consolidated into one function\r\n\r\n const handleRowClick = (item: Building | Site | Infrastructure | FileRow | User) => {\r\n // Files and users don't participate in compare mode\r\n if (comparing && 'id' in item) {\r\n const id = String(item.id)\r\n const isChecked = compareItems.some(i => i.id === id)\r\n if (isChecked) {\r\n removeItemFromCompare(id)\r\n } else {\r\n addItemToCompare({ ...item, id })\r\n }\r\n return\r\n }\r\n\r\n // Navigate to detail view, setting the correct selected item per viewer\r\n switch (currentViewer) {\r\n case ViewerNames.buildings:\r\n setSelectedItem(item as Building)\r\n break\r\n case ViewerNames.sites:\r\n setSelectedSite(item as Site)\r\n break\r\n case ViewerNames.infrastructure:\r\n setSelectedInfrastructure(item as Infrastructure)\r\n break\r\n case ViewerNames.files:\r\n setSelectedFile(item as FileRow)\r\n break\r\n case ViewerNames.users:\r\n setSelectedUser(item as User)\r\n break\r\n }\r\n setView('detail')\r\n }\r\n\r\nconst handleBackToTable = () => {\r\n setView('table')\r\n setSelectedItem(null)\r\n setSelectedSite(null)\r\n setSelectedInfrastructure(null)\r\n setSelectedFile(null)\r\n setSelectedUser(null)\r\n setEditing(false)\r\n setActiveChanges(false)\r\n }\r\n\r\n // Refs for imperative save on child detail components\r\n\r\n const buildingDetailsRef = React.useRef<BuildingDetailsRef>(null)\r\n const siteDetailsRef = React.useRef<SiteDetailsRef>(null)\r\n const infrastructureDetailsRef = React.useRef<InfrastructureDetailsRef>(null)\r\n const fileDetailsRef = React.useRef(null)\r\n const userDetailsRef = React.useRef(null)\r\n\r\n // Save / create handlers — consolidated into one function\r\n\r\n const handleSaveChanges = async () => {\r\n switch (currentViewer) {\r\n case ViewerNames.buildings:\r\n await buildingDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.sites:\r\n await siteDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.infrastructure:\r\n await infrastructureDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.files:\r\n await fileDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.users:\r\n await userDetailsRef.current?.saveChanges()\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * Handles creation of a new entity (id < 0).\r\n * Calls saveChanges on the appropriate ref, then shows a toast.\r\n * Pass successKey as undefined for viewers that show their own success toast (e.g. buildings).\r\n */\r\n const handleCreate = async (\r\n ref: React.RefObject<{ saveChanges: () => Promise<void> }>,\r\n toastKeys: { successKey?: string; errorKey: string },\r\n ) => {\r\n try {\r\n await ref.current?.saveChanges()\r\n setActiveChanges(false)\r\n if (toastKeys.successKey) toast.success(t(toastKeys.successKey))\r\n } catch (error) {\r\n if (error?.status !== 401) toast.error(t(toastKeys.errorKey))\r\n }\r\n }\r\n\r\n // Dispatches to the right ref + toast keys based on which new item is selected\r\n const handleCreateNewItem = async () => {\r\n if (selectedSite && selectedSite.id < 0) {\r\n await handleCreate(siteDetailsRef, {\r\n successKey: 'toastSuccessCreateSite',\r\n errorKey: 'toastFailCreateSite',\r\n })\r\n } else if (selectedItem && selectedItem.id < 0) {\r\n await handleCreate(buildingDetailsRef, {\r\n // Building details shows its own success toast\r\n errorKey: 'toastFailCreateBuilding',\r\n })\r\n } else if (selectedInfrastructure && selectedInfrastructure.id < 0) {\r\n await handleCreate(infrastructureDetailsRef, {\r\n successKey: 'toastSuccessCreateInfrastructure',\r\n errorKey: 'toastFailCreateInfrastructure',\r\n })\r\n } else {\r\n // Users and existing items — standard save\r\n await handleSaveChanges()\r\n }\r\n }\r\n\r\n // Derived UI helpers\r\n\r\n const isNewItem = !!(\r\n (selectedSite && selectedSite.id < 0)\r\n || (selectedItem && selectedItem.id < 0)\r\n || (selectedInfrastructure && selectedInfrastructure.id < 0)\r\n )\r\n\r\n // Render\r\n\r\n return (\r\n <div className={`${hideFrame ? '' : 'sm:p-2'} overflow-hidden ${hideFrame ? '' : 'bg-[#fafafa]'} ${height ? height : 'h-full'}`}>\r\n <div className={`${hideFrame ? '' : 'bg-background rounded-xl shadow'} h-full min-h-0`}>\r\n <div className=\"flex flex-col h-full min-h-0\">\r\n\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"\">\r\n <div className=\"flex flex-row gap-2 justify-start items-center px-3 py-4 relative\">\r\n <Breadcrumb className=\"px-3\">\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n {view === 'table'\r\n ? <BreadcrumbPage>{headerTitle}</BreadcrumbPage>\r\n : (\r\n <BreadcrumbLink onClick={handleBackToTable} className=\"cursor-pointer\">\r\n {headerTitle}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n\r\n {view === 'detail' && (\r\n <>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{breadcrumbTitle}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </>\r\n )}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n\r\n {/* Header content based on view */}\r\n {view === 'table' ? (\r\n <>\r\n {/* Title Row */}\r\n {!hideTitle && (\r\n <div className=\"flex flex-row justify-between items-center px-6 py-6\">\r\n <div className=\"flex flex-col gap-1.5\">\r\n <div className=\"flex items-center gap-2\">\r\n <MenuIcon className=\"h-8 w-8\" />\r\n <h1 className=\"text-2xl text-foreground\">{headerTitle}</h1>\r\n </div>\r\n {comparing && (\r\n <h2 className=\"text-sm text-muted-foreground font-normal\">\r\n Choose up to 3 {headerTitle.toLowerCase()} to compare.\r\n </h2>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search & Filter & Actions Row */}\r\n <div className={`flex ${hideTitle ? 'justify-between' : 'justify-end'} items-center px-6 py-4 gap-4`}>\r\n <div className={hideTitle ? 'w-64' : 'w-96'}>\r\n <Input\r\n placeholder={`${t('searchPlaceholder')} ${headerTitle}...`}\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n />\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <FilterButtons\r\n currentViewer={currentViewer}\r\n filters={filters}\r\n activeFilters={activeFilters}\r\n filterFields={filtersOptions}\r\n data={data}\r\n setFilters={setFilters}\r\n setActiveFilters={setActiveFilters}\r\n />\r\n <HeaderButtons\r\n headerTitle={headerTitle}\r\n currentViewer={currentViewer}\r\n compareItems={compareItems}\r\n setCompareItems={setCompareItems}\r\n comparing={comparing}\r\n setComparing={setComparing}\r\n newItemName={newItemName}\r\n setNewItemName={setNewItemName}\r\n filteredData={\r\n currentViewer === ViewerNames.buildings\r\n || currentViewer === ViewerNames.sites\r\n || currentViewer === ViewerNames.infrastructure\r\n ? filteredData\r\n : undefined\r\n }\r\n users={currentViewer === ViewerNames.users ? users : undefined}\r\n />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n </>\r\n ) : (\r\n // Detail View Header\r\n <div className=\"flex justify-between items-center px-6 py-6\">\r\n <DetailHeader\r\n selectedItem={selectedItem}\r\n selectedSite={selectedSite}\r\n selectedInfrastructure={selectedInfrastructure}\r\n selectedFile={selectedFile}\r\n selectedUser={selectedUser}\r\n />\r\n\r\n <DetailActions\r\n editing={editing}\r\n activeChanges={activeChanges}\r\n currentViewer={currentViewer}\r\n selectedItem={selectedItem}\r\n selectedSite={selectedSite}\r\n selectedInfrastructure={selectedInfrastructure}\r\n selectedFile={selectedFile}\r\n selectedUser={selectedUser}\r\n activeBuildingTab={activeBuildingTab}\r\n activeSiteTab={activeSiteTab}\r\n onSave={async () => {\r\n await handleCreateNewItem()\r\n setEditing(false)\r\n }}\r\n onEdit={() => {\r\n setEditing(true)\r\n if (isNewItem) setActiveChanges(true)\r\n }}\r\n onCancel={() => {\r\n setEditing(false)\r\n if (isNewItem) handleBackToTable()\r\n }}\r\n onDeleteUser={() => {\r\n setSelectedUser(null)\r\n setView('table')\r\n }}\r\n setView={setView}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Detail view separator */}\r\n {view === 'detail' && <Separator />}\r\n </div>\r\n\r\n {/* Scrollable Content Area */}\r\n <div className=\"flex-1 overflow-hidden\">\r\n {view === 'table' ? (\r\n <div className=\"h-full flex flex-col md:p-6 overflow-auto\">\r\n <DataTable\r\n columns={currentViewer === ViewerNames.users ? userColumns : tableColumns}\r\n data={filteredData}\r\n onRowClick={handleRowClick}\r\n currentViewer={currentViewer}\r\n isLoading={isLoading}\r\n leadingCell={comparing\r\n ? ({ dataset }) => {\r\n const item = dataset\r\n const isChecked = compareItems.some(i => i?.id === String(item?.id))\r\n const maxReached = compareItems.length >= 3 && !isChecked\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n if (isChecked) {\r\n removeItemFromCompare?.(String(item.id))\r\n } else {\r\n addItemToCompare?.({ ...item, id: String(item.id) })\r\n }\r\n }}\r\n >\r\n <Checkbox\r\n checked={isChecked}\r\n disabled={maxReached}\r\n className={`opacity-70 hover:opacity-100 data-[state=checked]:opacity-100 ${maxReached && '!cursor-default'}`}\r\n />\r\n </Button>\r\n )\r\n }\r\n : undefined}\r\n trailingCell={({ row }) => (\r\n <div onClick={e => e.stopPropagation()}>\r\n <MoreOptions\r\n row={row.original}\r\n dataType={dataType}\r\n hideViewOnMap={currentViewer === ViewerNames.users}\r\n setView={setView}\r\n onDeleteUser={() => setSelectedUser(null)}\r\n />\r\n </div>\r\n )}\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"h-full overflow-auto\">\r\n {selectedFile\r\n ? (\r\n <FileDetails\r\n selectedFile={selectedFile}\r\n buildings={buildings || []}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n ref={fileDetailsRef}\r\n />\r\n )\r\n : currentViewer === ViewerNames.buildings\r\n ? (\r\n <BuildingDetails\r\n selectedItem={selectedItem}\r\n setSelectedItem={setSelectedItem}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n buildings={buildings || []}\r\n ref={buildingDetailsRef}\r\n activeTab={activeBuildingTab}\r\n setActiveTab={setActiveBuildingTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.sites\r\n ? (\r\n <SiteDetails\r\n selectedSite={selectedSite}\r\n setSelectedSite={setSelectedSite}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n sites={sites || []}\r\n ref={siteDetailsRef}\r\n activeTab={activeSiteTab}\r\n setActiveTab={setActiveSiteTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.infrastructure\r\n ? (\r\n <InfrastructureDetails\r\n selectedInfrastructure={selectedInfrastructure}\r\n setSelectedInfrastructure={setSelectedInfrastructure}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n infrastructures={infrastructures || []}\r\n ref={infrastructureDetailsRef}\r\n activeTab={activeInfrastructureTab}\r\n setActiveTab={setActiveInfrastructureTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.users\r\n ? (\r\n <UserDetails\r\n selectedUser={selectedUser}\r\n setSelectedUser={setSelectedUser}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n users={users || []}\r\n ref={userDetailsRef}\r\n hideTitle={hideTitle}\r\n />\r\n )\r\n : null}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["_a","_b","_c"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/DataMenu.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 { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { handleApiError } from '../../../utils/errorHandler'\r\n\r\n// Utils\r\nimport { useViewerData } from './utils/useViewerData'\r\nimport { VIEWER_CONFIG } from './utils/viewerConfig'\r\n\r\nimport type { Building, Site, User, Infrastructure, Organization } from '../../../types/dbTypes'\r\nimport type { FilterState } from '../../../types/global'\r\n\r\n// Custom hooks\r\nimport { useBuildings, useCreateBuilding } from '../../../hooks/buildings/buildings'\r\nimport { useCreateSite, useSites } from '../../../hooks/sites/sites'\r\nimport { useFiles } from '../../../hooks/files/files'\r\nimport { useUsers } from '../../../hooks/users/users'\r\n\r\n// Context\r\nimport { useMenusContext } from '../../../store'\r\nimport { useBuildingsContext } from '../../../store'\r\nimport { useFilesContext } from '../../../store'\r\n\r\n// Types\r\nimport type { FileRow } from '../../../types/files'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../ui/Breadcrumb'\r\nimport { Button, Checkbox, DataTable, Input, Separator } from '../../ui/'\r\n\r\nimport type { BuildingDetailsRef } from './buildingDetails/BuildingDetails'\r\nimport type { SiteDetailsRef } from './siteDetails/SiteDetails'\r\nimport type { InfrastructureDetailsRef } from './infrastructureDetails/InfrastructureDetails'\r\n\r\nimport BuildingDetails from './buildingDetails/BuildingDetails'\r\nimport { FileDetails } from './files/FileDetails'\r\n\r\n// Custom Components\r\nimport DetailActions from './details/DetailActions'\r\nimport DetailHeader from './details/DetailHeader'\r\nimport FilterButtons from './FilterButtons'\r\nimport HeaderButtons from './HeaderButtons'\r\nimport MoreOptions from './MoreOptions'\r\nimport SiteDetails from './siteDetails/SiteDetails'\r\nimport UserDetails from './userDetails/UserDetails'\r\n\r\n// Data\r\nimport { useColumns, useUserColumns } from './utils/Columns'\r\nimport { useBuildingHeaders, useInfrastructureHeaders, useSiteHeaders } from './utils/Headers'\r\nimport { DataTypes, DataTypesNames, ViewerNames } from '../../../types'\r\nimport { useSession } from 'next-auth/react'\r\nimport InfrastructureDetails from './infrastructureDetails/InfrastructureDetails'\r\nimport { useCreateInfrastructure, useInfrastructures } from '../../../hooks/infrastructures/infrastructures'\r\n\r\ntype DataMenuProps = {\r\n currentViewer: ViewerNames\r\n height?: string\r\n hideFrame?: boolean\r\n hideTitle?: boolean\r\n hideActions?: boolean\r\n organization?: Organization\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport function DataMenu({ currentViewer, height, hideTitle, hideActions, hideFrame, organization, geocodeEarthApiKey, geocoderUrl }: DataMenuProps) {\r\n // Translations\r\n const t = useTranslations('DataMenu')\r\n\r\n // View state\r\n const { view, setView } = useMenusContext()\r\n const { selectedItem, setSelectedItem } = useMenusContext()\r\n const { selectedSite, setSelectedSite } = useMenusContext()\r\n const { selectedInfrastructure, setSelectedInfrastructure } = useMenusContext()\r\n const { selectedFile, setSelectedFile } = useMenusContext()\r\n const { selectedUser, setSelectedUser } = useMenusContext()\r\n const { state: fileState } = useFilesContext()\r\n const { currentFile } = fileState.files\r\n\r\n // Search / filter state\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [activeFilters, setActiveFilters] = React.useState<FilterState[]>([])\r\n const [filters, setFilters] = React.useState([\r\n { id: 1, field: '', fieldType: null, operator: null, value: null, secondValue: null },\r\n ])\r\n\r\n const [dataType, setDataType] = React.useState<DataTypes>(DataTypesNames.building)\r\n const [editing, setEditing] = React.useState(false)\r\n const [activeChanges, setActiveChanges] = React.useState(false)\r\n\r\n // Tab headers\r\n const buildingHeaders = useBuildingHeaders()\r\n const siteHeaders = useSiteHeaders()\r\n const infrastructureHeaders = useInfrastructureHeaders()\r\n\r\n const buildingTabOptions = buildingHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n const siteTabOptions = siteHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n const infrastructureTabOptions = infrastructureHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n\r\n const [activeBuildingTab, setActiveBuildingTab] = React.useState(buildingTabOptions[0]?.key || '')\r\n const [activeSiteTab, setActiveSiteTab] = React.useState(siteTabOptions[0]?.key || '')\r\n const [activeInfrastructureTab, setActiveInfrastructureTab] = React.useState(infrastructureTabOptions[0]?.key || '')\r\n\r\n // Reset active tab only when selected item ID changes\r\n const prevBuildingId = React.useRef<number | undefined>(undefined)\r\n const prevInfrastructureId = React.useRef<number | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n if (currentViewer === ViewerNames.buildings && selectedItem?.id !== prevBuildingId.current) {\r\n setActiveBuildingTab(buildingTabOptions[0]?.key || '')\r\n prevBuildingId.current = selectedItem?.id\r\n }\r\n if (currentViewer === ViewerNames.infrastructure && selectedInfrastructure?.id !== prevInfrastructureId.current) {\r\n setActiveInfrastructureTab(infrastructureTabOptions[0]?.key || '')\r\n prevInfrastructureId.current = selectedInfrastructure?.id\r\n }\r\n }, [selectedItem?.id, selectedInfrastructure?.id, currentViewer])\r\n\r\n const [newItemName, setNewItemName] = React.useState('')\r\n\r\n // Compare state\r\n const {\r\n compareItems,\r\n setCompareItems,\r\n comparing,\r\n setComparing,\r\n addItemToCompare,\r\n removeItemFromCompare,\r\n } = useBuildingsContext()\r\n\r\n // Sync dataType with current viewer\r\n React.useEffect(() => {\r\n setDataType(DataTypesNames[currentViewer])\r\n }, [currentViewer])\r\n\r\n // Reset compare state when viewer changes\r\n React.useEffect(() => {\r\n setComparing(false)\r\n setCompareItems([])\r\n }, [currentViewer, setComparing, setCompareItems])\r\n\r\n // Data fetching\r\n const { buildings, isLoading: buildingsLoading, isError: buildingsError } = useBuildings()\r\n const { sites, isLoading: sitesLoading, isError: sitesError } = useSites()\r\n const { infrastructures, isLoading: infrastructuresLoading, isError: infrastructuresError } = useInfrastructures()\r\n const { files, isLoading: filesLoading, isError: filesError } = useFiles()\r\n const { users, isLoading: usersLoading, isError: usersError } = useUsers()\r\n\r\n const { createError: createSiteError } = useCreateSite()\r\n const { createError: createBuildingError } = useCreateBuilding()\r\n const { createError: createInfrastructureError } = useCreateInfrastructure()\r\n\r\n React.useEffect(() => {\r\n handleApiError(buildingsError)\r\n handleApiError(sitesError)\r\n handleApiError(filesError)\r\n handleApiError(infrastructuresError)\r\n handleApiError(usersError)\r\n handleApiError(createSiteError)\r\n handleApiError(createBuildingError)\r\n handleApiError(createInfrastructureError)\r\n }, [buildingsError, sitesError, infrastructuresError, filesError, usersError, createSiteError, createBuildingError, createInfrastructureError])\r\n\r\n const tableColumns = useColumns(buildings || [])\r\n const userColumns = useUserColumns()\r\n\r\n const { user } = useSession().data\r\n\r\n // Viewer config — resolves icon and i18n title key\r\n const viewerConfig = VIEWER_CONFIG[currentViewer]\r\n const headerTitle = t(viewerConfig.titleKey)\r\n const MenuIcon = viewerConfig.icon\r\n\r\n // Derived data, filtered data, and filter options — all per-viewer logic lives in this hook\r\n const { data, filteredData, filtersOptions, isLoading } = useViewerData({\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n files,\r\n users,\r\n loadingFlags: {\r\n buildings: buildingsLoading,\r\n sites: sitesLoading,\r\n infrastructures: infrastructuresLoading,\r\n files: filesLoading,\r\n users: usersLoading,\r\n },\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n userEmail: user?.email || '',\r\n })\r\n\r\n const openedCurrentFileIdRef = React.useRef<number | null>(null)\r\n\r\n React.useEffect(() => {\r\n if (currentViewer !== ViewerNames.files || !currentFile) return\r\n if (openedCurrentFileIdRef.current === currentFile.id) return\r\n\r\n const fileRow = data.find((item): item is FileRow => String(item.id) === String(currentFile.id))\r\n if (!fileRow) return\r\n\r\n openedCurrentFileIdRef.current = currentFile.id\r\n setSelectedFile(fileRow)\r\n setView('detail')\r\n }, [currentViewer, currentFile, data, setSelectedFile, setView])\r\n\r\n // Breadcrumb title — derives the detail page label from whichever item is selected\r\n const breadcrumbTitle = React.useMemo(() => {\r\n if (selectedItem) return selectedItem.buildingName || selectedItem.buildingAddress\r\n if (selectedSite) return selectedSite.siteName || selectedSite.siteAddress\r\n if (selectedInfrastructure) return selectedInfrastructure.infrastructureName || selectedInfrastructure.infrastructureType\r\n if (selectedFile) return selectedFile.name\r\n if (selectedUser) return selectedUser.name\r\n if (currentViewer === ViewerNames.extensions) return 'Extension Details'\r\n return undefined\r\n }, [selectedItem, selectedSite, selectedInfrastructure, selectedFile, selectedUser, currentViewer])\r\n\r\n // Row click handlers — consolidated into one function\r\n\r\n const handleRowClick = (item: Building | Site | Infrastructure | FileRow | User) => {\r\n // Files and users don't participate in compare mode\r\n if (comparing && 'id' in item) {\r\n const id = String(item.id)\r\n const isChecked = compareItems.some(i => i.id === id)\r\n if (isChecked) {\r\n removeItemFromCompare(id)\r\n } else {\r\n addItemToCompare({ ...item, id })\r\n }\r\n return\r\n }\r\n\r\n // Navigate to detail view, setting the correct selected item per viewer\r\n switch (currentViewer) {\r\n case ViewerNames.buildings:\r\n setSelectedItem(item as Building)\r\n break\r\n case ViewerNames.sites:\r\n setSelectedSite(item as Site)\r\n break\r\n case ViewerNames.infrastructure:\r\n setSelectedInfrastructure(item as Infrastructure)\r\n break\r\n case ViewerNames.files:\r\n setSelectedFile(item as FileRow)\r\n break\r\n case ViewerNames.users:\r\n setSelectedUser(item as User)\r\n break\r\n }\r\n setView('detail')\r\n }\r\n\r\nconst handleBackToTable = () => {\r\n setView('table')\r\n setSelectedItem(null)\r\n setSelectedSite(null)\r\n setSelectedInfrastructure(null)\r\n setSelectedFile(null)\r\n setSelectedUser(null)\r\n setEditing(false)\r\n setActiveChanges(false)\r\n }\r\n\r\n // Refs for imperative save on child detail components\r\n\r\n const buildingDetailsRef = React.useRef<BuildingDetailsRef>(null)\r\n const siteDetailsRef = React.useRef<SiteDetailsRef>(null)\r\n const infrastructureDetailsRef = React.useRef<InfrastructureDetailsRef>(null)\r\n const fileDetailsRef = React.useRef(null)\r\n const userDetailsRef = React.useRef(null)\r\n\r\n // Save / create handlers — consolidated into one function\r\n\r\n const handleSaveChanges = async () => {\r\n switch (currentViewer) {\r\n case ViewerNames.buildings:\r\n await buildingDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.sites:\r\n await siteDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.infrastructure:\r\n await infrastructureDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.files:\r\n await fileDetailsRef.current?.saveChanges()\r\n break\r\n case ViewerNames.users:\r\n await userDetailsRef.current?.saveChanges()\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * Handles creation of a new entity (id < 0).\r\n * Calls saveChanges on the appropriate ref, then shows a toast.\r\n * Pass successKey as undefined for viewers that show their own success toast (e.g. buildings).\r\n */\r\n const handleCreate = async (\r\n ref: React.RefObject<{ saveChanges: () => Promise<void> }>,\r\n toastKeys: { successKey?: string; errorKey: string },\r\n ) => {\r\n try {\r\n await ref.current?.saveChanges()\r\n setActiveChanges(false)\r\n if (toastKeys.successKey) toast.success(t(toastKeys.successKey))\r\n } catch (error) {\r\n if (error?.status !== 401) toast.error(t(toastKeys.errorKey))\r\n }\r\n }\r\n\r\n // Dispatches to the right ref + toast keys based on which new item is selected\r\n const handleCreateNewItem = async () => {\r\n if (selectedSite && selectedSite.id < 0) {\r\n await handleCreate(siteDetailsRef, {\r\n successKey: 'toastSuccessCreateSite',\r\n errorKey: 'toastFailCreateSite',\r\n })\r\n } else if (selectedItem && selectedItem.id < 0) {\r\n await handleCreate(buildingDetailsRef, {\r\n // Building details shows its own success toast\r\n errorKey: 'toastFailCreateBuilding',\r\n })\r\n } else if (selectedInfrastructure && selectedInfrastructure.id < 0) {\r\n await handleCreate(infrastructureDetailsRef, {\r\n successKey: 'toastSuccessCreateInfrastructure',\r\n errorKey: 'toastFailCreateInfrastructure',\r\n })\r\n } else {\r\n // Users and existing items — standard save\r\n await handleSaveChanges()\r\n }\r\n }\r\n\r\n // Derived UI helpers\r\n\r\n const isNewItem = !!(\r\n (selectedSite && selectedSite.id < 0)\r\n || (selectedItem && selectedItem.id < 0)\r\n || (selectedInfrastructure && selectedInfrastructure.id < 0)\r\n )\r\n\r\n // Render\r\n\r\n return (\r\n <div className={`${hideFrame ? '' : 'sm:p-2'} overflow-hidden ${hideFrame ? '' : 'bg-[#fafafa]'} ${height ? height : 'h-full'}`}>\r\n <div className={`${hideFrame ? '' : 'bg-background rounded-xl shadow'} h-full min-h-0`}>\r\n <div className=\"flex flex-col h-full min-h-0\">\r\n\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"\">\r\n <div className=\"flex flex-row gap-2 justify-start items-center px-3 py-4 relative\">\r\n <Breadcrumb className=\"px-3\">\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n {view === 'table'\r\n ? <BreadcrumbPage>{headerTitle}</BreadcrumbPage>\r\n : (\r\n <BreadcrumbLink onClick={handleBackToTable} className=\"cursor-pointer\">\r\n {headerTitle}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n\r\n {view === 'detail' && (\r\n <>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{breadcrumbTitle}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </>\r\n )}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n\r\n {/* Header content based on view */}\r\n {view === 'table' ? (\r\n <>\r\n {/* Title Row */}\r\n {!hideTitle && (\r\n <div className=\"flex flex-row justify-between items-center px-6 py-6\">\r\n <div className=\"flex flex-col gap-1.5\">\r\n <div className=\"flex items-center gap-2\">\r\n <MenuIcon className=\"h-8 w-8\" />\r\n <h1 className=\"text-2xl text-foreground\">{headerTitle}</h1>\r\n </div>\r\n {comparing && (\r\n <h2 className=\"text-sm text-muted-foreground font-normal\">\r\n Choose up to 3 {headerTitle.toLowerCase()} to compare.\r\n </h2>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search & Filter & Actions Row */}\r\n <div className={`flex ${hideTitle ? 'justify-between' : 'justify-end'} items-center px-6 py-4 gap-4`}>\r\n <div className={hideTitle ? 'w-64' : 'w-96'}>\r\n <Input\r\n placeholder={`${t('searchPlaceholder')} ${headerTitle}...`}\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n />\r\n </div>\r\n\r\n <div className=\"flex gap-2\">\r\n <FilterButtons\r\n currentViewer={currentViewer}\r\n filters={filters}\r\n activeFilters={activeFilters}\r\n filterFields={filtersOptions}\r\n data={data}\r\n setFilters={setFilters}\r\n setActiveFilters={setActiveFilters}\r\n />\r\n <HeaderButtons\r\n headerTitle={headerTitle}\r\n currentViewer={currentViewer}\r\n compareItems={compareItems}\r\n setCompareItems={setCompareItems}\r\n comparing={comparing}\r\n setComparing={setComparing}\r\n newItemName={newItemName}\r\n setNewItemName={setNewItemName}\r\n filteredData={\r\n currentViewer === ViewerNames.buildings\r\n || currentViewer === ViewerNames.sites\r\n || currentViewer === ViewerNames.infrastructure\r\n ? filteredData\r\n : undefined\r\n }\r\n users={currentViewer === ViewerNames.users ? users : undefined}\r\n geocodeEarthApiKey={geocodeEarthApiKey}\r\n geocoderUrl={geocoderUrl}\r\n />\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n </>\r\n ) : (\r\n // Detail View Header\r\n <div className=\"flex justify-between items-center px-6 py-6\">\r\n <DetailHeader\r\n selectedItem={selectedItem}\r\n selectedSite={selectedSite}\r\n selectedInfrastructure={selectedInfrastructure}\r\n selectedFile={selectedFile}\r\n selectedUser={selectedUser}\r\n countryCode={organization?.country}\r\n />\r\n\r\n <DetailActions\r\n editing={editing}\r\n activeChanges={activeChanges}\r\n currentViewer={currentViewer}\r\n selectedItem={selectedItem}\r\n selectedSite={selectedSite}\r\n selectedInfrastructure={selectedInfrastructure}\r\n selectedFile={selectedFile}\r\n selectedUser={selectedUser}\r\n activeBuildingTab={activeBuildingTab}\r\n activeSiteTab={activeSiteTab}\r\n onSave={async () => {\r\n await handleCreateNewItem()\r\n setEditing(false)\r\n }}\r\n onEdit={() => {\r\n setEditing(true)\r\n if (isNewItem) setActiveChanges(true)\r\n }}\r\n onCancel={() => {\r\n setEditing(false)\r\n if (isNewItem) handleBackToTable()\r\n }}\r\n onDeleteUser={() => {\r\n setSelectedUser(null)\r\n setView('table')\r\n }}\r\n setView={setView}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Detail view separator */}\r\n {view === 'detail' && <Separator />}\r\n </div>\r\n\r\n {/* Scrollable Content Area */}\r\n <div className=\"flex-1 overflow-hidden\">\r\n {view === 'table' ? (\r\n <div className=\"h-full flex flex-col md:p-6 overflow-auto\">\r\n <DataTable\r\n columns={currentViewer === ViewerNames.users ? userColumns : tableColumns}\r\n data={filteredData}\r\n onRowClick={handleRowClick}\r\n currentViewer={currentViewer}\r\n isLoading={isLoading}\r\n leadingCell={comparing\r\n ? ({ dataset }) => {\r\n const item = dataset\r\n const isChecked = compareItems.some(i => i?.id === String(item?.id))\r\n const maxReached = compareItems.length >= 3 && !isChecked\r\n\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n if (isChecked) {\r\n removeItemFromCompare?.(String(item.id))\r\n } else {\r\n addItemToCompare?.({ ...item, id: String(item.id) })\r\n }\r\n }}\r\n >\r\n <Checkbox\r\n checked={isChecked}\r\n disabled={maxReached}\r\n className={`opacity-70 hover:opacity-100 data-[state=checked]:opacity-100 ${maxReached && '!cursor-default'}`}\r\n />\r\n </Button>\r\n )\r\n }\r\n : undefined}\r\n trailingCell={({ row }) => (\r\n <div onClick={e => e.stopPropagation()}>\r\n <MoreOptions\r\n row={row.original}\r\n dataType={dataType}\r\n hideViewOnMap={currentViewer === ViewerNames.users}\r\n setView={setView}\r\n onDeleteUser={() => setSelectedUser(null)}\r\n />\r\n </div>\r\n )}\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"h-full overflow-auto\">\r\n {selectedFile\r\n ? (\r\n <FileDetails\r\n selectedFile={selectedFile}\r\n buildings={buildings || []}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n ref={fileDetailsRef}\r\n />\r\n )\r\n : currentViewer === ViewerNames.buildings\r\n ? (\r\n <BuildingDetails\r\n selectedItem={selectedItem}\r\n setSelectedItem={setSelectedItem}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n buildings={buildings || []}\r\n ref={buildingDetailsRef}\r\n activeTab={activeBuildingTab}\r\n setActiveTab={setActiveBuildingTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.sites\r\n ? (\r\n <SiteDetails\r\n selectedSite={selectedSite}\r\n setSelectedSite={setSelectedSite}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n sites={sites || []}\r\n ref={siteDetailsRef}\r\n activeTab={activeSiteTab}\r\n setActiveTab={setActiveSiteTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.infrastructure\r\n ? (\r\n <InfrastructureDetails\r\n selectedInfrastructure={selectedInfrastructure}\r\n setSelectedInfrastructure={setSelectedInfrastructure}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n infrastructures={infrastructures || []}\r\n ref={infrastructureDetailsRef}\r\n activeTab={activeInfrastructureTab}\r\n setActiveTab={setActiveInfrastructureTab}\r\n />\r\n )\r\n : currentViewer === ViewerNames.users\r\n ? (\r\n <UserDetails\r\n selectedUser={selectedUser}\r\n setSelectedUser={setSelectedUser}\r\n editing={editing}\r\n setEditing={setEditing}\r\n setActiveChanges={setActiveChanges}\r\n users={users || []}\r\n ref={userDetailsRef}\r\n hideTitle={hideTitle}\r\n />\r\n )\r\n : null}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["_a","_b","_c"]}
|
|
@@ -12,7 +12,9 @@ type HeaderButtonsProps = {
|
|
|
12
12
|
setNewItemName: React.Dispatch<React.SetStateAction<string>>;
|
|
13
13
|
filteredData?: Array<Building | Site>;
|
|
14
14
|
users?: User[];
|
|
15
|
+
geocodeEarthApiKey?: string;
|
|
16
|
+
geocoderUrl?: string;
|
|
15
17
|
};
|
|
16
|
-
export default function HeaderButtons({ headerTitle, currentViewer, compareItems, setCompareItems, comparing, setComparing, newItemName, setNewItemName, filteredData, users, }: HeaderButtonsProps): React.JSX.Element;
|
|
18
|
+
export default function HeaderButtons({ headerTitle, currentViewer, compareItems, setCompareItems, comparing, setComparing, newItemName, setNewItemName, filteredData, users, geocodeEarthApiKey, geocoderUrl, }: HeaderButtonsProps): React.JSX.Element;
|
|
17
19
|
export {};
|
|
18
20
|
//# sourceMappingURL=HeaderButtons.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderButtons.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/Data/HeaderButtons.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAmBjD,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,eAAe,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACrE,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"HeaderButtons.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/Data/HeaderButtons.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAmBjD,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,eAAe,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACrE,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,KAAK,EACL,kBAAkB,EAClB,WAAW,GACZ,EAAE,kBAAkB,qBAkPpB"}
|
|
@@ -47,7 +47,9 @@ function HeaderButtons({
|
|
|
47
47
|
newItemName,
|
|
48
48
|
setNewItemName,
|
|
49
49
|
filteredData,
|
|
50
|
-
users
|
|
50
|
+
users,
|
|
51
|
+
geocodeEarthApiKey,
|
|
52
|
+
geocoderUrl
|
|
51
53
|
}) {
|
|
52
54
|
const t = useTranslations("HeaderButtons");
|
|
53
55
|
const { ability } = usePermissions();
|
|
@@ -161,7 +163,9 @@ function HeaderButtons({
|
|
|
161
163
|
newBuildingFields,
|
|
162
164
|
setNewBuildingFields,
|
|
163
165
|
open: addBuildingOpen,
|
|
164
|
-
onOpenChange: setAddBuildingOpen
|
|
166
|
+
onOpenChange: setAddBuildingOpen,
|
|
167
|
+
geocodeEarthApiKey,
|
|
168
|
+
geocoderUrl
|
|
165
169
|
}
|
|
166
170
|
),
|
|
167
171
|
/* @__PURE__ */ jsx(BuildingMoreOptions, { buildings: filteredData, variant: "outline" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/HeaderButtons.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// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../store'\r\n\r\n// Utils\r\nimport type { Dataset } from '../../../types/datasetTypes'\r\nimport type { Building, Site, User } from '../../../types/dbTypes'\r\n\r\nimport { DatasetsContext, MapContext, MenusContext } from '../../../store'\r\nimport type { CompareItem } from '../../../store'\r\n\r\n// Shadcn Components\r\nimport { Button } from '../../../components/ui/Button'\r\nimport { createSitesDataset } from '../map/src/MapLayers/src/SiteLayer'\r\nimport { fitBuildingsBounds, fitSitesBounds } from '../map/utils/fitBuildingsBounds'\r\nimport AddBuilding from './buildingDetails/AddBuilding'\r\n// File Adder\r\nimport DatatableFileAdder from './files/DatatableFileAdder'\r\n// Custom Components\r\nimport AddSite from './siteDetails/AddSite'\r\nimport CompareDialog from '../map/src/compare/CompareDialog'\r\nimport UserMoreOptions from './userDetails/UserMoreOptions'\r\nimport AddUser from './userDetails/AddUser'\r\nimport BuildingMoreOptions from './buildingDetails/BuildingsMoreOptions'\r\nimport { ViewerNames } from '../../../types/'\r\nimport AddInfrastructure from './infrastructureDetails/AddInfrastructure'\r\nimport { createBuildingsDataset } from '../map/src/MapLayers/src/BuildingLayers/src/databaseBuildings'\r\n\r\ntype HeaderButtonsProps = {\r\n headerTitle: string\r\n currentViewer: string\r\n compareItems: CompareItem[]\r\n setCompareItems?: React.Dispatch<React.SetStateAction<CompareItem[]>>\r\n comparing: boolean\r\n setComparing: React.Dispatch<React.SetStateAction<boolean>>\r\n newItemName: string\r\n setNewItemName: React.Dispatch<React.SetStateAction<string>>\r\n filteredData?: Array<Building | Site>\r\n users?: User[]\r\n}\r\n\r\nexport default function HeaderButtons({\r\n headerTitle,\r\n currentViewer,\r\n compareItems,\r\n setCompareItems,\r\n comparing,\r\n setComparing,\r\n newItemName,\r\n setNewItemName,\r\n filteredData,\r\n users,\r\n}: HeaderButtonsProps) {\r\n // Translations\r\n const t = useTranslations('HeaderButtons')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [newInfrastructureFields, setNewInfrastructureFields] = React.useState({})\r\n const [addInfrastructureOpen, setAddInfrastructureOpen] = React.useState(false)\r\n const [addBuildingOpen, setAddBuildingOpen] = React.useState(false)\r\n const [addUserOpen, setAddUserOpen] = React.useState(false)\r\n\r\n const { map } = mapState.map\r\n const firstBuilding = compareItems[0]\r\n\r\n const coordinates = firstBuilding\r\n ? (('buildingLongitude' in firstBuilding && 'buildingLatitude' in firstBuilding)\r\n ? [firstBuilding.buildingLongitude, firstBuilding.buildingLatitude]\r\n : ('coordinates' in firstBuilding))\r\n : undefined\r\n\r\n const handleViewOnMap = () => {\r\n // set the current viewer to map\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n }\r\n\r\n const handleViewAllOnMap = async () => {\r\n if (filteredData.length === 0)\r\n return\r\n\r\n // Switch to map view\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n\r\n if (currentViewer === 'buildings') {\r\n // Filter buildings with valid coordinates\r\n const validBuildings = filteredData.filter(\r\n (item): item is Building => {\r\n const b = item as Building\r\n const lon = b.buildingLongitude\r\n const lat = b.buildingLatitude\r\n if (lon == null || lat == null) return false\r\n\r\n // Rough North America bounding box\r\n const minLat = 5\r\n const maxLat = 85\r\n const minLon = -170\r\n const maxLon = -10\r\n\r\n return Number.isFinite(lat)\r\n && Number.isFinite(lon)\r\n && lat >= minLat\r\n && lat <= maxLat\r\n && lon >= minLon\r\n && lon <= maxLon\r\n }\r\n )\r\n\r\n if (validBuildings.length === 0)\r\n return\r\n\r\n const name = 'Database Buildings'\r\n\r\n const dataset: Dataset = createBuildingsDataset(validBuildings, name)\r\n\r\n // Add buildings as a dataset to the map state\r\n datasetDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset },\r\n })\r\n\r\n fitBuildingsBounds(validBuildings, map)\r\n }\r\n\r\n else if (currentViewer === 'sites') {\r\n // Filter sites with valid coordinates\r\n const validSites = filteredData.filter(\r\n (item): item is Site =>\r\n (item as Site).siteLongitude != null && (item as Site).siteLatitude != null\r\n )\r\n\r\n if (validSites.length === 0)\r\n return\r\n\r\n const name = 'Database Sites'\r\n\r\n const dataset: Dataset = createSitesDataset(validSites, name)\r\n\r\n // Add buildings as a dataset to the map state\r\n datasetDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset },\r\n })\r\n\r\n fitSitesBounds(validSites, map)\r\n }\r\n\r\n else if (currentViewer === 'infrastructure') {\r\n // Filter infrastructure with valid coordinates\r\n }\r\n\r\n\r\n }\r\n\r\n const handleAddBuilding = (building: Building) => {\r\n if (setCompareItems) {\r\n const compareItem: CompareItem = {\r\n ...building,\r\n id: String(building.id),\r\n }\r\n setCompareItems([...compareItems, compareItem])\r\n }\r\n }\r\n\r\n const toggleOpen = () => {\r\n setComparing(false)\r\n // Clear compareItems when exiting compare mode for proper cleanup\r\n if (setCompareItems) {\r\n setCompareItems([])\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-row gap-2.5\">\r\n {comparing\r\n ? (\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n setComparing(false)\r\n // Clear compareItems for proper cleanup when canceling\r\n if (setCompareItems) {\r\n setCompareItems([])\r\n }\r\n }}\r\n disabled={currentViewer === 'buildings' && !ability.can('read', 'Building') || currentViewer === 'sites' && !ability.can('read', 'Site')}\r\n >\r\n {t('cancelButton')}\r\n </Button>\r\n )\r\n : currentViewer === 'files'\r\n ? (\r\n <DatatableFileAdder />\r\n )\r\n : currentViewer === 'buildings'\r\n ? (\r\n <>\r\n <Button\r\n variant=\"default\"\r\n onClick={() => setAddBuildingOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.CirclePlus />\r\n {t('addBuilding')}\r\n </Button>\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={addBuildingOpen}\r\n onOpenChange={setAddBuildingOpen}\r\n />\r\n <BuildingMoreOptions buildings={filteredData as Building[]} variant=\"outline\" />\r\n </>\r\n )\r\n : currentViewer === 'sites'\r\n ? (\r\n <AddSite\r\n newItemName={newItemName}\r\n setNewItemName={setNewItemName}\r\n />\r\n )\r\n : currentViewer === 'infrastructure'\r\n ? (\r\n <AddInfrastructure\r\n newInfrastructureFields={newInfrastructureFields}\r\n setNewInfrastructureFields={setNewInfrastructureFields}\r\n open={addInfrastructureOpen}\r\n onOpenChange={setAddInfrastructureOpen}\r\n />\r\n )\r\n : currentViewer === 'users'\r\n ? (\r\n <>\r\n <Button\r\n variant=\"default\"\r\n onClick={() => setAddUserOpen(true)}\r\n disabled={!ability.can('create', 'User')}\r\n >\r\n <LR.CirclePlus />\r\n {t('addUser')}\r\n </Button>\r\n <AddUser open={addUserOpen} onOpenChange={setAddUserOpen} />\r\n <UserMoreOptions users={users} variant=\"outline\" />\r\n </>\r\n )\r\n : null}\r\n\r\n {/* Compare Button/Dialog */}\r\n {comparing\r\n ? (\r\n <CompareDialog\r\n toggleOpen={toggleOpen}\r\n compareItems={compareItems}\r\n setCompareItems={setCompareItems || (() => {})}\r\n handleAddBuilding={handleAddBuilding}\r\n />\r\n )\r\n : (\r\n <Button\r\n variant=\"secondary\"\r\n className={`max-sm:hidden ${(currentViewer === ViewerNames.files || currentViewer === ViewerNames.extensions || currentViewer === ViewerNames.users) ? 'hidden' : ''}`}\r\n onClick={() => setComparing(true)}\r\n >\r\n <LR.GitCompare />\r\n {t('compare')}\r\n {' '}\r\n {headerTitle}\r\n </Button>\r\n )}\r\n {(currentViewer === 'buildings' || currentViewer === 'sites') && filteredData && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleViewAllOnMap}\r\n disabled={filteredData.length === 0 || currentViewer === 'buildings' &&!ability.can('read', 'Building') || currentViewer === 'sites' && !ability.can('read', 'Site')}\r\n >\r\n <LR.Map className=\"\" />\r\n {t('viewButton')}\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/HeaderButtons.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// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../store'\r\n\r\n// Utils\r\nimport type { Dataset } from '../../../types/datasetTypes'\r\nimport type { Building, Site, User } from '../../../types/dbTypes'\r\n\r\nimport { DatasetsContext, MapContext, MenusContext } from '../../../store'\r\nimport type { CompareItem } from '../../../store'\r\n\r\n// Shadcn Components\r\nimport { Button } from '../../../components/ui/Button'\r\nimport { createSitesDataset } from '../map/src/MapLayers/src/SiteLayer'\r\nimport { fitBuildingsBounds, fitSitesBounds } from '../map/utils/fitBuildingsBounds'\r\nimport AddBuilding from './buildingDetails/AddBuilding'\r\n// File Adder\r\nimport DatatableFileAdder from './files/DatatableFileAdder'\r\n// Custom Components\r\nimport AddSite from './siteDetails/AddSite'\r\nimport CompareDialog from '../map/src/compare/CompareDialog'\r\nimport UserMoreOptions from './userDetails/UserMoreOptions'\r\nimport AddUser from './userDetails/AddUser'\r\nimport BuildingMoreOptions from './buildingDetails/BuildingsMoreOptions'\r\nimport { ViewerNames } from '../../../types/'\r\nimport AddInfrastructure from './infrastructureDetails/AddInfrastructure'\r\nimport { createBuildingsDataset } from '../map/src/MapLayers/src/BuildingLayers/src/databaseBuildings'\r\n\r\ntype HeaderButtonsProps = {\r\n headerTitle: string\r\n currentViewer: string\r\n compareItems: CompareItem[]\r\n setCompareItems?: React.Dispatch<React.SetStateAction<CompareItem[]>>\r\n comparing: boolean\r\n setComparing: React.Dispatch<React.SetStateAction<boolean>>\r\n newItemName: string\r\n setNewItemName: React.Dispatch<React.SetStateAction<string>>\r\n filteredData?: Array<Building | Site>\r\n users?: User[]\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport default function HeaderButtons({\r\n headerTitle,\r\n currentViewer,\r\n compareItems,\r\n setCompareItems,\r\n comparing,\r\n setComparing,\r\n newItemName,\r\n setNewItemName,\r\n filteredData,\r\n users,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n}: HeaderButtonsProps) {\r\n // Translations\r\n const t = useTranslations('HeaderButtons')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [newInfrastructureFields, setNewInfrastructureFields] = React.useState({})\r\n const [addInfrastructureOpen, setAddInfrastructureOpen] = React.useState(false)\r\n const [addBuildingOpen, setAddBuildingOpen] = React.useState(false)\r\n const [addUserOpen, setAddUserOpen] = React.useState(false)\r\n\r\n const { map } = mapState.map\r\n const firstBuilding = compareItems[0]\r\n\r\n const coordinates = firstBuilding\r\n ? (('buildingLongitude' in firstBuilding && 'buildingLatitude' in firstBuilding)\r\n ? [firstBuilding.buildingLongitude, firstBuilding.buildingLatitude]\r\n : ('coordinates' in firstBuilding))\r\n : undefined\r\n\r\n const handleViewOnMap = () => {\r\n // set the current viewer to map\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n }\r\n\r\n const handleViewAllOnMap = async () => {\r\n if (filteredData.length === 0)\r\n return\r\n\r\n // Switch to map view\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n\r\n if (currentViewer === 'buildings') {\r\n // Filter buildings with valid coordinates\r\n const validBuildings = filteredData.filter(\r\n (item): item is Building => {\r\n const b = item as Building\r\n const lon = b.buildingLongitude\r\n const lat = b.buildingLatitude\r\n if (lon == null || lat == null) return false\r\n\r\n // Rough North America bounding box\r\n const minLat = 5\r\n const maxLat = 85\r\n const minLon = -170\r\n const maxLon = -10\r\n\r\n return Number.isFinite(lat)\r\n && Number.isFinite(lon)\r\n && lat >= minLat\r\n && lat <= maxLat\r\n && lon >= minLon\r\n && lon <= maxLon\r\n }\r\n )\r\n\r\n if (validBuildings.length === 0)\r\n return\r\n\r\n const name = 'Database Buildings'\r\n\r\n const dataset: Dataset = createBuildingsDataset(validBuildings, name)\r\n\r\n // Add buildings as a dataset to the map state\r\n datasetDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset },\r\n })\r\n\r\n fitBuildingsBounds(validBuildings, map)\r\n }\r\n\r\n else if (currentViewer === 'sites') {\r\n // Filter sites with valid coordinates\r\n const validSites = filteredData.filter(\r\n (item): item is Site =>\r\n (item as Site).siteLongitude != null && (item as Site).siteLatitude != null\r\n )\r\n\r\n if (validSites.length === 0)\r\n return\r\n\r\n const name = 'Database Sites'\r\n\r\n const dataset: Dataset = createSitesDataset(validSites, name)\r\n\r\n // Add buildings as a dataset to the map state\r\n datasetDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset },\r\n })\r\n\r\n fitSitesBounds(validSites, map)\r\n }\r\n\r\n else if (currentViewer === 'infrastructure') {\r\n // Filter infrastructure with valid coordinates\r\n }\r\n\r\n\r\n }\r\n\r\n const handleAddBuilding = (building: Building) => {\r\n if (setCompareItems) {\r\n const compareItem: CompareItem = {\r\n ...building,\r\n id: String(building.id),\r\n }\r\n setCompareItems([...compareItems, compareItem])\r\n }\r\n }\r\n\r\n const toggleOpen = () => {\r\n setComparing(false)\r\n // Clear compareItems when exiting compare mode for proper cleanup\r\n if (setCompareItems) {\r\n setCompareItems([])\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-row gap-2.5\">\r\n {comparing\r\n ? (\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n setComparing(false)\r\n // Clear compareItems for proper cleanup when canceling\r\n if (setCompareItems) {\r\n setCompareItems([])\r\n }\r\n }}\r\n disabled={currentViewer === 'buildings' && !ability.can('read', 'Building') || currentViewer === 'sites' && !ability.can('read', 'Site')}\r\n >\r\n {t('cancelButton')}\r\n </Button>\r\n )\r\n : currentViewer === 'files'\r\n ? (\r\n <DatatableFileAdder />\r\n )\r\n : currentViewer === 'buildings'\r\n ? (\r\n <>\r\n <Button\r\n variant=\"default\"\r\n onClick={() => setAddBuildingOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.CirclePlus />\r\n {t('addBuilding')}\r\n </Button>\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={addBuildingOpen}\r\n onOpenChange={setAddBuildingOpen}\r\n geocodeEarthApiKey={geocodeEarthApiKey}\r\n geocoderUrl={geocoderUrl}\r\n />\r\n <BuildingMoreOptions buildings={filteredData as Building[]} variant=\"outline\" />\r\n </>\r\n )\r\n : currentViewer === 'sites'\r\n ? (\r\n <AddSite\r\n newItemName={newItemName}\r\n setNewItemName={setNewItemName}\r\n />\r\n )\r\n : currentViewer === 'infrastructure'\r\n ? (\r\n <AddInfrastructure\r\n newInfrastructureFields={newInfrastructureFields}\r\n setNewInfrastructureFields={setNewInfrastructureFields}\r\n open={addInfrastructureOpen}\r\n onOpenChange={setAddInfrastructureOpen}\r\n />\r\n )\r\n : currentViewer === 'users'\r\n ? (\r\n <>\r\n <Button\r\n variant=\"default\"\r\n onClick={() => setAddUserOpen(true)}\r\n disabled={!ability.can('create', 'User')}\r\n >\r\n <LR.CirclePlus />\r\n {t('addUser')}\r\n </Button>\r\n <AddUser open={addUserOpen} onOpenChange={setAddUserOpen} />\r\n <UserMoreOptions users={users} variant=\"outline\" />\r\n </>\r\n )\r\n : null}\r\n\r\n {/* Compare Button/Dialog */}\r\n {comparing\r\n ? (\r\n <CompareDialog\r\n toggleOpen={toggleOpen}\r\n compareItems={compareItems}\r\n setCompareItems={setCompareItems || (() => {})}\r\n handleAddBuilding={handleAddBuilding}\r\n />\r\n )\r\n : (\r\n <Button\r\n variant=\"secondary\"\r\n className={`max-sm:hidden ${(currentViewer === ViewerNames.files || currentViewer === ViewerNames.extensions || currentViewer === ViewerNames.users) ? 'hidden' : ''}`}\r\n onClick={() => setComparing(true)}\r\n >\r\n <LR.GitCompare />\r\n {t('compare')}\r\n {' '}\r\n {headerTitle}\r\n </Button>\r\n )}\r\n {(currentViewer === 'buildings' || currentViewer === 'sites') && filteredData && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleViewAllOnMap}\r\n disabled={filteredData.length === 0 || currentViewer === 'buildings' &&!ability.can('read', 'Building') || currentViewer === 'sites' && !ability.can('read', 'Site')}\r\n >\r\n <LR.Map className=\"\" />\r\n {t('viewButton')}\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuMY,SAoBI,UApBJ,KAqBM,YArBN;AAjMZ,YAAY,QAAQ;AAEpB,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAM/B,SAAS,iBAAiB,YAAY,oBAAoB;AAI1D,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,oBAAoB,sBAAsB;AACnD,OAAO,iBAAiB;AAExB,OAAO,wBAAwB;AAE/B,OAAO,aAAa;AACpB,OAAO,mBAAmB;AAC1B,OAAO,qBAAqB;AAC5B,OAAO,aAAa;AACpB,OAAO,yBAAyB;AAChC,SAAS,mBAAmB;AAC5B,OAAO,uBAAuB;AAC9B,SAAS,8BAA8B;AAiBxB,SAAR,cAA+B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AAErB,QAAM,IAAI,gBAAgB,eAAe;AAGzC,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,UAAU,gBAAgB,IAAI,MAAM,WAAW,eAAe;AACtE,QAAM,EAAE,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACjE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,CAAC,CAAC;AACnE,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,MAAM,SAAS,CAAC,CAAC;AAC/E,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,MAAM,SAAS,KAAK;AAC9E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,KAAK;AAClE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,KAAK;AAE1D,QAAM,EAAE,IAAI,IAAI,SAAS;AACzB,QAAM,gBAAgB,aAAa,CAAC;AAEpC,QAAM,cAAc,gBACd,uBAAuB,iBAAiB,sBAAsB,gBAC5D,CAAC,cAAc,mBAAmB,cAAc,gBAAgB,IAC/D,iBAAiB,gBACtB;AAEJ,QAAM,kBAAkB,MAAM;AAE5B,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,EAAE,eAAe,YAAY,IAAI;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,YAAY;AACrC,QAAI,aAAa,WAAW;AAC1B;AAGF,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,EAAE,eAAe,YAAY,IAAI;AAAA,IAC5C,CAAC;AAED,QAAI,kBAAkB,aAAa;AAEjC,YAAM,iBAAiB,aAAa;AAAA,QAClC,CAAC,SAA2B;AAC1B,gBAAM,IAAI;AACV,gBAAM,MAAM,EAAE;AACd,gBAAM,MAAM,EAAE;AACd,cAAI,OAAO,QAAQ,OAAO,KAAM,QAAO;AAGvC,gBAAM,SAAS;AACf,gBAAM,SAAS;AACf,gBAAM,SAAS;AACf,gBAAM,SAAS;AAEf,iBAAO,OAAO,SAAS,GAAG,KACzB,OAAO,SAAS,GAAG,KACnB,OAAO,UACP,OAAO,UACP,OAAO,UACP,OAAO;AAAA,QACV;AAAA,MACF;AAEA,UAAI,eAAe,WAAW;AAC5B;AAEF,YAAM,OAAO;AAEb,YAAM,UAAmB,uBAAuB,gBAAgB,IAAI;AAGpE,sBAAgB;AAAA,QACd,MAAM;AAAA,QACN,SAAS,EAAE,QAAQ;AAAA,MACrB,CAAC;AAED,yBAAmB,gBAAgB,GAAG;AAAA,IACxC,WAES,kBAAkB,SAAS;AAElC,YAAM,aAAa,aAAa;AAAA,QAC9B,CAAC,SACE,KAAc,iBAAiB,QAAS,KAAc,gBAAgB;AAAA,MAC3E;AAEA,UAAI,WAAW,WAAW;AACxB;AAEF,YAAM,OAAO;AAEb,YAAM,UAAmB,mBAAmB,YAAY,IAAI;AAG5D,sBAAgB;AAAA,QACd,MAAM;AAAA,QACN,SAAS,EAAE,QAAQ;AAAA,MACrB,CAAC;AAED,qBAAe,YAAY,GAAG;AAAA,IAChC,WAES,kBAAkB,kBAAkB;AAAA,IAE7C;AAAA,EAGF;AAEA,QAAM,oBAAoB,CAAC,aAAuB;AAChD,QAAI,iBAAiB;AACnB,YAAM,cAA2B,iCAC5B,WAD4B;AAAA,QAE/B,IAAI,OAAO,SAAS,EAAE;AAAA,MACxB;AACA,sBAAgB,CAAC,GAAG,cAAc,WAAW,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,iBAAa,KAAK;AAElB,QAAI,iBAAiB;AACnB,sBAAgB,CAAC,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,yBACZ;AAAA,gBAEK;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS,MAAM;AACb,uBAAa,KAAK;AAElB,cAAI,iBAAiB;AACnB,4BAAgB,CAAC,CAAC;AAAA,UACpB;AAAA,QACF;AAAA,QACA,UAAU,kBAAkB,eAAe,CAAC,QAAQ,IAAI,QAAQ,UAAU,KAAK,kBAAkB,WAAW,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAEtI,YAAE,cAAc;AAAA;AAAA,IACnB,IAEF,kBAAkB,UAEd,oBAAC,sBAAmB,IAEtB,kBAAkB,cAEd,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,mBAAmB,IAAI;AAAA,UACtC,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,GAAG,YAAH,EAAc;AAAA,YACd,EAAE,aAAa;AAAA;AAAA;AAAA,MAClB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,cAAc;AAAA,UACd;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,uBAAoB,WAAW,cAA4B,SAAQ,WAAU;AAAA,OAChF,IAEF,kBAAkB,UAEd;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA;AAAA,IACF,IAEF,kBAAkB,mBAEhB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB,IAEF,kBAAkB,UAEd,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,eAAe,IAAI;AAAA,UAClC,UAAU,CAAC,QAAQ,IAAI,UAAU,MAAM;AAAA,UAEvC;AAAA,gCAAC,GAAG,YAAH,EAAc;AAAA,YACd,EAAE,SAAS;AAAA;AAAA;AAAA,MACd;AAAA,MACA,oBAAC,WAAQ,MAAM,aAAa,cAAc,gBAAgB;AAAA,MAC1D,oBAAC,mBAAgB,OAAc,SAAQ,WAAU;AAAA,OACnD,IAEF;AAAA,IAGX,YAEK;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,iBAAiB,oBAAoB,MAAM;AAAA,QAAC;AAAA,QAC5C;AAAA;AAAA,IACF,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAW,iBAAkB,kBAAkB,YAAY,SAAS,kBAAkB,YAAY,cAAc,kBAAkB,YAAY,QAAS,WAAW,EAAE;AAAA,QACpK,SAAS,MAAM,aAAa,IAAI;AAAA,QAEhC;AAAA,8BAAC,GAAG,YAAH,EAAc;AAAA,UACd,EAAE,SAAS;AAAA,UACX;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,KAEJ,kBAAkB,eAAe,kBAAkB,YAAY,gBAC/D;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU,aAAa,WAAW,KAAK,kBAAkB,eAAc,CAAC,QAAQ,IAAI,QAAQ,UAAU,KAAK,kBAAkB,WAAW,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAEnK;AAAA,8BAAC,GAAG,KAAH,EAAO,WAAU,IAAG;AAAA,UACpB,EAAE,YAAY;AAAA;AAAA;AAAA,IACjB;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -4,7 +4,9 @@ interface AddBuildingProps {
|
|
|
4
4
|
setNewBuildingFields: (fields: any) => void;
|
|
5
5
|
open: boolean;
|
|
6
6
|
onOpenChange: (open: boolean) => void;
|
|
7
|
+
geocodeEarthApiKey?: string;
|
|
8
|
+
geocoderUrl?: string;
|
|
7
9
|
}
|
|
8
|
-
export default function AddBuilding({ newBuildingFields, setNewBuildingFields, open, onOpenChange, }: AddBuildingProps): React.JSX.Element;
|
|
10
|
+
export default function AddBuilding({ newBuildingFields, setNewBuildingFields, open, onOpenChange, geocodeEarthApiKey, geocoderUrl, }: AddBuildingProps): React.JSX.Element;
|
|
9
11
|
export {};
|
|
10
12
|
//# sourceMappingURL=AddBuilding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddBuilding.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/AddBuilding.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,UAAU,gBAAgB;IACxB,iBAAiB,EAAE,GAAG,CAAA;IACtB,oBAAoB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;IAC3C,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"AddBuilding.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/AddBuilding.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,UAAU,gBAAgB;IACxB,iBAAiB,EAAE,GAAG,CAAA;IACtB,oBAAoB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;IAC3C,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,iBAAiB,EACjB,oBAAoB,EACpB,IAAI,EACJ,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,EAAE,gBAAgB,qBAyDlB"}
|
|
@@ -27,7 +27,9 @@ function AddBuilding({
|
|
|
27
27
|
newBuildingFields,
|
|
28
28
|
setNewBuildingFields,
|
|
29
29
|
open,
|
|
30
|
-
onOpenChange
|
|
30
|
+
onOpenChange,
|
|
31
|
+
geocodeEarthApiKey,
|
|
32
|
+
geocoderUrl
|
|
31
33
|
}) {
|
|
32
34
|
var _a;
|
|
33
35
|
const t = useTranslations("AddBuilding");
|
|
@@ -59,7 +61,7 @@ function AddBuilding({
|
|
|
59
61
|
children: [
|
|
60
62
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
61
63
|
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-foreground", children: t("label") }),
|
|
62
|
-
/* @__PURE__ */ jsx(GeocoderInput, { onSelect: handleGeocoderSelect }),
|
|
64
|
+
/* @__PURE__ */ jsx(GeocoderInput, { onSelect: handleGeocoderSelect, geocodeEarthApiKey, geocoderUrl }),
|
|
63
65
|
newBuildingFields.buildingAddress && /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: [
|
|
64
66
|
t("label2"),
|
|
65
67
|
" ",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/AddBuilding.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 { useMenusContext } from '../../../../store'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Shadcn components\r\nimport { AddItemDialog } from '../../../ui/AddItemDialog'\r\nimport { Button } from '../../../ui/Button'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom components\r\nimport GeocoderInput from './GeocoderInput'\r\nimport { DropdownMenuItem } from '@radix-ui/react-dropdown-menu'\r\n\r\ninterface AddBuildingProps {\r\n newBuildingFields: any\r\n setNewBuildingFields: (fields: any) => void\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n}\r\n\r\nexport default function AddBuilding({\r\n newBuildingFields,\r\n setNewBuildingFields,\r\n open,\r\n onOpenChange,\r\n}: AddBuildingProps) {\r\n // Translations\r\n const t = useTranslations('AddBuilding')\r\n\r\n const { setSelectedItem, setView } = useMenusContext()\r\n\r\n const handleGeocoderSelect = (fields) => {\r\n setNewBuildingFields(fields)\r\n }\r\n\r\n const handleGetStarted = () => {\r\n if (!newBuildingFields.buildingAddress?.trim()) {\r\n toast.error(t('toastErr'))\r\n return\r\n }\r\n\r\n const blankBuilding = {\r\n id: -1,\r\n ...newBuildingFields,\r\n }\r\n\r\n setSelectedItem(blankBuilding as any)\r\n setView('detail')\r\n onOpenChange(false)\r\n }\r\n\r\n return (\r\n <AddItemDialog\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title={t('title')}\r\n description={t('description')}\r\n icon={LR.Building2}\r\n >\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{t('label')}</div>\r\n <GeocoderInput onSelect={handleGeocoderSelect} />\r\n {newBuildingFields.buildingAddress && (\r\n <div className=\"text-xs text-muted-foreground mt-1\">\r\n {t('label2')}\r\n {' '}\r\n {newBuildingFields.buildingAddress}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"w-full flex justify-end\">\r\n <Button\r\n variant=\"secondary\"\r\n className=\"w-fit\"\r\n onClick={handleGetStarted}\r\n disabled={!newBuildingFields.buildingAddress?.trim()}\r\n >\r\n {t('submit')}\r\n </Button>\r\n </div>\r\n </AddItemDialog>\r\n )\r\n}"],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/AddBuilding.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 { useMenusContext } from '../../../../store'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Shadcn components\r\nimport { AddItemDialog } from '../../../ui/AddItemDialog'\r\nimport { Button } from '../../../ui/Button'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom components\r\nimport GeocoderInput from './GeocoderInput'\r\nimport { DropdownMenuItem } from '@radix-ui/react-dropdown-menu'\r\n\r\ninterface AddBuildingProps {\r\n newBuildingFields: any\r\n setNewBuildingFields: (fields: any) => void\r\n open: boolean\r\n onOpenChange: (open: boolean) => void\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport default function AddBuilding({\r\n newBuildingFields,\r\n setNewBuildingFields,\r\n open,\r\n onOpenChange,\r\n geocodeEarthApiKey,\r\n geocoderUrl,\r\n}: AddBuildingProps) {\r\n // Translations\r\n const t = useTranslations('AddBuilding')\r\n\r\n const { setSelectedItem, setView } = useMenusContext()\r\n\r\n const handleGeocoderSelect = (fields) => {\r\n setNewBuildingFields(fields)\r\n }\r\n\r\n const handleGetStarted = () => {\r\n if (!newBuildingFields.buildingAddress?.trim()) {\r\n toast.error(t('toastErr'))\r\n return\r\n }\r\n\r\n const blankBuilding = {\r\n id: -1,\r\n ...newBuildingFields,\r\n }\r\n\r\n setSelectedItem(blankBuilding as any)\r\n setView('detail')\r\n onOpenChange(false)\r\n }\r\n\r\n return (\r\n <AddItemDialog\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title={t('title')}\r\n description={t('description')}\r\n icon={LR.Building2}\r\n >\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{t('label')}</div>\r\n <GeocoderInput onSelect={handleGeocoderSelect} geocodeEarthApiKey={geocodeEarthApiKey} geocoderUrl={geocoderUrl} />\r\n {newBuildingFields.buildingAddress && (\r\n <div className=\"text-xs text-muted-foreground mt-1\">\r\n {t('label2')}\r\n {' '}\r\n {newBuildingFields.buildingAddress}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"w-full flex justify-end\">\r\n <Button\r\n variant=\"secondary\"\r\n className=\"w-fit\"\r\n onClick={handleGetStarted}\r\n disabled={!newBuildingFields.buildingAddress?.trim()}\r\n >\r\n {t('submit')}\r\n </Button>\r\n </div>\r\n </AddItemDialog>\r\n )\r\n}"],"mappings":";;;;;;;;;;;;;;;;;AAwEQ,cAGE,YAHF;AAlER,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAGhC,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAGvB,YAAY,QAAQ;AAGpB,OAAO,mBAAmB;AAYX,SAAR,YAA6B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AArCrB;AAuCE,QAAM,IAAI,gBAAgB,aAAa;AAEvC,QAAM,EAAE,iBAAiB,QAAQ,IAAI,gBAAgB;AAErD,QAAM,uBAAuB,CAAC,WAAW;AACvC,yBAAqB,MAAM;AAAA,EAC7B;AAEA,QAAM,mBAAmB,MAAM;AA/CjC,QAAAA;AAgDI,QAAI,GAACA,MAAA,kBAAkB,oBAAlB,gBAAAA,IAAmC,SAAQ;AAC9C,YAAM,MAAM,EAAE,UAAU,CAAC;AACzB;AAAA,IACF;AAEA,UAAM,gBAAgB;AAAA,MACpB,IAAI;AAAA,OACD;AAGL,oBAAgB,aAAoB;AACpC,YAAQ,QAAQ;AAChB,iBAAa,KAAK;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,EAAE,OAAO;AAAA,MAChB,aAAa,EAAE,aAAa;AAAA,MAC5B,MAAM,GAAG;AAAA,MAET;AAAA,6BAAC,SAAI,WAAU,uBACb;AAAA,8BAAC,SAAI,WAAU,uCAAuC,YAAE,OAAO,GAAE;AAAA,UACjE,oBAAC,iBAAc,UAAU,sBAAsB,oBAAwC,aAA0B;AAAA,UAChH,kBAAkB,mBACjB,qBAAC,SAAI,WAAU,sCACZ;AAAA,cAAE,QAAQ;AAAA,YACV;AAAA,YACA,kBAAkB;AAAA,aACrB;AAAA,WAEJ;AAAA,QACA,oBAAC,SAAI,WAAU,2BACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU,GAAC,uBAAkB,oBAAlB,mBAAmC;AAAA,YAE7C,YAAE,QAAQ;AAAA;AAAA,QACb,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["_a"]}
|
|
@@ -9,7 +9,9 @@ interface GeocoderInputProps {
|
|
|
9
9
|
buildingMunicipality?: string;
|
|
10
10
|
buildingPostalCode?: string;
|
|
11
11
|
}) => void;
|
|
12
|
+
geocodeEarthApiKey?: string;
|
|
13
|
+
geocoderUrl?: string;
|
|
12
14
|
}
|
|
13
|
-
export default function GeocoderInput({ onSelect }: GeocoderInputProps): React.JSX.Element;
|
|
15
|
+
export default function GeocoderInput({ onSelect, geocodeEarthApiKey, geocoderUrl }: GeocoderInputProps): React.JSX.Element;
|
|
14
16
|
export {};
|
|
15
17
|
//# sourceMappingURL=GeocoderInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeocoderInput.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/GeocoderInput.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,MAAM,CAAA;QACvB,iBAAiB,EAAE,MAAM,CAAA;QACzB,gBAAgB,EAAE,MAAM,CAAA;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAA;QACnC,oBAAoB,CAAC,EAAE,MAAM,CAAA;QAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC5B,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"GeocoderInput.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/GeocoderInput.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,MAAM,CAAA;QACvB,iBAAiB,EAAE,MAAM,CAAA;QACzB,gBAAgB,EAAE,MAAM,CAAA;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAA;QACnC,oBAAoB,CAAC,EAAE,MAAM,CAAA;QAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC5B,KAAK,IAAI,CAAA;IACV,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,kBAAkB,qBAsBtG"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import Geocoder from "../../map/src/Geocoder";
|
|
3
|
-
function GeocoderInput({ onSelect }) {
|
|
3
|
+
function GeocoderInput({ onSelect, geocodeEarthApiKey, geocoderUrl }) {
|
|
4
4
|
return /* @__PURE__ */ jsx(
|
|
5
5
|
Geocoder,
|
|
6
6
|
{
|
|
7
7
|
showDatabaseBuildings: false,
|
|
8
8
|
alwaysExpanded: true,
|
|
9
|
+
geocodeEarthApiKey,
|
|
10
|
+
geocoderUrl,
|
|
9
11
|
onSelect: (addressData) => {
|
|
10
12
|
if (!addressData) return;
|
|
11
13
|
const { formatted_address, coordinates, properties } = addressData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/GeocoderInput.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport Geocoder from '../../map/src/Geocoder'\r\n\r\ninterface GeocoderInputProps {\r\n onSelect: (fields: {\r\n buildingAddress: string\r\n buildingLongitude: number\r\n buildingLatitude: number\r\n buildingStreetName?: string\r\n buildingCountrySubdivision?: string\r\n buildingMunicipality?: string\r\n buildingPostalCode?: string\r\n }) => void\r\n}\r\n\r\nexport default function GeocoderInput({ onSelect }: GeocoderInputProps) {\r\n return (\r\n <Geocoder\r\n showDatabaseBuildings={false}\r\n alwaysExpanded={true}\r\n onSelect={(addressData: any) => {\r\n if (!addressData) return\r\n const { formatted_address, coordinates, properties } = addressData\r\n onSelect({\r\n buildingAddress: formatted_address,\r\n buildingLongitude: coordinates[0],\r\n buildingLatitude: coordinates[1],\r\n buildingStreetName: properties?.street,\r\n buildingCountrySubdivision: properties?.region_a || properties?.region,\r\n buildingMunicipality: properties?.locality || properties?.county,\r\n buildingPostalCode: properties?.postalcode,\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/GeocoderInput.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport Geocoder from '../../map/src/Geocoder'\r\n\r\ninterface GeocoderInputProps {\r\n onSelect: (fields: {\r\n buildingAddress: string\r\n buildingLongitude: number\r\n buildingLatitude: number\r\n buildingStreetName?: string\r\n buildingCountrySubdivision?: string\r\n buildingMunicipality?: string\r\n buildingPostalCode?: string\r\n }) => void\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport default function GeocoderInput({ onSelect, geocodeEarthApiKey, geocoderUrl }: GeocoderInputProps) {\r\n return (\r\n <Geocoder\r\n showDatabaseBuildings={false}\r\n alwaysExpanded={true}\r\n geocodeEarthApiKey={geocodeEarthApiKey}\r\n geocoderUrl={geocoderUrl}\r\n onSelect={(addressData: any) => {\r\n if (!addressData) return\r\n const { formatted_address, coordinates, properties } = addressData\r\n onSelect({\r\n buildingAddress: formatted_address,\r\n buildingLongitude: coordinates[0],\r\n buildingLatitude: coordinates[1],\r\n buildingStreetName: properties?.street,\r\n buildingCountrySubdivision: properties?.region_a || properties?.region,\r\n buildingMunicipality: properties?.locality || properties?.county,\r\n buildingPostalCode: properties?.postalcode,\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n"],"mappings":"AAsBI;AAlBJ,OAAO,cAAc;AAgBN,SAAR,cAA+B,EAAE,UAAU,oBAAoB,YAAY,GAAuB;AACvG,SACE;AAAA,IAAC;AAAA;AAAA,MACC,uBAAuB;AAAA,MACvB,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,UAAU,CAAC,gBAAqB;AAC9B,YAAI,CAAC,YAAa;AAClB,cAAM,EAAE,mBAAmB,aAAa,WAAW,IAAI;AACvD,iBAAS;AAAA,UACP,iBAAiB;AAAA,UACjB,mBAAmB,YAAY,CAAC;AAAA,UAChC,kBAAkB,YAAY,CAAC;AAAA,UAC/B,oBAAoB,yCAAY;AAAA,UAChC,6BAA4B,yCAAY,cAAY,yCAAY;AAAA,UAChE,uBAAsB,yCAAY,cAAY,yCAAY;AAAA,UAC1D,oBAAoB,yCAAY;AAAA,QAClC,CAAC;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -6,7 +6,8 @@ interface DetailHeaderProps {
|
|
|
6
6
|
selectedInfrastructure?: Infrastructure | null;
|
|
7
7
|
selectedFile?: FileRow | null;
|
|
8
8
|
selectedUser?: Partial<User> | null;
|
|
9
|
+
countryCode?: string | null;
|
|
9
10
|
}
|
|
10
|
-
export default function DetailHeader({ selectedItem, selectedSite, selectedInfrastructure, selectedFile, selectedUser, }: DetailHeaderProps): import("react").JSX.Element;
|
|
11
|
+
export default function DetailHeader({ selectedItem, selectedSite, selectedInfrastructure, selectedFile, selectedUser, countryCode, }: DetailHeaderProps): import("react").JSX.Element;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=DetailHeader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailHeader.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/details/DetailHeader.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAA;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"DetailHeader.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/details/DetailHeader.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAA;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAYtD,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC9B,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAC1B,sBAAsB,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAC9C,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAoFD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,EAAE,iBAAiB,+BAkBnB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import * as LR from "lucide-react";
|
|
4
|
-
import { useAppConfigContext } from "../../../../store/AppConfig/context";
|
|
5
4
|
function getCountryName(code) {
|
|
6
5
|
var _a;
|
|
7
6
|
if (!code) return null;
|
|
@@ -70,11 +69,10 @@ function DetailHeader({
|
|
|
70
69
|
selectedSite,
|
|
71
70
|
selectedInfrastructure,
|
|
72
71
|
selectedFile,
|
|
73
|
-
selectedUser
|
|
72
|
+
selectedUser,
|
|
73
|
+
countryCode
|
|
74
74
|
}) {
|
|
75
|
-
|
|
76
|
-
const { state: appConfigState } = useAppConfigContext();
|
|
77
|
-
const countryName = getCountryName((_a = appConfigState.appConfig.organization) == null ? void 0 : _a.country);
|
|
75
|
+
const countryName = getCountryName(countryCode);
|
|
78
76
|
return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: selectedItem ? /* @__PURE__ */ jsx(BuildingHeader, { building: selectedItem, countryName }) : selectedSite ? /* @__PURE__ */ jsx(SiteHeader, { site: selectedSite, countryName }) : selectedInfrastructure ? /* @__PURE__ */ jsx(InfrastructureHeader, { infrastructure: selectedInfrastructure, countryName }) : selectedFile ? /* @__PURE__ */ jsx(FileHeader, { file: selectedFile }) : selectedUser ? /* @__PURE__ */ jsx(UserHeader, { user: selectedUser }) : null });
|
|
79
77
|
}
|
|
80
78
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/details/DetailHeader.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 LR from 'lucide-react'\r\nimport type { Building, Infrastructure, Site, User } from '../../../../types/dbTypes'\r\nimport type { FileRow } from '../../../../types/files'\r\
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/details/DetailHeader.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 LR from 'lucide-react'\r\nimport type { Building, Infrastructure, Site, User } from '../../../../types/dbTypes'\r\nimport type { FileRow } from '../../../../types/files'\r\n\r\nfunction getCountryName(code: string | null | undefined): string | null {\r\n if (!code) return null\r\n try {\r\n return new Intl.DisplayNames(['en'], { type: 'region' }).of(code.toUpperCase()) ?? null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n// Types\r\ninterface DetailHeaderProps {\r\n selectedItem?: Building | null\r\n selectedSite?: Site | null\r\n selectedInfrastructure?: Infrastructure | null\r\n selectedFile?: FileRow | null\r\n selectedUser?: Partial<User> | null\r\n countryCode?: string | null\r\n}\r\n\r\n// Sub-components — one per entity type, all follow the same shape:\r\n// icon + primary title (name || fallback) + optional subtitle\r\n\r\nfunction BuildingHeader({ building, countryName }: { building: Building; countryName: string | null }) {\r\n const title = building.buildingName || building.buildingAddress\r\n const parts = [building.buildingCountrySubdivision, countryName].filter(Boolean)\r\n const subtitle = building.buildingName\r\n ? building.buildingAddress\r\n : parts.length ? parts.join(', ') : (building.buildingAddress ?? '')\r\n\r\n return (\r\n <>\r\n <LR.Building2 className=\"h-8 w-8 shrink-0\" />\r\n <div>\r\n <h1 className=\"text-2xl font-semibold\">{title}</h1>\r\n <p className=\"text-muted-foreground\">{subtitle}</p>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nfunction SiteHeader({ site, countryName }: { site: Site; countryName: string | null }) {\r\n const title = site.siteName || site.siteAddress\r\n const parts = [site.siteCountrySubdivision, countryName].filter(Boolean)\r\n const subtitle = site.siteName\r\n ? site.siteAddress\r\n : parts.length ? parts.join(', ') : (site.siteAddress ?? '')\r\n\r\n return (\r\n <>\r\n <LR.BoxSelect className=\"h-8 w-8 shrink-0\" />\r\n <div>\r\n <h1 className=\"text-2xl font-semibold\">{title}</h1>\r\n <p className=\"text-muted-foreground\">{subtitle}</p>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nfunction InfrastructureHeader({ infrastructure, countryName }: { infrastructure: Infrastructure; countryName: string | null }) {\r\n const title = infrastructure.infrastructureName || infrastructure.infrastructureType\r\n const parts = [infrastructure.infrastructureCountrySubdivision, countryName].filter(Boolean)\r\n const subtitle = infrastructure.infrastructureName\r\n ? infrastructure.infrastructureType\r\n : parts.length ? parts.join(', ') : (infrastructure.infrastructureType ?? '')\r\n\r\n return (\r\n <>\r\n <LR.TrainTrack className=\"h-8 w-8 shrink-0\" />\r\n <div>\r\n <h1 className=\"text-2xl font-semibold\">{title}</h1>\r\n <p className=\"text-muted-foreground\">{subtitle}</p>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nfunction FileHeader({ file }: { file: FileRow }) {\r\n return (\r\n <>\r\n <LR.File className=\"h-8 w-8 shrink-0\" />\r\n <div>\r\n <h1 className=\"text-2xl font-semibold\">{file.name}</h1>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nfunction UserHeader({ user }: { user: Partial<User> }) {\r\n return (\r\n <>\r\n <LR.Users className=\"h-8 w-8 shrink-0\" />\r\n <div>\r\n <h1 className=\"text-2xl font-semibold\">{user.name || 'New User'}</h1>\r\n {user.email && <p className=\"text-muted-foreground\">{user.email}</p>}\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\n// DetailHeader — resolves which sub-component to render\r\n\r\nexport default function DetailHeader({\r\n selectedItem,\r\n selectedSite,\r\n selectedInfrastructure,\r\n selectedFile,\r\n selectedUser,\r\n countryCode,\r\n}: DetailHeaderProps) {\r\n const countryName = getCountryName(countryCode)\r\n\r\n return (\r\n <div className=\"flex items-center gap-4\">\r\n {selectedItem\r\n ? <BuildingHeader building={selectedItem} countryName={countryName} />\r\n : selectedSite\r\n ? <SiteHeader site={selectedSite} countryName={countryName} />\r\n : selectedInfrastructure\r\n ? <InfrastructureHeader infrastructure={selectedInfrastructure} countryName={countryName} />\r\n : selectedFile\r\n ? <FileHeader file={selectedFile} />\r\n : selectedUser\r\n ? <UserHeader user={selectedUser} />\r\n : null}\r\n </div>\r\n )\r\n}"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,13 @@ import * as React from 'react';
|
|
|
2
2
|
import { Organization } from '../../types/dbTypes';
|
|
3
3
|
interface ViewerProps {
|
|
4
4
|
organization: Organization;
|
|
5
|
+
minioBaseUrl?: string;
|
|
6
|
+
martinBaseUrl?: string;
|
|
7
|
+
pointcloudApiUrl?: string;
|
|
8
|
+
maptilerKey?: string;
|
|
9
|
+
geocodeEarthApiKey?: string;
|
|
10
|
+
geocoderUrl?: string;
|
|
5
11
|
}
|
|
6
|
-
export declare function Viewer({ organization }: ViewerProps): React.JSX.Element;
|
|
12
|
+
export declare function Viewer({ organization, minioBaseUrl, martinBaseUrl, pointcloudApiUrl, maptilerKey, geocodeEarthApiKey, geocoderUrl }: ViewerProps): React.JSX.Element;
|
|
7
13
|
export {};
|
|
8
14
|
//# sourceMappingURL=Viewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewer.d.ts","sourceRoot":"","sources":["../../../../src/core/components/viewers/Viewer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAsClD,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"Viewer.d.ts","sourceRoot":"","sources":["../../../../src/core/components/viewers/Viewer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAsClD,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,MAAM,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,WAAW,qBAyHhJ"}
|
|
@@ -29,7 +29,7 @@ function ViewerLoadingFallback({ label }) {
|
|
|
29
29
|
/* @__PURE__ */ jsx("span", { className: "text-foreground text-base font-medium font-['Inter'] leading-7", children: label })
|
|
30
30
|
] }) });
|
|
31
31
|
}
|
|
32
|
-
function Viewer({ organization }) {
|
|
32
|
+
function Viewer({ organization, minioBaseUrl, martinBaseUrl, pointcloudApiUrl, maptilerKey, geocodeEarthApiKey, geocoderUrl }) {
|
|
33
33
|
const searchParams = useSearchParams();
|
|
34
34
|
const viewer = searchParams.get("viewer") || ViewerNames.map;
|
|
35
35
|
const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext);
|
|
@@ -98,16 +98,16 @@ function Viewer({ organization }) {
|
|
|
98
98
|
const selectedViewer = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
99
99
|
[ViewerNames.map, ViewerNames.bim, ViewerNames.pointcloud].includes(validViewer) && /* @__PURE__ */ jsx(SidebarTrigger, {}),
|
|
100
100
|
/* @__PURE__ */ jsxs("div", { style: { height: "100%", width: "100%", position: "relative" }, children: [
|
|
101
|
-
/* @__PURE__ */ jsx("div", { style: { display: validViewer === ViewerNames.map ? "block" : "none", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx(MapViewer, { organization }) }),
|
|
101
|
+
/* @__PURE__ */ jsx("div", { style: { display: validViewer === ViewerNames.map ? "block" : "none", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx(MapViewer, { organization, minioBaseUrl, maptilerKey }) }),
|
|
102
102
|
validViewer === ViewerNames.bim && /* @__PURE__ */ jsx(BimViewer, {}),
|
|
103
|
-
validViewer === ViewerNames.pointcloud && /* @__PURE__ */ jsx(PointCloudViewer, {}),
|
|
104
|
-
[ViewerNames.buildings, ViewerNames.sites, ViewerNames.files, ViewerNames.land, ViewerNames.infrastructure, ViewerNames.extensions, ViewerNames.users].includes(validViewer) && /* @__PURE__ */ jsx(DataMenu, { currentViewer: validViewer }),
|
|
105
|
-
[ViewerNames.settings].includes(validViewer) && /* @__PURE__ */ jsx(UserSettings, {})
|
|
103
|
+
validViewer === ViewerNames.pointcloud && /* @__PURE__ */ jsx(PointCloudViewer, { pointcloudApiUrl }),
|
|
104
|
+
[ViewerNames.buildings, ViewerNames.sites, ViewerNames.files, ViewerNames.land, ViewerNames.infrastructure, ViewerNames.extensions, ViewerNames.users].includes(validViewer) && /* @__PURE__ */ jsx(DataMenu, { currentViewer: validViewer, organization, geocodeEarthApiKey, geocoderUrl }),
|
|
105
|
+
[ViewerNames.settings].includes(validViewer) && /* @__PURE__ */ jsx(UserSettings, { minioBaseUrl })
|
|
106
106
|
] })
|
|
107
107
|
] });
|
|
108
108
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
109
109
|
selectedViewer,
|
|
110
|
-
/* @__PURE__ */ jsx(Toolbar, { viewer: validViewer })
|
|
110
|
+
/* @__PURE__ */ jsx(Toolbar, { viewer: validViewer, minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl })
|
|
111
111
|
] });
|
|
112
112
|
}
|
|
113
113
|
export {
|