@collabdt/core 0.3.1 → 0.3.3
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/authentication/ForgotPassword.d.ts.map +1 -1
- package/dist/core/components/authentication/ForgotPassword.js +0 -1
- package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts +12 -2
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.js +137 -139
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
- package/dist/core/components/ui/Comments/Comment.d.ts +18 -1
- package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/Comment.js +94 -23
- package/dist/core/components/ui/Comments/Comment.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentActionButtons.d.ts +38 -0
- package/dist/core/components/ui/Comments/CommentActionButtons.d.ts.map +1 -0
- package/dist/core/components/ui/Comments/CommentActionButtons.js +134 -0
- package/dist/core/components/ui/Comments/CommentActionButtons.js.map +1 -0
- package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentInput.js +5 -2
- package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.js +86 -42
- package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
- package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/commentUtils.js +2 -1
- package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js +0 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.js +16 -12
- package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +1 -2
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +66 -94
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
- package/dist/core/components/ui/Sensors/Sensor.d.ts +16 -3
- package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/Sensor.js +76 -37
- package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorChart.d.ts +12 -2
- package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorChart.js +49 -12
- package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts +9 -0
- package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts.map +1 -0
- package/dist/core/components/ui/Sensors/SensorDetailDialog.js +128 -0
- package/dist/core/components/ui/Sensors/SensorDetailDialog.js.map +1 -0
- package/dist/core/components/ui/Sensors/SensorInput.d.ts +6 -1
- package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorInput.js +94 -9
- package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts +3 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.js +4 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts +1 -3
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js +33 -10
- package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
- package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts +7 -0
- package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts.map +1 -0
- package/dist/core/components/ui/Sensors/TimeZoneSelect.js +56 -0
- package/dist/core/components/ui/Sensors/TimeZoneSelect.js.map +1 -0
- package/dist/core/components/ui/Sensors/sensorData.d.ts +42 -0
- package/dist/core/components/ui/Sensors/sensorData.d.ts.map +1 -0
- package/dist/core/components/ui/Sensors/sensorData.js +118 -0
- package/dist/core/components/ui/Sensors/sensorData.js.map +1 -0
- package/dist/core/components/ui/Sensors/sensorRange.d.ts +24 -0
- package/dist/core/components/ui/Sensors/sensorRange.d.ts.map +1 -0
- package/dist/core/components/ui/Sensors/sensorRange.js +34 -0
- package/dist/core/components/ui/Sensors/sensorRange.js.map +1 -0
- package/dist/core/components/ui/Sensors/useSensorSeries.d.ts +15 -0
- package/dist/core/components/ui/Sensors/useSensorSeries.d.ts.map +1 -0
- package/dist/core/components/ui/Sensors/useSensorSeries.js +63 -0
- package/dist/core/components/ui/Sensors/useSensorSeries.js.map +1 -0
- package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
- package/dist/core/components/ui/Sidebar.js +27 -4
- package/dist/core/components/ui/Sidebar.js.map +1 -1
- package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
- package/dist/core/components/ui/ToolbarButton.js +0 -1
- package/dist/core/components/ui/ToolbarButton.js.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js +0 -2
- package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
- package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js +0 -10
- package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
- package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/DatatableFileAdder.js +0 -1
- package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
- package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js +0 -1
- package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js +0 -1
- package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/filterHelper.js +0 -2
- package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
- package/dist/core/components/viewers/Viewer.js +1 -1
- package/dist/core/components/viewers/Viewer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +0 -3
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +1 -7
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js +1 -9
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +1 -3
- 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/TabSelector.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js +4 -3
- package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.js +0 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +1 -2
- 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 +25 -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/BimComment.d.ts +16 -10
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js +26 -6
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts +2 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js +5 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts +8 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +15 -3
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts +44 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js +77 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts +3 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js +5 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts +33 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js +90 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js.map +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js +2 -2
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts +7 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js +50 -73
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +7 -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 +39 -11
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js +1 -5
- package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js +0 -1
- package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/measureBimTool.js +1 -2
- package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.d.ts +1 -2
- 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/src/arcGISDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js +11 -14
- package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js +2 -5
- package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js +0 -3
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js +0 -11
- package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js +0 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +0 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js +0 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +1 -2
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -2
- package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js +174 -53
- package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js +2 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +1 -3
- 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 +74 -42
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js +4 -3
- package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.js +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js +0 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js +1 -5
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +1 -3
- 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/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js +1 -3
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +0 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/flyToEach.js +0 -1
- package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js +0 -2
- package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
- package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts +19 -0
- package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts.map +1 -0
- package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js +108 -0
- package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js.map +1 -0
- package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts +24 -0
- package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts.map +1 -0
- package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js +27 -0
- package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js.map +1 -0
- package/dist/core/components/viewers/shared/markers/types.d.ts +66 -0
- package/dist/core/components/viewers/shared/markers/types.d.ts.map +1 -0
- package/dist/core/components/viewers/shared/markers/types.js +1 -0
- package/dist/core/components/viewers/shared/markers/types.js.map +1 -0
- package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts +22 -0
- package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts.map +1 -0
- package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js +233 -0
- package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js.map +1 -0
- package/dist/core/hooks/comments/comments.d.ts +11 -0
- package/dist/core/hooks/comments/comments.d.ts.map +1 -1
- package/dist/core/hooks/comments/comments.js +3 -1
- package/dist/core/hooks/comments/comments.js.map +1 -1
- package/dist/core/hooks/comments/createCommentHooks.d.ts +11 -0
- package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
- package/dist/core/hooks/comments/createCommentHooks.js +30 -1
- package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
- package/dist/core/hooks/files/files.d.ts.map +1 -1
- package/dist/core/hooks/files/files.js +0 -1
- package/dist/core/hooks/files/files.js.map +1 -1
- package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts +30 -0
- package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts.map +1 -0
- package/dist/core/hooks/ui/useResizableSidebarWidth.js +75 -0
- package/dist/core/hooks/ui/useResizableSidebarWidth.js.map +1 -0
- package/dist/core/i18n/messages/en.json +10 -1
- package/dist/core/i18n/messages/es.json +11 -2
- package/dist/core/i18n/messages/fr.json +11 -2
- package/dist/core/store/AppConfig/context.d.ts.map +1 -1
- package/dist/core/store/AppConfig/context.js +4 -1
- package/dist/core/store/AppConfig/context.js.map +1 -1
- package/dist/core/store/AppConfig/reducer.d.ts +10 -0
- package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
- package/dist/core/store/AppConfig/reducer.js +10 -0
- package/dist/core/store/AppConfig/reducer.js.map +1 -1
- package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
- package/dist/core/store/Datasets/reducer.js +0 -2
- package/dist/core/store/Datasets/reducer.js.map +1 -1
- package/dist/core/store/Files/reducer.js +0 -1
- package/dist/core/store/Files/reducer.js.map +1 -1
- package/dist/core/store/Menus/context.d.ts.map +1 -1
- package/dist/core/store/Menus/context.js +8 -2
- package/dist/core/store/Menus/context.js.map +1 -1
- package/dist/core/store/Menus/reducer.d.ts +65 -1
- package/dist/core/store/Menus/reducer.d.ts.map +1 -1
- package/dist/core/store/Menus/reducer.js +39 -3
- package/dist/core/store/Menus/reducer.js.map +1 -1
- package/dist/core/utils/markerUtils.d.ts +10 -0
- package/dist/core/utils/markerUtils.d.ts.map +1 -1
- package/dist/core/utils/markerUtils.js +9 -1
- package/dist/core/utils/markerUtils.js.map +1 -1
- package/dist/core/utils/memcache.d.ts.map +1 -1
- package/dist/core/utils/memcache.js +0 -7
- package/dist/core/utils/memcache.js.map +1 -1
- package/dist/core/utils/timeUtils.d.ts +24 -1
- package/dist/core/utils/timeUtils.d.ts.map +1 -1
- package/dist/core/utils/timeUtils.js +52 -3
- package/dist/core/utils/timeUtils.js.map +1 -1
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\n\r\nimport { CurrentWorld } from './CurrentWorld';\r\n\r\nexport class ClippingPlane extends OBC.Component {\r\n\r\n static readonly uuid = '29b2eabd-36cd-4b42-a62c-d0509bd67d60' as const\r\n\r\n private _enabled = false\r\n private clipper: OBC.Clipper\r\n private casters: OBC.Raycasters\r\n private world: OBC.World | null = null\r\n private container: HTMLElement | null = null\r\n\r\n get enabled() {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n this.clipper.enabled = value\r\n\r\n if (value) {\r\n this.setupClippingPlane()\r\n } else {\r\n this.removeEventListeners()\r\n }\r\n }\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ClippingPlane.uuid, this)\r\n\r\n // Initialize clipper and raycasters\r\n this.clipper = components.get(OBC.Clipper)\r\n this.casters = components.get(OBC.Raycasters)\r\n this.world = components.get(CurrentWorld).world\r\n\r\n // Initialize the raycaster for the world\r\n if (this.world) {\r\n this.casters.get(this.world)\r\n }\r\n\r\n // Get the container from the world's renderer\r\n if (this.world?.renderer?.three.domElement.parentElement) {\r\n this.container = this.world.renderer.three.domElement.parentElement\r\n }\r\n }\r\n\r\n private setupClippingPlane() {\r\n if (!this.world || !this.container) {\r\n console.warn('World and container must be set before enabling clipping plane')\r\n return\r\n }\r\n\r\n // Add double-click event listener to create clipping planes\r\n this.container.ondblclick = () => {\r\n if (this.enabled && this.world) {\r\n this.clipper.create(this.world)\r\n }\r\n }\r\n\r\n // Make container focusable and focused for keyboard events\r\n this.container.tabIndex = -1\r\n this.container.focus()\r\n\r\n // Add keyboard event listener for deleting clipping planes\r\n this.container.addEventListener('keydown', this.handleKeyDown)\r\n // Also add to window as fallback\r\n window.addEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private removeEventListeners() {\r\n if (this.container) {\r\n this.container.ondblclick = null\r\n this.container.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n window.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\n\r\nimport { CurrentWorld } from './CurrentWorld';\r\n\r\nexport class ClippingPlane extends OBC.Component {\r\n\r\n static readonly uuid = '29b2eabd-36cd-4b42-a62c-d0509bd67d60' as const\r\n\r\n private _enabled = false\r\n private clipper: OBC.Clipper\r\n private casters: OBC.Raycasters\r\n private world: OBC.World | null = null\r\n private container: HTMLElement | null = null\r\n\r\n get enabled() {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n this.clipper.enabled = value\r\n\r\n if (value) {\r\n this.setupClippingPlane()\r\n } else {\r\n this.removeEventListeners()\r\n }\r\n }\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ClippingPlane.uuid, this)\r\n\r\n // Initialize clipper and raycasters\r\n this.clipper = components.get(OBC.Clipper)\r\n this.casters = components.get(OBC.Raycasters)\r\n this.world = components.get(CurrentWorld).world\r\n\r\n // Initialize the raycaster for the world\r\n if (this.world) {\r\n this.casters.get(this.world)\r\n }\r\n\r\n // Get the container from the world's renderer\r\n if (this.world?.renderer?.three.domElement.parentElement) {\r\n this.container = this.world.renderer.three.domElement.parentElement\r\n }\r\n }\r\n\r\n private setupClippingPlane() {\r\n if (!this.world || !this.container) {\r\n console.warn('World and container must be set before enabling clipping plane')\r\n return\r\n }\r\n\r\n // Add double-click event listener to create clipping planes\r\n this.container.ondblclick = () => {\r\n if (this.enabled && this.world) {\r\n this.clipper.create(this.world)\r\n }\r\n }\r\n\r\n // Make container focusable and focused for keyboard events\r\n this.container.tabIndex = -1\r\n this.container.focus()\r\n\r\n // Add keyboard event listener for deleting clipping planes\r\n this.container.addEventListener('keydown', this.handleKeyDown)\r\n // Also add to window as fallback\r\n window.addEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private removeEventListeners() {\r\n if (this.container) {\r\n this.container.ondblclick = null\r\n this.container.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n window.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.code === \"Delete\" || event.code === \"Backspace\" || event.code === \"Escape\") {\r\n if (this.enabled && this.world) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.deletePlanes()\r\n }\r\n }\r\n }\r\n\r\n createPlanes() {\r\n if (this.enabled && this.world) {\r\n this.clipper.create(this.world)\r\n }\r\n }\r\n\r\n deletePlanes() {\r\n if (this.world) {\r\n this.clipper.deleteAll()\r\n }\r\n }\r\n\r\n dispose() {\r\n this.enabled = false\r\n this.removeEventListeners()\r\n this.world = null\r\n this.container = null\r\n }\r\n}"],"mappings":"AAGA,YAAY,SAAS;AAErB,SAAS,oBAAoB;AAEtB,MAAM,iBAAN,MAAM,uBAAsB,IAAI,UAAU;AAAA,EAyB7C,YAAY,YAA4B;AAhC5C;AAiCQ,UAAM,UAAU;AAtBpB,SAAQ,WAAW;AAGnB,SAAQ,QAA0B;AAClC,SAAQ,YAAgC;AAoExC,SAAQ,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,SAAS,YAAY,MAAM,SAAS,eAAe,MAAM,SAAS,UAAU;AAClF,YAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,eAAK,aAAa;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AAzDI,eAAW,IAAI,eAAc,MAAM,IAAI;AAGvC,SAAK,UAAU,WAAW,IAAI,IAAI,OAAO;AACzC,SAAK,UAAU,WAAW,IAAI,IAAI,UAAU;AAC5C,SAAK,QAAQ,WAAW,IAAI,YAAY,EAAE;AAG1C,QAAI,KAAK,OAAO;AACZ,WAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,IAC/B;AAGA,SAAI,gBAAK,UAAL,mBAAY,aAAZ,mBAAsB,MAAM,WAAW,eAAe;AACtD,WAAK,YAAY,KAAK,MAAM,SAAS,MAAM,WAAW;AAAA,IAC1D;AAAA,EACJ;AAAA,EAjCA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQ,OAAgB;AACxB,SAAK,WAAW;AAChB,SAAK,QAAQ,UAAU;AAEvB,QAAI,OAAO;AACP,WAAK,mBAAmB;AAAA,IAC5B,OAAO;AACH,WAAK,qBAAqB;AAAA,IAC9B;AAAA,EACJ;AAAA,EAsBQ,qBAAqB;AACzB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,WAAW;AAChC,cAAQ,KAAK,gEAAgE;AAC7E;AAAA,IACJ;AAGA,SAAK,UAAU,aAAa,MAAM;AAC9B,UAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,aAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,MAClC;AAAA,IACJ;AAGA,SAAK,UAAU,WAAW;AAC1B,SAAK,UAAU,MAAM;AAGrB,SAAK,UAAU,iBAAiB,WAAW,KAAK,aAAa;AAE7D,WAAO,iBAAiB,WAAW,KAAK,aAAa;AAAA,EACzD;AAAA,EAEQ,uBAAuB;AAC3B,QAAI,KAAK,WAAW;AAChB,WAAK,UAAU,aAAa;AAC5B,WAAK,UAAU,oBAAoB,WAAW,KAAK,aAAa;AAAA,IACpE;AACA,WAAO,oBAAoB,WAAW,KAAK,aAAa;AAAA,EAC5D;AAAA,EAYA,eAAe;AACX,QAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,WAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,eAAe;AACX,QAAI,KAAK,OAAO;AACZ,WAAK,QAAQ,UAAU;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,UAAU;AACN,SAAK,UAAU;AACf,SAAK,qBAAqB;AAC1B,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACrB;AACJ;AAxGa,eAEO,OAAO;AAFpB,IAAM,gBAAN;","names":[]}
|
|
@@ -2,9 +2,8 @@ import * as React from "react";
|
|
|
2
2
|
import type { Tool } from "../../../../../../types/tools";
|
|
3
3
|
interface AddToBimProps {
|
|
4
4
|
tool: Tool;
|
|
5
|
-
minioBaseUrl?: string;
|
|
6
5
|
[key: string]: unknown;
|
|
7
6
|
}
|
|
8
|
-
export default function AddToBim({ tool
|
|
7
|
+
export default function AddToBim({ tool }: AddToBimProps): React.JSX.Element;
|
|
9
8
|
export {};
|
|
10
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAuB9B,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,+BAA+B,CAAA;AAI1E,UAAU,aAAa;IACrB,IAAI,EAAE,IAAI,CAAA;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAkCD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,aAAa,qBA+QvD"}
|
|
@@ -11,6 +11,7 @@ import { ViewerNames } from "../../../../../../types/dbTypes";
|
|
|
11
11
|
import { Button, useSidebar } from "../../../../../ui";
|
|
12
12
|
import { CommentInput } from "../../../../../ui/Comments/CommentInput";
|
|
13
13
|
import { ViewerContextMenu } from "../../../../../ui/FilesManager";
|
|
14
|
+
import { SensorDetailDialog } from "../../../../../ui/Sensors/SensorDetailDialog";
|
|
14
15
|
import { SensorInput } from "../../../../../ui/Sensors/SensorInput";
|
|
15
16
|
import { FileAdderDialog } from "../../../../map/src/tools/AddTools/AddFile/FileAdder";
|
|
16
17
|
import { AddToBimToolbar } from "./src/AddToBimToolbar";
|
|
@@ -43,7 +44,7 @@ const FilePreview = ({ file, mousePosition }) => {
|
|
|
43
44
|
}
|
|
44
45
|
);
|
|
45
46
|
};
|
|
46
|
-
function AddToBim({ tool
|
|
47
|
+
function AddToBim({ tool }) {
|
|
47
48
|
var _a, _b;
|
|
48
49
|
const t = useTranslations("AddToBim");
|
|
49
50
|
const { dispatch: toolsDispatch, state: toolsState } = React.useContext(ToolsContext);
|
|
@@ -56,7 +57,7 @@ function AddToBim({ tool, minioBaseUrl }) {
|
|
|
56
57
|
const [addingMode, setAddingMode] = React.useState(null);
|
|
57
58
|
const [contextMenu, setContextMenu] = React.useState(null);
|
|
58
59
|
const { addPendingComment, removePendingComment, commentCount } = useCommentMarkers(world, buildingId);
|
|
59
|
-
const { addPendingSensor, removePendingSensor, sensorCount } = useSensorMarkers(world, buildingId
|
|
60
|
+
const { addPendingSensor, removePendingSensor, sensorCount, detailSensor, detailSensorType, closeSensorDetail, editSensor, closeSensorEdit } = useSensorMarkers(world, buildingId);
|
|
60
61
|
const { uploadFile } = useUploadFileToBuilding(buildingId);
|
|
61
62
|
const { deleteFile } = useDeleteFile(buildingId);
|
|
62
63
|
const filesData = useFilesByBuildingId(buildingId).files || [];
|
|
@@ -258,6 +259,28 @@ function AddToBim({ tool, minioBaseUrl }) {
|
|
|
258
259
|
}
|
|
259
260
|
}
|
|
260
261
|
),
|
|
262
|
+
/* @__PURE__ */ jsx(
|
|
263
|
+
SensorInput,
|
|
264
|
+
{
|
|
265
|
+
viewer: ViewerNames.bim,
|
|
266
|
+
layout: "dialog",
|
|
267
|
+
isOpen: !!editSensor,
|
|
268
|
+
editSensor: editSensor != null ? editSensor : void 0,
|
|
269
|
+
onCancel: closeSensorEdit,
|
|
270
|
+
onSaved: closeSensorEdit
|
|
271
|
+
}
|
|
272
|
+
),
|
|
273
|
+
detailSensor && /* @__PURE__ */ jsx(
|
|
274
|
+
SensorDetailDialog,
|
|
275
|
+
{
|
|
276
|
+
open: !!detailSensor,
|
|
277
|
+
onOpenChange: (o) => {
|
|
278
|
+
if (!o) closeSensorDetail();
|
|
279
|
+
},
|
|
280
|
+
sensor: detailSensor,
|
|
281
|
+
sensorType: detailSensorType
|
|
282
|
+
}
|
|
283
|
+
),
|
|
261
284
|
contextMenu && /* @__PURE__ */ jsx(
|
|
262
285
|
ViewerContextMenu,
|
|
263
286
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as LR from \"lucide-react\"\r\nimport Image from \"next/image\"\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from \"react\"\r\n\r\n\r\nimport { useFilesByBuildingId, useUploadFileToBuilding, useDeleteFile } from \"../../../../../../hooks/files/files\"\r\nimport { BuildingsContext, MenusContext, ToolsContext } from \"../../../../../../store\"\r\nimport { BimContext } from \"../../../../../../store/BIM/context\"\r\nimport { ViewerNames } from \"../../../../../../types/dbTypes\"\r\nimport { Button, useSidebar } from \"../../../../../ui\"\r\nimport { CommentInput } from \"../../../../../ui/Comments/CommentInput\"\r\nimport { ViewerContextMenu } from \"../../../../../ui/FilesManager\"\r\nimport { SensorInput } from \"../../../../../ui/Sensors/SensorInput\"\r\nimport { FileAdderDialog } from \"../../../../map/src/tools/AddTools/AddFile/FileAdder\"\r\n\r\nimport { AddToBimToolbar } from \"./src/AddToBimToolbar\"\r\nimport { initializeCSS2DRenderer } from \"./src/FileMarkerUtils\"\r\nimport Position3DCard from \"./src/Position3DCard\"\r\nimport { useCommentMarkers } from \"./src/useCommentMarkers\"\r\nimport { useFilePlacement } from \"./src/useFilePlacement\"\r\nimport { useSensorMarkers } from \"./src/useSensorMarkers\"\r\n\r\nimport type { DbFile } from \"../../../../../../types/dbTypes\"\r\nimport type { FileAction } from \"../../../../../../types/global\"\r\nimport type { Tool, ToolbarToolType } from \"../../../../../../types/tools\"\r\nimport type { FileMarkerAction } from \"../../../../../ui/FilesManager/src/FileMarker\"\r\nimport type { BimToolbarToolsType } from \"../bimToolbar\"\r\n\r\ninterface AddToBimProps {\r\n tool: Tool\r\n minioBaseUrl?: string\r\n [key: string]: unknown\r\n}\r\n\r\nconst FilePreview: React.FC<{\r\n file: File\r\n mousePosition: { x: number; y: number }\r\n}> = ({ file, mousePosition }) => {\r\n const [imageUrl, setImageUrl] = React.useState<string | null>(null)\r\n const isImage = file.type.startsWith(\"image/\")\r\n\r\n React.useEffect(() => {\r\n if (isImage) {\r\n const url = URL.createObjectURL(file)\r\n setImageUrl(url)\r\n return () => URL.revokeObjectURL(url)\r\n }\r\n }, [file, isImage])\r\n\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"fixed pointer-events-none z-[9999] bg-white/95 flex items-center gap-2 cursor-crosshair text-xs\"\r\n style={{ left: mousePosition.x + 10, top: mousePosition.y - 10 }}\r\n >\r\n {isImage && imageUrl ? (\r\n <Image src={imageUrl} alt={file.name} width={16} height={16} className=\"object-cover rounded\" />\r\n ) : (\r\n <LR.File size={16} className=\"text-black\" />\r\n )}\r\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap flex-1\">{file.name}</span>\r\n </Button>\r\n )\r\n}\r\n\r\nexport default function AddToBim({ tool, minioBaseUrl }: AddToBimProps) {\r\n const t = useTranslations('AddToBim')\r\n const { dispatch: toolsDispatch, state: toolsState } = React.useContext(ToolsContext)\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { bimComponents, world, fragments } = bimState.bim\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const buildingId = buildingState?.buildings?.building?.id || -1\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const [addingMode, setAddingMode] = React.useState<BimToolbarToolsType>(null)\r\n\r\n // Context menu state for right-click on BIM scene objects\r\n const [contextMenu, setContextMenu] = React.useState<{ x: number; y: number; file: DbFile } | null>(null)\r\n\r\n // Extracted hooks\r\n const { addPendingComment, removePendingComment, commentCount } = useCommentMarkers(world, buildingId)\r\n const { addPendingSensor, removePendingSensor, sensorCount } = useSensorMarkers(world, buildingId, minioBaseUrl)\r\n const { uploadFile } = useUploadFileToBuilding(buildingId)\r\n const { deleteFile } = useDeleteFile(buildingId)\r\n\r\n // Visible (added-to-scene) non-BIM files; also used to resolve a marker to its DB record.\r\n const filesData = useFilesByBuildingId(buildingId).files || []\r\n const filesDataRef = React.useRef(filesData)\r\n filesDataRef.current = filesData\r\n const visibleFileCount = filesData.filter(f => {\r\n const ext = f.extension?.toLowerCase()\r\n return ext !== \"ifc\" && ext !== \"frag\" && f.tag !== \"user\" && f.tag !== \"bim-file\" && f.isVisible\r\n }).length\r\n\r\n // Marker actions reach into the placement API after it is created, so route through a ref.\r\n const placementRef = React.useRef<ReturnType<typeof useFilePlacement> | null>(null)\r\n const handleMarkerAction = React.useCallback((id: string, action: FileMarkerAction) => {\r\n const api = placementRef.current\r\n if (!api) return\r\n if (action === \"delete\") {\r\n const placed = api.getPlacedFile(id)\r\n api.removePlacedFile(id)\r\n const dbFile = placed\r\n ? filesDataRef.current.find(f => f.name === placed.name && (f.id ?? 0) > 0)\r\n : undefined\r\n if (dbFile?.id) deleteFile(dbFile.id).catch(() => { })\r\n return\r\n }\r\n api.editPlacedFile(id, action === \"move\" ? \"translate\" : action)\r\n }, [deleteFile])\r\n\r\n const filePlacement = useFilePlacement(\r\n bimComponents, world, fragments, toolsDispatch, buildingId, uploadFile,\r\n handleMarkerAction,\r\n )\r\n placementRef.current = filePlacement\r\n\r\n // Initialize CSS2D renderer\r\n React.useEffect(() => {\r\n if (world) initializeCSS2DRenderer(world)\r\n }, [world])\r\n\r\n // Canvas-level right-click: raycast to detect hit, show context menu\r\n React.useEffect(() => {\r\n if (!world || !fragments) return\r\n const canvas = world.renderer?.three?.domElement\r\n if (!canvas) return\r\n\r\n const handleContextMenu = async (e: MouseEvent) => {\r\n // Prevent the browser default menu immediately, regardless of what we hit\r\n e.preventDefault()\r\n\r\n const mouse = new (await import(\"three\")).Vector2(e.clientX, e.clientY)\r\n const result = await filePlacement.raycast({\r\n camera: world.camera.three,\r\n mouse,\r\n dom: canvas,\r\n })\r\n\r\n // Try to identify which file was hit by matching model names in fragments\r\n const hitModelId = (result as any)?.modelId ?? (result as any)?.fragments?.modelId\r\n const matchedFile = hitModelId\r\n ? filesDataRef.current.find(f => f.name === hitModelId)\r\n : null\r\n\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n file: matchedFile ?? { id: 0, name: t('bimObject'), url: \"\", type: \"bim-file\" } as DbFile,\r\n })\r\n }\r\n\r\n canvas.addEventListener(\"contextmenu\", handleContextMenu)\r\n return () => canvas.removeEventListener(\"contextmenu\", handleContextMenu)\r\n }, [world, fragments, filePlacement.raycast])\r\n\r\n // Allow other UI to trigger AddToBim modes via currentToolId\r\n const { currentToolId } = toolsState.tools\r\n React.useEffect(() => {\r\n const bimAddModes: BimToolbarToolsType[] = [\r\n \"bim-add-file\", \"bim-add-comment\", \"bim-add-ids\",\r\n \"bim-add-ifc\", \"bim-add-bcf\", \"bim-add-cad\", \"bim-add-sensor\",\r\n ]\r\n if (bimAddModes.includes(currentToolId as BimToolbarToolsType)) {\r\n setAddingMode(currentToolId as BimToolbarToolsType)\r\n }\r\n }, [currentToolId])\r\n\r\n const startAdding = React.useCallback((mode: BimToolbarToolsType) => {\r\n setAddingMode(mode)\r\n toolsDispatch({ type: \"SET-TOOL\", payload: { currentToolId: mode } })\r\n // Crosshair is set by useFilePlacement.handleFileSelect after the user picks a file,\r\n // not here — so the cursor stays normal while the file picker is open.\r\n }, [toolsDispatch])\r\n\r\n const cancelAdding = React.useCallback(() => {\r\n setAddingMode(null)\r\n filePlacement.cancelPlacement()\r\n }, [filePlacement])\r\n\r\n // Sidebar navigation callbacks\r\n const openFileTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"file\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const openCommentsTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"communication\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const openSensorsTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"sensors\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const handleContextMenuAction = React.useCallback((_action: FileAction, _file: DbFile) => {\r\n openFileTab()\r\n }, [openFileTab])\r\n\r\n return (\r\n <>\r\n {/* File preview tooltip following cursor during placement */}\r\n {filePlacement.selectedFile && filePlacement.isPlacingFile && (\r\n <FilePreview file={filePlacement.selectedFile} mousePosition={filePlacement.mousePosition} />\r\n )}\r\n\r\n {/* Toolbar submenu */}\r\n <AddToBimToolbar\r\n tool={tool}\r\n onStartFile={() => startAdding(\"bim-add-file\")}\r\n onStartComment={() => startAdding(\"bim-add-comment\")}\r\n onStartCAD={() => startAdding(\"bim-add-cad\")}\r\n onStartSensor={() => startAdding(\"bim-add-sensor\")}\r\n fileCount={visibleFileCount}\r\n commentCount={commentCount}\r\n sensorCount={sensorCount}\r\n onFileBadgeClick={openFileTab}\r\n onCommentBadgeClick={openCommentsTab}\r\n onSensorBadgeClick={openSensorsTab}\r\n />\r\n\r\n {/* 3D position/scale card for DXF/GLB placement */}\r\n {filePlacement.show3DScaleCard && filePlacement.selectedFile && filePlacement.current3DFileType && (\r\n <Position3DCard\r\n fileType={filePlacement.current3DFileType}\r\n fileName={filePlacement.selectedFile.name}\r\n scale={filePlacement.fileScale}\r\n rotation={filePlacement.fileRotation}\r\n onScaleChange={filePlacement.setFileScale}\r\n onRotationChange={filePlacement.setFileRotation}\r\n onConfirm={() => {\r\n filePlacement.confirmPlacement()\r\n setAddingMode(null)\r\n }}\r\n onCancel={cancelAdding}\r\n />\r\n )}\r\n\r\n {/* File input card */}\r\n {addingMode === \"bim-add-file\" && !filePlacement.show3DScaleCard && (\r\n <FileAdderDialog\r\n isOpen={true}\r\n onClose={cancelAdding}\r\n title={t('addFile')}\r\n icon={LR.FilePlus}\r\n accept=\"*/*\"\r\n onFileSelect={(e) => filePlacement.handleFileSelect(e, addingMode)}\r\n onFileDrop={(file) => filePlacement.handleFileDrop(file, addingMode)}\r\n dropZoneTitle={t('dropZoneTitle')}\r\n dropZoneSubtext={t('dropZoneSubtext')}\r\n hide={filePlacement.isPlacingFile && !!filePlacement.selectedFile}\r\n />\r\n )}\r\n\r\n {addingMode === \"bim-add-cad\" && !filePlacement.show3DScaleCard && (\r\n <FileAdderDialog\r\n isOpen={true}\r\n onClose={cancelAdding}\r\n title={t('addCadFile')}\r\n icon={LR.DraftingCompass}\r\n accept=\".dxf,.dwg\"\r\n onFileSelect={(e) => filePlacement.handleFileSelect(e, addingMode)}\r\n onFileDrop={(file) => filePlacement.handleFileDrop(file, addingMode)}\r\n dropZoneTitle={t('dropZoneTitleCad')}\r\n dropZoneSubtext={t('dropZoneSubtextCad')}\r\n hide={filePlacement.isPlacingFile && !!filePlacement.selectedFile}\r\n />\r\n )}\r\n\r\n {/* Comment input */}\r\n <CommentInput\r\n viewer={ViewerNames.bim}\r\n layout=\"dialog\"\r\n isOpen={addingMode === \"bim-add-comment\"}\r\n onCancel={cancelAdding}\r\n bim={{\r\n world,\r\n raycast: filePlacement.raycast,\r\n buildingId,\r\n setCursor: filePlacement.setCursor,\r\n addPendingMarker: addPendingComment,\r\n removePendingMarker: removePendingComment,\r\n }}\r\n />\r\n\r\n {/* Sensor input */}\r\n <SensorInput\r\n viewer={ViewerNames.bim}\r\n layout=\"dialog\"\r\n isOpen={addingMode === \"bim-add-sensor\"}\r\n onCancel={cancelAdding}\r\n bim={{\r\n world,\r\n raycast: filePlacement.raycast,\r\n buildingId,\r\n setCursor: filePlacement.setCursor,\r\n addPendingMarker: addPendingSensor,\r\n removePendingMarker: removePendingSensor,\r\n }}\r\n />\r\n\r\n {/* Right-click context menu on BIM scene objects */}\r\n {contextMenu && (\r\n <ViewerContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n file={contextMenu.file}\r\n options={['view', 'move', 'delete']}\r\n onAction={handleContextMenuAction}\r\n onClose={() => setContextMenu(null)}\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as LR from \"lucide-react\"\r\nimport Image from \"next/image\"\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from \"react\"\r\n\r\n\r\nimport { useFilesByBuildingId, useUploadFileToBuilding, useDeleteFile } from \"../../../../../../hooks/files/files\"\r\nimport { BuildingsContext, MenusContext, ToolsContext } from \"../../../../../../store\"\r\nimport { BimContext } from \"../../../../../../store/BIM/context\"\r\nimport { ViewerNames } from \"../../../../../../types/dbTypes\"\r\nimport { Button, useSidebar } from \"../../../../../ui\"\r\nimport { CommentInput } from \"../../../../../ui/Comments/CommentInput\"\r\nimport { ViewerContextMenu } from \"../../../../../ui/FilesManager\"\r\nimport { SensorDetailDialog } from \"../../../../../ui/Sensors/SensorDetailDialog\"\r\nimport { SensorInput } from \"../../../../../ui/Sensors/SensorInput\"\r\nimport { FileAdderDialog } from \"../../../../map/src/tools/AddTools/AddFile/FileAdder\"\r\n\r\nimport { AddToBimToolbar } from \"./src/AddToBimToolbar\"\r\nimport { initializeCSS2DRenderer } from \"./src/FileMarkerUtils\"\r\nimport Position3DCard from \"./src/Position3DCard\"\r\nimport { useCommentMarkers } from \"./src/useCommentMarkers\"\r\nimport { useFilePlacement } from \"./src/useFilePlacement\"\r\nimport { useSensorMarkers } from \"./src/useSensorMarkers\"\r\n\r\nimport type { DbFile } from \"../../../../../../types/dbTypes\"\r\nimport type { FileAction } from \"../../../../../../types/global\"\r\nimport type { Tool, ToolbarToolType } from \"../../../../../../types/tools\"\r\nimport type { FileMarkerAction } from \"../../../../../ui/FilesManager/src/FileMarker\"\r\nimport type { BimToolbarToolsType } from \"../bimToolbar\"\r\n\r\ninterface AddToBimProps {\r\n tool: Tool\r\n [key: string]: unknown\r\n}\r\n\r\nconst FilePreview: React.FC<{\r\n file: File\r\n mousePosition: { x: number; y: number }\r\n}> = ({ file, mousePosition }) => {\r\n const [imageUrl, setImageUrl] = React.useState<string | null>(null)\r\n const isImage = file.type.startsWith(\"image/\")\r\n\r\n React.useEffect(() => {\r\n if (isImage) {\r\n const url = URL.createObjectURL(file)\r\n setImageUrl(url)\r\n return () => URL.revokeObjectURL(url)\r\n }\r\n }, [file, isImage])\r\n\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"fixed pointer-events-none z-[9999] bg-white/95 flex items-center gap-2 cursor-crosshair text-xs\"\r\n style={{ left: mousePosition.x + 10, top: mousePosition.y - 10 }}\r\n >\r\n {isImage && imageUrl ? (\r\n <Image src={imageUrl} alt={file.name} width={16} height={16} className=\"object-cover rounded\" />\r\n ) : (\r\n <LR.File size={16} className=\"text-black\" />\r\n )}\r\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap flex-1\">{file.name}</span>\r\n </Button>\r\n )\r\n}\r\n\r\nexport default function AddToBim({ tool }: AddToBimProps) {\r\n const t = useTranslations('AddToBim')\r\n const { dispatch: toolsDispatch, state: toolsState } = React.useContext(ToolsContext)\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { bimComponents, world, fragments } = bimState.bim\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const buildingId = buildingState?.buildings?.building?.id || -1\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const [addingMode, setAddingMode] = React.useState<BimToolbarToolsType>(null)\r\n\r\n // Context menu state for right-click on BIM scene objects\r\n const [contextMenu, setContextMenu] = React.useState<{ x: number; y: number; file: DbFile } | null>(null)\r\n\r\n // Extracted hooks\r\n const { addPendingComment, removePendingComment, commentCount } = useCommentMarkers(world, buildingId)\r\n const { addPendingSensor, removePendingSensor, sensorCount, detailSensor, detailSensorType, closeSensorDetail, editSensor, closeSensorEdit } = useSensorMarkers(world, buildingId)\r\n const { uploadFile } = useUploadFileToBuilding(buildingId)\r\n const { deleteFile } = useDeleteFile(buildingId)\r\n\r\n // Visible (added-to-scene) non-BIM files; also used to resolve a marker to its DB record.\r\n const filesData = useFilesByBuildingId(buildingId).files || []\r\n const filesDataRef = React.useRef(filesData)\r\n filesDataRef.current = filesData\r\n const visibleFileCount = filesData.filter(f => {\r\n const ext = f.extension?.toLowerCase()\r\n return ext !== \"ifc\" && ext !== \"frag\" && f.tag !== \"user\" && f.tag !== \"bim-file\" && f.isVisible\r\n }).length\r\n\r\n // Marker actions reach into the placement API after it is created, so route through a ref.\r\n const placementRef = React.useRef<ReturnType<typeof useFilePlacement> | null>(null)\r\n const handleMarkerAction = React.useCallback((id: string, action: FileMarkerAction) => {\r\n const api = placementRef.current\r\n if (!api) return\r\n if (action === \"delete\") {\r\n const placed = api.getPlacedFile(id)\r\n api.removePlacedFile(id)\r\n const dbFile = placed\r\n ? filesDataRef.current.find(f => f.name === placed.name && (f.id ?? 0) > 0)\r\n : undefined\r\n if (dbFile?.id) deleteFile(dbFile.id).catch(() => { })\r\n return\r\n }\r\n api.editPlacedFile(id, action === \"move\" ? \"translate\" : action)\r\n }, [deleteFile])\r\n\r\n const filePlacement = useFilePlacement(\r\n bimComponents, world, fragments, toolsDispatch, buildingId, uploadFile,\r\n handleMarkerAction,\r\n )\r\n placementRef.current = filePlacement\r\n\r\n // Initialize CSS2D renderer\r\n React.useEffect(() => {\r\n if (world) initializeCSS2DRenderer(world)\r\n }, [world])\r\n\r\n // Canvas-level right-click: raycast to detect hit, show context menu\r\n React.useEffect(() => {\r\n if (!world || !fragments) return\r\n const canvas = world.renderer?.three?.domElement\r\n if (!canvas) return\r\n\r\n const handleContextMenu = async (e: MouseEvent) => {\r\n // Prevent the browser default menu immediately, regardless of what we hit\r\n e.preventDefault()\r\n\r\n const mouse = new (await import(\"three\")).Vector2(e.clientX, e.clientY)\r\n const result = await filePlacement.raycast({\r\n camera: world.camera.three,\r\n mouse,\r\n dom: canvas,\r\n })\r\n\r\n // Try to identify which file was hit by matching model names in fragments\r\n const hitModelId = (result as any)?.modelId ?? (result as any)?.fragments?.modelId\r\n const matchedFile = hitModelId\r\n ? filesDataRef.current.find(f => f.name === hitModelId)\r\n : null\r\n\r\n setContextMenu({\r\n x: e.clientX,\r\n y: e.clientY,\r\n file: matchedFile ?? { id: 0, name: t('bimObject'), url: \"\", type: \"bim-file\" } as DbFile,\r\n })\r\n }\r\n\r\n canvas.addEventListener(\"contextmenu\", handleContextMenu)\r\n return () => canvas.removeEventListener(\"contextmenu\", handleContextMenu)\r\n }, [world, fragments, filePlacement.raycast])\r\n\r\n // Allow other UI to trigger AddToBim modes via currentToolId\r\n const { currentToolId } = toolsState.tools\r\n React.useEffect(() => {\r\n const bimAddModes: BimToolbarToolsType[] = [\r\n \"bim-add-file\", \"bim-add-comment\", \"bim-add-ids\",\r\n \"bim-add-ifc\", \"bim-add-bcf\", \"bim-add-cad\", \"bim-add-sensor\",\r\n ]\r\n if (bimAddModes.includes(currentToolId as BimToolbarToolsType)) {\r\n setAddingMode(currentToolId as BimToolbarToolsType)\r\n }\r\n }, [currentToolId])\r\n\r\n const startAdding = React.useCallback((mode: BimToolbarToolsType) => {\r\n setAddingMode(mode)\r\n toolsDispatch({ type: \"SET-TOOL\", payload: { currentToolId: mode } })\r\n // Crosshair is set by useFilePlacement.handleFileSelect after the user picks a file,\r\n // not here — so the cursor stays normal while the file picker is open.\r\n }, [toolsDispatch])\r\n\r\n const cancelAdding = React.useCallback(() => {\r\n setAddingMode(null)\r\n filePlacement.cancelPlacement()\r\n }, [filePlacement])\r\n\r\n // Sidebar navigation callbacks\r\n const openFileTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"file\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const openCommentsTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"communication\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const openSensorsTab = React.useCallback(() => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: \"sensors\" } })\r\n }, [setOpenInfo, menusDispatch])\r\n\r\n const handleContextMenuAction = React.useCallback((_action: FileAction, _file: DbFile) => {\r\n openFileTab()\r\n }, [openFileTab])\r\n\r\n return (\r\n <>\r\n {/* File preview tooltip following cursor during placement */}\r\n {filePlacement.selectedFile && filePlacement.isPlacingFile && (\r\n <FilePreview file={filePlacement.selectedFile} mousePosition={filePlacement.mousePosition} />\r\n )}\r\n\r\n {/* Toolbar submenu */}\r\n <AddToBimToolbar\r\n tool={tool}\r\n onStartFile={() => startAdding(\"bim-add-file\")}\r\n onStartComment={() => startAdding(\"bim-add-comment\")}\r\n onStartCAD={() => startAdding(\"bim-add-cad\")}\r\n onStartSensor={() => startAdding(\"bim-add-sensor\")}\r\n fileCount={visibleFileCount}\r\n commentCount={commentCount}\r\n sensorCount={sensorCount}\r\n onFileBadgeClick={openFileTab}\r\n onCommentBadgeClick={openCommentsTab}\r\n onSensorBadgeClick={openSensorsTab}\r\n />\r\n\r\n {/* 3D position/scale card for DXF/GLB placement */}\r\n {filePlacement.show3DScaleCard && filePlacement.selectedFile && filePlacement.current3DFileType && (\r\n <Position3DCard\r\n fileType={filePlacement.current3DFileType}\r\n fileName={filePlacement.selectedFile.name}\r\n scale={filePlacement.fileScale}\r\n rotation={filePlacement.fileRotation}\r\n onScaleChange={filePlacement.setFileScale}\r\n onRotationChange={filePlacement.setFileRotation}\r\n onConfirm={() => {\r\n filePlacement.confirmPlacement()\r\n setAddingMode(null)\r\n }}\r\n onCancel={cancelAdding}\r\n />\r\n )}\r\n\r\n {/* File input card */}\r\n {addingMode === \"bim-add-file\" && !filePlacement.show3DScaleCard && (\r\n <FileAdderDialog\r\n isOpen={true}\r\n onClose={cancelAdding}\r\n title={t('addFile')}\r\n icon={LR.FilePlus}\r\n accept=\"*/*\"\r\n onFileSelect={(e) => filePlacement.handleFileSelect(e, addingMode)}\r\n onFileDrop={(file) => filePlacement.handleFileDrop(file, addingMode)}\r\n dropZoneTitle={t('dropZoneTitle')}\r\n dropZoneSubtext={t('dropZoneSubtext')}\r\n hide={filePlacement.isPlacingFile && !!filePlacement.selectedFile}\r\n />\r\n )}\r\n\r\n {addingMode === \"bim-add-cad\" && !filePlacement.show3DScaleCard && (\r\n <FileAdderDialog\r\n isOpen={true}\r\n onClose={cancelAdding}\r\n title={t('addCadFile')}\r\n icon={LR.DraftingCompass}\r\n accept=\".dxf,.dwg\"\r\n onFileSelect={(e) => filePlacement.handleFileSelect(e, addingMode)}\r\n onFileDrop={(file) => filePlacement.handleFileDrop(file, addingMode)}\r\n dropZoneTitle={t('dropZoneTitleCad')}\r\n dropZoneSubtext={t('dropZoneSubtextCad')}\r\n hide={filePlacement.isPlacingFile && !!filePlacement.selectedFile}\r\n />\r\n )}\r\n\r\n {/* Comment input */}\r\n <CommentInput\r\n viewer={ViewerNames.bim}\r\n layout=\"dialog\"\r\n isOpen={addingMode === \"bim-add-comment\"}\r\n onCancel={cancelAdding}\r\n bim={{\r\n world,\r\n raycast: filePlacement.raycast,\r\n buildingId,\r\n setCursor: filePlacement.setCursor,\r\n addPendingMarker: addPendingComment,\r\n removePendingMarker: removePendingComment,\r\n }}\r\n />\r\n\r\n {/* Sensor input */}\r\n <SensorInput\r\n viewer={ViewerNames.bim}\r\n layout=\"dialog\"\r\n isOpen={addingMode === \"bim-add-sensor\"}\r\n onCancel={cancelAdding}\r\n bim={{\r\n world,\r\n raycast: filePlacement.raycast,\r\n buildingId,\r\n setCursor: filePlacement.setCursor,\r\n addPendingMarker: addPendingSensor,\r\n removePendingMarker: removePendingSensor,\r\n }}\r\n />\r\n\r\n {/* Sensor edit dialog (opened from a 3D sensor card's edit tool) */}\r\n <SensorInput\r\n viewer={ViewerNames.bim}\r\n layout=\"dialog\"\r\n isOpen={!!editSensor}\r\n editSensor={editSensor ?? undefined}\r\n onCancel={closeSensorEdit}\r\n onSaved={closeSensorEdit}\r\n />\r\n\r\n {/* Sensor detail dialog (hosted here, in the provider tree, since the 3D card root has none) */}\r\n {detailSensor && (\r\n <SensorDetailDialog\r\n open={!!detailSensor}\r\n onOpenChange={(o) => { if (!o) closeSensorDetail() }}\r\n sensor={detailSensor}\r\n sensorType={detailSensorType}\r\n />\r\n )}\r\n\r\n {/* Right-click context menu on BIM scene objects */}\r\n {contextMenu && (\r\n <ViewerContextMenu\r\n x={contextMenu.x}\r\n y={contextMenu.y}\r\n file={contextMenu.file}\r\n options={['view', 'move', 'delete']}\r\n onAction={handleContextMenuAction}\r\n onClose={() => setContextMenu(null)}\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
|
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import type
|
|
3
|
-
interface
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CommentActionLabels } from '../../../../../../ui/Comments/CommentActionButtons';
|
|
3
|
+
interface BimCommentProps {
|
|
4
4
|
userName: string;
|
|
5
5
|
userImage: number | null;
|
|
6
6
|
userImageFileId?: number | null;
|
|
7
|
-
worldCamera: THREE.Camera;
|
|
8
|
-
targetPoint: THREE.Vector3;
|
|
9
|
-
onRemove?: () => void;
|
|
10
|
-
onEdit?: () => void;
|
|
11
|
-
onClose: () => void;
|
|
12
7
|
buildingId?: number;
|
|
13
8
|
timestamp: Date;
|
|
14
9
|
text: string;
|
|
15
|
-
sphere: THREE.Object3D;
|
|
16
10
|
isPending?: boolean;
|
|
17
11
|
highlight?: boolean;
|
|
12
|
+
focused?: boolean;
|
|
13
|
+
showActions?: boolean;
|
|
14
|
+
canReply?: boolean;
|
|
15
|
+
canEdit?: boolean;
|
|
16
|
+
canDelete?: boolean;
|
|
17
|
+
actionLabels?: CommentActionLabels;
|
|
18
|
+
onRemove?: () => void;
|
|
19
|
+
onClose?: () => void;
|
|
20
|
+
onSelect?: () => void;
|
|
21
|
+
onFocus?: () => void;
|
|
22
|
+
onReply?: () => void;
|
|
23
|
+
onEdit?: () => void;
|
|
18
24
|
}
|
|
19
|
-
export default function BimComment({ userName, userImage, userImageFileId,
|
|
25
|
+
export default function BimComment({ userName, userImage, userImageFileId, buildingId, timestamp, text, isPending, highlight, focused, showActions, canReply, canEdit, canDelete, actionLabels, onRemove, onClose, onSelect, onFocus, onReply, onEdit, }: BimCommentProps): React.ReactElement;
|
|
20
26
|
export {};
|
|
21
27
|
//# sourceMappingURL=BimComment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BimComment.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"BimComment.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,eAAe,EACf,UAAU,EACV,SAAS,EACT,IAAI,EACJ,SAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,WAAmB,EACnB,QAAe,EACf,OAAc,EACd,SAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA2BtC"}
|
|
@@ -5,14 +5,23 @@ function BimComment({
|
|
|
5
5
|
userName,
|
|
6
6
|
userImage,
|
|
7
7
|
userImageFileId,
|
|
8
|
-
onRemove,
|
|
9
|
-
onEdit,
|
|
10
|
-
onClose,
|
|
11
8
|
buildingId,
|
|
12
9
|
timestamp,
|
|
13
10
|
text,
|
|
14
11
|
isPending = false,
|
|
15
|
-
highlight = false
|
|
12
|
+
highlight = false,
|
|
13
|
+
focused = false,
|
|
14
|
+
showActions = false,
|
|
15
|
+
canReply = true,
|
|
16
|
+
canEdit = true,
|
|
17
|
+
canDelete = true,
|
|
18
|
+
actionLabels,
|
|
19
|
+
onRemove,
|
|
20
|
+
onClose,
|
|
21
|
+
onSelect,
|
|
22
|
+
onFocus,
|
|
23
|
+
onReply,
|
|
24
|
+
onEdit
|
|
16
25
|
}) {
|
|
17
26
|
return /* @__PURE__ */ jsx(
|
|
18
27
|
Comment,
|
|
@@ -24,10 +33,21 @@ function BimComment({
|
|
|
24
33
|
text,
|
|
25
34
|
createdAt: timestamp,
|
|
26
35
|
isPending,
|
|
36
|
+
highlight,
|
|
37
|
+
focused,
|
|
38
|
+
showActions,
|
|
39
|
+
canReply,
|
|
40
|
+
canEdit,
|
|
41
|
+
canDelete,
|
|
42
|
+
actionLabels,
|
|
43
|
+
onRemove,
|
|
27
44
|
onClose,
|
|
45
|
+
onSelect,
|
|
46
|
+
onFocus,
|
|
47
|
+
onReply,
|
|
48
|
+
onEdit,
|
|
28
49
|
enableCollapse: true,
|
|
29
|
-
defaultCollapsed: true
|
|
30
|
-
highlight
|
|
50
|
+
defaultCollapsed: true
|
|
31
51
|
}
|
|
32
52
|
);
|
|
33
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.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
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.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\n\r\nimport Comment from '../../../../../../ui/Comments/Comment'\r\n\r\nimport type { CommentActionLabels } from '../../../../../../ui/Comments/CommentActionButtons'\r\n\r\ninterface BimCommentProps {\r\n userName: string\r\n userImage: number | null\r\n userImageFileId?: number | null\r\n buildingId?: number\r\n timestamp: Date\r\n text: string\r\n isPending?: boolean\r\n highlight?: boolean\r\n focused?: boolean\r\n showActions?: boolean\r\n canReply?: boolean\r\n canEdit?: boolean\r\n canDelete?: boolean\r\n actionLabels?: CommentActionLabels\r\n onRemove?: () => void\r\n onClose?: () => void\r\n onSelect?: () => void\r\n onFocus?: () => void\r\n onReply?: () => void\r\n onEdit?: () => void\r\n}\r\n\r\nexport default function BimComment({\r\n userName,\r\n userImage,\r\n userImageFileId,\r\n buildingId,\r\n timestamp,\r\n text,\r\n isPending = false,\r\n highlight = false,\r\n focused = false,\r\n showActions = false,\r\n canReply = true,\r\n canEdit = true,\r\n canDelete = true,\r\n actionLabels,\r\n onRemove,\r\n onClose,\r\n onSelect,\r\n onFocus,\r\n onReply,\r\n onEdit,\r\n}: BimCommentProps): React.ReactElement {\r\n return (\r\n <Comment\r\n userName={userName}\r\n userImage={userImage}\r\n userImageFileId={userImageFileId}\r\n buildingId={buildingId}\r\n text={text}\r\n createdAt={timestamp}\r\n isPending={isPending}\r\n highlight={highlight}\r\n focused={focused}\r\n showActions={showActions}\r\n canReply={canReply}\r\n canEdit={canEdit}\r\n canDelete={canDelete}\r\n actionLabels={actionLabels}\r\n onRemove={onRemove}\r\n onClose={onClose}\r\n onSelect={onSelect}\r\n onFocus={onFocus}\r\n onReply={onReply}\r\n onEdit={onEdit}\r\n enableCollapse\r\n defaultCollapsed\r\n />\r\n )\r\n}\r\n"],"mappings":";AAyDI;AAlDJ,OAAO,aAAa;AA2BL,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAc;AAAA,MACd,kBAAgB;AAAA;AAAA,EAClB;AAEJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BimCommentCluster.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,MAAM,gDAAgD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Re-export shim: the cluster bubble moved to the shared marker framework.\r\nexport { BimMarkerCluster as default } from \"../../../../../shared/markers/BimMarkerCluster\"\r\n"],"mappings":"AAIA,SAA6B,wBAAe;","names":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import type { SensorDataFormat, SensorType } from '../../../../../../../types/dbTypes';
|
|
3
|
+
import type { CommentActionLabels } from '../../../../../../ui/Comments/CommentActionButtons';
|
|
3
4
|
import type * as THREE from 'three';
|
|
4
5
|
interface SensorProps {
|
|
5
6
|
sensorName: string;
|
|
@@ -12,12 +13,18 @@ interface SensorProps {
|
|
|
12
13
|
targetPoint: THREE.Vector3;
|
|
13
14
|
onRemove?: () => void;
|
|
14
15
|
onEdit?: () => void;
|
|
16
|
+
onExpand?: () => void;
|
|
15
17
|
onClose: () => void;
|
|
16
18
|
buildingId?: number;
|
|
17
19
|
timestamp: Date;
|
|
18
20
|
sphere: THREE.Object3D;
|
|
19
21
|
highlight?: boolean;
|
|
22
|
+
timeZone?: string;
|
|
23
|
+
showActions?: boolean;
|
|
24
|
+
canEdit?: boolean;
|
|
25
|
+
canDelete?: boolean;
|
|
26
|
+
actionLabels?: CommentActionLabels;
|
|
20
27
|
}
|
|
21
|
-
export default function BimSensor({ sensorName, sensorType, tags, dataUrl, dataFormat, updateFrequency, onRemove, onEdit, onClose, buildingId, timestamp,
|
|
28
|
+
export default function BimSensor({ sensorName, sensorType, tags, dataUrl, dataFormat, updateFrequency, onRemove, onEdit, onExpand, onClose, buildingId, timestamp, highlight, timeZone, showActions, canEdit, canDelete, actionLabels, }: SensorProps): React.ReactElement;
|
|
22
29
|
export {};
|
|
23
30
|
//# sourceMappingURL=BimSensor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BimSensor.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,KAAK,CAAC,MAAM,CAAA;IACzB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"BimSensor.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AAC9F,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,KAAK,CAAC,MAAM,CAAA;IACzB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,mBAAmB,CAAA;CACnC;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,UAAU,EACV,UAAU,EACV,IAAI,EACJ,OAAO,EACP,UAAU,EACV,eAAe,EACf,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAiB,EACjB,QAAQ,EACR,WAAmB,EACnB,OAAc,EACd,SAAgB,EAChB,YAAY,GACb,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA+BlC"}
|
|
@@ -11,11 +11,16 @@ function BimSensor({
|
|
|
11
11
|
updateFrequency,
|
|
12
12
|
onRemove,
|
|
13
13
|
onEdit,
|
|
14
|
+
onExpand,
|
|
14
15
|
onClose,
|
|
15
16
|
buildingId,
|
|
16
17
|
timestamp,
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
highlight = false,
|
|
19
|
+
timeZone,
|
|
20
|
+
showActions = false,
|
|
21
|
+
canEdit = true,
|
|
22
|
+
canDelete = true,
|
|
23
|
+
actionLabels
|
|
19
24
|
}) {
|
|
20
25
|
return /* @__PURE__ */ jsx(
|
|
21
26
|
"div",
|
|
@@ -34,11 +39,18 @@ function BimSensor({
|
|
|
34
39
|
updateFrequency,
|
|
35
40
|
createdAt: timestamp,
|
|
36
41
|
onRemove,
|
|
42
|
+
onEdit,
|
|
43
|
+
onExpand,
|
|
37
44
|
onClose,
|
|
45
|
+
showActions,
|
|
46
|
+
canEdit,
|
|
47
|
+
canDelete,
|
|
48
|
+
actionLabels,
|
|
38
49
|
enableCollapse: true,
|
|
39
50
|
defaultCollapsed: true,
|
|
40
51
|
size: "sm",
|
|
41
|
-
highlight
|
|
52
|
+
highlight,
|
|
53
|
+
timeZone
|
|
42
54
|
}
|
|
43
55
|
)
|
|
44
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.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\n\r\nimport Sensor from '../../../../../../ui/Sensors/Sensor'\r\n\r\nimport { markerStyle, markerStyleHighlight } from './markerUtils'\r\n\r\nimport type { SensorDataFormat, SensorType } from '../../../../../../../types/dbTypes';\r\nimport type * as THREE from 'three'\r\n\r\ninterface SensorProps {\r\n sensorName: string\r\n sensorType: SensorType\r\n dataUrl: string\r\n dataFormat: SensorDataFormat\r\n updateFrequency: number\r\n tags?: string[]\r\n worldCamera: THREE.Camera\r\n targetPoint: THREE.Vector3\r\n onRemove?: () => void\r\n onEdit?: () => void\r\n onClose: () => void\r\n buildingId?: number\r\n timestamp: Date\r\n sphere: THREE.Object3D\r\n highlight?: boolean\r\n}\r\n\r\nexport default function BimSensor({\r\n sensorName,\r\n sensorType,\r\n tags,\r\n dataUrl,\r\n dataFormat,\r\n updateFrequency,\r\n onRemove,\r\n onEdit,\r\n onClose,\r\n buildingId,\r\n timestamp,\r\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.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\n\r\nimport Sensor from '../../../../../../ui/Sensors/Sensor'\r\n\r\nimport { markerStyle, markerStyleHighlight } from './markerUtils'\r\n\r\nimport type { SensorDataFormat, SensorType } from '../../../../../../../types/dbTypes';\r\nimport type { CommentActionLabels } from '../../../../../../ui/Comments/CommentActionButtons';\r\nimport type * as THREE from 'three'\r\n\r\ninterface SensorProps {\r\n sensorName: string\r\n sensorType: SensorType\r\n dataUrl: string\r\n dataFormat: SensorDataFormat\r\n updateFrequency: number\r\n tags?: string[]\r\n worldCamera: THREE.Camera\r\n targetPoint: THREE.Vector3\r\n onRemove?: () => void\r\n onEdit?: () => void\r\n onExpand?: () => void\r\n onClose: () => void\r\n buildingId?: number\r\n timestamp: Date\r\n sphere: THREE.Object3D\r\n highlight?: boolean\r\n timeZone?: string\r\n showActions?: boolean\r\n canEdit?: boolean\r\n canDelete?: boolean\r\n actionLabels?: CommentActionLabels\r\n}\r\n\r\nexport default function BimSensor({\r\n sensorName,\r\n sensorType,\r\n tags,\r\n dataUrl,\r\n dataFormat,\r\n updateFrequency,\r\n onRemove,\r\n onEdit,\r\n onExpand,\r\n onClose,\r\n buildingId,\r\n timestamp,\r\n highlight = false,\r\n timeZone,\r\n showActions = false,\r\n canEdit = true,\r\n canDelete = true,\r\n actionLabels,\r\n}: SensorProps): React.ReactElement {\r\n return (\r\n <div\r\n className={highlight ? markerStyleHighlight : markerStyle}\r\n >\r\n <Sensor\r\n buildingId={buildingId}\r\n sensorName={sensorName}\r\n sensorType={sensorType}\r\n tags={tags}\r\n tagsVariant=\"read-only\"\r\n dataUrl={dataUrl}\r\n dataFormat={dataFormat}\r\n updateFrequency={updateFrequency}\r\n createdAt={timestamp}\r\n onRemove={onRemove}\r\n onEdit={onEdit}\r\n onExpand={onExpand}\r\n onClose={onClose}\r\n showActions={showActions}\r\n canEdit={canEdit}\r\n canDelete={canDelete}\r\n actionLabels={actionLabels}\r\n enableCollapse\r\n defaultCollapsed\r\n size=\"sm\"\r\n highlight={highlight}\r\n timeZone={timeZone}\r\n />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA+DM;AAxDN,OAAO,YAAY;AAEnB,SAAS,aAAa,4BAA4B;AA8BnC,SAAR,UAA2B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AACF,GAAoC;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,YAAY,uBAAuB;AAAA,MAE9C;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAc;AAAA,UACd,kBAAgB;AAAA,UAChB,MAAK;AAAA,UACL;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* Screen-space clustering for 3D (BIM) comment markers.
|
|
4
|
+
*
|
|
5
|
+
* The BIM viewer renders each comment as an independent CSS2DObject at a world
|
|
6
|
+
* position, so markers that are close together (or aligned along the camera
|
|
7
|
+
* axis) overlap on screen. This groups markers whose projected screen positions
|
|
8
|
+
* fall within `threshold` pixels of each other so the caller can draw a single
|
|
9
|
+
* numbered cluster bubble instead of a pile of overlapping avatars.
|
|
10
|
+
*
|
|
11
|
+
* Pure and side-effect free (no scene mutation) so it can be unit tested.
|
|
12
|
+
*/
|
|
13
|
+
export interface HasWorldPosition {
|
|
14
|
+
id: number;
|
|
15
|
+
x?: number | null;
|
|
16
|
+
y?: number | null;
|
|
17
|
+
z?: number | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ScreenCluster<T> {
|
|
20
|
+
/** Stable key derived from member ids (sorted) — used for registry diffing. */
|
|
21
|
+
key: string;
|
|
22
|
+
screenX: number;
|
|
23
|
+
screenY: number;
|
|
24
|
+
worldCenter: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
z: number;
|
|
28
|
+
};
|
|
29
|
+
members: T[];
|
|
30
|
+
}
|
|
31
|
+
export interface ClusterResult<T> {
|
|
32
|
+
clusters: ScreenCluster<T>[];
|
|
33
|
+
singles: T[];
|
|
34
|
+
}
|
|
35
|
+
export interface ProjectedPoint {
|
|
36
|
+
screenX: number;
|
|
37
|
+
screenY: number;
|
|
38
|
+
/** false when the point is behind the camera. */
|
|
39
|
+
onScreen: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Project a world point to pixel coordinates for the given camera/viewport. */
|
|
42
|
+
export declare function projectPoint(x: number, y: number, z: number, camera: THREE.Camera, width: number, height: number): ProjectedPoint;
|
|
43
|
+
export declare function clusterMarkersByScreenSpace<T extends HasWorldPosition>(items: T[], camera: THREE.Camera, width: number, height: number, threshold?: number): ClusterResult<T>;
|
|
44
|
+
//# sourceMappingURL=clusterMarkersByScreenSpace.d.ts.map
|
package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clusterMarkersByScreenSpace.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,OAAO,EAAE,CAAC,EAAE,CAAA;CACb;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5B,OAAO,EAAE,CAAC,EAAE,CAAA;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,cAAc,CAYhB;AAOD,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,gBAAgB,EACpE,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,SAAK,GACb,aAAa,CAAC,CAAC,CAAC,CAiDlB"}
|
package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
import * as THREE from "three";
|
|
18
|
+
function projectPoint(x, y, z, camera, width, height) {
|
|
19
|
+
const pos = new THREE.Vector3(x, y, z);
|
|
20
|
+
const cameraSpace = pos.clone().applyMatrix4(camera.matrixWorldInverse);
|
|
21
|
+
const behind = cameraSpace.z >= 0;
|
|
22
|
+
const ndc = pos.project(camera);
|
|
23
|
+
return {
|
|
24
|
+
screenX: (ndc.x * 0.5 + 0.5) * width,
|
|
25
|
+
screenY: (-ndc.y * 0.5 + 0.5) * height,
|
|
26
|
+
onScreen: !behind
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function average(values) {
|
|
30
|
+
if (values.length === 0) return 0;
|
|
31
|
+
return values.reduce((sum, v) => sum + v, 0) / values.length;
|
|
32
|
+
}
|
|
33
|
+
function clusterMarkersByScreenSpace(items, camera, width, height, threshold = 44) {
|
|
34
|
+
const projected = items.filter(
|
|
35
|
+
(it) => it.x != null && it.y != null && it.z != null
|
|
36
|
+
).map((item) => __spreadValues({ item }, projectPoint(item.x, item.y, item.z, camera, width, height)));
|
|
37
|
+
const onScreen = projected.filter((p) => p.onScreen);
|
|
38
|
+
const clusters = [];
|
|
39
|
+
const singles = projected.filter((p) => !p.onScreen).map((p) => p.item);
|
|
40
|
+
const used = new Array(onScreen.length).fill(false);
|
|
41
|
+
for (let i = 0; i < onScreen.length; i++) {
|
|
42
|
+
if (used[i]) continue;
|
|
43
|
+
used[i] = true;
|
|
44
|
+
const group = [onScreen[i]];
|
|
45
|
+
for (let j = i + 1; j < onScreen.length; j++) {
|
|
46
|
+
if (used[j]) continue;
|
|
47
|
+
const dx = onScreen[i].screenX - onScreen[j].screenX;
|
|
48
|
+
const dy = onScreen[i].screenY - onScreen[j].screenY;
|
|
49
|
+
if (Math.hypot(dx, dy) <= threshold) {
|
|
50
|
+
used[j] = true;
|
|
51
|
+
group.push(onScreen[j]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (group.length === 1) {
|
|
55
|
+
singles.push(group[0].item);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const members = group.map((g) => g.item);
|
|
59
|
+
clusters.push({
|
|
60
|
+
key: members.map((m) => m.id).sort((a, b) => a - b).join("-"),
|
|
61
|
+
screenX: average(group.map((g) => g.screenX)),
|
|
62
|
+
screenY: average(group.map((g) => g.screenY)),
|
|
63
|
+
worldCenter: {
|
|
64
|
+
x: average(members.map((m) => m.x)),
|
|
65
|
+
y: average(members.map((m) => m.y)),
|
|
66
|
+
z: average(members.map((m) => m.z))
|
|
67
|
+
},
|
|
68
|
+
members
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return { clusters, singles };
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
clusterMarkersByScreenSpace,
|
|
75
|
+
projectPoint
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=clusterMarkersByScreenSpace.js.map
|
package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as THREE from 'three'\r\n\r\n/**\r\n * Screen-space clustering for 3D (BIM) comment markers.\r\n *\r\n * The BIM viewer renders each comment as an independent CSS2DObject at a world\r\n * position, so markers that are close together (or aligned along the camera\r\n * axis) overlap on screen. This groups markers whose projected screen positions\r\n * fall within `threshold` pixels of each other so the caller can draw a single\r\n * numbered cluster bubble instead of a pile of overlapping avatars.\r\n *\r\n * Pure and side-effect free (no scene mutation) so it can be unit tested.\r\n */\r\n\r\nexport interface HasWorldPosition {\r\n id: number\r\n x?: number | null\r\n y?: number | null\r\n z?: number | null\r\n}\r\n\r\nexport interface ScreenCluster<T> {\r\n /** Stable key derived from member ids (sorted) — used for registry diffing. */\r\n key: string\r\n screenX: number\r\n screenY: number\r\n worldCenter: { x: number; y: number; z: number }\r\n members: T[]\r\n}\r\n\r\nexport interface ClusterResult<T> {\r\n clusters: ScreenCluster<T>[]\r\n singles: T[]\r\n}\r\n\r\nexport interface ProjectedPoint {\r\n screenX: number\r\n screenY: number\r\n /** false when the point is behind the camera. */\r\n onScreen: boolean\r\n}\r\n\r\n/** Project a world point to pixel coordinates for the given camera/viewport. */\r\nexport function projectPoint(\r\n x: number,\r\n y: number,\r\n z: number,\r\n camera: THREE.Camera,\r\n width: number,\r\n height: number,\r\n): ProjectedPoint {\r\n const pos = new THREE.Vector3(x, y, z)\r\n // Camera-space z is positive when the point is behind the camera (it looks down -z).\r\n const cameraSpace = pos.clone().applyMatrix4(camera.matrixWorldInverse)\r\n const behind = cameraSpace.z >= 0\r\n\r\n const ndc = pos.project(camera)\r\n return {\r\n screenX: (ndc.x * 0.5 + 0.5) * width,\r\n screenY: (-ndc.y * 0.5 + 0.5) * height,\r\n onScreen: !behind,\r\n }\r\n}\r\n\r\nfunction average(values: number[]): number {\r\n if (values.length === 0) return 0\r\n return values.reduce((sum, v) => sum + v, 0) / values.length\r\n}\r\n\r\nexport function clusterMarkersByScreenSpace<T extends HasWorldPosition>(\r\n items: T[],\r\n camera: THREE.Camera,\r\n width: number,\r\n height: number,\r\n threshold = 44,\r\n): ClusterResult<T> {\r\n const projected = items\r\n .filter((it): it is T & { x: number; y: number; z: number } =>\r\n it.x != null && it.y != null && it.z != null,\r\n )\r\n .map((item) => ({ item, ...projectPoint(item.x, item.y, item.z, camera, width, height) }))\r\n\r\n const onScreen = projected.filter((p) => p.onScreen)\r\n const clusters: ScreenCluster<T>[] = []\r\n // Points behind the camera are never clustered; they fall through as singles.\r\n const singles: T[] = projected.filter((p) => !p.onScreen).map((p) => p.item)\r\n\r\n const used = new Array(onScreen.length).fill(false)\r\n\r\n for (let i = 0; i < onScreen.length; i++) {\r\n if (used[i]) continue\r\n used[i] = true\r\n const group = [onScreen[i]]\r\n\r\n for (let j = i + 1; j < onScreen.length; j++) {\r\n if (used[j]) continue\r\n const dx = onScreen[i].screenX - onScreen[j].screenX\r\n const dy = onScreen[i].screenY - onScreen[j].screenY\r\n if (Math.hypot(dx, dy) <= threshold) {\r\n used[j] = true\r\n group.push(onScreen[j])\r\n }\r\n }\r\n\r\n if (group.length === 1) {\r\n singles.push(group[0].item)\r\n continue\r\n }\r\n\r\n const members = group.map((g) => g.item)\r\n clusters.push({\r\n key: members.map((m) => m.id).sort((a, b) => a - b).join('-'),\r\n screenX: average(group.map((g) => g.screenX)),\r\n screenY: average(group.map((g) => g.screenY)),\r\n worldCenter: {\r\n x: average(members.map((m) => m.x as number)),\r\n y: average(members.map((m) => m.y as number)),\r\n z: average(members.map((m) => m.z as number)),\r\n },\r\n members,\r\n })\r\n }\r\n\r\n return { clusters, singles }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAGA,YAAY,WAAW;AA2ChB,SAAS,aACd,GACA,GACA,GACA,QACA,OACA,QACgB;AAChB,QAAM,MAAM,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErC,QAAM,cAAc,IAAI,MAAM,EAAE,aAAa,OAAO,kBAAkB;AACtE,QAAM,SAAS,YAAY,KAAK;AAEhC,QAAM,MAAM,IAAI,QAAQ,MAAM;AAC9B,SAAO;AAAA,IACL,UAAU,IAAI,IAAI,MAAM,OAAO;AAAA,IAC/B,UAAU,CAAC,IAAI,IAAI,MAAM,OAAO;AAAA,IAChC,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,QAAQ,QAA0B;AACzC,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,OAAO;AACxD;AAEO,SAAS,4BACd,OACA,QACA,OACA,QACA,YAAY,IACM;AAClB,QAAM,YAAY,MACf;AAAA,IAAO,CAAC,OACP,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,GAAG,KAAK;AAAA,EAC1C,EACC,IAAI,CAAC,SAAU,iBAAE,QAAS,aAAa,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,OAAO,MAAM,EAAI;AAE3F,QAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ;AACnD,QAAM,WAA+B,CAAC;AAEtC,QAAM,UAAe,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAE3E,QAAM,OAAO,IAAI,MAAM,SAAS,MAAM,EAAE,KAAK,KAAK;AAElD,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,KAAK,CAAC,EAAG;AACb,SAAK,CAAC,IAAI;AACV,UAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;AAE1B,aAAS,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AAC5C,UAAI,KAAK,CAAC,EAAG;AACb,YAAM,KAAK,SAAS,CAAC,EAAE,UAAU,SAAS,CAAC,EAAE;AAC7C,YAAM,KAAK,SAAS,CAAC,EAAE,UAAU,SAAS,CAAC,EAAE;AAC7C,UAAI,KAAK,MAAM,IAAI,EAAE,KAAK,WAAW;AACnC,aAAK,CAAC,IAAI;AACV,cAAM,KAAK,SAAS,CAAC,CAAC;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,KAAK,MAAM,CAAC,EAAE,IAAI;AAC1B;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AACvC,aAAS,KAAK;AAAA,MACZ,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MAC5D,SAAS,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAAA,MAC5C,SAAS,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAAA,MAC5C,aAAa;AAAA,QACX,GAAG,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAW,CAAC;AAAA,QAC5C,GAAG,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAW,CAAC;AAAA,QAC5C,GAAG,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAW,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,QAAQ;AAC7B;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commentCameraUtils.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAA;AACrF,OAAO,EAAE,mBAAmB,IAAI,oBAAoB,EAAE,MAAM,mDAAmD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Re-export shim: logic moved to the shared marker framework.\r\nexport type { Vec3, LookAt } from \"../../../../../shared/markers/computeMarkerLookAt\"\r\nexport { computeMarkerLookAt as computeCommentLookAt } from \"../../../../../shared/markers/computeMarkerLookAt\"\r\n"],"mappings":"AAKA,SAAgC,2BAA4B;","names":[]}
|