@collabdt/core 0.0.42 → 0.0.43
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/Toolbar.d.ts.map +1 -1
- package/dist/core/components/Toolbar.js.map +1 -1
- package/dist/core/components/ToolbarBody.js.map +1 -1
- package/dist/core/components/TopNavigationBar.js.map +1 -1
- package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
- package/dist/core/components/authentication/Signin.js.map +1 -1
- package/dist/core/components/authentication/Signup.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
- package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
- package/dist/core/components/ui/DataTable.d.ts.map +1 -1
- package/dist/core/components/ui/DataTable.js +7 -0
- package/dist/core/components/ui/DataTable.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts +5 -2
- package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileMarker.js +84 -21
- package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
- package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
- package/dist/core/components/ui/Navbar.d.ts.map +1 -1
- package/dist/core/components/ui/Navbar.js.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
- package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
- package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +2 -2
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +2 -2
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
- package/dist/core/components/viewers/Viewer.js +5 -1
- package/dist/core/components/viewers/Viewer.js.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
- package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/BimViewer.js +14 -5
- package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +6 -0
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.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 +168 -39
- 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.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +14 -37
- package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.js +31 -318
- package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +66 -7
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +253 -21
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ModelManager/index.js +9 -0
- package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts +3 -2
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +3 -4
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -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 +40 -18
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +2 -5
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +45 -59
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +1 -0
- 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/FileHandler.d.ts +10 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js +25 -73
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts +7 -3
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +42 -78
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +52 -75
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +15 -3
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +165 -105
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
- package/dist/core/components/viewers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/index.js.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.js +1 -0
- package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +4 -3
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.js +148 -0
- package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.js +32 -15
- package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts +4 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js +43 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js +39 -3
- package/dist/core/components/viewers/map/datasets/src/localDatasets.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 +2 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +47 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.js +114 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +49 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.js +100 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -0
- package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.js +9 -9
- package/dist/core/components/viewers/map/src/Geocoder.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 +25 -43
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -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.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +19 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts +9 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js +28 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -0
- 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 +1 -16
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js +31 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts +21 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js +111 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +77 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/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.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.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 +10 -3
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.d.ts +6 -2
- package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.js +10 -62
- package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +5 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.js +192 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +6 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.js +14 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +8 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.js +44 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +6 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.js +39 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +8 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js +35 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -0
- package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +1 -3
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -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 -3
- 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/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +8 -2
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -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.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +9 -9
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
- package/dist/core/hooks/provider.js.map +1 -1
- package/dist/core/plugins/host/provider.d.ts.map +1 -1
- package/dist/core/plugins/host/provider.js.map +1 -1
- package/dist/core/store/AppConfig/context.d.ts.map +1 -1
- package/dist/core/store/AppConfig/context.js.map +1 -1
- package/dist/core/store/BIM/context.d.ts.map +1 -1
- package/dist/core/store/BIM/context.js.map +1 -1
- package/dist/core/store/BIM/reducer.d.ts +0 -1
- package/dist/core/store/BIM/reducer.d.ts.map +1 -1
- package/dist/core/store/BIM/reducer.js +0 -4
- package/dist/core/store/BIM/reducer.js.map +1 -1
- package/dist/core/store/Buildings/context.d.ts.map +1 -1
- package/dist/core/store/Buildings/context.js.map +1 -1
- package/dist/core/store/Content/context.d.ts.map +1 -1
- package/dist/core/store/Content/context.js.map +1 -1
- package/dist/core/store/Datasets/context.d.ts.map +1 -1
- package/dist/core/store/Datasets/context.js +2 -1
- package/dist/core/store/Datasets/context.js.map +1 -1
- package/dist/core/store/Datasets/reducer.d.ts +2 -0
- package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
- package/dist/core/store/Datasets/reducer.js +9 -4
- package/dist/core/store/Datasets/reducer.js.map +1 -1
- package/dist/core/store/Files/context.d.ts.map +1 -1
- package/dist/core/store/Files/context.js.map +1 -1
- package/dist/core/store/Map/context.d.ts.map +1 -1
- package/dist/core/store/Map/context.js.map +1 -1
- package/dist/core/store/Menus/context.d.ts.map +1 -1
- package/dist/core/store/Menus/context.js.map +1 -1
- package/dist/core/store/Permissions/context.d.ts.map +1 -1
- package/dist/core/store/Permissions/context.js.map +1 -1
- package/dist/core/store/PointCloud/context.d.ts.map +1 -1
- package/dist/core/store/PointCloud/context.js.map +1 -1
- package/dist/core/store/Tools/context.d.ts.map +1 -1
- package/dist/core/store/Tools/context.js.map +1 -1
- package/dist/core/types/datasetTypes.d.ts +8 -1
- package/dist/core/types/datasetTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.d.ts +13 -13
- package/dist/core/types/dbTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.js +13 -13
- package/dist/core/types/dbTypes.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/utils/imageUtils.js +1 -1
- package/dist/core/utils/imageUtils.js.map +1 -1
- package/package.json +4 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts +0 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts.map +0 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js +0 -173
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/components/ui/DataTable.tsx"],"sourcesContent":["'use client'\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport {\r\n ColumnDef,\r\n flexRender,\r\n getCoreRowModel,\r\n getPaginationRowModel,\r\n SortingState,\r\n getSortedRowModel,\r\n useReactTable,\r\n} from '@tanstack/react-table'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { ColumnMeta } from '../viewers/Data/utils/Columns'\r\n\r\n// Shadcn components\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from './Table'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from './Select'\r\nimport { Button } from './Button'\r\n\r\n// Icons\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n} from 'lucide-react'\r\n\r\nimport { MapContext, MenusContext } from '../../store'\r\nimport { ViewerNames } from '../../types/'\r\nimport { DataTableSkeleton } from '../DataTableSkeleton'\r\n\r\ninterface DataTableProps<TData, TValue> {\r\n columns: ColumnDef<TData, TValue>[]\r\n data: TData[]\r\n onRowClick?: (row: TData) => void\r\n onRowHover?: (row: TData) => void\r\n currentViewer?: string\r\n className?: string\r\n paginationClasses?: string\r\n leadingCell?: React.ComponentType<any>\r\n trailingCell?: React.ComponentType<any>\r\n showPagination?: boolean\r\n tab?: string\r\n isLoading?: boolean\r\n}\r\n\r\nexport function DataTable<TData, TValue>({\r\n columns,\r\n data,\r\n onRowClick,\r\n onRowHover,\r\n currentViewer,\r\n className,\r\n paginationClasses,\r\n trailingCell: TrailingCell,\r\n leadingCell: LeadingCell,\r\n showPagination = true,\r\n tab = '',\r\n isLoading = false,\r\n}: DataTableProps<TData, TValue>) {\r\n // Translation\r\n const t = useTranslations('DataTable')\r\n\r\n const [pageIndex, setPageIndex] = React.useState(0)\r\n\r\n const [sorting, setSorting] = React.useState<SortingState>([])\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n\r\n const { currentLocation, countrySubdivisionsData } = mapState.map\r\n const { countrySubdivision, municipality } = currentLocation || {}\r\n\r\n const [countrySubdivisionName, setCountrySubdivisionName] = React.useState<string>('')\r\n\r\n React.useEffect(() => {\r\n if (countrySubdivisionsData && countrySubdivision) {\r\n const sub = countrySubdivisionsData[countrySubdivision] as any\r\n setCountrySubdivisionName((sub?.name ?? sub) || '')\r\n }\r\n }, [countrySubdivisionsData, countrySubdivision])\r\n\r\n const capitalize = (str: string) => str ? str.charAt(0).toUpperCase() + str.slice(1) : ''\r\n\r\n type DataTypes = 'applied' | 'favourites' | 'national' | 'countrySubdivision' | 'municipal' | ViewerNames | ''\r\n\r\n const dataType: DataTypes = React.useMemo(() => {\r\n return (tab || currentViewer || '') as DataTypes\r\n }, [currentViewer, tab])\r\n\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n getCoreRowModel: getCoreRowModel(),\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onSortingChange: setSorting,\r\n getSortedRowModel: getSortedRowModel(),\r\n state: {\r\n sorting,\r\n pagination: {\r\n pageSize: rowsPerPage,\r\n pageIndex: pageIndex,\r\n },\r\n },\r\n onPaginationChange: (updater) => {\r\n const newPagination\r\n = typeof updater === 'function'\r\n ? updater({ pageIndex, pageSize: rowsPerPage })\r\n : updater\r\n\r\n setPageIndex(newPagination.pageIndex)\r\n if (newPagination.pageSize !== rowsPerPage) {\r\n menusDispatch({ type: 'SET_PAGINATION_ROWS_PER_PAGE', payload: { rowsPerPage: newPagination.pageSize } })\r\n }\r\n },\r\n })\r\n\r\n // Show skeleton when loading\r\n if (isLoading) {\r\n return (\r\n <DataTableSkeleton\r\n columns={columns.length}\r\n rows={rowsPerPage}\r\n showLeadingCell={!!LeadingCell}\r\n showTrailingCell={!!TrailingCell}\r\n className={className}\r\n showPagination={showPagination}\r\n />\r\n )\r\n }\r\n if (!data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <p className=\"text-gray-500\">{t('no')} {currentViewer} {t('availableAtTheMoment')}</p>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n <div className={`${className} rounded-md border overflow-hidden flex-1 flex flex-col`}>\r\n <div className=\"overflow-auto flex-1\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-background\">\r\n {table.getHeaderGroups().map(headerGroup => (\r\n <TableRow key={headerGroup.id}>\r\n {/* Empty header cell for LeadingCell if it exists */}\r\n {LeadingCell && <TableHead></TableHead>}\r\n {headerGroup.headers.map((header) => {\r\n // Get the column classes from meta\r\n const meta = header.column.columnDef.meta as ColumnMeta | undefined\r\n const columnClasses = meta?.columnClasses || ''\r\n\r\n return (\r\n <TableHead key={header.id} className={`${columnClasses}`}>\r\n {header.isPlaceholder\r\n ? null\r\n : flexRender(\r\n header.column.columnDef.header,\r\n header.getContext(),\r\n )}\r\n </TableHead>\r\n )\r\n })}\r\n <TableHead className=\"w-10\"></TableHead>\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody>\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map(row => (\r\n <TableRow\r\n key={row.id}\r\n data-state={row.getIsSelected() && 'selected'}\r\n className=\"cursor-pointer hover:bg-muted/50\"\r\n onClick={(e) => {\r\n // Only trigger row click if not clicking on the dropdown\r\n if (\r\n !(e.target as HTMLElement).closest('.dropdown-menu-trigger')\r\n && !(e.target as HTMLElement).closest('Button')\r\n && onRowClick) {\r\n onRowClick(row.original as TData)\r\n }\r\n }}\r\n onMouseEnter={() => {\r\n if (onRowHover) {\r\n onRowHover(row.original as TData)\r\n }\r\n }}\r\n >\r\n {/* leading cell(s) */}\r\n {LeadingCell\r\n && (\r\n <TableCell className=\"w-10 p-2\">\r\n <LeadingCell dataset={row.original} />\r\n </TableCell>\r\n )}\r\n\r\n {/* Table content */}\r\n {row.getVisibleCells().map((cell) => {\r\n // Get the column classes from meta for cells\r\n const meta = cell.column.columnDef.meta as ColumnMeta | any\r\n const columnClasses = meta?.columnClasses || ''\r\n\r\n return (\r\n <TableCell key={cell.id} className={columnClasses}>\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n )\r\n })}\r\n\r\n {/* trailing cell(s) */}\r\n {TrailingCell\r\n && (\r\n <TableCell className=\"w-10 p-2\">\r\n <TrailingCell row={row} />\r\n </TableCell>\r\n )}\r\n\r\n </TableRow>\r\n ))\r\n ) : (\r\n <TableRow>\r\n <TableCell colSpan={columns.length + 1} className=\"h-24 text-center\">\r\n {dataType === 'applied' && t('noApplied')}\r\n {dataType === 'favourites' && t('noFavorite')}\r\n {dataType === 'national' && `${t('noNational')}`}\r\n {dataType === 'countrySubdivision' && `${t('noProvincial')} ${countrySubdivisionName}`}\r\n {dataType === 'municipal' && `${t('noMunicipal')} ${municipality}`}\r\n {dataType === 'buildings' && `${t('noBuildings')}`}\r\n {dataType === 'sites' && `${t('noSites')} `}\r\n {dataType === 'files' && `${t('noFiles')}`}\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n </div>\r\n {/* Pagination */}\r\n {showPagination && (\r\n <div className={`flex items-center flex-wrap justify-center sm:justify-end gap-8 px-1 py-4 ${paginationClasses}`}>\r\n <div className=\"flex flex-row gap-2 items-center justify-center\">\r\n <span className=\"text-sm text-foreground text-nowrap\">{t('paginationTitle')}</span>\r\n <Select\r\n value={rowsPerPage.toString()}\r\n onValueChange={(value) => {\r\n const rowsPerPage = Number.parseInt(value)\r\n menusDispatch({ type: 'SET_PAGINATION_ROWS_PER_PAGE', payload: { rowsPerPage } })\r\n table.setPageSize(rowsPerPage)\r\n }}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"10\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"10\">10</SelectItem>\r\n <SelectItem value=\"20\">20</SelectItem>\r\n <SelectItem value=\"50\">50</SelectItem>\r\n <SelectItem value=\"100\">100</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n <div>\r\n <span className=\"text-sm text-foreground\">\r\n {t('page')}\r\n {' '}\r\n {table.getState().pagination.pageIndex + 1}\r\n {' '}\r\n {t('of')}\r\n {' '}\r\n {table.getPageCount()}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex flex-row gap-2 items-center justify-center\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.firstPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <ChevronsLeft />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.previousPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <ChevronLeft />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.nextPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <ChevronRight />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.lastPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <ChevronsRight />\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","rowsPerPage"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/ui/DataTable.tsx"],"sourcesContent":["'use client'\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport {\r\n ColumnDef,\r\n flexRender,\r\n getCoreRowModel,\r\n getPaginationRowModel,\r\n SortingState,\r\n getSortedRowModel,\r\n useReactTable,\r\n} from '@tanstack/react-table'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { ColumnMeta } from '../viewers/Data/utils/Columns'\r\n\r\n// Shadcn components\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from './Table'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from './Select'\r\nimport { Button } from './Button'\r\n\r\n// Icons\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n} from 'lucide-react'\r\n\r\nimport { MapContext, MenusContext } from '../../store'\r\nimport { ViewerNames } from '../../types/'\r\nimport { DataTableSkeleton } from '../DataTableSkeleton'\r\n\r\ninterface DataTableProps<TData, TValue> {\r\n columns: ColumnDef<TData, TValue>[]\r\n data: TData[]\r\n onRowClick?: (row: TData) => void\r\n onRowHover?: (row: TData) => void\r\n currentViewer?: string\r\n className?: string\r\n paginationClasses?: string\r\n leadingCell?: React.ComponentType<any>\r\n trailingCell?: React.ComponentType<any>\r\n showPagination?: boolean\r\n tab?: string\r\n isLoading?: boolean\r\n}\r\n\r\nexport function DataTable<TData, TValue>({\r\n columns,\r\n data,\r\n onRowClick,\r\n onRowHover,\r\n currentViewer,\r\n className,\r\n paginationClasses,\r\n trailingCell: TrailingCell,\r\n leadingCell: LeadingCell,\r\n showPagination = true,\r\n tab = '',\r\n isLoading = false,\r\n}: DataTableProps<TData, TValue>) {\r\n // Translation\r\n const t = useTranslations('DataTable')\r\n\r\n const [pageIndex, setPageIndex] = React.useState(0)\r\n\r\n const [sorting, setSorting] = React.useState<SortingState>([])\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n\r\n const { currentLocation, countrySubdivisionsData } = mapState.map\r\n const { countrySubdivision, municipality } = currentLocation || {}\r\n\r\n const [countrySubdivisionName, setCountrySubdivisionName] = React.useState<string>('')\r\n\r\n React.useEffect(() => {\r\n if (countrySubdivisionsData && countrySubdivision) {\r\n const sub = countrySubdivisionsData[countrySubdivision] as any\r\n setCountrySubdivisionName((sub?.name ?? sub) || '')\r\n }\r\n }, [countrySubdivisionsData, countrySubdivision])\r\n\r\n const capitalize = (str: string) => str ? str.charAt(0).toUpperCase() + str.slice(1) : ''\r\n\r\n type DataTypes = 'applied' | 'favourites' | 'national' | 'countrySubdivision' | 'municipal' | ViewerNames | ''\r\n\r\n const dataType: DataTypes = React.useMemo(() => {\r\n return (tab || currentViewer || '') as DataTypes\r\n }, [currentViewer, tab])\r\n\r\n // Keep the user on their current page when the data array changes for benign\r\n // reasons (a row's publish state refreshing, a checkbox/favourite toggle, etc.).\r\n // TanStack's autoResetPageIndex defaults to true, which would snap back to page 1\r\n // on every data change. We clamp manually below instead (see effect).\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n autoResetPageIndex: false,\r\n getCoreRowModel: getCoreRowModel(),\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onSortingChange: setSorting,\r\n getSortedRowModel: getSortedRowModel(),\r\n state: {\r\n sorting,\r\n pagination: {\r\n pageSize: rowsPerPage,\r\n pageIndex: pageIndex,\r\n },\r\n },\r\n onPaginationChange: (updater) => {\r\n const newPagination\r\n = typeof updater === 'function'\r\n ? updater({ pageIndex, pageSize: rowsPerPage })\r\n : updater\r\n\r\n setPageIndex(newPagination.pageIndex)\r\n if (newPagination.pageSize !== rowsPerPage) {\r\n menusDispatch({ type: 'SET_PAGINATION_ROWS_PER_PAGE', payload: { rowsPerPage: newPagination.pageSize } })\r\n }\r\n },\r\n })\r\n\r\n // If the data shrinks (filter/search/un-publish) so the current page no longer\r\n // exists, clamp to the last valid page rather than showing an empty table.\r\n React.useEffect(() => {\r\n const pageCount = Math.max(1, Math.ceil(data.length / rowsPerPage))\r\n if (pageIndex > pageCount - 1) {\r\n setPageIndex(pageCount - 1)\r\n }\r\n }, [data.length, rowsPerPage, pageIndex])\r\n\r\n // Show skeleton when loading\r\n if (isLoading) {\r\n return (\r\n <DataTableSkeleton\r\n columns={columns.length}\r\n rows={rowsPerPage}\r\n showLeadingCell={!!LeadingCell}\r\n showTrailingCell={!!TrailingCell}\r\n className={className}\r\n showPagination={showPagination}\r\n />\r\n )\r\n }\r\n if (!data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <p className=\"text-gray-500\">{t('no')} {currentViewer} {t('availableAtTheMoment')}</p>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col h-full\">\r\n <div className={`${className} rounded-md border overflow-hidden flex-1 flex flex-col`}>\r\n <div className=\"overflow-auto flex-1\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-background\">\r\n {table.getHeaderGroups().map(headerGroup => (\r\n <TableRow key={headerGroup.id}>\r\n {/* Empty header cell for LeadingCell if it exists */}\r\n {LeadingCell && <TableHead></TableHead>}\r\n {headerGroup.headers.map((header) => {\r\n // Get the column classes from meta\r\n const meta = header.column.columnDef.meta as ColumnMeta | undefined\r\n const columnClasses = meta?.columnClasses || ''\r\n\r\n return (\r\n <TableHead key={header.id} className={`${columnClasses}`}>\r\n {header.isPlaceholder\r\n ? null\r\n : flexRender(\r\n header.column.columnDef.header,\r\n header.getContext(),\r\n )}\r\n </TableHead>\r\n )\r\n })}\r\n <TableHead className=\"w-10\"></TableHead>\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody>\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map(row => (\r\n <TableRow\r\n key={row.id}\r\n data-state={row.getIsSelected() && 'selected'}\r\n className=\"cursor-pointer hover:bg-muted/50\"\r\n onClick={(e) => {\r\n // Only trigger row click if not clicking on the dropdown\r\n if (\r\n !(e.target as HTMLElement).closest('.dropdown-menu-trigger')\r\n && !(e.target as HTMLElement).closest('Button')\r\n && onRowClick) {\r\n onRowClick(row.original as TData)\r\n }\r\n }}\r\n onMouseEnter={() => {\r\n if (onRowHover) {\r\n onRowHover(row.original as TData)\r\n }\r\n }}\r\n >\r\n {/* leading cell(s) */}\r\n {LeadingCell\r\n && (\r\n <TableCell className=\"w-10 p-2\">\r\n <LeadingCell dataset={row.original} />\r\n </TableCell>\r\n )}\r\n\r\n {/* Table content */}\r\n {row.getVisibleCells().map((cell) => {\r\n // Get the column classes from meta for cells\r\n const meta = cell.column.columnDef.meta as ColumnMeta | any\r\n const columnClasses = meta?.columnClasses || ''\r\n\r\n return (\r\n <TableCell key={cell.id} className={columnClasses}>\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n )\r\n })}\r\n\r\n {/* trailing cell(s) */}\r\n {TrailingCell\r\n && (\r\n <TableCell className=\"w-10 p-2\">\r\n <TrailingCell row={row} />\r\n </TableCell>\r\n )}\r\n\r\n </TableRow>\r\n ))\r\n ) : (\r\n <TableRow>\r\n <TableCell colSpan={columns.length + 1} className=\"h-24 text-center\">\r\n {dataType === 'applied' && t('noApplied')}\r\n {dataType === 'favourites' && t('noFavorite')}\r\n {dataType === 'national' && `${t('noNational')}`}\r\n {dataType === 'countrySubdivision' && `${t('noProvincial')} ${countrySubdivisionName}`}\r\n {dataType === 'municipal' && `${t('noMunicipal')} ${municipality}`}\r\n {dataType === 'buildings' && `${t('noBuildings')}`}\r\n {dataType === 'sites' && `${t('noSites')} `}\r\n {dataType === 'files' && `${t('noFiles')}`}\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n </div>\r\n {/* Pagination */}\r\n {showPagination && (\r\n <div className={`flex items-center flex-wrap justify-center sm:justify-end gap-8 px-1 py-4 ${paginationClasses}`}>\r\n <div className=\"flex flex-row gap-2 items-center justify-center\">\r\n <span className=\"text-sm text-foreground text-nowrap\">{t('paginationTitle')}</span>\r\n <Select\r\n value={rowsPerPage.toString()}\r\n onValueChange={(value) => {\r\n const rowsPerPage = Number.parseInt(value)\r\n menusDispatch({ type: 'SET_PAGINATION_ROWS_PER_PAGE', payload: { rowsPerPage } })\r\n table.setPageSize(rowsPerPage)\r\n }}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"10\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"10\">10</SelectItem>\r\n <SelectItem value=\"20\">20</SelectItem>\r\n <SelectItem value=\"50\">50</SelectItem>\r\n <SelectItem value=\"100\">100</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n <div>\r\n <span className=\"text-sm text-foreground\">\r\n {t('page')}\r\n {' '}\r\n {table.getState().pagination.pageIndex + 1}\r\n {' '}\r\n {t('of')}\r\n {' '}\r\n {table.getPageCount()}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex flex-row gap-2 items-center justify-center\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.firstPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <ChevronsLeft />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.previousPage()}\r\n disabled={!table.getCanPreviousPage()}\r\n >\r\n <ChevronLeft />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.nextPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <ChevronRight />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => table.lastPage()}\r\n disabled={!table.getCanNextPage()}\r\n >\r\n <ChevronsRight />\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","rowsPerPage"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileItemComponent.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/FileItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAW1D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAoB,EAAE,EAAE,oBAAoB,qBA2ItG;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"FileItemComponent.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/FileItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAW1D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAoB,EAAE,EAAE,oBAAoB,qBA2ItG;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,eAAO,MAAM,iBAAiB,oDAsC5B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/FileItemComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { getFileIcon } from '../../../../utils/getFileIcon'\r\nimport type { DbFile as DbFile } from '../../../../types/dbTypes'\r\nimport type { FileAction } from '../../../../types/global'\r\nimport ConfirmDialog from '../../../ConfirmDialog'\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n DropdownMenuSeparator,\r\n} from '../../DropdownMenu'\r\nimport { MenusContext, usePermissions } from '../../../../store'\r\n\r\nexport interface FileMenuContentProps {\r\n file: DbFile & { isVisible?: boolean }\r\n onAction: (action: FileAction, file: DbFile) => void\r\n options: FileAction[]\r\n confirmDelete?: boolean\r\n}\r\n\r\n/** Shared menu items used by both FileItemComponent's dropdown and MapContextMenu. */\r\nexport function FileMenuContent({ file, onAction, options, confirmDelete = true }: FileMenuContentProps) {\r\n const t = useTranslations('FileItemComponent')\r\n const tDialog = useTranslations('FileMoreOptions')\r\n const { ability } = usePermissions()\r\n const canReadFile = ability.can('read', 'File')\r\n const canUpdateFile = ability.can('update', 'File')\r\n const canDeleteFile = ability.can('delete', 'File')\r\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = React.useState(false)\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const isPlaced = currentViewer === 'bim'\r\n ? true // BIM models are always placed — null x/y/z means origin (0,0,0), use move to reposition\r\n : currentViewer === 'pointcloud'\r\n ? true // for point clouds we don't have position yet\r\n : currentViewer === 'map'\r\n ? file.lat != null && file.lng != null\r\n : false\r\n\r\n const isGhost = !!(file as any).isGhost\r\n const hasPlaceOption = options.includes('view') || options.includes('move')\r\n\r\n const handleDeleteClick = React.useCallback(() => {\r\n if (confirmDelete) {\r\n setIsDeleteDialogOpen(true)\r\n return\r\n }\r\n\r\n onAction('delete', file)\r\n }, [confirmDelete, onAction, file])\r\n\r\n const handleDeleteConfirm = React.useCallback(async (e: React.MouseEvent) => {\r\n e.preventDefault()\r\n setIsDeleting(true)\r\n try {\r\n await Promise.resolve(onAction('delete', file))\r\n }\r\n finally {\r\n setIsDeleting(false)\r\n setIsDeleteDialogOpen(false)\r\n }\r\n }, [onAction, file])\r\n\r\n return (\r\n <>\r\n {options.includes('download') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('download', file)}\r\n disabled={!canReadFile}\r\n >\r\n <LR.Download className=\"h-4 w-4\" />\r\n {t('downloadTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {hasPlaceOption && !isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('move', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Locate className=\"h-4 w-4\" />\r\n {t('placeTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('view') && isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('view', file)}\r\n disabled={!canReadFile}\r\n >\r\n {file.isVisible !== false\r\n ? <LR.EyeOff className=\"h-4 w-4\" />\r\n : <LR.Eye className=\"h-4 w-4\" />}\r\n {file.isVisible !== false ? t('hideTitle') : t('showTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('ghost') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('ghost', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n {isGhost ? <LR.Box className=\"h-4 w-4\" /> : <LR.Ghost className=\"h-4 w-4\" />}\r\n {isGhost ? t('unghostTitle') : t('ghostTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('move') && isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('move', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Move className=\"h-4 w-4\" />\r\n {t('moveTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('edit') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('edit', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n {t('editTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('info') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('info', file)}\r\n disabled={!canReadFile}\r\n >\r\n <LR.Info className=\"h-4 w-4\" />\r\n {t('infoTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('delete') && (\r\n <>\r\n {options.some(o => o !== 'delete') && <DropdownMenuSeparator />}\r\n <DropdownMenuItem\r\n onSelect={(e) => {\r\n if (confirmDelete) e.preventDefault()\r\n }}\r\n onClick={handleDeleteClick}\r\n disabled={!canDeleteFile}\r\n className=\"focus:text-destructive\"\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n {t('deleteTitle')}\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n\r\n <ConfirmDialog\r\n isOpen={isDeleteDialogOpen}\r\n isDeleting={isDeleting}\r\n onOpenChange={setIsDeleteDialogOpen}\r\n handleConfirm={handleDeleteConfirm}\r\n itemName={file.name}\r\n dataType={tDialog('file')}\r\n />\r\n </>\r\n )\r\n}\r\n\r\nexport interface FileItemComponentProps {\r\n file: DbFile & { isVisible?: boolean }\r\n onAction: (action: FileAction, file: DbFile) => void\r\n options: FileAction[]\r\n translationKey?: string\r\n confirmDelete?: boolean\r\n}\r\n\r\n// Audit Phase 1.C (F-19): React.memo so a sidebar-toggle re-render of the\r\n// parent section (FilesSection / ModelsSection / etc.) doesn't cascade\r\n// into every item in a 20–30-item list. Consumers must pass referentially\r\n// stable `onAction` + `options` props (see the section files) for memo to\r\n// take effect — they were the cumulative cost of the 344 ms sidebar-toggle\r\n// commit captured in the Phase 0 React Profiler baseline.\r\nexport const FileItemComponent = React.memo(function FileItemComponent({\r\n file,\r\n onAction,\r\n options,\r\n confirmDelete = true,\r\n}: FileItemComponentProps) {\r\n const t = useTranslations('FileItemComponent')\r\n const Icon = getFileIcon(file)\r\n\r\n return (\r\n <div className={`flex items-center justify-between px-2 py-1 hover:bg-accent/50 rounded-md transition-colors ${\r\n file.isVisible !== false ? '' : 'opacity-50'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-2 flex-1 min-w-0 \">\r\n <Icon className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"text-sm text-foreground truncate cursor-pointer\">{file.name}</span>\r\n </div>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <button\r\n className=\"h-6 w-6 p-0 flex items-center justify-center rounded hover:bg-accent text-muted-foreground hover:text-foreground flex-shrink-0\"\r\n title={t('moreOptions')}\r\n >\r\n <LR.MoreVertical className=\"h-4 w-4\" />\r\n </button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\" className=\"w-44\">\r\n <FileMenuContent\r\n file={file}\r\n onAction={onAction}\r\n options={options}\r\n confirmDelete={confirmDelete}\r\n />\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n )\r\n})\r\n"],"mappings":";AA0EQ,SAiEA,UA7DE,KAJF;AAxER,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,YAAY,QAAQ;AACpB,SAAS,mBAAmB;AAG5B,OAAO,mBAAmB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc,sBAAsB;AAUtC,SAAS,gBAAgB,EAAE,MAAM,UAAU,SAAS,gBAAgB,KAAK,GAAyB;AACvG,QAAM,IAAI,gBAAgB,mBAAmB;AAC7C,QAAM,UAAU,gBAAgB,iBAAiB;AACjD,QAAM,EAAE,QAAQ,IAAI,eAAe;AACnC,QAAM,cAAc,QAAQ,IAAI,QAAQ,MAAM;AAC9C,QAAM,gBAAgB,QAAQ,IAAI,UAAU,MAAM;AAClD,QAAM,gBAAgB,QAAQ,IAAI,UAAU,MAAM;AAClD,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AACxE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAExD,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,QAAM,WAAW,kBAAkB,QAC/B,OACA,kBAAkB,eAClB,OACE,kBAAkB,QAChB,KAAK,OAAO,QAAQ,KAAK,OAAO,OAChC;AAER,QAAM,UAAU,CAAC,CAAE,KAAa;AAChC,QAAM,iBAAiB,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,MAAM;AAE1E,QAAM,oBAAoB,MAAM,YAAY,MAAM;AAChD,QAAI,eAAe;AACjB,4BAAsB,IAAI;AAC1B;AAAA,IACF;AAEA,aAAS,UAAU,IAAI;AAAA,EACzB,GAAG,CAAC,eAAe,UAAU,IAAI,CAAC;AAElC,QAAM,sBAAsB,MAAM,YAAY,OAAO,MAAwB;AAC3E,MAAE,eAAe;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,QAAQ,QAAQ,SAAS,UAAU,IAAI,CAAC;AAAA,IAChD,UACA;AACE,oBAAc,KAAK;AACnB,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,SACE,iCACG;AAAA,YAAQ,SAAS,UAAU,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,YAAY,IAAI;AAAA,QACxC,UAAU,CAAC;AAAA,QAEX;AAAA,8BAAC,GAAG,UAAH,EAAY,WAAU,WAAU;AAAA,UAChC,EAAE,eAAe;AAAA;AAAA;AAAA,IACpB;AAAA,IAED,kBAAkB,CAAC,YAClB;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,QAAQ,IAAI;AAAA,QACpC,UAAU,CAAC,eAAe,CAAC;AAAA,QAE3B;AAAA,8BAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA,UAC9B,EAAE,YAAY;AAAA;AAAA;AAAA,IACjB;AAAA,IAED,QAAQ,SAAS,MAAM,KAAK,YAC3B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,QAAQ,IAAI;AAAA,QACpC,UAAU,CAAC;AAAA,QAEV;AAAA,eAAK,cAAc,QAChB,oBAAC,GAAG,QAAH,EAAU,WAAU,WAAU,IAC/B,oBAAC,GAAG,KAAH,EAAO,WAAU,WAAU;AAAA,UAC/B,KAAK,cAAc,QAAQ,EAAE,WAAW,IAAI,EAAE,WAAW;AAAA;AAAA;AAAA,IAC5D;AAAA,IAED,QAAQ,SAAS,OAAO,KACvB;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,SAAS,IAAI;AAAA,QACrC,UAAU,CAAC,eAAe,CAAC;AAAA,QAE1B;AAAA,oBAAU,oBAAC,GAAG,KAAH,EAAO,WAAU,WAAU,IAAK,oBAAC,GAAG,OAAH,EAAS,WAAU,WAAU;AAAA,UACzE,UAAU,EAAE,cAAc,IAAI,EAAE,YAAY;AAAA;AAAA;AAAA,IAC/C;AAAA,IAED,QAAQ,SAAS,MAAM,KAAK,YAC3B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,QAAQ,IAAI;AAAA,QACpC,UAAU,CAAC,eAAe,CAAC;AAAA,QAE3B;AAAA,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA,UAC5B,EAAE,WAAW;AAAA;AAAA;AAAA,IAChB;AAAA,IAED,QAAQ,SAAS,MAAM,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,QAAQ,IAAI;AAAA,QACpC,UAAU,CAAC,eAAe,CAAC;AAAA,QAE3B;AAAA,8BAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA,UAC9B,EAAE,WAAW;AAAA;AAAA;AAAA,IAChB;AAAA,IAED,QAAQ,SAAS,MAAM,KACtB;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,SAAS,QAAQ,IAAI;AAAA,QACpC,UAAU,CAAC;AAAA,QAEX;AAAA,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA,UAC5B,EAAE,WAAW;AAAA;AAAA;AAAA,IAChB;AAAA,IAED,QAAQ,SAAS,QAAQ,KACxB,iCACG;AAAA,cAAQ,KAAK,OAAK,MAAM,QAAQ,KAAK,oBAAC,yBAAsB;AAAA,MAC7D;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,CAAC,MAAM;AACf,gBAAI,cAAe,GAAE,eAAe;AAAA,UACtC;AAAA,UACA,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UACX,WAAU;AAAA,UAEV;AAAA,gCAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA,YAC9B,EAAE,aAAa;AAAA;AAAA;AAAA,MAClB;AAAA,OACF;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR;AAAA,QACA,cAAc;AAAA,QACd,eAAe;AAAA,QACf,UAAU,KAAK;AAAA,QACf,UAAU,QAAQ,MAAM;AAAA;AAAA,IAC1B;AAAA,KACF;AAEJ;AAgBO,MAAM,oBAAoB,MAAM,KAAK,SAASA,mBAAkB;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,GAA2B;AACzB,QAAM,IAAI,gBAAgB,mBAAmB;AAC7C,QAAM,OAAO,YAAY,IAAI;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MAAI,WAAW,+FACd,KAAK,cAAc,QAAQ,KAAK,YAClC;AAAA,MAEE;AAAA,6BAAC,SAAI,WAAU,2CACb;AAAA,8BAAC,QAAK,WAAU,+CAA8C;AAAA,UAC9D,oBAAC,UAAK,WAAU,mDAAmD,eAAK,MAAK;AAAA,WAC/E;AAAA,QACA,qBAAC,gBACC;AAAA,8BAAC,uBAAoB,SAAO,MAC1B;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,aAAa;AAAA,cAEtB,8BAAC,GAAG,cAAH,EAAgB,WAAU,WAAU;AAAA;AAAA,UACvC,GACF;AAAA,UACA,oBAAC,uBAAoB,OAAM,OAAM,WAAU,QACzC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF,GACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["FileItemComponent"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/FileItemComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { getFileIcon } from '../../../../utils/getFileIcon'\r\nimport type { DbFile as DbFile } from '../../../../types/dbTypes'\r\nimport type { FileAction } from '../../../../types/global'\r\nimport ConfirmDialog from '../../../ConfirmDialog'\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n DropdownMenuSeparator,\r\n} from '../../DropdownMenu'\r\nimport { MenusContext, usePermissions } from '../../../../store'\r\n\r\nexport interface FileMenuContentProps {\r\n file: DbFile & { isVisible?: boolean }\r\n onAction: (action: FileAction, file: DbFile) => void\r\n options: FileAction[]\r\n confirmDelete?: boolean\r\n}\r\n\r\n/** Shared menu items used by both FileItemComponent's dropdown and MapContextMenu. */\r\nexport function FileMenuContent({ file, onAction, options, confirmDelete = true }: FileMenuContentProps) {\r\n const t = useTranslations('FileItemComponent')\r\n const tDialog = useTranslations('FileMoreOptions')\r\n const { ability } = usePermissions()\r\n const canReadFile = ability.can('read', 'File')\r\n const canUpdateFile = ability.can('update', 'File')\r\n const canDeleteFile = ability.can('delete', 'File')\r\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = React.useState(false)\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const isPlaced = currentViewer === 'bim'\r\n ? true // BIM models are always placed — null x/y/z means origin (0,0,0), use move to reposition\r\n : currentViewer === 'pointcloud'\r\n ? true // for point clouds we don't have position yet\r\n : currentViewer === 'map'\r\n ? file.lat != null && file.lng != null\r\n : false\r\n\r\n const isGhost = !!(file as any).isGhost\r\n const hasPlaceOption = options.includes('view') || options.includes('move')\r\n\r\n const handleDeleteClick = React.useCallback(() => {\r\n if (confirmDelete) {\r\n setIsDeleteDialogOpen(true)\r\n return\r\n }\r\n\r\n onAction('delete', file)\r\n }, [confirmDelete, onAction, file])\r\n\r\n const handleDeleteConfirm = React.useCallback(async (e: React.MouseEvent) => {\r\n e.preventDefault()\r\n setIsDeleting(true)\r\n try {\r\n await Promise.resolve(onAction('delete', file))\r\n }\r\n finally {\r\n setIsDeleting(false)\r\n setIsDeleteDialogOpen(false)\r\n }\r\n }, [onAction, file])\r\n\r\n return (\r\n <>\r\n {options.includes('download') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('download', file)}\r\n disabled={!canReadFile}\r\n >\r\n <LR.Download className=\"h-4 w-4\" />\r\n {t('downloadTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {hasPlaceOption && !isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('move', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Locate className=\"h-4 w-4\" />\r\n {t('placeTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('view') && isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('view', file)}\r\n disabled={!canReadFile}\r\n >\r\n {file.isVisible !== false\r\n ? <LR.EyeOff className=\"h-4 w-4\" />\r\n : <LR.Eye className=\"h-4 w-4\" />}\r\n {file.isVisible !== false ? t('hideTitle') : t('showTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('ghost') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('ghost', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n {isGhost ? <LR.Box className=\"h-4 w-4\" /> : <LR.Ghost className=\"h-4 w-4\" />}\r\n {isGhost ? t('unghostTitle') : t('ghostTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('move') && isPlaced && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('move', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Move className=\"h-4 w-4\" />\r\n {t('moveTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('edit') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('edit', file)}\r\n disabled={!canReadFile || !canUpdateFile}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n {t('editTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('info') && (\r\n <DropdownMenuItem\r\n onClick={() => onAction('info', file)}\r\n disabled={!canReadFile}\r\n >\r\n <LR.Info className=\"h-4 w-4\" />\r\n {t('infoTitle')}\r\n </DropdownMenuItem>\r\n )}\r\n {options.includes('delete') && (\r\n <>\r\n {options.some(o => o !== 'delete') && <DropdownMenuSeparator />}\r\n <DropdownMenuItem\r\n onSelect={(e) => {\r\n if (confirmDelete) e.preventDefault()\r\n }}\r\n onClick={handleDeleteClick}\r\n disabled={!canDeleteFile}\r\n className=\"focus:text-destructive\"\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n {t('deleteTitle')}\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n\r\n <ConfirmDialog\r\n isOpen={isDeleteDialogOpen}\r\n isDeleting={isDeleting}\r\n onOpenChange={setIsDeleteDialogOpen}\r\n handleConfirm={handleDeleteConfirm}\r\n itemName={file.name}\r\n dataType={tDialog('file')}\r\n />\r\n </>\r\n )\r\n}\r\n\r\nexport interface FileItemComponentProps {\r\n file: DbFile & { isVisible?: boolean }\r\n onAction: (action: FileAction, file: DbFile) => void\r\n options: FileAction[]\r\n translationKey?: string\r\n confirmDelete?: boolean\r\n}\r\n\r\nexport const FileItemComponent = React.memo(function FileItemComponent({\r\n file,\r\n onAction,\r\n options,\r\n confirmDelete = true,\r\n}: FileItemComponentProps) {\r\n const t = useTranslations('FileItemComponent')\r\n const Icon = getFileIcon(file)\r\n\r\n return (\r\n <div className={`flex items-center justify-between px-2 py-1 hover:bg-accent/50 rounded-md transition-colors ${\r\n file.isVisible !== false ? '' : 'opacity-50'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-2 flex-1 min-w-0 \">\r\n <Icon className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"text-sm text-foreground truncate cursor-pointer\">{file.name}</span>\r\n </div>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <button\r\n className=\"h-6 w-6 p-0 flex items-center justify-center rounded hover:bg-accent text-muted-foreground hover:text-foreground flex-shrink-0\"\r\n title={t('moreOptions')}\r\n >\r\n <LR.MoreVertical className=\"h-4 w-4\" />\r\n </button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\" className=\"w-44\">\r\n <FileMenuContent\r\n file={file}\r\n onAction={onAction}\r\n options={options}\r\n confirmDelete={confirmDelete}\r\n />\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n )\r\n})\r\n"],"mappings":"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","names":["FileItemComponent"]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import type { DbFile } from '../../../../types/dbTypes';
|
|
3
|
+
export type FileMarkerAction = 'move' | 'rotate' | 'scale' | 'delete';
|
|
2
4
|
interface FileMarkerProps {
|
|
3
5
|
file: DbFile;
|
|
4
|
-
|
|
6
|
+
onAction?: (action: FileMarkerAction) => void;
|
|
7
|
+
highlight?: boolean;
|
|
5
8
|
}
|
|
6
|
-
export default function FileMarker({ file,
|
|
9
|
+
export default function FileMarker({ file, onAction, highlight }: FileMarkerProps): React.JSX.Element;
|
|
7
10
|
export {};
|
|
8
11
|
//# sourceMappingURL=FileMarker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileMarker.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/FileMarker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileMarker.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/FileMarker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAErE,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAWD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAiB,EAAE,EAAE,eAAe,qBAkExF"}
|
|
@@ -1,29 +1,92 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
2
4
|
import * as LR from "lucide-react";
|
|
3
|
-
import { Button } from "../../Button";
|
|
4
5
|
import Image from "next/image";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
import { Card } from "../../Card";
|
|
7
|
+
import { Button } from "../../Button";
|
|
8
|
+
const ACTIONS = [
|
|
9
|
+
{ action: "move", label: "Move", Icon: LR.Move },
|
|
10
|
+
{ action: "rotate", label: "Rotate", Icon: LR.RotateCw },
|
|
11
|
+
{ action: "scale", label: "Scale", Icon: LR.Scaling }
|
|
12
|
+
];
|
|
13
|
+
function FileMarker({ file, onAction, highlight = false }) {
|
|
14
|
+
const [open, setOpen] = React.useState(false);
|
|
15
|
+
const isImage = file.type.startsWith("image/") && !!file.url;
|
|
16
|
+
const isVideo = file.type.startsWith("video/");
|
|
17
|
+
const isModel = file.type.includes("model") || /\.(obj|fbx|gltf|glb|3ds|dae|ply|stl)$/i.test(file.name);
|
|
18
|
+
const isDxf = file.name.toLowerCase().endsWith(".dxf");
|
|
19
|
+
const Icon = isVideo ? LR.Video : isModel ? LR.Box : isDxf ? LR.DraftingCompass : LR.FileText;
|
|
20
|
+
const stop = (e) => e.stopPropagation();
|
|
21
|
+
if (!open) {
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
className: `flex h-9 w-9 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-primary shadow-md transition-transform hover:scale-105 pointer-events-auto ${highlight ? "ring-2 ring-primary" : ""}`,
|
|
26
|
+
title: file.name,
|
|
27
|
+
onPointerDown: (e) => {
|
|
28
|
+
stop(e);
|
|
29
|
+
setOpen(true);
|
|
30
|
+
},
|
|
31
|
+
children: isImage ? /* @__PURE__ */ jsx(Image, { width: 36, height: 36, src: file.url, alt: file.name, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 text-primary-foreground" })
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
return /* @__PURE__ */ jsx("div", { className: "pointer-events-auto", onPointerDown: stop, children: /* @__PURE__ */ jsxs(Card, { className: "w-44 p-1.5 shadow-lg", children: [
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 px-1 pb-1", children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
|
|
38
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-xs font-medium", title: file.name, children: file.name }),
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
Button,
|
|
41
|
+
{
|
|
42
|
+
variant: "ghost",
|
|
43
|
+
size: "icon",
|
|
44
|
+
className: "h-5 w-5 shrink-0",
|
|
45
|
+
onPointerDown: (e) => {
|
|
46
|
+
stop(e);
|
|
47
|
+
setOpen(false);
|
|
48
|
+
},
|
|
49
|
+
children: /* @__PURE__ */ jsx(LR.X, { className: "h-3 w-3" })
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ jsxs("div", { className: "border-t pt-1", children: [
|
|
54
|
+
ACTIONS.map(({ action, label, Icon: ActionIcon }) => /* @__PURE__ */ jsxs(
|
|
55
|
+
"button",
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
onPointerDown: (e) => {
|
|
59
|
+
stop(e);
|
|
60
|
+
setOpen(false);
|
|
61
|
+
onAction == null ? void 0 : onAction(action);
|
|
62
|
+
},
|
|
63
|
+
className: "flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent",
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ jsx(ActionIcon, { className: "h-3.5 w-3.5" }),
|
|
66
|
+
label
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
action
|
|
70
|
+
)),
|
|
71
|
+
/* @__PURE__ */ jsxs(
|
|
72
|
+
"button",
|
|
15
73
|
{
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
74
|
+
type: "button",
|
|
75
|
+
onPointerDown: (e) => {
|
|
76
|
+
stop(e);
|
|
77
|
+
setOpen(false);
|
|
78
|
+
onAction == null ? void 0 : onAction("delete");
|
|
79
|
+
},
|
|
80
|
+
className: "flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-destructive hover:bg-destructive/10",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsx(LR.Trash2, { className: "h-3.5 w-3.5" }),
|
|
83
|
+
"Delete"
|
|
84
|
+
]
|
|
21
85
|
}
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
);
|
|
86
|
+
)
|
|
87
|
+
] })
|
|
88
|
+
] }) });
|
|
25
89
|
}
|
|
26
|
-
;
|
|
27
90
|
export {
|
|
28
91
|
FileMarker as default
|
|
29
92
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/FileMarker.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/FileMarker.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport Image from 'next/image'\r\nimport { Card } from '../../Card'\r\nimport { Button } from '../../Button'\r\nimport type { DbFile } from '../../../../types/dbTypes'\r\n\r\nexport type FileMarkerAction = 'move' | 'rotate' | 'scale' | 'delete'\r\n\r\ninterface FileMarkerProps {\r\n file: DbFile\r\n onAction?: (action: FileMarkerAction) => void\r\n highlight?: boolean\r\n}\r\n\r\nconst ACTIONS: { action: FileMarkerAction; label: string; Icon: React.ComponentType<{ className?: string }> }[] = [\r\n { action: 'move', label: 'Move', Icon: LR.Move },\r\n { action: 'rotate', label: 'Rotate', Icon: LR.RotateCw },\r\n { action: 'scale', label: 'Scale', Icon: LR.Scaling },\r\n]\r\n\r\n// Floating marker shown above a placed file (mirrors the comment/sensor markers):\r\n// a light icon pin that opens a small actions card. Interaction is on pointer-down so\r\n// the camera controls underneath don't swallow it.\r\nexport default function FileMarker({ file, onAction, highlight = false }: FileMarkerProps) {\r\n const [open, setOpen] = React.useState(false)\r\n\r\n const isImage = file.type.startsWith('image/') && !!file.url\r\n const isVideo = file.type.startsWith('video/')\r\n const isModel = file.type.includes('model') || /\\.(obj|fbx|gltf|glb|3ds|dae|ply|stl)$/i.test(file.name)\r\n const isDxf = file.name.toLowerCase().endsWith('.dxf')\r\n const Icon = isVideo ? LR.Video : isModel ? LR.Box : isDxf ? LR.DraftingCompass : LR.FileText\r\n\r\n const stop = (e: React.SyntheticEvent) => e.stopPropagation()\r\n\r\n if (!open) {\r\n return (\r\n <div\r\n className={`flex h-9 w-9 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-primary shadow-md transition-transform hover:scale-105 pointer-events-auto ${\r\n highlight ? 'ring-2 ring-primary' : ''\r\n }`}\r\n title={file.name}\r\n onPointerDown={(e) => { stop(e); setOpen(true) }}\r\n >\r\n {isImage\r\n ? <Image width={36} height={36} src={file.url} alt={file.name} className=\"h-full w-full object-cover\" />\r\n : <Icon className=\"h-4 w-4 text-primary-foreground\" />}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"pointer-events-auto\" onPointerDown={stop}>\r\n <Card className=\"w-44 p-1.5 shadow-lg\">\r\n <div className=\"flex items-center gap-1.5 px-1 pb-1\">\r\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\r\n <span className=\"flex-1 truncate text-xs font-medium\" title={file.name}>{file.name}</span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-5 w-5 shrink-0\"\r\n onPointerDown={(e) => { stop(e); setOpen(false) }}\r\n >\r\n <LR.X className=\"h-3 w-3\" />\r\n </Button>\r\n </div>\r\n <div className=\"border-t pt-1\">\r\n {ACTIONS.map(({ action, label, Icon: ActionIcon }) => (\r\n <button\r\n key={action}\r\n type=\"button\"\r\n onPointerDown={(e) => { stop(e); setOpen(false); onAction?.(action) }}\r\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent\"\r\n >\r\n <ActionIcon className=\"h-3.5 w-3.5\" />\r\n {label}\r\n </button>\r\n ))}\r\n <button\r\n type=\"button\"\r\n onPointerDown={(e) => { stop(e); setOpen(false); onAction?.('delete') }}\r\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-destructive hover:bg-destructive/10\"\r\n >\r\n <LR.Trash2 className=\"h-3.5 w-3.5\" />\r\n Delete\r\n </button>\r\n </div>\r\n </Card>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA+CY,cASJ,YATI;AA7CZ,YAAY,WAAW;AACvB,YAAY,QAAQ;AACpB,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,SAAS,cAAc;AAWvB,MAAM,UAA4G;AAAA,EAChH,EAAE,QAAQ,QAAQ,OAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,EAC/C,EAAE,QAAQ,UAAU,OAAO,UAAU,MAAM,GAAG,SAAS;AAAA,EACvD,EAAE,QAAQ,SAAS,OAAO,SAAS,MAAM,GAAG,QAAQ;AACtD;AAKe,SAAR,WAA4B,EAAE,MAAM,UAAU,YAAY,MAAM,GAAoB;AACzF,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAE5C,QAAM,UAAU,KAAK,KAAK,WAAW,QAAQ,KAAK,CAAC,CAAC,KAAK;AACzD,QAAM,UAAU,KAAK,KAAK,WAAW,QAAQ;AAC7C,QAAM,UAAU,KAAK,KAAK,SAAS,OAAO,KAAK,yCAAyC,KAAK,KAAK,IAAI;AACtG,QAAM,QAAQ,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM;AACrD,QAAM,OAAO,UAAU,GAAG,QAAQ,UAAU,GAAG,MAAM,QAAQ,GAAG,kBAAkB,GAAG;AAErF,QAAM,OAAO,CAAC,MAA4B,EAAE,gBAAgB;AAE5D,MAAI,CAAC,MAAM;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,oLACT,YAAY,wBAAwB,EACtC;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,eAAe,CAAC,MAAM;AAAE,eAAK,CAAC;AAAG,kBAAQ,IAAI;AAAA,QAAE;AAAA,QAE9C,oBACG,oBAAC,SAAM,OAAO,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,WAAU,8BAA6B,IACpG,oBAAC,QAAK,WAAU,mCAAkC;AAAA;AAAA,IACxD;AAAA,EAEJ;AAEA,SACE,oBAAC,SAAI,WAAU,uBAAsB,eAAe,MAClD,+BAAC,QAAK,WAAU,wBACd;AAAA,yBAAC,SAAI,WAAU,uCACb;AAAA,0BAAC,QAAK,WAAU,8CAA6C;AAAA,MAC7D,oBAAC,UAAK,WAAU,uCAAsC,OAAO,KAAK,MAAO,eAAK,MAAK;AAAA,MACnF;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UACV,eAAe,CAAC,MAAM;AAAE,iBAAK,CAAC;AAAG,oBAAQ,KAAK;AAAA,UAAE;AAAA,UAEhD,8BAAC,GAAG,GAAH,EAAK,WAAU,WAAU;AAAA;AAAA,MAC5B;AAAA,OACF;AAAA,IACA,qBAAC,SAAI,WAAU,iBACZ;AAAA,cAAQ,IAAI,CAAC,EAAE,QAAQ,OAAO,MAAM,WAAW,MAC9C;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,eAAe,CAAC,MAAM;AAAE,iBAAK,CAAC;AAAG,oBAAQ,KAAK;AAAG,iDAAW;AAAA,UAAQ;AAAA,UACpE,WAAU;AAAA,UAEV;AAAA,gCAAC,cAAW,WAAU,eAAc;AAAA,YACnC;AAAA;AAAA;AAAA,QANI;AAAA,MAOP,CACD;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAe,CAAC,MAAM;AAAE,iBAAK,CAAC;AAAG,oBAAQ,KAAK;AAAG,iDAAW;AAAA,UAAU;AAAA,UACtE,WAAU;AAAA,UAEV;AAAA,gCAAC,GAAG,QAAH,EAAU,WAAU,eAAc;AAAA,YAAE;AAAA;AAAA;AAAA,MAEvC;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertIfcToFragmentsFile.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"convertIfcToFragmentsFile.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAczE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\nimport { IfcToFragments } from '../../../viewers/bim/src/IfcToFragments'\n\n/**\n * Convert an IFC file to a fragments .frag file. The returned File is a\n * `(baseName)(ifc).frag` blob ready to upload via `performUploadFile`.\n *\n * Lazy: this module brings in `@thatopen/components`, `@thatopen/fragments`,\n * and the `web-ifc` WASM bootstrap, so it is intentionally not imported\n * statically by any UI code.\n */\nexport async function convertIfcToFragmentsFile(file: File): Promise<File> {\n const bimComponents = new OBC.Components()\n const converter = bimComponents.get(IfcToFragments)\n const fragmentBytes = await converter.loadFromFile(file)\n\n // Convert Uint8Array to ArrayBuffer slice to satisfy Blob typing.\n const arrayBuffer = (fragmentBytes.buffer as ArrayBuffer).slice(\n fragmentBytes.byteOffset,\n fragmentBytes.byteOffset + fragmentBytes.byteLength,\n )\n const fragBlob = new Blob([arrayBuffer], { type: 'application/octet-stream' })\n const baseName = file.name.replace(/\\.[^.]+$/, '')\n const fragName = `${baseName}(ifc).frag`\n return new File([fragBlob], fragName, { type: 'application/octet-stream' })\n}\n"],"mappings":"AAAA,YAAY,SAAS;AACrB,SAAS,sBAAsB;AAU/B,eAAsB,0BAA0B,MAA2B;AACzE,QAAM,gBAAgB,IAAI,IAAI,WAAW;AACzC,QAAM,YAAY,cAAc,IAAI,cAAc;AAClD,QAAM,gBAAgB,MAAM,UAAU,aAAa,IAAI;AAGvD,QAAM,cAAe,cAAc,OAAuB;AAAA,IACxD,cAAc;AAAA,IACd,cAAc,aAAa,cAAc;AAAA,EAC3C;AACA,QAAM,WAAW,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAC7E,QAAM,WAAW,KAAK,KAAK,QAAQ,YAAY,EAAE;AACjD,QAAM,WAAW,GAAG,QAAQ;AAC5B,SAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5E;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFileUploadHandler.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useFileUploadHandler.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadHandler.ts"],"names":[],"mappings":"AAWA,UAAU,yBAAyB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACzE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,cAAc,CAAC,EAAE;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,qBAAqB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChF,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,GAAG,EACH,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,GACf,EAAE,yBAAyB,GAAG,iBAAiB,CAqF/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadHandler.ts"],"sourcesContent":["import { useSession } from 'next-auth/react'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { uploadFile as performUploadFile } from '../../uploadFile'\r\n\r\nimport { getFileExtension } from '../../../../utils/utils'\r\nimport { useBuilding } from '../../../../hooks/buildings/buildings'\r\n\r\n//
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadHandler.ts"],"sourcesContent":["import { useSession } from 'next-auth/react'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { uploadFile as performUploadFile } from '../../uploadFile'\r\n\r\nimport { getFileExtension } from '../../../../utils/utils'\r\nimport { useBuilding } from '../../../../hooks/buildings/buildings'\r\n\r\n// @thatopen/IfcToFragments are imported dynamically in the IFC branch below\r\n// (not statically) to keep ~456 KB out of the eager bundle.\r\n\r\ninterface UseFileUploadHandlerProps {\r\n buildingId: number\r\n tag?: string\r\n isVisible?: boolean\r\n uploadFile: (args: { fileData: any, buildingId: number }) => Promise<any>\r\n onFileUpload?: () => void\r\n onUploadStart?: () => void\r\n onUploadEnd?: () => void\r\n customMessages?: {\r\n success?: string\r\n errorPrefix?: string\r\n errorSuffix?: string\r\n noIdError?: string\r\n }\r\n}\r\n\r\ninterface FileUploadHandler {\r\n handleFileUpload: (file: File | null) => Promise<void>\r\n handleInputFileChange: (e: React.ChangeEvent<HTMLInputElement>) => Promise<void>\r\n isUploading: boolean\r\n}\r\n\r\nexport function useFileUploadHandler({\r\n buildingId,\r\n tag,\r\n isVisible,\r\n uploadFile,\r\n onFileUpload,\r\n onUploadStart,\r\n onUploadEnd,\r\n customMessages,\r\n}: UseFileUploadHandlerProps): FileUploadHandler {\r\n const { data: session } = useSession()\r\n const user = session?.user\r\n const t = useTranslations('useFileUploadHandler')\r\n const { building } = useBuilding(buildingId)\r\n\r\n // Inherit building position for the uploaded fragment file\r\n const position = building ? {\r\n lng: building.buildingLongitude,\r\n lat: building.buildingLatitude,\r\n rotation: building.rotation ?? 0,\r\n elevation: building.buildingElevation ?? 0,\r\n } : undefined\r\n\r\n const handleFileUpload = async (file: File | null) => {\r\n if (!file) return\r\n\r\n if (!buildingId) {\r\n const errorMsg = customMessages?.noIdError || t('noBuildingId')\r\n toast.error(errorMsg)\r\n return\r\n }\r\n\r\n onUploadStart?.()\r\n \r\n try {\r\n const ext = getFileExtension(file)?.toLowerCase()\r\n\r\n if (ext === 'ifc') {\r\n const { convertIfcToFragmentsFile } = await import('./convertIfcToFragmentsFile')\r\n const fragFile = await convertIfcToFragmentsFile(file)\r\n\r\n await performUploadFile({\r\n // files: [file, fragFile], // Upload both IFC and fragments\r\n files: [fragFile], // Upload only fragments\r\n buildingId: buildingId || 0,\r\n tag,\r\n isVisible,\r\n user,\r\n uploadFile,\r\n position: { ...position },\r\n })\r\n\r\n const successMsg = customMessages?.success || t('uploadSuccess', { count: 2 })\r\n toast.success(successMsg)\r\n } else {\r\n // Non-IFC: upload as-is\r\n await performUploadFile({\r\n file,\r\n buildingId: buildingId || 0,\r\n tag,\r\n user,\r\n uploadFile,\r\n isVisible,\r\n position: position !== undefined || isVisible !== undefined ? { ...position } : undefined,\r\n })\r\n\r\n const successMsg = customMessages?.success || t('uploadSuccess', { count: 1 })\r\n toast.success(successMsg)\r\n }\r\n \r\n if (typeof onFileUpload === 'function') {\r\n onFileUpload()\r\n }\r\n } catch (error) {\r\n const errorPrefix = customMessages?.errorPrefix || t('uploadError')\r\n const errorSuffix = customMessages?.errorSuffix || t('unknownError')\r\n const errorMsg = `${errorPrefix} ${error instanceof Error ? error.message : errorSuffix}`\r\n toast.error(errorMsg)\r\n } finally {\r\n onUploadEnd?.()\r\n }\r\n }\r\n\r\n const handleInputFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0] || null\r\n await handleFileUpload(file)\r\n e.target.value = '' // Reset input to allow uploading the same file again\r\n }\r\n\r\n return {\r\n handleFileUpload,\r\n handleInputFileChange,\r\n isUploading: false // This could be enhanced with actual loading state if needed\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAChC,SAAS,cAAc,yBAAyB;AAEhD,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AA2BrB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AA1CjD;AA2CE,QAAM,EAAE,MAAM,QAAQ,IAAI,WAAW;AACrC,QAAM,OAAO,mCAAS;AACtB,QAAM,IAAI,gBAAgB,sBAAsB;AAChD,QAAM,EAAE,SAAS,IAAI,YAAY,UAAU;AAGrC,QAAM,WAAW,WAAW;AAAA,IAC1B,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,IACd,WAAU,cAAS,aAAT,YAAqB;AAAA,IAC/B,YAAW,cAAS,sBAAT,YAA8B;AAAA,EAC3C,IAAI;AAEV,QAAM,mBAAmB,OAAO,SAAsB;AAxDxD,QAAAA;AAyDI,QAAI,CAAC,KAAM;AAEX,QAAI,CAAC,YAAY;AACf,YAAM,YAAW,iDAAgB,cAAa,EAAE,cAAc;AAC9D,YAAM,MAAM,QAAQ;AACpB;AAAA,IACF;AAEA;AAEA,QAAI;AACF,YAAM,OAAMA,MAAA,iBAAiB,IAAI,MAArB,gBAAAA,IAAwB;AAEpC,UAAI,QAAQ,OAAO;AACjB,cAAM,EAAE,0BAA0B,IAAI,MAAM,OAAO,6BAA6B;AAChF,cAAM,WAAW,MAAM,0BAA0B,IAAI;AAErD,cAAM,kBAAkB;AAAA;AAAA,UAEtB,OAAO,CAAC,QAAQ;AAAA;AAAA,UAChB,YAAY,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,mBAAK;AAAA,QACjB,CAAC;AAED,cAAM,cAAa,iDAAgB,YAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;AAC7E,cAAM,QAAQ,UAAU;AAAA,MAC1B,OAAO;AAEL,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA,YAAY,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,aAAa,UAAa,cAAc,SAAY,mBAAK,YAAa;AAAA,QAClF,CAAC;AAED,cAAM,cAAa,iDAAgB,YAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;AAC7E,cAAM,QAAQ,UAAU;AAAA,MAC1B;AAEA,UAAI,OAAO,iBAAiB,YAAY;AACtC,qBAAa;AAAA,MACf;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAc,iDAAgB,gBAAe,EAAE,aAAa;AAClE,YAAM,eAAc,iDAAgB,gBAAe,EAAE,cAAc;AACnE,YAAM,WAAW,GAAG,WAAW,IAAI,iBAAiB,QAAQ,MAAM,UAAU,WAAW;AACvF,YAAM,MAAM,QAAQ;AAAA,IACtB,UAAE;AACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAwB,OAAO,MAA2C;AApHlF,QAAAA;AAqHI,UAAM,SAAOA,MAAA,EAAE,OAAO,UAAT,gBAAAA,IAAiB,OAAM;AACpC,UAAM,iBAAiB,IAAI;AAC3B,MAAE,OAAO,QAAQ;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA;AAAA,EACf;AACF;","names":["_a"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IfcIcon.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Icons/IfcIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"IfcIcon.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Icons/IfcIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAGD,eAAO,MAAM,OAAO,0CAqBlB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/ui/Icons/IfcIcon.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport interface IfcIconProps {\r\n className?: string\r\n size?: number | string\r\n monochromatic?: boolean\r\n}\r\n\r\n// IFC logo icon\r\
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/ui/Icons/IfcIcon.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport interface IfcIconProps {\r\n className?: string\r\n size?: number | string\r\n monochromatic?: boolean\r\n}\r\n\r\n// IFC logo icon\r\nexport const IfcIcon = React.memo(function IfcIcon({ className = 'h-4 w-4', size, monochromatic = true }: IfcIconProps) {\r\n return (\r\n <svg\r\n id=\"ifc-logo\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 199.04 199.19\"\r\n className={className}\r\n width={size}\r\n height={size}\r\n >\r\n <path fill={monochromatic ? \"currentColor\" : \"#004f9f\"} d=\"m44.73,122.66c7.34,7.8,19.6,8.17,27.4.83l25.53-24.03-16.28-17.3-39.64,37.31,3,3.18Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#004f9f\"} d=\"m5.27,80.74l16.34,17.36,17.3-16.28-13.34-14.18,43.6-41.04,49.75,52.85,3.3-3.11c7.79-7.34,8.16-19.6.83-27.4L83.59,7.02c-7.34-7.8-19.6-8.17-27.4-.83L6.1,53.34c-7.8,7.34-8.17,19.6-.83,27.4Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#9f358b\"} d=\"m122.66,154.31c7.79-7.34,8.17-19.6.83-27.4l-24.03-25.53-17.3,16.28,37.31,39.64,3.18-3Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#9f358b\"} d=\"m80.74,193.77l17.36-16.34-16.28-17.3-14.18,13.34-41.04-43.6,52.85-49.75-3.11-3.3c-7.34-7.8-19.6-8.17-27.4-.83L7.02,115.45c-7.8,7.34-8.17,19.6-.83,27.4l47.15,50.09c7.34,7.79,19.6,8.17,27.4.83Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#009eb0\"} d=\"m154.31,76.38c-7.34-7.8-19.6-8.17-27.4-.83l-25.53,24.03,16.28,17.3,39.64-37.31-3-3.18Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#009eb0\"} d=\"m193.77,118.3l-16.34-17.36-17.3,16.28,13.34,14.17-43.61,41.04-49.75-52.85-3.3,3.11c-7.79,7.34-8.17,19.6-.83,27.4l39.46,41.92c7.34,7.8,19.6,8.17,27.4.83l50.09-47.15c7.8-7.34,8.17-19.6.83-27.4\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#f00023\"} d=\"m76.38,44.73c-7.8,7.34-8.17,19.6-.83,27.4l24.03,25.52,17.3-16.28-37.31-39.64-3.18,3Z\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#f00023\"} d=\"m118.3,5.27l-17.36,16.34,16.28,17.3,14.17-13.34,41.04,43.6-52.85,49.75,3.11,3.3c7.34,7.79,19.6,8.17,27.4.83l41.92-39.46c7.79-7.34,8.17-19.6.83-27.4L145.7,6.1c-7.33-7.8-19.6-8.17-27.4-.83\" />\r\n <path fill={monochromatic ? \"currentColor\" : \"#1c1c1b\"} d=\"m189.7,199.19c-4.81,0-8.73-3.99-8.73-8.9s3.92-8.9,8.73-8.9,8.78,3.99,8.78,8.9-3.94,8.9-8.78,8.9Zm0-16.52c-1.99,0-3.85.8-5.22,2.26-1.35,1.43-2.09,3.34-2.09,5.35s.74,3.92,2.09,5.35c1.37,1.46,3.22,2.26,5.22,2.26,4.05,0,7.35-3.42,7.35-7.62s-3.3-7.62-7.35-7.62Zm4.67,12.98h-1.74l-2.91-4.79h-2.17v4.79h-1.28v-10.53h4.01c2.26,0,3.36.93,3.36,2.86s-1.22,2.59-2.38,2.83l3.11,4.84Zm-6.82-6.03h1.79c1.71,0,2.92-.12,2.92-1.67,0-1.08-.74-1.6-2.27-1.6h-2.44v3.27Z\" />\r\n </svg>\r\n )\r\n})\r\n"],"mappings":"AAWI,SAQE,KARF;AAXJ,OAAO,WAAW;AASX,MAAM,UAAU,MAAM,KAAK,SAASA,SAAQ,EAAE,YAAY,WAAW,MAAM,gBAAgB,KAAK,GAAiB;AACtH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,OAAM;AAAA,MACN,SAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MAER;AAAA,4BAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,uFAAsF;AAAA,QAChJ,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,8LAA6L;AAAA,QACvP,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,0FAAyF;AAAA,QACnJ,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,mMAAkM;AAAA,QAC5P,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,0FAAyF;AAAA,QACnJ,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,kMAAiM;AAAA,QAC3P,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,wFAAuF;AAAA,QACjJ,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,8LAA6L;AAAA,QACvP,oBAAC,UAAK,MAAM,gBAAgB,iBAAiB,WAAW,GAAE,ocAAmc;AAAA;AAAA;AAAA,EAC/f;AAEJ,CAAC;","names":["IfcIcon"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgB9B,wBAAgB,WAAW,sBAW1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"sourcesContent":["'use client'\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\n\r\n// Icons\r\nimport { MenusContext } from '../../../store'\r\nimport { MapSidebar } from '../../viewers/map/src/MapSidebar'\r\n\r\
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"sourcesContent":["'use client'\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\n\r\n// Icons\r\nimport { MenusContext } from '../../../store'\r\nimport { MapSidebar } from '../../viewers/map/src/MapSidebar'\r\n\r\nconst BimSidebar = dynamic(\r\n () => import('../../viewers/bim/src/BimSidebar/src').then(m => ({ default: m.BimSidebar })),\r\n { ssr: false },\r\n)\r\nconst PointCloudSidebar = dynamic(\r\n () => import('../../viewers/pointcloud/src/PointCloudSidebar').then(m => ({ default: m.PointCloudSidebar })),\r\n { ssr: false },\r\n)\r\n\r\nexport function InfoSidebar() {\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n return (\r\n <>\r\n {currentViewer === 'map' && <MapSidebar />}\r\n {currentViewer === 'bim' && <BimSidebar />}\r\n {currentViewer === 'pointcloud' && <PointCloudSidebar />}\r\n </>\r\n )\r\n}"],"mappings":";AAsBI,mBAC8B,KAD9B;AArBJ,YAAY,WAAW;AACvB,OAAO,aAAa;AAGpB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAE3B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,sCAAsC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC1F,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,gDAAgD,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EAC3G,EAAE,KAAK,MAAM;AACf;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,SACE,iCACG;AAAA,sBAAkB,SAAS,oBAAC,cAAW;AAAA,IACvC,kBAAkB,SAAS,oBAAC,cAAW;AAAA,IACvC,kBAAkB,gBAAgB,oBAAC,qBAAkB;AAAA,KACxD;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Navbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Navbar.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,GAAG,CAAA;IAChB,IAAI,EAAE,GAAG,CAAA;IACT,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,aAAa,EACb,KAAK,EACL,MAAM,EACN,UAAU,EACV,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,cAAqB,GACtB,EAAE,WAAW,+BAoLb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/components/ui/Navbar.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { Moon, Sun, Menu, X } from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport Link from 'next/link'\r\nimport { useState, useEffect } from 'react'\r\n// import { Button, LanguageToggle, CdtIcon, Language } from '@collabdt/core'\r\n// Audit Phase 1.B (F-2): the old `from '../..'` reached the components\r\n// barrel (src/core/components/index.ts) which re-exports `./viewers/*` —\r\n// causing Navbar's consumers (e.g. /instance-not-found) to ship the full\r\n// BIM / PointCloud / Map viewer trees (~1.5 MB gzipped extra). Imports\r\n// below are now from specific files so webpack only follows what's used.\r\nimport { Button } from './Button'\r\nimport LanguageToggle from './LanguageToggle'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport { Language } from '../../types/dbTypes'\r\n\r\ninterface NavbarProps {\r\n activeSection: string\r\n theme: 'light' | 'dark'\r\n locale: Language\r\n navOpacity?: any\r\n navY: any\r\n onToggleTheme: () => void\r\n onToggleLanguage: () => void\r\n onScrollToSection: (id: string) => void\r\n showNavigation?: boolean\r\n}\r\n\r\nexport default function Navbar({\r\n activeSection,\r\n theme,\r\n locale,\r\n navOpacity,\r\n navY,\r\n onToggleTheme,\r\n onToggleLanguage,\r\n onScrollToSection,\r\n showNavigation = true,\r\n}: NavbarProps) {\r\n const tNav = useTranslations('HomePage.nav')\r\n const tHero = useTranslations('HomePage.hero')\r\n const nextLocale = locale === Language.En ? Language.Fr : Language.En\r\n const [onMobile, setOnMobile] = useState(false)\r\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\r\n const [currentSection, setCurrentSection] = useState(activeSection)\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setOnMobile(window.innerWidth < 640)\r\n checkMobile()\r\n window.addEventListener('resize', checkMobile)\r\n return () => window.removeEventListener('resize', checkMobile)\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCurrentSection(activeSection)\r\n }, [activeSection])\r\n\r\n return (\r\n <motion.nav\r\n style={{ y: navY }}\r\n className=\"glass-nav fixed top-0 left-0 right-0 z-50\"\r\n >\r\n <div className=\"container mx-auto px-6 py-4\">\r\n <div className=\"flex items-center gap-6\">\r\n {/* Logo */}\r\n <motion.div\r\n initial={{ opacity: 0, x: -20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n className=\"flex-shrink-0\"\r\n >\r\n <Link href=\"#hero\" className=\"flex items-center gap-3 group\">\r\n <CdtIcon className=\"w-8 h-8\" />\r\n <span\r\n className=\"font-display font-bold tracking-tight max-xs:text-sm max-xs:text-nowrap transition-colors duration-200\"\r\n style={{ color: 'var(--hp-on-surface)' }}\r\n >\r\n {onMobile ? 'CDT' : 'Collab Digital Twins'}\r\n </span>\r\n </Link>\r\n </motion.div>\r\n\r\n {/* Nav links */}\r\n {showNavigation && (\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-1 flex-1 justify-center`}>\r\n {['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n }}\r\n className=\"relative px-4 py-2 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n fontWeight: currentSection === section ? 700 : 500,\r\n }}\r\n >\r\n {tNav(section as any)}\r\n {currentSection === section && (\r\n <motion.div\r\n layoutId=\"activeSection\"\r\n className=\"absolute -bottom-[17px] left-2 right-2 h-[2px]\"\r\n style={{ background: 'var(--hp-primary-container)' }}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Right actions */}\r\n <div className=\"flex items-center gap-3 flex-shrink-0 ml-auto\">\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-3`}>\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n </Button>\r\n\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-nav-cta rounded-md px-5 text-sm\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n\r\n {/* Mobile toggle */}\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\r\n className=\"lg:hidden p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle menu\"\r\n >\r\n {mobileMenuOpen ? <X className=\"w-5 h-5\" /> : <Menu className=\"w-5 h-5\" />}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Mobile menu */}\r\n <AnimatePresence>\r\n {mobileMenuOpen && (\r\n <motion.div\r\n initial={{ opacity: 0, height: 0 }}\r\n animate={{ opacity: 1, height: 'auto' }}\r\n exit={{ opacity: 0, height: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"lg:hidden overflow-hidden\"\r\n >\r\n <div className=\"py-4 space-y-1 mt-4\" style={{ borderTop: '1px solid rgba(255,255,255,0.04)' }}>\r\n {showNavigation &&\r\n ['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n setMobileMenuOpen(false)\r\n }}\r\n className=\"block w-full text-left px-4 py-2.5 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n background: currentSection === section\r\n ? 'rgba(239, 145, 97, 0.08)'\r\n : 'transparent',\r\n }}\r\n >\r\n {tNav(section as any)}\r\n </button>\r\n ))}\r\n\r\n <div className=\"flex items-center gap-2 px-4 py-2 pt-3\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n <span className=\"text-sm\">{theme === 'dark' ? 'Light' : 'Dark'}</span>\r\n </Button>\r\n <div className=\"flex-1\">\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"pt-2 px-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-sovereign w-full rounded-md\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </motion.nav>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/ui/Navbar.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { Moon, Sun, Menu, X } from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport Link from 'next/link'\r\nimport { useState, useEffect } from 'react'\r\nimport { Button } from './Button'\r\nimport LanguageToggle from './LanguageToggle'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport { Language } from '../../types/dbTypes'\r\n\r\ninterface NavbarProps {\r\n activeSection: string\r\n theme: 'light' | 'dark'\r\n locale: Language\r\n navOpacity?: any\r\n navY: any\r\n onToggleTheme: () => void\r\n onToggleLanguage: () => void\r\n onScrollToSection: (id: string) => void\r\n showNavigation?: boolean\r\n}\r\n\r\nexport default function Navbar({\r\n activeSection,\r\n theme,\r\n locale,\r\n navOpacity,\r\n navY,\r\n onToggleTheme,\r\n onToggleLanguage,\r\n onScrollToSection,\r\n showNavigation = true,\r\n}: NavbarProps) {\r\n const tNav = useTranslations('HomePage.nav')\r\n const tHero = useTranslations('HomePage.hero')\r\n const nextLocale = locale === Language.En ? Language.Fr : Language.En\r\n const [onMobile, setOnMobile] = useState(false)\r\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\r\n const [currentSection, setCurrentSection] = useState(activeSection)\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setOnMobile(window.innerWidth < 640)\r\n checkMobile()\r\n window.addEventListener('resize', checkMobile)\r\n return () => window.removeEventListener('resize', checkMobile)\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCurrentSection(activeSection)\r\n }, [activeSection])\r\n\r\n return (\r\n <motion.nav\r\n style={{ y: navY }}\r\n className=\"glass-nav fixed top-0 left-0 right-0 z-50\"\r\n >\r\n <div className=\"container mx-auto px-6 py-4\">\r\n <div className=\"flex items-center gap-6\">\r\n {/* Logo */}\r\n <motion.div\r\n initial={{ opacity: 0, x: -20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n className=\"flex-shrink-0\"\r\n >\r\n <Link href=\"#hero\" className=\"flex items-center gap-3 group\">\r\n <CdtIcon className=\"w-8 h-8\" />\r\n <span\r\n className=\"font-display font-bold tracking-tight max-xs:text-sm max-xs:text-nowrap transition-colors duration-200\"\r\n style={{ color: 'var(--hp-on-surface)' }}\r\n >\r\n {onMobile ? 'CDT' : 'Collab Digital Twins'}\r\n </span>\r\n </Link>\r\n </motion.div>\r\n\r\n {/* Nav links */}\r\n {showNavigation && (\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-1 flex-1 justify-center`}>\r\n {['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n }}\r\n className=\"relative px-4 py-2 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n fontWeight: currentSection === section ? 700 : 500,\r\n }}\r\n >\r\n {tNav(section as any)}\r\n {currentSection === section && (\r\n <motion.div\r\n layoutId=\"activeSection\"\r\n className=\"absolute -bottom-[17px] left-2 right-2 h-[2px]\"\r\n style={{ background: 'var(--hp-primary-container)' }}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Right actions */}\r\n <div className=\"flex items-center gap-3 flex-shrink-0 ml-auto\">\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-3`}>\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n </Button>\r\n\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-nav-cta rounded-md px-5 text-sm\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n\r\n {/* Mobile toggle */}\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\r\n className=\"lg:hidden p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle menu\"\r\n >\r\n {mobileMenuOpen ? <X className=\"w-5 h-5\" /> : <Menu className=\"w-5 h-5\" />}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Mobile menu */}\r\n <AnimatePresence>\r\n {mobileMenuOpen && (\r\n <motion.div\r\n initial={{ opacity: 0, height: 0 }}\r\n animate={{ opacity: 1, height: 'auto' }}\r\n exit={{ opacity: 0, height: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"lg:hidden overflow-hidden\"\r\n >\r\n <div className=\"py-4 space-y-1 mt-4\" style={{ borderTop: '1px solid rgba(255,255,255,0.04)' }}>\r\n {showNavigation &&\r\n ['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n setMobileMenuOpen(false)\r\n }}\r\n className=\"block w-full text-left px-4 py-2.5 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n background: currentSection === section\r\n ? 'rgba(239, 145, 97, 0.08)'\r\n : 'transparent',\r\n }}\r\n >\r\n {tNav(section as any)}\r\n </button>\r\n ))}\r\n\r\n <div className=\"flex items-center gap-2 px-4 py-2 pt-3\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n <span className=\"text-sm\">{theme === 'dark' ? 'Light' : 'Dark'}</span>\r\n </Button>\r\n <div className=\"flex-1\">\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"pt-2 px-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-sovereign w-full rounded-md\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </motion.nav>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSensorItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"CollapsibleSensorItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAQ3D,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAExD,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAS,EACT,SAAgB,EAChB,YAAY,EACZ,YAAY,EACb,EAAE,0BAA0B,qBAqO5B"}
|