@collabdt/core 0.0.51 → 0.0.53
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/NOTICE +1021 -0
- package/README.md +32 -4
- package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
- package/dist/core/components/AppSidebarContent.js.map +1 -1
- package/dist/core/components/ConfirmDialog.d.ts.map +1 -1
- package/dist/core/components/ConfirmDialog.js.map +1 -1
- package/dist/core/components/DataTableSkeleton.d.ts.map +1 -1
- package/dist/core/components/DataTableSkeleton.js.map +1 -1
- package/dist/core/components/LanguageSwitch.d.ts.map +1 -1
- package/dist/core/components/LanguageSwitch.js.map +1 -1
- package/dist/core/components/Logo.d.ts.map +1 -1
- package/dist/core/components/Logo.js.map +1 -1
- package/dist/core/components/Toolbar.d.ts.map +1 -1
- package/dist/core/components/Toolbar.js.map +1 -1
- package/dist/core/components/ToolbarBody.d.ts.map +1 -1
- package/dist/core/components/ToolbarBody.js.map +1 -1
- package/dist/core/components/ToolbarSubmenu.d.ts.map +1 -1
- package/dist/core/components/ToolbarSubmenu.js.map +1 -1
- package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
- package/dist/core/components/TopNavigationBar.js.map +1 -1
- package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
- package/dist/core/components/authentication/AuthPage.js.map +1 -1
- package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
- package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
- package/dist/core/components/authentication/PasswordError.d.ts.map +1 -1
- package/dist/core/components/authentication/PasswordError.js.map +1 -1
- package/dist/core/components/authentication/Signin.d.ts.map +1 -1
- package/dist/core/components/authentication/Signin.js.map +1 -1
- package/dist/core/components/authentication/SigninEmail.d.ts.map +1 -1
- package/dist/core/components/authentication/SigninEmail.js.map +1 -1
- package/dist/core/components/authentication/Signup.d.ts.map +1 -1
- package/dist/core/components/authentication/Signup.js.map +1 -1
- package/dist/core/components/authentication/VerifyEmail.d.ts.map +1 -1
- package/dist/core/components/authentication/VerifyEmail.js.map +1 -1
- package/dist/core/components/authentication/index.d.ts.map +1 -1
- package/dist/core/components/authentication/index.js.map +1 -1
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/instance-not-found/index.d.ts.map +1 -1
- package/dist/core/components/instance-not-found/index.js.map +1 -1
- package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
- package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
- package/dist/core/components/organizationConfig/index.d.ts.map +1 -1
- package/dist/core/components/organizationConfig/index.js.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
- package/dist/core/components/settings/index.d.ts.map +1 -1
- package/dist/core/components/settings/index.js.map +1 -1
- package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/ChangePassword.d.ts.map +1 -1
- package/dist/core/components/settings/src/ChangePassword.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSkeleton.d.ts.map +1 -1
- package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
- package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
- package/dist/core/components/settings/src/SettingsHeader.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsHeader.js.map +1 -1
- package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
- package/dist/core/components/settings/src/SettingsSkeleton.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
- package/dist/core/components/settings/src/UsersSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/UsersSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/types.d.ts.map +1 -1
- package/dist/core/components/ui/Accordion.d.ts.map +1 -1
- package/dist/core/components/ui/Accordion.js.map +1 -1
- package/dist/core/components/ui/AddItemDialog.d.ts.map +1 -1
- package/dist/core/components/ui/AddItemDialog.js.map +1 -1
- package/dist/core/components/ui/AlertDialog.d.ts.map +1 -1
- package/dist/core/components/ui/AlertDialog.js.map +1 -1
- package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
- package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
- package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
- package/dist/core/components/ui/AppSidebar.js.map +1 -1
- package/dist/core/components/ui/Avatar.d.ts.map +1 -1
- package/dist/core/components/ui/Avatar.js.map +1 -1
- package/dist/core/components/ui/Badge.d.ts.map +1 -1
- package/dist/core/components/ui/Badge.js.map +1 -1
- package/dist/core/components/ui/Breadcrumb.d.ts.map +1 -1
- package/dist/core/components/ui/Breadcrumb.js.map +1 -1
- package/dist/core/components/ui/Button.d.ts.map +1 -1
- package/dist/core/components/ui/Button.js.map +1 -1
- package/dist/core/components/ui/Calendar.d.ts.map +1 -1
- package/dist/core/components/ui/Calendar.js.map +1 -1
- package/dist/core/components/ui/Card.d.ts.map +1 -1
- package/dist/core/components/ui/Card.js.map +1 -1
- package/dist/core/components/ui/Checkbox.d.ts.map +1 -1
- package/dist/core/components/ui/Checkbox.js.map +1 -1
- package/dist/core/components/ui/CollapsibleSection.d.ts.map +1 -1
- package/dist/core/components/ui/CollapsibleSection.js.map +1 -1
- package/dist/core/components/ui/ColorCircle.d.ts.map +1 -1
- package/dist/core/components/ui/ColorCircle.js.map +1 -1
- package/dist/core/components/ui/Command.d.ts.map +1 -1
- package/dist/core/components/ui/Command.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/Comment.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/Comment.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
- package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
- package/dist/core/components/ui/Countdown.d.ts.map +1 -1
- package/dist/core/components/ui/Countdown.js.map +1 -1
- package/dist/core/components/ui/DataTable.d.ts.map +1 -1
- package/dist/core/components/ui/DataTable.js.map +1 -1
- package/dist/core/components/ui/DatePicker.d.ts.map +1 -1
- package/dist/core/components/ui/DatePicker.js.map +1 -1
- package/dist/core/components/ui/DescriptionList.d.ts.map +1 -1
- package/dist/core/components/ui/DescriptionList.js.map +1 -1
- package/dist/core/components/ui/Dialog.d.ts.map +1 -1
- package/dist/core/components/ui/Dialog.js.map +1 -1
- package/dist/core/components/ui/DropdownMenu.d.ts.map +1 -1
- package/dist/core/components/ui/DropdownMenu.js.map +1 -1
- package/dist/core/components/ui/ExportData.d.ts.map +1 -1
- package/dist/core/components/ui/ExportData.js.map +1 -1
- package/dist/core/components/ui/FilesManager/index.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/index.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.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.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/downloadUtils.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/downloadUtils.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileActions.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.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/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
- package/dist/core/components/ui/Footer.d.ts.map +1 -1
- package/dist/core/components/ui/Footer.js.map +1 -1
- package/dist/core/components/ui/GenericTool.d.ts.map +1 -1
- package/dist/core/components/ui/GenericTool.js.map +1 -1
- package/dist/core/components/ui/Icons/BcfIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/BcfIcon.js.map +1 -1
- package/dist/core/components/ui/Icons/CdtIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/CdtIcon.js.map +1 -1
- package/dist/core/components/ui/Icons/FloorPlanIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/FloorPlanIcon.js.map +1 -1
- package/dist/core/components/ui/Icons/GoogleIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/GoogleIcon.js.map +1 -1
- package/dist/core/components/ui/Icons/IdsIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/IdsIcon.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/Icons/index.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/index.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Header.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/Input.d.ts.map +1 -1
- package/dist/core/components/ui/Input.js.map +1 -1
- package/dist/core/components/ui/Label.d.ts.map +1 -1
- package/dist/core/components/ui/Label.js.map +1 -1
- package/dist/core/components/ui/LanguageToggle.d.ts.map +1 -1
- package/dist/core/components/ui/LanguageToggle.js.map +1 -1
- package/dist/core/components/ui/LoadingSpinner.d.ts.map +1 -1
- package/dist/core/components/ui/LoadingSpinner.js.map +1 -1
- package/dist/core/components/ui/Menubar.d.ts.map +1 -1
- package/dist/core/components/ui/Menubar.js.map +1 -1
- package/dist/core/components/ui/NavUser.d.ts.map +1 -1
- package/dist/core/components/ui/NavUser.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/Popover.d.ts.map +1 -1
- package/dist/core/components/ui/Popover.js.map +1 -1
- package/dist/core/components/ui/Progress.d.ts.map +1 -1
- package/dist/core/components/ui/Progress.js.map +1 -1
- package/dist/core/components/ui/ScrollArea.d.ts.map +1 -1
- package/dist/core/components/ui/ScrollArea.js.map +1 -1
- package/dist/core/components/ui/SearchInput.d.ts.map +1 -1
- package/dist/core/components/ui/SearchInput.js.map +1 -1
- package/dist/core/components/ui/Select.d.ts.map +1 -1
- package/dist/core/components/ui/Select.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/Sensor.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorInput.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/Sensors/SensorsSectionSkeleton.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.js.map +1 -1
- package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
- package/dist/core/components/ui/Separator.d.ts.map +1 -1
- package/dist/core/components/ui/Separator.js.map +1 -1
- package/dist/core/components/ui/SettingsButton.d.ts.map +1 -1
- package/dist/core/components/ui/SettingsButton.js.map +1 -1
- package/dist/core/components/ui/ShareFeature/QRCodeWithLink.d.ts.map +1 -1
- package/dist/core/components/ui/ShareFeature/QRCodeWithLink.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/ui/ShareFeature/index.d.ts.map +1 -1
- package/dist/core/components/ui/ShareFeature/index.js.map +1 -1
- package/dist/core/components/ui/Sheet.d.ts.map +1 -1
- package/dist/core/components/ui/Sheet.js.map +1 -1
- package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
- package/dist/core/components/ui/Sidebar.js.map +1 -1
- package/dist/core/components/ui/Skeleton.d.ts.map +1 -1
- package/dist/core/components/ui/Skeleton.js.map +1 -1
- package/dist/core/components/ui/Slider.d.ts.map +1 -1
- package/dist/core/components/ui/Slider.js.map +1 -1
- package/dist/core/components/ui/Sonner.d.ts.map +1 -1
- package/dist/core/components/ui/Sonner.js.map +1 -1
- package/dist/core/components/ui/Switch.d.ts.map +1 -1
- package/dist/core/components/ui/Switch.js.map +1 -1
- package/dist/core/components/ui/Table.d.ts.map +1 -1
- package/dist/core/components/ui/Table.js.map +1 -1
- package/dist/core/components/ui/Tabs.d.ts.map +1 -1
- package/dist/core/components/ui/Tabs.js.map +1 -1
- package/dist/core/components/ui/Textarea.d.ts.map +1 -1
- package/dist/core/components/ui/Textarea.js.map +1 -1
- package/dist/core/components/ui/Toggle.d.ts.map +1 -1
- package/dist/core/components/ui/Toggle.js.map +1 -1
- package/dist/core/components/ui/ToggleGroup.d.ts.map +1 -1
- package/dist/core/components/ui/ToggleGroup.js.map +1 -1
- package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
- package/dist/core/components/ui/ToolbarButton.js.map +1 -1
- package/dist/core/components/ui/Tooltip.d.ts.map +1 -1
- package/dist/core/components/ui/Tooltip.js.map +1 -1
- package/dist/core/components/ui/UserAvatar.d.ts.map +1 -1
- package/dist/core/components/ui/UserAvatar.js.map +1 -1
- package/dist/core/components/ui/chart.d.ts.map +1 -1
- package/dist/core/components/ui/chart.js.map +1 -1
- package/dist/core/components/ui/downloadUtils.d.ts.map +1 -1
- package/dist/core/components/ui/downloadUtils.js.map +1 -1
- package/dist/core/components/ui/index.d.ts.map +1 -1
- package/dist/core/components/ui/index.js.map +1 -1
- package/dist/core/components/ui/openPopupWindow.d.ts.map +1 -1
- package/dist/core/components/ui/openPopupWindow.js.map +1 -1
- package/dist/core/components/ui/openPopupWindowLCA.d.ts.map +1 -1
- package/dist/core/components/ui/openPopupWindowLCA.js.map +1 -1
- package/dist/core/components/ui/stats.d.ts.map +1 -1
- package/dist/core/components/ui/stats.js.map +1 -1
- package/dist/core/components/ui/uploadFile.d.ts.map +1 -1
- package/dist/core/components/ui/uploadFile.js.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
- package/dist/core/components/viewers/Data/FilterButtons.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/FilterButtons.js.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/Filters.js.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.js.map +1 -1
- package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/AttachedFiles.js.map +1 -1
- package/dist/core/components/viewers/Data/details/CheckboxGroup.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/CheckboxGroup.js.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailActions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailActions.js.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
- package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FileUpload.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FileUpload.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FilterFiles.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FilterFiles.js.map +1 -1
- package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
- package/dist/core/components/viewers/Data/details/UnitsGrid.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/UnitsGrid.js.map +1 -1
- package/dist/core/components/viewers/Data/details/getAttachmentFileName.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/getAttachmentFileName.js.map +1 -1
- package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
- package/dist/core/components/viewers/Data/files/FileDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/FileDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/files/FileMoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/FileMoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/files/FilePreview.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/FilePreview.js.map +1 -1
- package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AddSite.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AddSite.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/AddUser.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/AddUser.js.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/Columns.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/Headers.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/Headers.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/convertDate.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/convertDate.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/csvUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/csvUtils.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/useViewerData.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/useViewerData.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/viewerConfig.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/viewerConfig.js.map +1 -1
- package/dist/core/components/viewers/Viewer.d.ts.map +1 -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.map +1 -1
- package/dist/core/components/viewers/bim/src/BCFTopicsManager.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BCFTopicsManager.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BIMManager/index.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.map +1 -1
- package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/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.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/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.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.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/CameraProjection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/CameraProjection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
- package/dist/core/components/viewers/bim/src/CurrentCamera.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/CurrentCamera.js.map +1 -1
- package/dist/core/components/viewers/bim/src/CurrentWorld.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/CurrentWorld.js.map +1 -1
- package/dist/core/components/viewers/bim/src/Cursor.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/Cursor.js.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FitCamera.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FitCamera.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.js.map +1 -1
- package/dist/core/components/viewers/bim/src/GhostMode.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/GhostMode.js.map +1 -1
- package/dist/core/components/viewers/bim/src/Highlighter/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/Highlighter/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/IDSManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/IDSManager/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js.map +1 -1
- package/dist/core/components/viewers/bim/src/IfcToFragments.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/IfcToFragments.js.map +1 -1
- package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.js.map +1 -1
- package/dist/core/components/viewers/bim/src/LoadModels.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/LoadModels.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.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/SpatialStructure.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/SpatialStructure.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ViewportGizmo.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ViewportGizmo.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/CameraController.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ChromeController.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ClipController.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/GridController.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/GridController.js.map +1 -1
- 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/ViewModeCoordinator.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/drawingLayers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/drawingLayers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/drawingProjection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/safeRun.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/safeRun.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useBuildingName.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useBuildingName.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.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/viewSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/viewSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.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.map +1 -1
- 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.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -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.map +1 -1
- 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.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.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
- 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.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/shareBimTool.js.map +1 -1
- package/dist/core/components/viewers/bim/utils/GizmoController.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/utils/GizmoController.js.map +1 -1
- package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/utils/setCameraLookAt.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.map +1 -1
- package/dist/core/components/viewers/map/datasets/AddPortalDialog.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/AddPortalDialog.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetDetails.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.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetSkeleton.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetSkeleton.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/Filters.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/Filters.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/NestedFilter.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/NestedFilter.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.map +1 -1
- package/dist/core/components/viewers/map/datasets/data.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/data.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.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/arcgisFetch.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/arcgisFetch.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/cache.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/cache.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/geojsonFile.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/geojsonFile.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +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.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/socrataDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/urlSources.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +0 -8
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/utils.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/utils.js.map +1 -1
- package/dist/core/components/viewers/map/legends/MapLegendHost.d.ts.map +1 -1
- package/dist/core/components/viewers/map/legends/MapLegendHost.js.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.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.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.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.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.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/components/FileIcon.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.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.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -1
- 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.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/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/LayersTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.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.map +1 -1
- package/dist/core/components/viewers/map/src/SimpleMap.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/SimpleMap.js.map +1 -1
- package/dist/core/components/viewers/map/src/compare/AddItem.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/compare/AddItem.js.map +1 -1
- package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/compare/CompareDialog.js.map +1 -1
- package/dist/core/components/viewers/map/src/compare/description-list.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/compare/description-list.js.map +1 -1
- package/dist/core/components/viewers/map/src/compare/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/compare/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/measureMapTool.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/shareMapTool.js.map +1 -1
- package/dist/core/components/viewers/map/utils/ClusterManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/ClusterManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/MarkerManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MarkerManager.js.map +1 -1
- package/dist/core/components/viewers/map/utils/dateName.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/dateName.js.map +1 -1
- package/dist/core/components/viewers/map/utils/extractCoordinates.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/extractCoordinates.js.map +1 -1
- package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/fitBuildingsBounds.js.map +1 -1
- package/dist/core/components/viewers/map/utils/fitGeojsonBounds.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/fitGeojsonBounds.js.map +1 -1
- package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.js.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
- package/dist/core/components/viewers/map/utils/mapStyleCatalog.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/mapStyleCatalog.js.map +1 -1
- package/dist/core/components/viewers/map/utils/stringToColour.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/stringToColour.js.map +1 -1
- package/dist/core/components/viewers/map/utils/toggleBimToMap.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/toggleBimToMap.js.map +1 -1
- package/dist/core/components/viewers/map/utils/updateBuildingOsmId.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/updateBuildingOsmId.js.map +1 -1
- package/dist/core/components/viewers/map/utils/validateBounds.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/validateBounds.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/define.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/define.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.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.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.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/PointCloudSidebar/src/SettingsTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.js.map +1 -1
- package/dist/core/components/viewers/useCoordinateSystem.d.ts.map +1 -1
- package/dist/core/components/viewers/useCoordinateSystem.js.map +1 -1
- package/dist/core/hooks/buildings/buildings.d.ts.map +1 -1
- package/dist/core/hooks/buildings/buildings.js.map +1 -1
- package/dist/core/hooks/buildings/createBuildingHooks.d.ts.map +1 -1
- package/dist/core/hooks/buildings/createBuildingHooks.js.map +1 -1
- package/dist/core/hooks/comments/comments.d.ts.map +1 -1
- package/dist/core/hooks/comments/comments.js.map +1 -1
- package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
- package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
- package/dist/core/hooks/files/createFileHooks.d.ts.map +1 -1
- package/dist/core/hooks/files/createFileHooks.js.map +1 -1
- package/dist/core/hooks/files/files.d.ts.map +1 -1
- package/dist/core/hooks/files/files.js.map +1 -1
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js.map +1 -1
- package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts.map +1 -1
- package/dist/core/hooks/infrastructures/createInfrastructureHooks.js.map +1 -1
- package/dist/core/hooks/infrastructures/infrastructures.d.ts.map +1 -1
- package/dist/core/hooks/infrastructures/infrastructures.js.map +1 -1
- package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts.map +1 -1
- package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.js.map +1 -1
- package/dist/core/hooks/openDataPortals/openDataPortals.d.ts.map +1 -1
- package/dist/core/hooks/openDataPortals/openDataPortals.js.map +1 -1
- package/dist/core/hooks/organizations/createOrganizationHooks.d.ts.map +1 -1
- package/dist/core/hooks/organizations/createOrganizationHooks.js.map +1 -1
- package/dist/core/hooks/organizations/organizations.d.ts.map +1 -1
- package/dist/core/hooks/organizations/organizations.js.map +1 -1
- package/dist/core/hooks/ports/apiAdapter.d.ts.map +1 -1
- package/dist/core/hooks/provider.d.ts.map +1 -1
- package/dist/core/hooks/provider.js.map +1 -1
- package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts.map +1 -1
- package/dist/core/hooks/sensorTypes/createSensorTypeHooks.js.map +1 -1
- package/dist/core/hooks/sensorTypes/sensorTypes.d.ts.map +1 -1
- package/dist/core/hooks/sensorTypes/sensorTypes.js.map +1 -1
- package/dist/core/hooks/sensors/createSensorHooks.d.ts.map +1 -1
- package/dist/core/hooks/sensors/createSensorHooks.js.map +1 -1
- package/dist/core/hooks/sensors/sensors.d.ts.map +1 -1
- package/dist/core/hooks/sensors/sensors.js.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
- package/dist/core/hooks/sites/sites.d.ts.map +1 -1
- package/dist/core/hooks/sites/sites.js.map +1 -1
- package/dist/core/hooks/ui/use-mobile.d.ts.map +1 -1
- package/dist/core/hooks/ui/use-mobile.js.map +1 -1
- package/dist/core/hooks/users/createUserHooks.d.ts.map +1 -1
- package/dist/core/hooks/users/createUserHooks.js.map +1 -1
- package/dist/core/hooks/users/users.d.ts.map +1 -1
- package/dist/core/hooks/users/users.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/plugins/host/context.d.ts.map +1 -1
- package/dist/core/plugins/host/context.js.map +1 -1
- package/dist/core/plugins/host/errors.d.ts.map +1 -1
- package/dist/core/plugins/host/errors.js.map +1 -1
- package/dist/core/plugins/host/host.d.ts.map +1 -1
- package/dist/core/plugins/host/host.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/plugins/host/registry.d.ts.map +1 -1
- package/dist/core/plugins/host/registry.js.map +1 -1
- package/dist/core/plugins/installed.d.ts.map +1 -1
- package/dist/core/plugins/installed.js.map +1 -1
- package/dist/core/plugins/sdk/components.d.ts.map +1 -1
- package/dist/core/plugins/sdk/components.js.map +1 -1
- package/dist/core/plugins/sdk/index.d.ts.map +1 -1
- package/dist/core/plugins/sdk/index.js.map +1 -1
- package/dist/core/plugins/sdk/types.d.ts.map +1 -1
- package/dist/core/plugins/sdk/types.js.map +1 -1
- package/dist/core/store/ActionMap.d.ts.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/AppConfig/reducer.d.ts.map +1 -1
- package/dist/core/store/AppConfig/reducer.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.map +1 -1
- 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/Buildings/reducer.d.ts.map +1 -1
- package/dist/core/store/Buildings/reducer.js.map +1 -1
- package/dist/core/store/CombineProviders.d.ts.map +1 -1
- package/dist/core/store/CombineProviders.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.map +1 -1
- package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
- 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/Files/reducer.d.ts.map +1 -1
- package/dist/core/store/Files/reducer.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/Map/reducer.d.ts.map +1 -1
- package/dist/core/store/Map/reducer.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/Menus/reducer.d.ts.map +1 -1
- package/dist/core/store/Menus/reducer.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/PointCloud/reducer.d.ts.map +1 -1
- package/dist/core/store/PointCloud/reducer.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/store/Tools/reducer.d.ts.map +1 -1
- package/dist/core/store/Tools/reducer.js.map +1 -1
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/styles/tailwindMerge.d.ts.map +1 -1
- package/dist/core/styles/tailwindMerge.js.map +1 -1
- package/dist/core/types/bim.d.ts.map +1 -1
- package/dist/core/types/datasetTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.js.map +1 -1
- package/dist/core/types/files.d.ts.map +1 -1
- package/dist/core/types/global.d.ts.map +1 -1
- package/dist/core/types/global.js.map +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/types/map.d.ts.map +1 -1
- package/dist/core/types/martinTypes.d.ts.map +1 -1
- package/dist/core/types/martinTypes.js.map +1 -1
- package/dist/core/types/next-auth.d.ts.map +1 -1
- package/dist/core/types/tools.d.ts.map +1 -1
- package/dist/core/types/users.d.ts.map +1 -1
- package/dist/core/utils/acceptedFiles.d.ts.map +1 -1
- package/dist/core/utils/acceptedFiles.js.map +1 -1
- package/dist/core/utils/errorHandler.d.ts.map +1 -1
- package/dist/core/utils/errorHandler.js.map +1 -1
- package/dist/core/utils/getFileIcon.d.ts.map +1 -1
- package/dist/core/utils/getFileIcon.js.map +1 -1
- package/dist/core/utils/imageUtils.d.ts.map +1 -1
- package/dist/core/utils/imageUtils.js.map +1 -1
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core/utils/index.js.map +1 -1
- package/dist/core/utils/markerUtils.d.ts.map +1 -1
- package/dist/core/utils/markerUtils.js.map +1 -1
- package/dist/core/utils/memcache.d.ts.map +1 -1
- package/dist/core/utils/memcache.js.map +1 -1
- package/dist/core/utils/roles.d.ts.map +1 -1
- package/dist/core/utils/roles.js.map +1 -1
- package/dist/core/utils/timeUtils.d.ts.map +1 -1
- package/dist/core/utils/timeUtils.js.map +1 -1
- package/dist/core/utils/utils.d.ts.map +1 -1
- package/dist/core/utils/utils.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/map/utils/updateBuildingOsmId.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/map/utils/updateBuildingOsmId.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nexport const updateBuildingOsmId = async (buildingId: number, osmId: number) => {\r\n try {\r\n const response = await fetch(`/api/buildings/${buildingId}`, {\r\n method: 'PATCH',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ buildingOsmId: osmId }),\r\n })\r\n\r\n if (!response.ok) throw new Error('Network response was not ok')\r\n\r\n // Optionally refresh or mutate data here\r\n }\r\n catch (error) {\r\n console.error('Failed to update OSM ID:', error)\r\n }\r\n}\r\n"],"mappings":"AAGO,MAAM,sBAAsB,OAAO,YAAoB,UAAkB;AAC9E,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,kBAAkB,UAAU,IAAI;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,eAAe,MAAM,CAAC;AAAA,IAC/C,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAAA,EAGjE,SACO,OAAO;AACZ,YAAQ,MAAM,4BAA4B,KAAK;AAAA,EACjD;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateBounds.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/utils/validateBounds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validateBounds.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/utils/validateBounds.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAwBnD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,OAAO,EACf,iBAAiB,gBAAgB,KAChC,gBAAgB,GAAG,SAsBrB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/map/utils/validateBounds.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/map/utils/validateBounds.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { LngLatBoundsLike } from 'maplibre-gl'\r\n\r\n/**\r\n * Type guard to check if a value is a valid flat bounds array [minLng, minLat, maxLng, maxLat]\r\n */\r\nconst isValidFlatBounds = (value: unknown): value is [number, number, number, number] => (\r\n Array.isArray(value)\r\n && value.length === 4\r\n && value.every((n) => typeof n === 'number' && Number.isFinite(n))\r\n)\r\n\r\n/**\r\n * Type guard to check if a value is a valid nested bounds array [[minLng, minLat], [maxLng, maxLat]]\r\n */\r\nconst isValidNestedBounds = (value: unknown): value is [[number, number], [number, number]] => (\r\n Array.isArray(value)\r\n && value.length === 2\r\n && value.every((pair) => (\r\n Array.isArray(pair)\r\n && pair.length === 2\r\n && pair.every((n) => typeof n === 'number' && Number.isFinite(n))\r\n ))\r\n)\r\n\r\n/**\r\n * Resolves and validates bounds to a LngLatBoundsLike format.\r\n * Accepts bounds as an array (flat or nested) or as a JSON string.\r\n * Falls back to the provided fallback bounds if validation fails.\r\n *\r\n * @param bounds - The bounds to validate (can be an array or JSON string)\r\n * @param fallbackBounds - The bounds to use if validation fails. When omitted,\r\n * invalid input resolves to `undefined`, i.e. no panning restriction.\r\n * @returns Valid LngLatBoundsLike bounds, or the fallback (which may be undefined)\r\n */\r\nexport const resolveBounds = (\r\n bounds: unknown,\r\n fallbackBounds?: LngLatBoundsLike\r\n): LngLatBoundsLike | undefined => {\r\n if (isValidFlatBounds(bounds) || isValidNestedBounds(bounds)) {\r\n return bounds as LngLatBoundsLike\r\n }\r\n\r\n if (typeof bounds === 'string') {\r\n const trimmed = bounds.trim()\r\n if (trimmed.length === 0) {\r\n return fallbackBounds\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed) as unknown\r\n if (isValidFlatBounds(parsed) || isValidNestedBounds(parsed)) {\r\n return parsed as LngLatBoundsLike\r\n }\r\n } catch {\r\n // fall back to fallbackBounds\r\n }\r\n }\r\n\r\n return fallbackBounds\r\n}\r\n"],"mappings":"AAQA,MAAM,oBAAoB,CAAC,UACzB,MAAM,QAAQ,KAAK,KAChB,MAAM,WAAW,KACjB,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC;AAMnE,MAAM,sBAAsB,CAAC,UAC3B,MAAM,QAAQ,KAAK,KAChB,MAAM,WAAW,KACjB,MAAM,MAAM,CAAC,SACd,MAAM,QAAQ,IAAI,KACf,KAAK,WAAW,KAChB,KAAK,MAAM,CAAC,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC,CACjE;AAaI,MAAM,gBAAgB,CAC3B,QACA,mBACiC;AACjC,MAAI,kBAAkB,MAAM,KAAK,oBAAoB,MAAM,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,kBAAkB,MAAM,KAAK,oBAAoB,MAAM,GAAG;AAC5D,eAAO;AAAA,MACT;AAAA,IACF,SAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudToolbar.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudToolbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointCloudToolbar.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudToolbar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,wBAAgB,iBAAiB,sBAEhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudToolbar.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { pointcloudToolbarTools } from './src/tools'\r\nimport { ToolbarBody } from '../../ToolbarBody'\r\n\r\nexport function PointCloudToolbar() {\r\n return <ToolbarBody viewer=\"pointcloud\" tools={pointcloudToolbarTools()} />\r\n}\r\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudToolbar.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { pointcloudToolbarTools } from './src/tools'\r\nimport { ToolbarBody } from '../../ToolbarBody'\r\n\r\nexport function PointCloudToolbar() {\r\n return <ToolbarBody viewer=\"pointcloud\" tools={pointcloudToolbarTools()} />\r\n}\r\n"],"mappings":";AAUS;AAJT,SAAS,8BAA8B;AACvC,SAAS,mBAAmB;AAErB,SAAS,oBAAoB;AAClC,SAAO,oBAAC,eAAY,QAAO,cAAa,OAAO,uBAAuB,GAAG;AAC3E;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointCloudViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,wBAAgB,gBAAgB,sBAsO/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nexport function PointCloudViewer() {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n // Potree's render loop re-schedules itself via requestAnimationFrame with no stop API;\r\n // shadow it with a no-op so it halts on unmount instead of running forever against a\r\n // disposed renderer (otherwise a new loop accumulates on every visit).\r\n if (v) {\r\n v.loop = () => { };\r\n v.update = () => { };\r\n }\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ; (async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n // Bail if the viewer was torn down (or re-init'd) while this load was in flight —\r\n // the init-effect cleanup nulls viewerRef, so this guard avoids attaching to a dead viewer.\r\n if (viewerRef.current !== viewer) return;\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nexport function PointCloudViewer() {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n // Potree's render loop re-schedules itself via requestAnimationFrame with no stop API;\r\n // shadow it with a no-op so it halts on unmount instead of running forever against a\r\n // disposed renderer (otherwise a new loop accumulates on every visit).\r\n if (v) {\r\n v.loop = () => { };\r\n v.update = () => { };\r\n }\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ; (async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n // Bail if the viewer was torn down (or re-init'd) while this load was in flight —\r\n // the init-effect cleanup nulls viewerRef, so this guard avoids attaching to a dead viewer.\r\n if (viewerRef.current !== viewer) return;\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/define.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/pointcloud/define.ts"],"names":[],"mappings":"AAMA,+BAA+B;AAC/B,0BAAkB,UAAU;IAC1B,YAAY,IAAI;IAChB,WAAW,IAAI;IACf,EAAE,IAAI;CACP;AAED,4CAA4C;AAC5C,0BAAkB,QAAQ;IACxB,IAAI,IAAI;IACR,SAAS,IAAI;IACb,WAAW,IAAI;IACf,YAAY,IAAI;CACjB;AAED,yEAAyE;AACzE,0BAAkB,UAAU;IAC1B,UAAU,IAAI;IACd,UAAU,IAAI;CACf;AAED,0CAA0C;AAC1C,0BAAkB,uBAAuB;IACvC,KAAK,IAAI;IACT,MAAM,IAAI;IACV,eAAe,IAAI;CACpB;AAED,iCAAiC;AACjC,0BAAkB,KAAK;IACrB,IAAI,IAAW;IACf,KAAK,IAAU;IACf,MAAM,IAAS;CAChB;AAED,kCAAkC;AAClC,0BAAkB,aAAa;IAC7B,KAAK,IAAI;IACT,UAAU,IAAI;IACd,QAAQ,IAAI;CACb;AAED,yBAAyB;AACzB,0BAAkB,UAAU;IAC1B,MAAM,IAAI;IACV,MAAM,IAAI;IACV,UAAU,IAAI;CACf;AAED,kCAAkC;AAClC,0BAAkB,QAAQ;IACxB,MAAM,IAAI;IACV,MAAM,IAAI;CACX;AAED;;;GAGG;AACH,0BAAkB,UAAU;IAC1B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,cAAc,CAI/D,CAAC;AAGF,eAAO,MAAM,QAAQ,GAAI,eAAe,MAAM,EAAE,MAAM,UAAU,WACV,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,MAAM,UAAU,WACV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/define.ts"],"sourcesContent":["// This is enum declaration file, taken from Potree Point Cloud Viewer\r\n// https://github.com/potree/potree/blob/develop/src/defines.js\r\n\r\n/** Camera projection / mode */\r\nexport const enum CameraMode {\r\n ORTHOGRAPHIC = 0,\r\n PERSPECTIVE = 1,\r\n VR = 2,\r\n}\r\n\r\n/** How clipping volumes affect rendering */\r\nexport const enum ClipTask {\r\n NONE = 0,\r\n HIGHLIGHT = 1,\r\n SHOW_INSIDE = 2,\r\n SHOW_OUTSIDE = 3,\r\n}\r\n\r\n/** Whether a point is kept if it's inside ANY or ALL clipping volumes */\r\nexport const enum ClipMethod {\r\n INSIDE_ANY = 0,\r\n INSIDE_ALL = 1,\r\n}\r\n\r\n/** Elevation shader gradient wrap mode */\r\nexport const enum ElevationGradientRepeat {\r\n CLAMP = 0,\r\n REPEAT = 1,\r\n MIRRORED_REPEAT = 2,\r\n}\r\n\r\n/** Mouse buttons as bit flags */\r\nexport const enum MOUSE {\r\n LEFT = 0b0001,\r\n RIGHT = 0b0010,\r\n MIDDLE = 0b0100,\r\n}\r\n\r\n/** Point size attenuation mode */\r\nexport const enum PointSizeType {\r\n FIXED = 0,\r\n ATTENUATED = 1,\r\n ADAPTIVE = 2,\r\n}\r\n\r\n/** Point sprite shape */\r\nexport const enum PointShape {\r\n SQUARE = 0,\r\n CIRCLE = 1,\r\n PARABOLOID = 2,\r\n}\r\n\r\n/** Acceleration structure type */\r\nexport const enum TreeType {\r\n OCTREE = 0,\r\n KDTREE = 1,\r\n}\r\n\r\n/**\r\n * Units: enum + metadata map (enums can’t hold object values).\r\n * Use LengthUnit for typing, and LENGTH_UNIT_META for code & scale.\r\n */\r\nexport const enum LengthUnit {\r\n METER = \"METER\",\r\n FEET = \"FEET\",\r\n INCH = \"INCH\",\r\n}\r\n\r\nexport type LengthUnitInfo = {\r\n code: string;\r\n unitsPerMeter: number;\r\n};\r\n\r\nexport const LENGTH_UNIT_META: Record<LengthUnit, LengthUnitInfo> = {\r\n [LengthUnit.METER]: { code: \"m\", unitsPerMeter: 1.0 },\r\n [LengthUnit.FEET]: { code: \"ft\", unitsPerMeter: 3.28084 },\r\n [LengthUnit.INCH]: { code: \"″\", unitsPerMeter: 39.3701 },\r\n};\r\n\r\n// (optional) helpers\r\nexport const metersTo = (valueInMeters: number, unit: LengthUnit) =>\r\n valueInMeters * LENGTH_UNIT_META[unit].unitsPerMeter;\r\n\r\nexport const toMeters = (value: number, unit: LengthUnit) =>\r\n value / LENGTH_UNIT_META[unit].unitsPerMeter;"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/define.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// This is enum declaration file, taken from Potree Point Cloud Viewer\r\n// https://github.com/potree/potree/blob/develop/src/defines.js\r\n\r\n/** Camera projection / mode */\r\nexport const enum CameraMode {\r\n ORTHOGRAPHIC = 0,\r\n PERSPECTIVE = 1,\r\n VR = 2,\r\n}\r\n\r\n/** How clipping volumes affect rendering */\r\nexport const enum ClipTask {\r\n NONE = 0,\r\n HIGHLIGHT = 1,\r\n SHOW_INSIDE = 2,\r\n SHOW_OUTSIDE = 3,\r\n}\r\n\r\n/** Whether a point is kept if it's inside ANY or ALL clipping volumes */\r\nexport const enum ClipMethod {\r\n INSIDE_ANY = 0,\r\n INSIDE_ALL = 1,\r\n}\r\n\r\n/** Elevation shader gradient wrap mode */\r\nexport const enum ElevationGradientRepeat {\r\n CLAMP = 0,\r\n REPEAT = 1,\r\n MIRRORED_REPEAT = 2,\r\n}\r\n\r\n/** Mouse buttons as bit flags */\r\nexport const enum MOUSE {\r\n LEFT = 0b0001,\r\n RIGHT = 0b0010,\r\n MIDDLE = 0b0100,\r\n}\r\n\r\n/** Point size attenuation mode */\r\nexport const enum PointSizeType {\r\n FIXED = 0,\r\n ATTENUATED = 1,\r\n ADAPTIVE = 2,\r\n}\r\n\r\n/** Point sprite shape */\r\nexport const enum PointShape {\r\n SQUARE = 0,\r\n CIRCLE = 1,\r\n PARABOLOID = 2,\r\n}\r\n\r\n/** Acceleration structure type */\r\nexport const enum TreeType {\r\n OCTREE = 0,\r\n KDTREE = 1,\r\n}\r\n\r\n/**\r\n * Units: enum + metadata map (enums can’t hold object values).\r\n * Use LengthUnit for typing, and LENGTH_UNIT_META for code & scale.\r\n */\r\nexport const enum LengthUnit {\r\n METER = \"METER\",\r\n FEET = \"FEET\",\r\n INCH = \"INCH\",\r\n}\r\n\r\nexport type LengthUnitInfo = {\r\n code: string;\r\n unitsPerMeter: number;\r\n};\r\n\r\nexport const LENGTH_UNIT_META: Record<LengthUnit, LengthUnitInfo> = {\r\n [LengthUnit.METER]: { code: \"m\", unitsPerMeter: 1.0 },\r\n [LengthUnit.FEET]: { code: \"ft\", unitsPerMeter: 3.28084 },\r\n [LengthUnit.INCH]: { code: \"″\", unitsPerMeter: 39.3701 },\r\n};\r\n\r\n// (optional) helpers\r\nexport const metersTo = (valueInMeters: number, unit: LengthUnit) =>\r\n valueInMeters * LENGTH_UNIT_META[unit].unitsPerMeter;\r\n\r\nexport const toMeters = (value: number, unit: LengthUnit) =>\r\n value / LENGTH_UNIT_META[unit].unitsPerMeter;"],"mappings":"AAOO,IAAW,aAAX,kBAAWA,gBAAX;AACL,EAAAA,wBAAA,kBAAe,KAAf;AACA,EAAAA,wBAAA,iBAAc,KAAd;AACA,EAAAA,wBAAA,QAAK,KAAL;AAHgB,SAAAA;AAAA,GAAA;AAOX,IAAW,WAAX,kBAAWC,cAAX;AACL,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,eAAY,KAAZ;AACA,EAAAA,oBAAA,iBAAc,KAAd;AACA,EAAAA,oBAAA,kBAAe,KAAf;AAJgB,SAAAA;AAAA,GAAA;AAQX,IAAW,aAAX,kBAAWC,gBAAX;AACL,EAAAA,wBAAA,gBAAa,KAAb;AACA,EAAAA,wBAAA,gBAAa,KAAb;AAFgB,SAAAA;AAAA,GAAA;AAMX,IAAW,0BAAX,kBAAWC,6BAAX;AACL,EAAAA,kDAAA,WAAQ,KAAR;AACA,EAAAA,kDAAA,YAAS,KAAT;AACA,EAAAA,kDAAA,qBAAkB,KAAlB;AAHgB,SAAAA;AAAA,GAAA;AAOX,IAAW,QAAX,kBAAWC,WAAX;AACL,EAAAA,cAAA,UAAS,KAAT;AACA,EAAAA,cAAA,WAAS,KAAT;AACA,EAAAA,cAAA,YAAS,KAAT;AAHgB,SAAAA;AAAA,GAAA;AAOX,IAAW,gBAAX,kBAAWC,mBAAX;AACL,EAAAA,8BAAA,WAAQ,KAAR;AACA,EAAAA,8BAAA,gBAAa,KAAb;AACA,EAAAA,8BAAA,cAAW,KAAX;AAHgB,SAAAA;AAAA,GAAA;AAOX,IAAW,aAAX,kBAAWC,gBAAX;AACL,EAAAA,wBAAA,YAAS,KAAT;AACA,EAAAA,wBAAA,YAAS,KAAT;AACA,EAAAA,wBAAA,gBAAa,KAAb;AAHgB,SAAAA;AAAA,GAAA;AAOX,IAAW,WAAX,kBAAWC,cAAX;AACL,EAAAA,oBAAA,YAAS,KAAT;AACA,EAAAA,oBAAA,YAAS,KAAT;AAFgB,SAAAA;AAAA,GAAA;AASX,IAAW,aAAX,kBAAWC,gBAAX;AACL,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,UAAO;AAHS,SAAAA;AAAA,GAAA;AAWX,MAAM,mBAAuD;AAAA,EAClE,CAAC,mBAAgB,GAAG,EAAE,MAAM,KAAM,eAAe,EAAI;AAAA,EACrD,CAAC,iBAAe,GAAI,EAAE,MAAM,MAAM,eAAe,QAAQ;AAAA,EACzD,CAAC,iBAAe,GAAI,EAAE,MAAM,UAAM,eAAe,QAAQ;AAC3D;AAGO,MAAM,WAAW,CAAC,eAAuB,SAC9C,gBAAgB,iBAAiB,IAAI,EAAE;AAElC,MAAM,WAAW,CAAC,OAAe,SACtC,QAAQ,iBAAiB,IAAI,EAAE;","names":["CameraMode","ClipTask","ClipMethod","ElevationGradientRepeat","MOUSE","PointSizeType","PointShape","TreeType","LengthUnit"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AA2BzB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,GAAG,YAAY,CAAA;AAElH,wBAAgB,sBAAsB,sBA0WrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Card, CardContent, CardHeader } from '../../../../ui/Card'\r\nimport { Input } from '../../../../ui/Input'\r\nimport { LoadingSpinner } from '../../../../ui/LoadingSpinner'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, usePermissions } from '../../../../../store'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useFilesByBuildingId } from '../../../../../hooks/files/files'\r\nimport type { DbFile } from '../../../../../types/dbTypes'\r\nimport { cn } from '../../../../../utils/utils'\r\nimport { useSearchParams, useRouter } from 'next/navigation'\r\nimport { useBuilding, useBuildings } from '../../../../../hooks/buildings/buildings'\r\nimport { SquareArrowOutUpRight } from 'lucide-react'\r\n\r\nconst API_BASE = process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? 'http://localhost:5101'\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string\r\n name: string\r\n }\r\n upload: {\r\n uploadUrl: string\r\n }\r\n}\r\n\r\nexport type pointCloudViewerState = 'opening' | 'loading' | 'ready' | 'error' | 'noPointCloudFiles' | 'noBuilding'\r\n\r\nexport function PointCloudLoadingState() {\r\n const t = useTranslations('PointCloudLoadingState')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: buildingState, dispatch: buildingDispatch } = React.useContext(BuildingsContext)\r\n const { building: storeBuilding } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n const buildingId = searchParams.get(\"buildingId\")\r\n const { building: urlBuilding, isLoading: buildingLoading, isError: buildingError } = useBuilding(buildingId ? Number(buildingId) : 0)\r\n const { buildings, isLoading: buildingsLoading } = useBuildings()\r\n\r\n // Determine the current building to use\r\n const building = storeBuilding || urlBuilding\r\n\r\n React.useEffect(() => {\r\n if (!storeBuilding && urlBuilding) {\r\n buildingDispatch({ type: \"SET-CURRENT-BUILDING\", payload: { building: urlBuilding } })\r\n }\r\n }, [urlBuilding, storeBuilding, buildingDispatch])\r\n\r\n const router = useRouter()\r\n const fileInputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const [currentState, setCurrentState] = React.useState<pointCloudViewerState>('opening')\r\n const [uploading, setUploading] = React.useState(false)\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [searchResults, setSearchResults] = React.useState<any[]>([])\r\n const [selectedBuilding, setSelectedBuilding] = React.useState<any>(null)\r\n \r\n const { files, isLoading: filesLoading } = useFilesByBuildingId(building?.id)\r\n const pointCloudFiles: DbFile[] = React.useMemo(() => (\r\n files.filter(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n })\r\n ), [files])\r\n\r\n // Fuzzy search function for buildings\r\n const fuzzySearchBuildings = React.useCallback((buildings: any[], searchTerm: string) => {\r\n if (!searchTerm.trim()) return buildings.slice(0, 10)\r\n \r\n const fuzzySearchScore = (search: string, text: string): number => {\r\n if (!search || !text) return 0\r\n const searchLower = search.toLowerCase()\r\n const textLower = text.toLowerCase()\r\n \r\n if (textLower === searchLower) return 1000\r\n if (textLower.startsWith(searchLower)) return 800\r\n if (textLower.includes(searchLower)) return 600\r\n \r\n return 0\r\n }\r\n\r\n return buildings\r\n .map((building) => {\r\n const address = building.buildingAddress || ''\r\n const name = building.buildingName || ''\r\n const id = building.id.toString()\r\n \r\n const addressScore = fuzzySearchScore(searchTerm, address)\r\n const nameScore = fuzzySearchScore(searchTerm, name)\r\n const idScore = fuzzySearchScore(searchTerm, id)\r\n \r\n const maxScore = Math.max(addressScore, nameScore, idScore)\r\n return { ...building, searchScore: maxScore }\r\n })\r\n .filter(building => building.searchScore > 0)\r\n .sort((a, b) => b.searchScore - a.searchScore)\r\n .slice(0, 10)\r\n }, [])\r\n\r\n // Handle search\r\n const handleSearch = React.useCallback((term: string) => {\r\n setSearchTerm(term)\r\n if (buildings) {\r\n setSearchResults(fuzzySearchBuildings(buildings, term))\r\n }\r\n }, [buildings, fuzzySearchBuildings])\r\n\r\n const shouldShow = (currentState === 'opening' || currentState === 'noPointCloudFiles' || currentState === 'noBuilding')\r\n\r\n // Handle initial state transitions\r\n React.useEffect(() => {\r\n // If building is loading, stay in opening state\r\n if (buildingLoading) {\r\n setCurrentState('opening')\r\n return\r\n }\r\n\r\n // If building failed to load or no buildingId provided, show noBuilding state\r\n if (buildingError || (!buildingId && !building)) {\r\n setCurrentState('noBuilding')\r\n return\r\n }\r\n\r\n // If we have a building but files are still loading, stay in opening state\r\n if (building && filesLoading) {\r\n setCurrentState('opening')\r\n return\r\n }\r\n\r\n // If we have a building but no point cloud files, show noPointCloudFiles state\r\n if (building && pointCloudFiles.length === 0) {\r\n setCurrentState('noPointCloudFiles')\r\n return\r\n }\r\n\r\n // We have point cloud files, hide the loading state\r\n if (building && pointCloudFiles.length > 0) {\r\n setCurrentState('ready')\r\n }\r\n }, [building, buildingLoading, buildingError, buildingId, filesLoading, pointCloudFiles.length])\r\n\r\n // Don't render if not visible\r\n if (!shouldShow) {\r\n return null\r\n }\r\n\r\n const handleBuildingSelect = (building: any) => {\r\n const url = new URL(window.location.href)\r\n url.searchParams.set('buildingId', building.id.toString())\r\n buildingDispatch({ type: 'SET-CURRENT-BUILDING', payload: { building } })\r\n setSelectedBuilding(building)\r\n setSearchTerm('')\r\n setSearchResults([])\r\n router.push(url.toString())\r\n }\r\n\r\n // Create point cloud entry\r\n async function createPointCloud(name: string): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ name }),\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Upload to presigned URL\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress?: (pct: number) => void\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest()\r\n xhr.open('PUT', url, true)\r\n\r\n if (onProgress) {\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100)\r\n onProgress(pct)\r\n }\r\n }\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve()\r\n else reject(new Error(`Upload failed with status ${xhr.status}`))\r\n }\r\n\r\n xhr.onerror = () => reject(new Error('Network error during upload'))\r\n xhr.send(file)\r\n } catch (err) {\r\n reject(err)\r\n }\r\n })\r\n }\r\n\r\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files\r\n if (!files || files.length === 0) return\r\n\r\n const file = files[0]\r\n const fileName = file.name\r\n const fileExt = fileName.toLowerCase()\r\n\r\n // Validate file extension\r\n if (!fileExt.endsWith('.laz') && !fileExt.endsWith('.las')) {\r\n alert('Please select a LAZ or LAS file.')\r\n return\r\n }\r\n\r\n setUploading(true)\r\n\r\n try {\r\n console.log('Creating point cloud entry...')\r\n const { pointCloud, upload } = await createPointCloud(fileName)\r\n console.log('Point cloud created:', pointCloud.id)\r\n\r\n console.log('Uploading file...')\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) => {\r\n console.log(`Upload progress: ${pct}%`)\r\n })\r\n console.log('Upload complete!')\r\n\r\n // Trigger a refresh of the files - the state will update automatically\r\n window.location.reload()\r\n }\r\n catch (error) {\r\n console.error('Error uploading point cloud:', error)\r\n alert(\r\n error instanceof Error\r\n ? `Failed to upload: ${error.message}`\r\n : 'Failed to upload point cloud'\r\n )\r\n setUploading(false)\r\n }\r\n }\r\n\r\n const handleUploadClick = () => {\r\n fileInputRef.current?.click()\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"absolute z-10 inset-0 bg-background/50 backdrop-blur-[1px] flex items-center justify-center pointer-events-none\">\r\n <Card className={cn(\"w-[536px] pointer-events-auto flex flex-col justify-start items-center gap-2\")}>\r\n <CardHeader className=\"flex justify-center items-center\">\r\n <div className=\"w-12 h-12 p-2 bg-card rounded-md shadow-sm border border-border flex justify-center items-center\">\r\n {currentState === 'noBuilding' ? (\r\n <LR.Building2 className={cn(\"w-4 h-5 text-foreground\", buildingsLoading && \"animate-pulse\")} strokeWidth={2} />\r\n ) : (\r\n <LR.Grip className={cn(\"w-4 h-5 text-foreground\", currentState === 'opening' && \"animate-pulse\")} strokeWidth={2} />\r\n )}\r\n </div>\r\n </CardHeader>\r\n\r\n <CardContent className=\"self-stretch flex flex-col justify-start items-center gap-6 pt-0\">\r\n <div className=\"self-stretch flex flex-col justify-start items-center gap-2\">\r\n <div className=\"self-stretch text-center text-foreground text-xl font-semibold font-['Inter'] leading-7 flex items-center justify-center gap-2\">\r\n {currentState === 'opening' ? (\r\n <>\r\n {t('openingText')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : currentState === 'noBuilding' ? (\r\n <>\r\n {t('noBuilding')}\r\n </>\r\n ) : uploading ? (\r\n <>\r\n {t('uploading')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : (\r\n t('noPointCloudLoaded')\r\n )}\r\n </div>\r\n {(currentState === 'noPointCloudFiles' || currentState === 'noBuilding') && !uploading && (\r\n <div className=\"self-stretch text-center text-muted-foreground text-sm font-normal font-['Inter'] leading-tight\">\r\n {currentState === 'noBuilding' ? t('selectBuildingHelpText') : t('helpText')}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {currentState === 'noBuilding' && (\r\n <div className=\"self-stretch flex flex-col gap-3 justify-centre items-center\">\r\n {buildingsLoading ? (\r\n <div className=\"flex items-center justify-center gap-2 text-muted-foreground\">\r\n <LoadingSpinner size={16} />\r\n <span>{t('loadingBuildings') || 'Loading buildings...'}</span>\r\n </div>\r\n ) : buildings && buildings.length > 0 ? (\r\n <div className=\"w-full relative\">\r\n {selectedBuilding ? (\r\n <div className=\"relative flex justify-end items-center\">\r\n <Input\r\n type=\"text\"\r\n value={\r\n 'Building: '\r\n + (selectedBuilding.buildingName && selectedBuilding.buildingAddress\r\n ? `${selectedBuilding.buildingName}, ${selectedBuilding.buildingAddress}`\r\n : selectedBuilding.buildingName || selectedBuilding.buildingAddress || `Building ${selectedBuilding.id}`)\r\n }\r\n readOnly\r\n className=\"w-full\"\r\n />\r\n <LR.X \r\n className=\"absolute right-2 cursor-pointer w-4 h-4 text-muted-foreground hover:text-foreground\" \r\n onClick={() => {\r\n setSelectedBuilding(null)\r\n setSearchTerm('')\r\n setSearchResults([])\r\n }} \r\n />\r\n </div>\r\n ) : (\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground w-4 h-4\" />\r\n <Input\r\n placeholder={t('searchBuildings') || 'Search buildings...'}\r\n value={searchTerm}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n className=\"w-full pl-10\"\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n )}\r\n \r\n {/* Search results dropdown */}\r\n {searchResults.length > 0 && searchTerm !== '' && !selectedBuilding && (\r\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-background border border-border rounded-md shadow-lg max-h-60 overflow-y-auto z-20\">\r\n {searchResults.map(building => (\r\n <div\r\n key={building.id}\r\n className=\"px-3 py-2 text-sm cursor-pointer hover:bg-muted transition-colors flex gap-2 items-center\"\r\n onClick={() => handleBuildingSelect(building)}\r\n >\r\n <LR.SquareArrowOutUpRight className=\"w-3 h-3\" />\r\n {building.buildingName\r\n ? `${building.buildingName}, ${building.buildingAddress}`\r\n : building.buildingAddress || `Building ${building.id}`}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"text-muted-foreground text-center\">\r\n {t('noBuildings') || 'No buildings available'}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {currentState === 'noPointCloudFiles' && (\r\n <div className=\"self-stretch flex justify-center items-center gap-3\">\r\n <Input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".laz,.las\"\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n />\r\n <Button\r\n onClick={handleUploadClick}\r\n size=\"sm\"\r\n className=\"gap-2\"\r\n disabled={uploading || !ability.can('create', 'File')}\r\n >\r\n <LR.Upload className=\"w-4 h-4\" />\r\n {uploading ? t('uploading') : t('uploadButton')}\r\n </Button>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </div>\r\n </>\r\n )\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuQgB,SAWE,UAXF,KAWE,YAXF;AAvQhB;AAEA,OAAO,WAAW;AAClB,SAAS,cAAc;AACvB,SAAS,MAAM,aAAa,kBAAkB;AAC9C,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAC/B,YAAY,QAAQ;AACpB,SAAS,kBAAkB,sBAAsB;AACjD,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAErC,SAAS,UAAU;AACnB,SAAS,iBAAiB,iBAAiB;AAC3C,SAAS,aAAa,oBAAoB;AAG1C,MAAM,YAAW,aAAQ,IAAI,mCAAZ,YAA8C;AAcxD,SAAS,yBAAyB;AACvC,QAAM,IAAI,gBAAgB,wBAAwB;AAElD,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,eAAe,UAAU,iBAAiB,IAAI,MAAM,WAAW,gBAAgB;AAC9F,QAAM,EAAE,UAAU,cAAc,IAAI,cAAc;AAElD,QAAM,eAAe,gBAAgB;AACrC,QAAM,aAAa,aAAa,IAAI,YAAY;AAChD,QAAM,EAAE,UAAU,aAAa,WAAW,iBAAiB,SAAS,cAAc,IAAI,YAAY,aAAa,OAAO,UAAU,IAAI,CAAC;AACrI,QAAM,EAAE,WAAW,WAAW,iBAAiB,IAAI,aAAa;AAGhE,QAAM,WAAW,iBAAiB;AAElC,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,iBAAiB,aAAa;AACjC,uBAAiB,EAAE,MAAM,wBAAwB,SAAS,EAAE,UAAU,YAAY,EAAE,CAAC;AAAA,IACvF;AAAA,EACF,GAAG,CAAC,aAAa,eAAe,gBAAgB,CAAC;AAEjD,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,MAAM,OAAyB,IAAI;AAExD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAgC,SAAS;AACvF,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,EAAE;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAgB,CAAC,CAAC;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAc,IAAI;AAExE,QAAM,EAAE,OAAO,WAAW,aAAa,IAAI,qBAAqB,qCAAU,EAAE;AAC5E,QAAM,kBAA4B,MAAM,QAAQ,MAC9C,MAAM,OAAO,UAAQ;AAhEzB,QAAAA;AAiEM,UAAM,OAAMA,MAAA,KAAK,cAAL,gBAAAA,IAAgB;AAC5B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,QAAQ,SAAS,QAAQ;AAAA,EAClC,CAAC,GACA,CAAC,KAAK,CAAC;AAGV,QAAM,uBAAuB,MAAM,YAAY,CAACC,YAAkBC,gBAAuB;AACvF,QAAI,CAACA,YAAW,KAAK,EAAG,QAAOD,WAAU,MAAM,GAAG,EAAE;AAEpD,UAAM,mBAAmB,CAAC,QAAgB,SAAyB;AACjE,UAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAC7B,YAAM,cAAc,OAAO,YAAY;AACvC,YAAM,YAAY,KAAK,YAAY;AAEnC,UAAI,cAAc,YAAa,QAAO;AACtC,UAAI,UAAU,WAAW,WAAW,EAAG,QAAO;AAC9C,UAAI,UAAU,SAAS,WAAW,EAAG,QAAO;AAE5C,aAAO;AAAA,IACT;AAEA,WAAOA,WACJ,IAAI,CAACE,cAAa;AACjB,YAAM,UAAUA,UAAS,mBAAmB;AAC5C,YAAM,OAAOA,UAAS,gBAAgB;AACtC,YAAM,KAAKA,UAAS,GAAG,SAAS;AAEhC,YAAM,eAAe,iBAAiBD,aAAY,OAAO;AACzD,YAAM,YAAY,iBAAiBA,aAAY,IAAI;AACnD,YAAM,UAAU,iBAAiBA,aAAY,EAAE;AAE/C,YAAM,WAAW,KAAK,IAAI,cAAc,WAAW,OAAO;AAC1D,aAAO,iCAAKC,YAAL,EAAe,aAAa,SAAS;AAAA,IAC9C,CAAC,EACA,OAAO,CAAAA,cAAYA,UAAS,cAAc,CAAC,EAC3C,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW,EAC5C,MAAM,GAAG,EAAE;AAAA,EAChB,GAAG,CAAC,CAAC;AAGL,QAAM,eAAe,MAAM,YAAY,CAAC,SAAiB;AACvD,kBAAc,IAAI;AAClB,QAAI,WAAW;AACb,uBAAiB,qBAAqB,WAAW,IAAI,CAAC;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,WAAW,oBAAoB,CAAC;AAEpC,QAAM,aAAc,iBAAiB,aAAa,iBAAiB,uBAAuB,iBAAiB;AAG3G,QAAM,UAAU,MAAM;AAEpB,QAAI,iBAAiB;AACnB,sBAAgB,SAAS;AACzB;AAAA,IACF;AAGA,QAAI,iBAAkB,CAAC,cAAc,CAAC,UAAW;AAC/C,sBAAgB,YAAY;AAC5B;AAAA,IACF;AAGA,QAAI,YAAY,cAAc;AAC5B,sBAAgB,SAAS;AACzB;AAAA,IACF;AAGA,QAAI,YAAY,gBAAgB,WAAW,GAAG;AAC5C,sBAAgB,mBAAmB;AACnC;AAAA,IACF;AAGA,QAAI,YAAY,gBAAgB,SAAS,GAAG;AAC1C,sBAAgB,OAAO;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,UAAU,iBAAiB,eAAe,YAAY,cAAc,gBAAgB,MAAM,CAAC;AAG/F,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAACA,cAAkB;AAC9C,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,QAAI,aAAa,IAAI,cAAcA,UAAS,GAAG,SAAS,CAAC;AACzD,qBAAiB,EAAE,MAAM,wBAAwB,SAAS,EAAE,UAAAA,UAAS,EAAE,CAAC;AACxE,wBAAoBA,SAAQ;AAC5B,kBAAc,EAAE;AAChB,qBAAiB,CAAC,CAAC;AACnB,WAAO,KAAK,IAAI,SAAS,CAAC;AAAA,EAC5B;AAGA,iBAAe,iBAAiB,MAAiD;AAC/E,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,gBAAgB;AAAA,MACjD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IAC/B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,YAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,MAAM,EAAE;AAAA,IACnE;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAGA,WAAS,qBACP,KACA,MACA,YACe;AACf,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI;AACF,cAAM,MAAM,IAAI,eAAe;AAC/B,YAAI,KAAK,OAAO,KAAK,IAAI;AAEzB,YAAI,YAAY;AACd,cAAI,OAAO,aAAa,CAAC,QAAQ;AAC/B,gBAAI,IAAI,kBAAkB;AACxB,oBAAM,MAAM,KAAK,MAAO,IAAI,SAAS,IAAI,QAAS,GAAG;AACrD,yBAAW,GAAG;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS,MAAM;AACjB,cAAI,IAAI,UAAU,OAAO,IAAI,SAAS,IAAK,SAAQ;AAAA,cAC9C,QAAO,IAAI,MAAM,6BAA6B,IAAI,MAAM,EAAE,CAAC;AAAA,QAClE;AAEA,YAAI,UAAU,MAAM,OAAO,IAAI,MAAM,6BAA6B,CAAC;AACnE,YAAI,KAAK,IAAI;AAAA,MACf,SAAS,KAAK;AACZ,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,OAAO,UAA+C;AAC7E,UAAMC,SAAQ,MAAM,OAAO;AAC3B,QAAI,CAACA,UAASA,OAAM,WAAW,EAAG;AAElC,UAAM,OAAOA,OAAM,CAAC;AACpB,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,SAAS,YAAY;AAGrC,QAAI,CAAC,QAAQ,SAAS,MAAM,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC1D,YAAM,kCAAkC;AACxC;AAAA,IACF;AAEA,iBAAa,IAAI;AAEjB,QAAI;AACF,cAAQ,IAAI,+BAA+B;AAC3C,YAAM,EAAE,YAAY,OAAO,IAAI,MAAM,iBAAiB,QAAQ;AAC9D,cAAQ,IAAI,wBAAwB,WAAW,EAAE;AAEjD,cAAQ,IAAI,mBAAmB;AAC/B,YAAM,qBAAqB,OAAO,WAAW,MAAM,CAAC,QAAQ;AAC1D,gBAAQ,IAAI,oBAAoB,GAAG,GAAG;AAAA,MACxC,CAAC;AACD,cAAQ,IAAI,kBAAkB;AAG9B,aAAO,SAAS,OAAO;AAAA,IACzB,SACO,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK;AACnD;AAAA,QACE,iBAAiB,QACb,qBAAqB,MAAM,OAAO,KAClC;AAAA,MACN;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM;AA5PlC,QAAAJ;AA6PI,KAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,EACxB;AAEA,SACE,gCACE,8BAAC,SAAI,WAAU,mHACb,+BAAC,QAAK,WAAW,GAAG,8EAA8E,GAChG;AAAA,wBAAC,cAAW,WAAU,oCACpB,8BAAC,SAAI,WAAU,oGACZ,2BAAiB,eAChB,oBAAC,GAAG,WAAH,EAAa,WAAW,GAAG,2BAA2B,oBAAoB,eAAe,GAAG,aAAa,GAAG,IAE7G,oBAAC,GAAG,MAAH,EAAQ,WAAW,GAAG,2BAA2B,iBAAiB,aAAa,eAAe,GAAG,aAAa,GAAG,GAEtH,GACF;AAAA,IAEA,qBAAC,eAAY,WAAU,oEACrB;AAAA,2BAAC,SAAI,WAAU,+DACb;AAAA,4BAAC,SAAI,WAAU,kIACZ,2BAAiB,YAChB,iCACG;AAAA,YAAE,aAAa;AAAA,UAChB,oBAAC,kBAAe,MAAM,IAAI;AAAA,WAC5B,IACE,iBAAiB,eACnB,gCACG,YAAE,YAAY,GACjB,IACE,YACF,iCACG;AAAA,YAAE,WAAW;AAAA,UACd,oBAAC,kBAAe,MAAM,IAAI;AAAA,WAC5B,IAEA,EAAE,oBAAoB,GAE1B;AAAA,SACE,iBAAiB,uBAAuB,iBAAiB,iBAAiB,CAAC,aAC3E,oBAAC,SAAI,WAAU,mGACZ,2BAAiB,eAAe,EAAE,wBAAwB,IAAI,EAAE,UAAU,GAC7E;AAAA,SAEJ;AAAA,MAEC,iBAAiB,gBAChB,oBAAC,SAAI,WAAU,gEACZ,6BACC,qBAAC,SAAI,WAAU,gEACb;AAAA,4BAAC,kBAAe,MAAM,IAAI;AAAA,QAC1B,oBAAC,UAAM,YAAE,kBAAkB,KAAK,wBAAuB;AAAA,SACzD,IACE,aAAa,UAAU,SAAS,IAClC,qBAAC,SAAI,WAAU,mBACZ;AAAA,2BACC,qBAAC,SAAI,WAAU,0CACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OACE,gBACG,iBAAiB,gBAAgB,iBAAiB,kBACjD,GAAG,iBAAiB,YAAY,KAAK,iBAAiB,eAAe,KACrE,iBAAiB,gBAAgB,iBAAiB,mBAAmB,YAAY,iBAAiB,EAAE;AAAA,cAE1G,UAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,UACA;AAAA,YAAC,GAAG;AAAA,YAAH;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM;AACb,oCAAoB,IAAI;AACxB,8BAAc,EAAE;AAChB,iCAAiB,CAAC,CAAC;AAAA,cACrB;AAAA;AAAA,UACF;AAAA,WACF,IAEA,qBAAC,SAAI,WAAU,YACb;AAAA,8BAAC,GAAG,QAAH,EAAU,WAAU,oFAAmF;AAAA,UACxG;AAAA,YAAC;AAAA;AAAA,cACC,aAAa,EAAE,iBAAiB,KAAK;AAAA,cACrC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,cAC5C,WAAU;AAAA,cACV,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA;AAAA,UACvC;AAAA,WACF;AAAA,QAID,cAAc,SAAS,KAAK,eAAe,MAAM,CAAC,oBACjD,oBAAC,SAAI,WAAU,+HACZ,wBAAc,IAAI,CAAAG,cACjB;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,SAAS,MAAM,qBAAqBA,SAAQ;AAAA,YAE5C;AAAA,kCAAC,GAAG,uBAAH,EAAyB,WAAU,WAAU;AAAA,cAC7CA,UAAS,eACN,GAAGA,UAAS,YAAY,KAAKA,UAAS,eAAe,KACrDA,UAAS,mBAAmB,YAAYA,UAAS,EAAE;AAAA;AAAA;AAAA,UAPlDA,UAAS;AAAA,QAQhB,CACD,GACH;AAAA,SAEJ,IAEA,oBAAC,SAAI,WAAU,qCACZ,YAAE,aAAa,KAAK,0BACvB,GAEJ;AAAA,MAGD,iBAAiB,uBAChB,qBAAC,SAAI,WAAU,uDACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU,aAAa,CAAC,QAAQ,IAAI,UAAU,MAAM;AAAA,YAEpD;AAAA,kCAAC,GAAG,QAAH,EAAU,WAAU,WAAU;AAAA,cAC9B,YAAY,EAAE,WAAW,IAAI,EAAE,cAAc;AAAA;AAAA;AAAA,QAChD;AAAA,SACF;AAAA,OAEJ;AAAA,KACF,GACF,GACF;AAEJ;","names":["_a","buildings","searchTerm","building","files"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Card, CardContent, CardHeader } from '../../../../ui/Card'\r\nimport { Input } from '../../../../ui/Input'\r\nimport { LoadingSpinner } from '../../../../ui/LoadingSpinner'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, usePermissions } from '../../../../../store'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useFilesByBuildingId } from '../../../../../hooks/files/files'\r\nimport type { DbFile } from '../../../../../types/dbTypes'\r\nimport { cn } from '../../../../../utils/utils'\r\nimport { useSearchParams, useRouter } from 'next/navigation'\r\nimport { useBuilding, useBuildings } from '../../../../../hooks/buildings/buildings'\r\nimport { SquareArrowOutUpRight } from 'lucide-react'\r\n\r\nconst API_BASE = process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? 'http://localhost:5101'\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string\r\n name: string\r\n }\r\n upload: {\r\n uploadUrl: string\r\n }\r\n}\r\n\r\nexport type pointCloudViewerState = 'opening' | 'loading' | 'ready' | 'error' | 'noPointCloudFiles' | 'noBuilding'\r\n\r\nexport function PointCloudLoadingState() {\r\n const t = useTranslations('PointCloudLoadingState')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: buildingState, dispatch: buildingDispatch } = React.useContext(BuildingsContext)\r\n const { building: storeBuilding } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n const buildingId = searchParams.get(\"buildingId\")\r\n const { building: urlBuilding, isLoading: buildingLoading, isError: buildingError } = useBuilding(buildingId ? Number(buildingId) : 0)\r\n const { buildings, isLoading: buildingsLoading } = useBuildings()\r\n\r\n // Determine the current building to use\r\n const building = storeBuilding || urlBuilding\r\n\r\n React.useEffect(() => {\r\n if (!storeBuilding && urlBuilding) {\r\n buildingDispatch({ type: \"SET-CURRENT-BUILDING\", payload: { building: urlBuilding } })\r\n }\r\n }, [urlBuilding, storeBuilding, buildingDispatch])\r\n\r\n const router = useRouter()\r\n const fileInputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n const [currentState, setCurrentState] = React.useState<pointCloudViewerState>('opening')\r\n const [uploading, setUploading] = React.useState(false)\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [searchResults, setSearchResults] = React.useState<any[]>([])\r\n const [selectedBuilding, setSelectedBuilding] = React.useState<any>(null)\r\n \r\n const { files, isLoading: filesLoading } = useFilesByBuildingId(building?.id)\r\n const pointCloudFiles: DbFile[] = React.useMemo(() => (\r\n files.filter(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n })\r\n ), [files])\r\n\r\n // Fuzzy search function for buildings\r\n const fuzzySearchBuildings = React.useCallback((buildings: any[], searchTerm: string) => {\r\n if (!searchTerm.trim()) return buildings.slice(0, 10)\r\n \r\n const fuzzySearchScore = (search: string, text: string): number => {\r\n if (!search || !text) return 0\r\n const searchLower = search.toLowerCase()\r\n const textLower = text.toLowerCase()\r\n \r\n if (textLower === searchLower) return 1000\r\n if (textLower.startsWith(searchLower)) return 800\r\n if (textLower.includes(searchLower)) return 600\r\n \r\n return 0\r\n }\r\n\r\n return buildings\r\n .map((building) => {\r\n const address = building.buildingAddress || ''\r\n const name = building.buildingName || ''\r\n const id = building.id.toString()\r\n \r\n const addressScore = fuzzySearchScore(searchTerm, address)\r\n const nameScore = fuzzySearchScore(searchTerm, name)\r\n const idScore = fuzzySearchScore(searchTerm, id)\r\n \r\n const maxScore = Math.max(addressScore, nameScore, idScore)\r\n return { ...building, searchScore: maxScore }\r\n })\r\n .filter(building => building.searchScore > 0)\r\n .sort((a, b) => b.searchScore - a.searchScore)\r\n .slice(0, 10)\r\n }, [])\r\n\r\n // Handle search\r\n const handleSearch = React.useCallback((term: string) => {\r\n setSearchTerm(term)\r\n if (buildings) {\r\n setSearchResults(fuzzySearchBuildings(buildings, term))\r\n }\r\n }, [buildings, fuzzySearchBuildings])\r\n\r\n const shouldShow = (currentState === 'opening' || currentState === 'noPointCloudFiles' || currentState === 'noBuilding')\r\n\r\n // Handle initial state transitions\r\n React.useEffect(() => {\r\n // If building is loading, stay in opening state\r\n if (buildingLoading) {\r\n setCurrentState('opening')\r\n return\r\n }\r\n\r\n // If building failed to load or no buildingId provided, show noBuilding state\r\n if (buildingError || (!buildingId && !building)) {\r\n setCurrentState('noBuilding')\r\n return\r\n }\r\n\r\n // If we have a building but files are still loading, stay in opening state\r\n if (building && filesLoading) {\r\n setCurrentState('opening')\r\n return\r\n }\r\n\r\n // If we have a building but no point cloud files, show noPointCloudFiles state\r\n if (building && pointCloudFiles.length === 0) {\r\n setCurrentState('noPointCloudFiles')\r\n return\r\n }\r\n\r\n // We have point cloud files, hide the loading state\r\n if (building && pointCloudFiles.length > 0) {\r\n setCurrentState('ready')\r\n }\r\n }, [building, buildingLoading, buildingError, buildingId, filesLoading, pointCloudFiles.length])\r\n\r\n // Don't render if not visible\r\n if (!shouldShow) {\r\n return null\r\n }\r\n\r\n const handleBuildingSelect = (building: any) => {\r\n const url = new URL(window.location.href)\r\n url.searchParams.set('buildingId', building.id.toString())\r\n buildingDispatch({ type: 'SET-CURRENT-BUILDING', payload: { building } })\r\n setSelectedBuilding(building)\r\n setSearchTerm('')\r\n setSearchResults([])\r\n router.push(url.toString())\r\n }\r\n\r\n // Create point cloud entry\r\n async function createPointCloud(name: string): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ name }),\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Upload to presigned URL\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress?: (pct: number) => void\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest()\r\n xhr.open('PUT', url, true)\r\n\r\n if (onProgress) {\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100)\r\n onProgress(pct)\r\n }\r\n }\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve()\r\n else reject(new Error(`Upload failed with status ${xhr.status}`))\r\n }\r\n\r\n xhr.onerror = () => reject(new Error('Network error during upload'))\r\n xhr.send(file)\r\n } catch (err) {\r\n reject(err)\r\n }\r\n })\r\n }\r\n\r\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files\r\n if (!files || files.length === 0) return\r\n\r\n const file = files[0]\r\n const fileName = file.name\r\n const fileExt = fileName.toLowerCase()\r\n\r\n // Validate file extension\r\n if (!fileExt.endsWith('.laz') && !fileExt.endsWith('.las')) {\r\n alert('Please select a LAZ or LAS file.')\r\n return\r\n }\r\n\r\n setUploading(true)\r\n\r\n try {\r\n console.log('Creating point cloud entry...')\r\n const { pointCloud, upload } = await createPointCloud(fileName)\r\n console.log('Point cloud created:', pointCloud.id)\r\n\r\n console.log('Uploading file...')\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) => {\r\n console.log(`Upload progress: ${pct}%`)\r\n })\r\n console.log('Upload complete!')\r\n\r\n // Trigger a refresh of the files - the state will update automatically\r\n window.location.reload()\r\n }\r\n catch (error) {\r\n console.error('Error uploading point cloud:', error)\r\n alert(\r\n error instanceof Error\r\n ? `Failed to upload: ${error.message}`\r\n : 'Failed to upload point cloud'\r\n )\r\n setUploading(false)\r\n }\r\n }\r\n\r\n const handleUploadClick = () => {\r\n fileInputRef.current?.click()\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"absolute z-10 inset-0 bg-background/50 backdrop-blur-[1px] flex items-center justify-center pointer-events-none\">\r\n <Card className={cn(\"w-[536px] pointer-events-auto flex flex-col justify-start items-center gap-2\")}>\r\n <CardHeader className=\"flex justify-center items-center\">\r\n <div className=\"w-12 h-12 p-2 bg-card rounded-md shadow-sm border border-border flex justify-center items-center\">\r\n {currentState === 'noBuilding' ? (\r\n <LR.Building2 className={cn(\"w-4 h-5 text-foreground\", buildingsLoading && \"animate-pulse\")} strokeWidth={2} />\r\n ) : (\r\n <LR.Grip className={cn(\"w-4 h-5 text-foreground\", currentState === 'opening' && \"animate-pulse\")} strokeWidth={2} />\r\n )}\r\n </div>\r\n </CardHeader>\r\n\r\n <CardContent className=\"self-stretch flex flex-col justify-start items-center gap-6 pt-0\">\r\n <div className=\"self-stretch flex flex-col justify-start items-center gap-2\">\r\n <div className=\"self-stretch text-center text-foreground text-xl font-semibold font-['Inter'] leading-7 flex items-center justify-center gap-2\">\r\n {currentState === 'opening' ? (\r\n <>\r\n {t('openingText')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : currentState === 'noBuilding' ? (\r\n <>\r\n {t('noBuilding')}\r\n </>\r\n ) : uploading ? (\r\n <>\r\n {t('uploading')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : (\r\n t('noPointCloudLoaded')\r\n )}\r\n </div>\r\n {(currentState === 'noPointCloudFiles' || currentState === 'noBuilding') && !uploading && (\r\n <div className=\"self-stretch text-center text-muted-foreground text-sm font-normal font-['Inter'] leading-tight\">\r\n {currentState === 'noBuilding' ? t('selectBuildingHelpText') : t('helpText')}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {currentState === 'noBuilding' && (\r\n <div className=\"self-stretch flex flex-col gap-3 justify-centre items-center\">\r\n {buildingsLoading ? (\r\n <div className=\"flex items-center justify-center gap-2 text-muted-foreground\">\r\n <LoadingSpinner size={16} />\r\n <span>{t('loadingBuildings') || 'Loading buildings...'}</span>\r\n </div>\r\n ) : buildings && buildings.length > 0 ? (\r\n <div className=\"w-full relative\">\r\n {selectedBuilding ? (\r\n <div className=\"relative flex justify-end items-center\">\r\n <Input\r\n type=\"text\"\r\n value={\r\n 'Building: '\r\n + (selectedBuilding.buildingName && selectedBuilding.buildingAddress\r\n ? `${selectedBuilding.buildingName}, ${selectedBuilding.buildingAddress}`\r\n : selectedBuilding.buildingName || selectedBuilding.buildingAddress || `Building ${selectedBuilding.id}`)\r\n }\r\n readOnly\r\n className=\"w-full\"\r\n />\r\n <LR.X \r\n className=\"absolute right-2 cursor-pointer w-4 h-4 text-muted-foreground hover:text-foreground\" \r\n onClick={() => {\r\n setSelectedBuilding(null)\r\n setSearchTerm('')\r\n setSearchResults([])\r\n }} \r\n />\r\n </div>\r\n ) : (\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground w-4 h-4\" />\r\n <Input\r\n placeholder={t('searchBuildings') || 'Search buildings...'}\r\n value={searchTerm}\r\n onChange={(e) => handleSearch(e.target.value)}\r\n className=\"w-full pl-10\"\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n )}\r\n \r\n {/* Search results dropdown */}\r\n {searchResults.length > 0 && searchTerm !== '' && !selectedBuilding && (\r\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-background border border-border rounded-md shadow-lg max-h-60 overflow-y-auto z-20\">\r\n {searchResults.map(building => (\r\n <div\r\n key={building.id}\r\n className=\"px-3 py-2 text-sm cursor-pointer hover:bg-muted transition-colors flex gap-2 items-center\"\r\n onClick={() => handleBuildingSelect(building)}\r\n >\r\n <LR.SquareArrowOutUpRight className=\"w-3 h-3\" />\r\n {building.buildingName\r\n ? `${building.buildingName}, ${building.buildingAddress}`\r\n : building.buildingAddress || `Building ${building.id}`}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"text-muted-foreground text-center\">\r\n {t('noBuildings') || 'No buildings available'}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {currentState === 'noPointCloudFiles' && (\r\n <div className=\"self-stretch flex justify-center items-center gap-3\">\r\n <Input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".laz,.las\"\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n />\r\n <Button\r\n onClick={handleUploadClick}\r\n size=\"sm\"\r\n className=\"gap-2\"\r\n disabled={uploading || !ability.can('create', 'File')}\r\n >\r\n <LR.Upload className=\"w-4 h-4\" />\r\n {uploading ? t('uploading') : t('uploadButton')}\r\n </Button>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </div>\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","buildings","searchTerm","building","files"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudManagementTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointCloudManagementTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,wBAAgB,yBAAyB,sBAgBxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { PointCloudTable } from \"./PointCloudTable\";\r\nimport UploadPointCloudPage from \"./PointCloudUploadPanel\";\r\n\r\ntype StatusFilter = \"all\" | \"uploaded\" | \"converted\" | \"not-converted\";\r\n\r\nenum PAGE {\r\n TABLE = \"table\",\r\n UPLOAD = \"upload\",\r\n}\r\n\r\nexport function PointCloudManagementTable() {\r\n const [currentPage, setCurrentPage] = React.useState<PAGE>(PAGE.TABLE)\r\n\r\n return(\r\n <div>\r\n {currentPage == PAGE.TABLE ? \r\n <PointCloudTable\r\n onUploadButtonClick = {() => setCurrentPage(PAGE.UPLOAD)}\r\n />\r\n :\r\n <UploadPointCloudPage\r\n onGoBackButtonClick = {() => setCurrentPage(PAGE.TABLE)}\r\n />\r\n }\r\n </div>\r\n )\r\n}\r\n\r\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { PointCloudTable } from \"./PointCloudTable\";\r\nimport UploadPointCloudPage from \"./PointCloudUploadPanel\";\r\n\r\ntype StatusFilter = \"all\" | \"uploaded\" | \"converted\" | \"not-converted\";\r\n\r\nenum PAGE {\r\n TABLE = \"table\",\r\n UPLOAD = \"upload\",\r\n}\r\n\r\nexport function PointCloudManagementTable() {\r\n const [currentPage, setCurrentPage] = React.useState<PAGE>(PAGE.TABLE)\r\n\r\n return(\r\n <div>\r\n {currentPage == PAGE.TABLE ? \r\n <PointCloudTable\r\n onUploadButtonClick = {() => setCurrentPage(PAGE.UPLOAD)}\r\n />\r\n :\r\n <UploadPointCloudPage\r\n onGoBackButtonClick = {() => setCurrentPage(PAGE.TABLE)}\r\n />\r\n }\r\n </div>\r\n )\r\n}\r\n\r\n"],"mappings":";AAsBQ;AAjBR,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,OAAO,0BAA0B;AAIjC,IAAK,OAAL,kBAAKA,UAAL;AACE,EAAAA,MAAA,WAAQ;AACR,EAAAA,MAAA,YAAS;AAFN,SAAAA;AAAA,GAAA;AAKE,SAAS,4BAA4B;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAe,mBAAU;AAErE,SACE,oBAAC,SACE,yBAAe,sBACd;AAAA,IAAC;AAAA;AAAA,MACC,qBAAuB,MAAM,eAAe,qBAAW;AAAA;AAAA,EACzD,IAEA;AAAA,IAAC;AAAA;AAAA,MACC,qBAAuB,MAAM,eAAe,mBAAU;AAAA;AAAA,EACxD,GAEJ;AAEJ;","names":["PAGE"]}
|
package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointCloudTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkD/B,KAAK,oBAAoB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAC/D,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACnC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC5B,mBAAmB,EACnB,GAAG,QAAQ,EACd,EAAE,oBAAoB,qBAkZtB"}
|
package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"../../../../ui/Table\";\r\n\r\nimport { Badge, Button, Checkbox, Input, ScrollArea } from '../../../../ui';\r\n\r\nimport { Tabs, TabsList, TabsTrigger } from \"../../../../ui/Tabs\";\r\n\r\nimport { useRouter, usePathname } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\nimport { toast } from 'sonner'\r\nimport ConfirmDialog from '../../../../ConfirmDialog'\r\n\r\nimport {\r\n Star,\r\n StarOff,\r\n Eye,\r\n Trash2,\r\n Filter,\r\n RotateCcw,\r\n ChevronLeft,\r\n ChevronRight,\r\n} from \"lucide-react\";\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\ntype PointCloud = {\r\n id: string;\r\n name: string;\r\n point_cloud_uploaded: boolean;\r\n point_cloud_potree_converted: boolean;\r\n createdAt: string;\r\n potree_metadata_presigned_url?: string | null;\r\n potree_metadata_file_key?: string | null;\r\n};\r\n\r\ntype StatusFilter = \"all\" | \"uploaded\" | \"converted\" | \"not-converted\";\r\n\r\nenum PAGE {\r\n TABLE = \"table\",\r\n UPLOAD = \"upload\",\r\n}\r\n\r\ntype PointCloudTableProps = React.HTMLAttributes<HTMLDivElement> & {\r\n onUploadButtonClick: () => void;\r\n};\r\n\r\nexport function PointCloudTable({\r\n onUploadButtonClick, \r\n ...divProps\r\n}: PointCloudTableProps) {\r\n const [pointClouds, setPointClouds] = React.useState<PointCloud[]>([]);\r\n const [loading, setLoading] = React.useState(false);\r\n const [error, setError] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const [statusFilter, setStatusFilter] = React.useState<StatusFilter>(\"all\");\r\n const [favorites, setFavorites] = React.useState<Set<string>>(new Set());\r\n const [currentUrl, setCurrentUrl] = React.useState<URL | null>(null);\r\n const [deleteTarget, setDeleteTarget] = React.useState<PointCloud | null>(null)\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n const t = useTranslations('PointCloudManagement')\r\n\r\n React.useEffect(() => {\r\n // This only runs in the browser\r\n const url = new URL(window.location.href);\r\n setCurrentUrl(url);\r\n }, []);\r\n\r\n const [currentPage, setCurrentPage] = React.useState<PAGE>(PAGE.TABLE)\r\n\r\n // route and navigation\r\n const router = useRouter()\r\n const pathname = usePathname()\r\n\r\n const loadPointClouds = React.useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n headers: { \"Accept\": \"application/json\" },\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`Failed to fetch point clouds (${res.status})`);\r\n }\r\n\r\n const data: PointCloud[] = await res.json();\r\n setPointClouds(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error(err);\r\n setError(\r\n err instanceof Error ? err.message : \"Unknown error while loading data\",\r\n );\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n loadPointClouds();\r\n }, [loadPointClouds]);\r\n\r\n const openViewer = (pointCloudId) => {\r\n if (!pointCloudId) return;\r\n const origin = window.location.origin\r\n const pathname = window.location.pathname\r\n const params = new URLSearchParams(currentUrl.search)\r\n params.set('viewer', 'pointcloud')\r\n params.set('pointCloudId', pointCloudId)\r\n const newurl = `${origin}${pathname}?${params.toString()}`\r\n router.push(newurl, { scroll: false }) // push but do not refresh\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!deleteTarget) return\r\n\r\n setIsDeleting(true)\r\n\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${deleteTarget.id}`, {\r\n method: \"DELETE\",\r\n });\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(msg || `Delete failed (${res.status})`);\r\n }\r\n\r\n setPointClouds((prev) => prev.filter((pc) => pc.id !== deleteTarget.id));\r\n setFavorites((prev) => {\r\n const next = new Set(prev);\r\n next.delete(deleteTarget.id);\r\n return next;\r\n });\r\n toast.success(t('deleteSuccess', { name: deleteTarget.name }))\r\n } catch (err) {\r\n console.error(err);\r\n toast.error(\r\n err instanceof Error\r\n ? t('deleteFailedWithReason', { error: err.message })\r\n : t('deleteFailed'),\r\n );\r\n } finally {\r\n setIsDeleting(false)\r\n setDeleteTarget(null)\r\n }\r\n };\r\n\r\n const toggleFavorite = (id: string) => {\r\n setFavorites((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n const filtered = React.useMemo(() => {\r\n return pointClouds.filter((pc) => {\r\n const matchesSearch =\r\n !search ||\r\n pc.name.toLowerCase().includes(search.toLowerCase()) ||\r\n pc.id.toLowerCase().includes(search.toLowerCase());\r\n\r\n let matchesStatus = true;\r\n if (statusFilter === \"uploaded\") {\r\n matchesStatus = pc.point_cloud_uploaded;\r\n } else if (statusFilter === \"converted\") {\r\n matchesStatus = pc.point_cloud_potree_converted;\r\n } else if (statusFilter === \"not-converted\") {\r\n matchesStatus =\r\n pc.point_cloud_uploaded && !pc.point_cloud_potree_converted;\r\n }\r\n\r\n return matchesSearch && matchesStatus;\r\n });\r\n }, [pointClouds, search, statusFilter]);\r\n\r\n return (\r\n <div className={`p-2 mt-20 ${divProps}`}>\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div className=\"space-y-1\">\r\n <h1 className=\"text-2xl font-semibold tracking-tight\">\r\n Point Clouds\r\n </h1>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n placeholder=\"Search point clouds...\"\r\n className=\"w-[240px]\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" title=\"Filters (not wired)\">\r\n <Filter className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={loadPointClouds}\r\n disabled={loading}\r\n title=\"Refresh\"\r\n >\r\n <RotateCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs row */}\r\n <Tabs\r\n value={statusFilter}\r\n onValueChange={(val) => setStatusFilter(val as StatusFilter)}\r\n className=\"w-full mb-2\"\r\n >\r\n <TabsList className=\"h-8\">\r\n <TabsTrigger value=\"all\" className=\"px-3\">\r\n All\r\n </TabsTrigger>\r\n <TabsTrigger value=\"uploaded\" className=\"px-3\">\r\n Uploaded\r\n </TabsTrigger>\r\n <TabsTrigger value=\"converted\" className=\"px-3\">\r\n Converted\r\n </TabsTrigger>\r\n <TabsTrigger value=\"not-converted\" className=\"px-3\">\r\n Needs conversion\r\n </TabsTrigger>\r\n </TabsList>\r\n </Tabs>\r\n\r\n {/* Table card */}\r\n <div className=\"rounded-md border bg-background\">\r\n <ScrollArea className=\"max-h-[520px]\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\r\n <TableRow>\r\n <TableHead className=\"w-[40px] pl-4\">\r\n <Checkbox aria-label=\"Select all\" />\r\n </TableHead>\r\n <TableHead className=\"w-[48px]\"></TableHead>\r\n <TableHead className=\"min-w-[220px]\">Name</TableHead>\r\n <TableHead className=\"w-[200px]\">Status</TableHead>\r\n <TableHead className=\"w-[220px]\">Created</TableHead>\r\n <TableHead className=\"w-[160px]\">Metadata</TableHead>\r\n <TableHead className=\"w-[140px] text-right pr-4\">\r\n Actions\r\n </TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n\r\n <TableBody>\r\n {loading && pointClouds.length === 0 && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n Loading point clouds…\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {!loading && error && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n <span className=\"text-sm text-destructive\">\r\n {error}\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {!loading && !error && filtered.length === 0 && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n <span className=\"text-sm text-muted-foreground\">\r\n No point clouds found.\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {filtered.map((pc) => {\r\n const isFavorite = favorites.has(pc.id);\r\n return (\r\n <TableRow\r\n key={pc.id}\r\n className=\"hover:bg-muted/50 transition-colors\"\r\n >\r\n <TableCell className=\"pl-4\">\r\n <Checkbox aria-label={`Select ${pc.name}`} />\r\n </TableCell>\r\n\r\n {/* Favorite star */}\r\n <TableCell className=\"text-center\">\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleFavorite(pc.id)}\r\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-full text-muted-foreground hover:text-yellow-500\"\r\n aria-label={\r\n isFavorite\r\n ? `Remove ${pc.name} from favourites`\r\n : `Add ${pc.name} to favourites`\r\n }\r\n >\r\n {isFavorite ? (\r\n <Star className=\"h-4 w-4 fill-yellow-400\" />\r\n ) : (\r\n <StarOff className=\"h-4 w-4\" />\r\n )}\r\n </button>\r\n </TableCell>\r\n\r\n {/* Name & ID */}\r\n <TableCell>\r\n <div className=\"font-medium\">{pc.name}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {pc.id}\r\n </div>\r\n </TableCell>\r\n\r\n {/* Status badges */}\r\n <TableCell>\r\n <div className=\"flex flex-wrap gap-1\">\r\n <Badge\r\n className={`text-xs border ${\r\n pc.point_cloud_uploaded\r\n ? \"bg-emerald-50 text-emerald-700 border-emerald-200\"\r\n : \"bg-rose-50 text-rose-700 border-rose-200\"\r\n }`}\r\n >\r\n {pc.point_cloud_uploaded ? \"Uploaded\" : \"Not uploaded\"}\r\n </Badge>\r\n\r\n <Badge\r\n className={`text-xs border ${\r\n pc.point_cloud_potree_converted\r\n ? \"bg-sky-50 text-sky-700 border-sky-200\"\r\n : \"bg-amber-50 text-amber-700 border-amber-200\"\r\n }`}\r\n >\r\n {pc.point_cloud_potree_converted\r\n ? \"Ready to view\"\r\n : \"Needs conversion\"}\r\n </Badge>\r\n </div>\r\n </TableCell>\r\n\r\n {/* Created date */}\r\n <TableCell className=\"whitespace-nowrap text-sm text-muted-foreground\">\r\n {new Date(pc.createdAt).toLocaleString()}\r\n </TableCell>\r\n\r\n {/* Metadata link */}\r\n <TableCell>\r\n {pc.potree_metadata_presigned_url ? (\r\n <Button\r\n asChild\r\n variant=\"link\"\r\n size=\"sm\"\r\n className=\"px-0\"\r\n >\r\n <a\r\n href={pc.potree_metadata_presigned_url}\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n metadata.json\r\n </a>\r\n </Button>\r\n ) : (\r\n <span className=\"text-xs text-muted-foreground\">—</span>\r\n )}\r\n </TableCell>\r\n\r\n {/* Actions */}\r\n <TableCell className=\"pr-4 text-right\">\r\n <div className=\"flex justify-end gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n disabled={!pc.potree_metadata_file_key}\r\n onClick={() =>\r\n openViewer(pc.id)\r\n }\r\n title=\"Open Potree viewer\"\r\n >\r\n <Eye className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"text-destructive hover:text-destructive\"\r\n onClick={() => setDeleteTarget(pc)}\r\n title={t('deleteTitle')}\r\n >\r\n <Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </ScrollArea>\r\n\r\n {/* Faux pagination / footer */}\r\n <div className=\"flex items-center justify-between border-t px-4 py-2 text-xs text-muted-foreground\">\r\n <div>\r\n Showing <span className=\"font-medium\">{filtered.length}</span> of{\" \"}\r\n <span className=\"font-medium\">{pointClouds.length}</span> point\r\n clouds\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Button variant=\"ghost\" size=\"icon\" disabled>\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"ghost\" size=\"icon\" disabled>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <Button\r\n onClick={() => {\r\n if (onUploadButtonClick != undefined){\r\n onUploadButtonClick()\r\n }\r\n }}\r\n className=\"mt-1 flex gap-2\"\r\n >\r\n Upload point cloud →\r\n </Button>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteTarget != null}\r\n isDeleting={isDeleting}\r\n onOpenChange={(open) => {\r\n if (!open) setDeleteTarget(null)\r\n }}\r\n handleConfirm={async (e) => {\r\n e.preventDefault()\r\n await handleDelete()\r\n }}\r\n itemName={deleteTarget?.name}\r\n dataType={t('pointCloudItem')}\r\n />\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["PAGE","pathname"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"../../../../ui/Table\";\r\n\r\nimport { Badge, Button, Checkbox, Input, ScrollArea } from '../../../../ui';\r\n\r\nimport { Tabs, TabsList, TabsTrigger } from \"../../../../ui/Tabs\";\r\n\r\nimport { useRouter, usePathname } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\nimport { toast } from 'sonner'\r\nimport ConfirmDialog from '../../../../ConfirmDialog'\r\n\r\nimport {\r\n Star,\r\n StarOff,\r\n Eye,\r\n Trash2,\r\n Filter,\r\n RotateCcw,\r\n ChevronLeft,\r\n ChevronRight,\r\n} from \"lucide-react\";\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\ntype PointCloud = {\r\n id: string;\r\n name: string;\r\n point_cloud_uploaded: boolean;\r\n point_cloud_potree_converted: boolean;\r\n createdAt: string;\r\n potree_metadata_presigned_url?: string | null;\r\n potree_metadata_file_key?: string | null;\r\n};\r\n\r\ntype StatusFilter = \"all\" | \"uploaded\" | \"converted\" | \"not-converted\";\r\n\r\nenum PAGE {\r\n TABLE = \"table\",\r\n UPLOAD = \"upload\",\r\n}\r\n\r\ntype PointCloudTableProps = React.HTMLAttributes<HTMLDivElement> & {\r\n onUploadButtonClick: () => void;\r\n};\r\n\r\nexport function PointCloudTable({\r\n onUploadButtonClick, \r\n ...divProps\r\n}: PointCloudTableProps) {\r\n const [pointClouds, setPointClouds] = React.useState<PointCloud[]>([]);\r\n const [loading, setLoading] = React.useState(false);\r\n const [error, setError] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const [statusFilter, setStatusFilter] = React.useState<StatusFilter>(\"all\");\r\n const [favorites, setFavorites] = React.useState<Set<string>>(new Set());\r\n const [currentUrl, setCurrentUrl] = React.useState<URL | null>(null);\r\n const [deleteTarget, setDeleteTarget] = React.useState<PointCloud | null>(null)\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n const t = useTranslations('PointCloudManagement')\r\n\r\n React.useEffect(() => {\r\n // This only runs in the browser\r\n const url = new URL(window.location.href);\r\n setCurrentUrl(url);\r\n }, []);\r\n\r\n const [currentPage, setCurrentPage] = React.useState<PAGE>(PAGE.TABLE)\r\n\r\n // route and navigation\r\n const router = useRouter()\r\n const pathname = usePathname()\r\n\r\n const loadPointClouds = React.useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n headers: { \"Accept\": \"application/json\" },\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`Failed to fetch point clouds (${res.status})`);\r\n }\r\n\r\n const data: PointCloud[] = await res.json();\r\n setPointClouds(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error(err);\r\n setError(\r\n err instanceof Error ? err.message : \"Unknown error while loading data\",\r\n );\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n loadPointClouds();\r\n }, [loadPointClouds]);\r\n\r\n const openViewer = (pointCloudId) => {\r\n if (!pointCloudId) return;\r\n const origin = window.location.origin\r\n const pathname = window.location.pathname\r\n const params = new URLSearchParams(currentUrl.search)\r\n params.set('viewer', 'pointcloud')\r\n params.set('pointCloudId', pointCloudId)\r\n const newurl = `${origin}${pathname}?${params.toString()}`\r\n router.push(newurl, { scroll: false }) // push but do not refresh\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!deleteTarget) return\r\n\r\n setIsDeleting(true)\r\n\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${deleteTarget.id}`, {\r\n method: \"DELETE\",\r\n });\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(msg || `Delete failed (${res.status})`);\r\n }\r\n\r\n setPointClouds((prev) => prev.filter((pc) => pc.id !== deleteTarget.id));\r\n setFavorites((prev) => {\r\n const next = new Set(prev);\r\n next.delete(deleteTarget.id);\r\n return next;\r\n });\r\n toast.success(t('deleteSuccess', { name: deleteTarget.name }))\r\n } catch (err) {\r\n console.error(err);\r\n toast.error(\r\n err instanceof Error\r\n ? t('deleteFailedWithReason', { error: err.message })\r\n : t('deleteFailed'),\r\n );\r\n } finally {\r\n setIsDeleting(false)\r\n setDeleteTarget(null)\r\n }\r\n };\r\n\r\n const toggleFavorite = (id: string) => {\r\n setFavorites((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n const filtered = React.useMemo(() => {\r\n return pointClouds.filter((pc) => {\r\n const matchesSearch =\r\n !search ||\r\n pc.name.toLowerCase().includes(search.toLowerCase()) ||\r\n pc.id.toLowerCase().includes(search.toLowerCase());\r\n\r\n let matchesStatus = true;\r\n if (statusFilter === \"uploaded\") {\r\n matchesStatus = pc.point_cloud_uploaded;\r\n } else if (statusFilter === \"converted\") {\r\n matchesStatus = pc.point_cloud_potree_converted;\r\n } else if (statusFilter === \"not-converted\") {\r\n matchesStatus =\r\n pc.point_cloud_uploaded && !pc.point_cloud_potree_converted;\r\n }\r\n\r\n return matchesSearch && matchesStatus;\r\n });\r\n }, [pointClouds, search, statusFilter]);\r\n\r\n return (\r\n <div className={`p-2 mt-20 ${divProps}`}>\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div className=\"space-y-1\">\r\n <h1 className=\"text-2xl font-semibold tracking-tight\">\r\n Point Clouds\r\n </h1>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n placeholder=\"Search point clouds...\"\r\n className=\"w-[240px]\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" title=\"Filters (not wired)\">\r\n <Filter className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={loadPointClouds}\r\n disabled={loading}\r\n title=\"Refresh\"\r\n >\r\n <RotateCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs row */}\r\n <Tabs\r\n value={statusFilter}\r\n onValueChange={(val) => setStatusFilter(val as StatusFilter)}\r\n className=\"w-full mb-2\"\r\n >\r\n <TabsList className=\"h-8\">\r\n <TabsTrigger value=\"all\" className=\"px-3\">\r\n All\r\n </TabsTrigger>\r\n <TabsTrigger value=\"uploaded\" className=\"px-3\">\r\n Uploaded\r\n </TabsTrigger>\r\n <TabsTrigger value=\"converted\" className=\"px-3\">\r\n Converted\r\n </TabsTrigger>\r\n <TabsTrigger value=\"not-converted\" className=\"px-3\">\r\n Needs conversion\r\n </TabsTrigger>\r\n </TabsList>\r\n </Tabs>\r\n\r\n {/* Table card */}\r\n <div className=\"rounded-md border bg-background\">\r\n <ScrollArea className=\"max-h-[520px]\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\r\n <TableRow>\r\n <TableHead className=\"w-[40px] pl-4\">\r\n <Checkbox aria-label=\"Select all\" />\r\n </TableHead>\r\n <TableHead className=\"w-[48px]\"></TableHead>\r\n <TableHead className=\"min-w-[220px]\">Name</TableHead>\r\n <TableHead className=\"w-[200px]\">Status</TableHead>\r\n <TableHead className=\"w-[220px]\">Created</TableHead>\r\n <TableHead className=\"w-[160px]\">Metadata</TableHead>\r\n <TableHead className=\"w-[140px] text-right pr-4\">\r\n Actions\r\n </TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n\r\n <TableBody>\r\n {loading && pointClouds.length === 0 && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n Loading point clouds…\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {!loading && error && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n <span className=\"text-sm text-destructive\">\r\n {error}\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {!loading && !error && filtered.length === 0 && (\r\n <TableRow>\r\n <TableCell colSpan={7} className=\"h-24 text-center\">\r\n <span className=\"text-sm text-muted-foreground\">\r\n No point clouds found.\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n\r\n {filtered.map((pc) => {\r\n const isFavorite = favorites.has(pc.id);\r\n return (\r\n <TableRow\r\n key={pc.id}\r\n className=\"hover:bg-muted/50 transition-colors\"\r\n >\r\n <TableCell className=\"pl-4\">\r\n <Checkbox aria-label={`Select ${pc.name}`} />\r\n </TableCell>\r\n\r\n {/* Favorite star */}\r\n <TableCell className=\"text-center\">\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleFavorite(pc.id)}\r\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-full text-muted-foreground hover:text-yellow-500\"\r\n aria-label={\r\n isFavorite\r\n ? `Remove ${pc.name} from favourites`\r\n : `Add ${pc.name} to favourites`\r\n }\r\n >\r\n {isFavorite ? (\r\n <Star className=\"h-4 w-4 fill-yellow-400\" />\r\n ) : (\r\n <StarOff className=\"h-4 w-4\" />\r\n )}\r\n </button>\r\n </TableCell>\r\n\r\n {/* Name & ID */}\r\n <TableCell>\r\n <div className=\"font-medium\">{pc.name}</div>\r\n <div className=\"text-xs text-muted-foreground\">\r\n {pc.id}\r\n </div>\r\n </TableCell>\r\n\r\n {/* Status badges */}\r\n <TableCell>\r\n <div className=\"flex flex-wrap gap-1\">\r\n <Badge\r\n className={`text-xs border ${\r\n pc.point_cloud_uploaded\r\n ? \"bg-emerald-50 text-emerald-700 border-emerald-200\"\r\n : \"bg-rose-50 text-rose-700 border-rose-200\"\r\n }`}\r\n >\r\n {pc.point_cloud_uploaded ? \"Uploaded\" : \"Not uploaded\"}\r\n </Badge>\r\n\r\n <Badge\r\n className={`text-xs border ${\r\n pc.point_cloud_potree_converted\r\n ? \"bg-sky-50 text-sky-700 border-sky-200\"\r\n : \"bg-amber-50 text-amber-700 border-amber-200\"\r\n }`}\r\n >\r\n {pc.point_cloud_potree_converted\r\n ? \"Ready to view\"\r\n : \"Needs conversion\"}\r\n </Badge>\r\n </div>\r\n </TableCell>\r\n\r\n {/* Created date */}\r\n <TableCell className=\"whitespace-nowrap text-sm text-muted-foreground\">\r\n {new Date(pc.createdAt).toLocaleString()}\r\n </TableCell>\r\n\r\n {/* Metadata link */}\r\n <TableCell>\r\n {pc.potree_metadata_presigned_url ? (\r\n <Button\r\n asChild\r\n variant=\"link\"\r\n size=\"sm\"\r\n className=\"px-0\"\r\n >\r\n <a\r\n href={pc.potree_metadata_presigned_url}\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n metadata.json\r\n </a>\r\n </Button>\r\n ) : (\r\n <span className=\"text-xs text-muted-foreground\">—</span>\r\n )}\r\n </TableCell>\r\n\r\n {/* Actions */}\r\n <TableCell className=\"pr-4 text-right\">\r\n <div className=\"flex justify-end gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n disabled={!pc.potree_metadata_file_key}\r\n onClick={() =>\r\n openViewer(pc.id)\r\n }\r\n title=\"Open Potree viewer\"\r\n >\r\n <Eye className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"text-destructive hover:text-destructive\"\r\n onClick={() => setDeleteTarget(pc)}\r\n title={t('deleteTitle')}\r\n >\r\n <Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </ScrollArea>\r\n\r\n {/* Faux pagination / footer */}\r\n <div className=\"flex items-center justify-between border-t px-4 py-2 text-xs text-muted-foreground\">\r\n <div>\r\n Showing <span className=\"font-medium\">{filtered.length}</span> of{\" \"}\r\n <span className=\"font-medium\">{pointClouds.length}</span> point\r\n clouds\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Button variant=\"ghost\" size=\"icon\" disabled>\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button variant=\"ghost\" size=\"icon\" disabled>\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <Button\r\n onClick={() => {\r\n if (onUploadButtonClick != undefined){\r\n onUploadButtonClick()\r\n }\r\n }}\r\n className=\"mt-1 flex gap-2\"\r\n >\r\n Upload point cloud →\r\n </Button>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteTarget != null}\r\n isDeleting={isDeleting}\r\n onOpenChange={(open) => {\r\n if (!open) setDeleteTarget(null)\r\n }}\r\n handleConfirm={async (e) => {\r\n e.preventDefault()\r\n await handleDelete()\r\n }}\r\n itemName={deleteTarget?.name}\r\n dataType={t('pointCloudItem')}\r\n />\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["PAGE","pathname"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointCloudUploadPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointCloudUploadPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyC/B,KAAK,yBAAyB,GAAG;IAC/B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAC3C,mBAAmB,GACpB,EAAE,yBAAyB,qBA2W3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.tsx"],"sourcesContent":["// app/point-clouds/upload/page.tsx\r\n\"use client\";\r\n\r\nimport * as React from \"react\";\r\n\r\nimport { ProgressBar } from \"../../../map/src/tools/AddTools/AddFile/ProgressBar\";\r\nimport { Button, Input, ScrollArea } from '../../../../ui';\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nconst CONVERSION_STATUS = Object.freeze({\r\n STARTED: \"conversion_started\",\r\n DOWNLOAD: \"download\",\r\n CONVERT: \"convert\",\r\n UPLOAD: \"upload\",\r\n CLEAN_UP: \"clean_up\",\r\n FAILED: \"failed\",\r\n FINISHED: \"finished\",\r\n});\r\n\r\n// All possible status values:\r\n// - local client-only phases: \"idle\", \"creating\", \"uploading\"\r\n// - plus all statuses from the backend (CONVERSION_STATUS values)\r\ntype ConversionStatus =\r\n | \"idle\"\r\n | \"creating\"\r\n | \"uploading\"\r\n | (typeof CONVERSION_STATUS)[keyof typeof CONVERSION_STATUS];\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string;\r\n name: string;\r\n };\r\n upload: {\r\n uploadUrl: string;\r\n };\r\n};\r\n\r\ntype StartConversionResponse = {\r\n jobId: string;\r\n};\r\n\r\ntype UploadPointCloudPageProps = {\r\n onGoBackButtonClick?: () => void;\r\n};\r\n\r\nexport default function UploadPointCloudPage({\r\n onGoBackButtonClick,\r\n}: UploadPointCloudPageProps) {\r\n const [name, setName] = React.useState(\"\");\r\n const [file, setFile] = React.useState<File | null>(null);\r\n\r\n const [progress, setProgress] = React.useState(0);\r\n const [status, setStatus] = React.useState<ConversionStatus>(\"idle\");\r\n const [pointCloudId, setPointCloudId] = React.useState<string | null>(null);\r\n const [jobId, setJobId] = React.useState<string | null>(null);\r\n const [logLines, setLogLines] = React.useState<string[]>([]);\r\n\r\n const esRef = React.useRef<EventSource | null>(null);\r\n\r\n const appendLog = React.useCallback((...parts: unknown[]) => {\r\n const line = parts\r\n .map((p) => (typeof p === \"string\" ? p : JSON.stringify(p, null, 2)))\r\n .join(\" \");\r\n setLogLines((prev) => [...prev, line]);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n if (esRef.current) {\r\n esRef.current.close();\r\n }\r\n };\r\n }, []);\r\n\r\n async function createPointCloud(\r\n name: string,\r\n ): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ name }),\r\n });\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`);\r\n }\r\n\r\n return res.json();\r\n }\r\n\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress: (pct: number) => void,\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", url, true);\r\n\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100);\r\n onProgress(pct);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve();\r\n else reject(new Error(`Upload failed with status ${xhr.status}`));\r\n };\r\n\r\n xhr.onerror = () => reject(new Error(\"Network error during upload\"));\r\n xhr.send(file);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n async function startConversion(\r\n pointCloudId: string,\r\n ): Promise<StartConversionResponse> {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(\r\n pointCloudId,\r\n )}/convert-to-potree`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ options: { sampling_method: \"poisson\" } }),\r\n },\r\n );\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(`convert-to-potree failed: ${msg || res.status}`);\r\n }\r\n\r\n return res.json();\r\n }\r\n\r\n function subscribeToProgress(jobId: string) {\r\n if (!jobId) return;\r\n\r\n if (esRef.current) {\r\n esRef.current.close();\r\n }\r\n\r\n const es = new EventSource(\r\n `${API_BASE}/events/convert-progress/${encodeURIComponent(jobId)}`,\r\n );\r\n esRef.current = es;\r\n\r\n es.onopen = () => appendLog(\"🟢 SSE connection opened\");\r\n\r\n es.onerror = (event) => {\r\n appendLog(\"❌ SSE error:\", event);\r\n setStatus((prev) =>\r\n prev === CONVERSION_STATUS.FINISHED ? prev : CONVERSION_STATUS.FAILED,\r\n );\r\n };\r\n\r\n es.addEventListener(\"progress\", (event) => {\r\n try {\r\n const msgEvent = event as MessageEvent;\r\n const data = JSON.parse(msgEvent.data);\r\n\r\n appendLog(\r\n \"[progress]\",\r\n data.status ?? \"\",\r\n data.message ?? \"\",\r\n data.progress ?? \"\",\r\n );\r\n\r\n // If backend sends a status field matching our constants, use it\r\n if (\r\n data.status &&\r\n Object.values(CONVERSION_STATUS).includes(data.status)\r\n ) {\r\n setStatus(data.status as ConversionStatus);\r\n }\r\n\r\n if (typeof data.progress === \"number\") {\r\n setProgress(data.progress);\r\n }\r\n } catch (err) {\r\n appendLog(\"❌ Failed to parse progress event\", err);\r\n }\r\n });\r\n\r\n es.addEventListener(\"finished\", () => {\r\n appendLog(\"[finished] Conversion completed\");\r\n setStatus(CONVERSION_STATUS.FINISHED);\r\n setProgress(100);\r\n es.close();\r\n esRef.current = null;\r\n });\r\n\r\n es.addEventListener(\"failed\", () => {\r\n appendLog(\"[failed] Conversion failed\");\r\n setStatus(CONVERSION_STATUS.FAILED);\r\n es.close();\r\n esRef.current = null;\r\n });\r\n\r\n es.addEventListener(\"connected\", (event) => {\r\n const msgEvent = event as MessageEvent;\r\n appendLog(\"[connected]\", msgEvent.data);\r\n });\r\n\r\n es.onmessage = (event) => {\r\n appendLog(\"[message]\", event.data);\r\n };\r\n }\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!name.trim() || !file) {\r\n alert(\"Please provide a name and select a LAZ/LAS file.\");\r\n return;\r\n }\r\n\r\n setLogLines([]);\r\n setProgress(0);\r\n setPointCloudId(null);\r\n setJobId(null);\r\n setStatus(\"idle\");\r\n\r\n try {\r\n appendLog(\"🟦 1) Creating point cloud...\");\r\n setStatus(\"creating\");\r\n\r\n const { pointCloud, upload } = await createPointCloud(name.trim());\r\n appendLog(pointCloud);\r\n setPointCloudId(pointCloud.id);\r\n\r\n appendLog(\"🟦 2) Uploading to presigned URL...\");\r\n setStatus(\"uploading\");\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) =>\r\n setProgress(pct),\r\n );\r\n appendLog(\"✔ Upload finished\");\r\n\r\n appendLog(\"🟦 3) Starting conversion...\");\r\n // Mark that the conversion has started (using backend status constant)\r\n setStatus(CONVERSION_STATUS.STARTED);\r\n const conversion = await startConversion(pointCloud.id);\r\n appendLog(conversion);\r\n\r\n const jobId = conversion.jobId;\r\n setJobId(jobId);\r\n\r\n appendLog(\"🟦 4) Subscribing to SSE…\");\r\n subscribeToProgress(jobId);\r\n } catch (err) {\r\n const message =\r\n err instanceof Error ? err.message : \"Unknown upload error\";\r\n appendLog(\"🔥 ERROR:\", message);\r\n setStatus(CONVERSION_STATUS.FAILED);\r\n alert(message);\r\n }\r\n };\r\n\r\n const busy =\r\n status !== \"idle\" &&\r\n status !== CONVERSION_STATUS.FINISHED &&\r\n status !== CONVERSION_STATUS.FAILED;\r\n\r\n const statusLabel: string = (() => {\r\n switch (status) {\r\n case \"idle\":\r\n return \"Idle\";\r\n case \"creating\":\r\n return \"Creating point cloud…\";\r\n case \"uploading\":\r\n return \"Uploading LAZ…\";\r\n\r\n case CONVERSION_STATUS.STARTED:\r\n return \"Conversion started…\";\r\n case CONVERSION_STATUS.DOWNLOAD:\r\n return \"Downloading source file…\";\r\n case CONVERSION_STATUS.CONVERT:\r\n return \"Running Potree converter…\";\r\n case CONVERSION_STATUS.UPLOAD:\r\n return \"Uploading Potree output…\";\r\n case CONVERSION_STATUS.CLEAN_UP:\r\n return \"Cleaning up temporary files…\";\r\n case CONVERSION_STATUS.FINISHED:\r\n return \"Done 🎉\";\r\n case CONVERSION_STATUS.FAILED:\r\n return \"Error – see log\";\r\n default:\r\n return \"Unknown status\";\r\n }\r\n })();\r\n\r\n return (\r\n <div className=\"p-2 mt-16\">\r\n <div className=\"flex items-center justify-between gap-2 mb-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-semibold tracking-tight\">\r\n Upload & Convert Point Cloud\r\n </h1>\r\n </div>\r\n\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n if (onGoBackButtonClick) onGoBackButtonClick();\r\n }}\r\n >\r\n ← Back to list\r\n </Button>\r\n </div>\r\n\r\n <div className=\"grid gap-4 md:grid-cols-[2fr,1.2fr]\">\r\n {/* Upload card */}\r\n <div className=\"rounded-md border bg-background p-4 space-y-4\">\r\n <div className=\"flex items-center justify-between gap-2 text-sm\">\r\n <span className=\"font-semibold\">Upload point cloud</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {statusLabel}\r\n </span>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-3 text-sm\">\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs font-medium\">Name</div>\r\n <Input\r\n placeholder=\"e.g. Campus north wing\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs font-medium\">LAZ / LAS file</div>\r\n <Input\r\n type=\"file\"\r\n accept=\".laz,.las\"\r\n onChange={(e) => {\r\n const f = e.target.files?.[0] ?? null;\r\n setFile(f);\r\n }}\r\n />\r\n {file && (\r\n <div className=\"text-[11px] text-muted-foreground\">\r\n Selected: <span className=\"font-medium\">{file.name}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <Button\r\n type=\"submit\"\r\n disabled={!name.trim() || !file || busy}\r\n size=\"sm\"\r\n >\r\n {busy ? \"Working...\" : \"Upload & Convert\"}\r\n </Button>\r\n\r\n <div className=\"flex flex-col text-[11px] text-muted-foreground\">\r\n <span>\r\n PointCloud ID:{\" \"}\r\n <code className=\"text-xs\">{pointCloudId ?? \"—\"}</code>\r\n </span>\r\n <span>\r\n Job ID: <code className=\"text-xs\">{jobId ?? \"—\"}</code>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\r\n <span>Upload / conversion progress</span>\r\n <span>{progress}%</span>\r\n </div>\r\n <ProgressBar value={progress} />\r\n </div>\r\n </form>\r\n </div>\r\n\r\n {/* Log card */}\r\n <div className=\"rounded-md border bg-muted/20 p-3 flex flex-col gap-2\">\r\n <div className=\"flex items-center justify-between text-xs\">\r\n <h2 className=\"font-semibold uppercase tracking-wide\">\r\n Conversion log\r\n </h2>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 px-2 text-[11px]\"\r\n onClick={() => setLogLines([])}\r\n >\r\n Clear\r\n </Button>\r\n </div>\r\n\r\n <ScrollArea className=\"h-[200px] rounded border bg-background\">\r\n <pre className=\"p-2 text-[11px] leading-snug whitespace-pre-wrap\">\r\n {logLines.length ? logLines.join(\"\\n\") : \"No activity yet.\"}\r\n </pre>\r\n </ScrollArea>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["name","file","pointCloudId","jobId","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// app/point-clouds/upload/page.tsx\r\n\"use client\";\r\n\r\nimport * as React from \"react\";\r\n\r\nimport { ProgressBar } from \"../../../map/src/tools/AddTools/AddFile/ProgressBar\";\r\nimport { Button, Input, ScrollArea } from '../../../../ui';\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nconst CONVERSION_STATUS = Object.freeze({\r\n STARTED: \"conversion_started\",\r\n DOWNLOAD: \"download\",\r\n CONVERT: \"convert\",\r\n UPLOAD: \"upload\",\r\n CLEAN_UP: \"clean_up\",\r\n FAILED: \"failed\",\r\n FINISHED: \"finished\",\r\n});\r\n\r\n// All possible status values:\r\n// - local client-only phases: \"idle\", \"creating\", \"uploading\"\r\n// - plus all statuses from the backend (CONVERSION_STATUS values)\r\ntype ConversionStatus =\r\n | \"idle\"\r\n | \"creating\"\r\n | \"uploading\"\r\n | (typeof CONVERSION_STATUS)[keyof typeof CONVERSION_STATUS];\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string;\r\n name: string;\r\n };\r\n upload: {\r\n uploadUrl: string;\r\n };\r\n};\r\n\r\ntype StartConversionResponse = {\r\n jobId: string;\r\n};\r\n\r\ntype UploadPointCloudPageProps = {\r\n onGoBackButtonClick?: () => void;\r\n};\r\n\r\nexport default function UploadPointCloudPage({\r\n onGoBackButtonClick,\r\n}: UploadPointCloudPageProps) {\r\n const [name, setName] = React.useState(\"\");\r\n const [file, setFile] = React.useState<File | null>(null);\r\n\r\n const [progress, setProgress] = React.useState(0);\r\n const [status, setStatus] = React.useState<ConversionStatus>(\"idle\");\r\n const [pointCloudId, setPointCloudId] = React.useState<string | null>(null);\r\n const [jobId, setJobId] = React.useState<string | null>(null);\r\n const [logLines, setLogLines] = React.useState<string[]>([]);\r\n\r\n const esRef = React.useRef<EventSource | null>(null);\r\n\r\n const appendLog = React.useCallback((...parts: unknown[]) => {\r\n const line = parts\r\n .map((p) => (typeof p === \"string\" ? p : JSON.stringify(p, null, 2)))\r\n .join(\" \");\r\n setLogLines((prev) => [...prev, line]);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n if (esRef.current) {\r\n esRef.current.close();\r\n }\r\n };\r\n }, []);\r\n\r\n async function createPointCloud(\r\n name: string,\r\n ): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ name }),\r\n });\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`);\r\n }\r\n\r\n return res.json();\r\n }\r\n\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress: (pct: number) => void,\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", url, true);\r\n\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100);\r\n onProgress(pct);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve();\r\n else reject(new Error(`Upload failed with status ${xhr.status}`));\r\n };\r\n\r\n xhr.onerror = () => reject(new Error(\"Network error during upload\"));\r\n xhr.send(file);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n async function startConversion(\r\n pointCloudId: string,\r\n ): Promise<StartConversionResponse> {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(\r\n pointCloudId,\r\n )}/convert-to-potree`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ options: { sampling_method: \"poisson\" } }),\r\n },\r\n );\r\n\r\n if (!res.ok) {\r\n const msg = await res.text();\r\n throw new Error(`convert-to-potree failed: ${msg || res.status}`);\r\n }\r\n\r\n return res.json();\r\n }\r\n\r\n function subscribeToProgress(jobId: string) {\r\n if (!jobId) return;\r\n\r\n if (esRef.current) {\r\n esRef.current.close();\r\n }\r\n\r\n const es = new EventSource(\r\n `${API_BASE}/events/convert-progress/${encodeURIComponent(jobId)}`,\r\n );\r\n esRef.current = es;\r\n\r\n es.onopen = () => appendLog(\"🟢 SSE connection opened\");\r\n\r\n es.onerror = (event) => {\r\n appendLog(\"❌ SSE error:\", event);\r\n setStatus((prev) =>\r\n prev === CONVERSION_STATUS.FINISHED ? prev : CONVERSION_STATUS.FAILED,\r\n );\r\n };\r\n\r\n es.addEventListener(\"progress\", (event) => {\r\n try {\r\n const msgEvent = event as MessageEvent;\r\n const data = JSON.parse(msgEvent.data);\r\n\r\n appendLog(\r\n \"[progress]\",\r\n data.status ?? \"\",\r\n data.message ?? \"\",\r\n data.progress ?? \"\",\r\n );\r\n\r\n // If backend sends a status field matching our constants, use it\r\n if (\r\n data.status &&\r\n Object.values(CONVERSION_STATUS).includes(data.status)\r\n ) {\r\n setStatus(data.status as ConversionStatus);\r\n }\r\n\r\n if (typeof data.progress === \"number\") {\r\n setProgress(data.progress);\r\n }\r\n } catch (err) {\r\n appendLog(\"❌ Failed to parse progress event\", err);\r\n }\r\n });\r\n\r\n es.addEventListener(\"finished\", () => {\r\n appendLog(\"[finished] Conversion completed\");\r\n setStatus(CONVERSION_STATUS.FINISHED);\r\n setProgress(100);\r\n es.close();\r\n esRef.current = null;\r\n });\r\n\r\n es.addEventListener(\"failed\", () => {\r\n appendLog(\"[failed] Conversion failed\");\r\n setStatus(CONVERSION_STATUS.FAILED);\r\n es.close();\r\n esRef.current = null;\r\n });\r\n\r\n es.addEventListener(\"connected\", (event) => {\r\n const msgEvent = event as MessageEvent;\r\n appendLog(\"[connected]\", msgEvent.data);\r\n });\r\n\r\n es.onmessage = (event) => {\r\n appendLog(\"[message]\", event.data);\r\n };\r\n }\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!name.trim() || !file) {\r\n alert(\"Please provide a name and select a LAZ/LAS file.\");\r\n return;\r\n }\r\n\r\n setLogLines([]);\r\n setProgress(0);\r\n setPointCloudId(null);\r\n setJobId(null);\r\n setStatus(\"idle\");\r\n\r\n try {\r\n appendLog(\"🟦 1) Creating point cloud...\");\r\n setStatus(\"creating\");\r\n\r\n const { pointCloud, upload } = await createPointCloud(name.trim());\r\n appendLog(pointCloud);\r\n setPointCloudId(pointCloud.id);\r\n\r\n appendLog(\"🟦 2) Uploading to presigned URL...\");\r\n setStatus(\"uploading\");\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) =>\r\n setProgress(pct),\r\n );\r\n appendLog(\"✔ Upload finished\");\r\n\r\n appendLog(\"🟦 3) Starting conversion...\");\r\n // Mark that the conversion has started (using backend status constant)\r\n setStatus(CONVERSION_STATUS.STARTED);\r\n const conversion = await startConversion(pointCloud.id);\r\n appendLog(conversion);\r\n\r\n const jobId = conversion.jobId;\r\n setJobId(jobId);\r\n\r\n appendLog(\"🟦 4) Subscribing to SSE…\");\r\n subscribeToProgress(jobId);\r\n } catch (err) {\r\n const message =\r\n err instanceof Error ? err.message : \"Unknown upload error\";\r\n appendLog(\"🔥 ERROR:\", message);\r\n setStatus(CONVERSION_STATUS.FAILED);\r\n alert(message);\r\n }\r\n };\r\n\r\n const busy =\r\n status !== \"idle\" &&\r\n status !== CONVERSION_STATUS.FINISHED &&\r\n status !== CONVERSION_STATUS.FAILED;\r\n\r\n const statusLabel: string = (() => {\r\n switch (status) {\r\n case \"idle\":\r\n return \"Idle\";\r\n case \"creating\":\r\n return \"Creating point cloud…\";\r\n case \"uploading\":\r\n return \"Uploading LAZ…\";\r\n\r\n case CONVERSION_STATUS.STARTED:\r\n return \"Conversion started…\";\r\n case CONVERSION_STATUS.DOWNLOAD:\r\n return \"Downloading source file…\";\r\n case CONVERSION_STATUS.CONVERT:\r\n return \"Running Potree converter…\";\r\n case CONVERSION_STATUS.UPLOAD:\r\n return \"Uploading Potree output…\";\r\n case CONVERSION_STATUS.CLEAN_UP:\r\n return \"Cleaning up temporary files…\";\r\n case CONVERSION_STATUS.FINISHED:\r\n return \"Done 🎉\";\r\n case CONVERSION_STATUS.FAILED:\r\n return \"Error – see log\";\r\n default:\r\n return \"Unknown status\";\r\n }\r\n })();\r\n\r\n return (\r\n <div className=\"p-2 mt-16\">\r\n <div className=\"flex items-center justify-between gap-2 mb-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-semibold tracking-tight\">\r\n Upload & Convert Point Cloud\r\n </h1>\r\n </div>\r\n\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n if (onGoBackButtonClick) onGoBackButtonClick();\r\n }}\r\n >\r\n ← Back to list\r\n </Button>\r\n </div>\r\n\r\n <div className=\"grid gap-4 md:grid-cols-[2fr,1.2fr]\">\r\n {/* Upload card */}\r\n <div className=\"rounded-md border bg-background p-4 space-y-4\">\r\n <div className=\"flex items-center justify-between gap-2 text-sm\">\r\n <span className=\"font-semibold\">Upload point cloud</span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {statusLabel}\r\n </span>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-3 text-sm\">\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs font-medium\">Name</div>\r\n <Input\r\n placeholder=\"e.g. Campus north wing\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <div className=\"text-xs font-medium\">LAZ / LAS file</div>\r\n <Input\r\n type=\"file\"\r\n accept=\".laz,.las\"\r\n onChange={(e) => {\r\n const f = e.target.files?.[0] ?? null;\r\n setFile(f);\r\n }}\r\n />\r\n {file && (\r\n <div className=\"text-[11px] text-muted-foreground\">\r\n Selected: <span className=\"font-medium\">{file.name}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <Button\r\n type=\"submit\"\r\n disabled={!name.trim() || !file || busy}\r\n size=\"sm\"\r\n >\r\n {busy ? \"Working...\" : \"Upload & Convert\"}\r\n </Button>\r\n\r\n <div className=\"flex flex-col text-[11px] text-muted-foreground\">\r\n <span>\r\n PointCloud ID:{\" \"}\r\n <code className=\"text-xs\">{pointCloudId ?? \"—\"}</code>\r\n </span>\r\n <span>\r\n Job ID: <code className=\"text-xs\">{jobId ?? \"—\"}</code>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\r\n <span>Upload / conversion progress</span>\r\n <span>{progress}%</span>\r\n </div>\r\n <ProgressBar value={progress} />\r\n </div>\r\n </form>\r\n </div>\r\n\r\n {/* Log card */}\r\n <div className=\"rounded-md border bg-muted/20 p-3 flex flex-col gap-2\">\r\n <div className=\"flex items-center justify-between text-xs\">\r\n <h2 className=\"font-semibold uppercase tracking-wide\">\r\n Conversion log\r\n </h2>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 px-2 text-[11px]\"\r\n onClick={() => setLogLines([])}\r\n >\r\n Clear\r\n </Button>\r\n </div>\r\n\r\n <ScrollArea className=\"h-[200px] rounded border bg-background\">\r\n <pre className=\"p-2 text-[11px] leading-snug whitespace-pre-wrap\">\r\n {logLines.length ? logLines.join(\"\\n\") : \"No activity yet.\"}\r\n </pre>\r\n </ScrollArea>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["name","file","pointCloudId","jobId","_a"]}
|