@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.
Files changed (1000) hide show
  1. package/NOTICE +1021 -0
  2. package/README.md +32 -4
  3. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/ConfirmDialog.d.ts.map +1 -1
  6. package/dist/core/components/ConfirmDialog.js.map +1 -1
  7. package/dist/core/components/DataTableSkeleton.d.ts.map +1 -1
  8. package/dist/core/components/DataTableSkeleton.js.map +1 -1
  9. package/dist/core/components/LanguageSwitch.d.ts.map +1 -1
  10. package/dist/core/components/LanguageSwitch.js.map +1 -1
  11. package/dist/core/components/Logo.d.ts.map +1 -1
  12. package/dist/core/components/Logo.js.map +1 -1
  13. package/dist/core/components/Toolbar.d.ts.map +1 -1
  14. package/dist/core/components/Toolbar.js.map +1 -1
  15. package/dist/core/components/ToolbarBody.d.ts.map +1 -1
  16. package/dist/core/components/ToolbarBody.js.map +1 -1
  17. package/dist/core/components/ToolbarSubmenu.d.ts.map +1 -1
  18. package/dist/core/components/ToolbarSubmenu.js.map +1 -1
  19. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  20. package/dist/core/components/TopNavigationBar.js.map +1 -1
  21. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  22. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  23. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  24. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  25. package/dist/core/components/authentication/PasswordError.d.ts.map +1 -1
  26. package/dist/core/components/authentication/PasswordError.js.map +1 -1
  27. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  28. package/dist/core/components/authentication/Signin.js.map +1 -1
  29. package/dist/core/components/authentication/SigninEmail.d.ts.map +1 -1
  30. package/dist/core/components/authentication/SigninEmail.js.map +1 -1
  31. package/dist/core/components/authentication/Signup.d.ts.map +1 -1
  32. package/dist/core/components/authentication/Signup.js.map +1 -1
  33. package/dist/core/components/authentication/VerifyEmail.d.ts.map +1 -1
  34. package/dist/core/components/authentication/VerifyEmail.js.map +1 -1
  35. package/dist/core/components/authentication/index.d.ts.map +1 -1
  36. package/dist/core/components/authentication/index.js.map +1 -1
  37. package/dist/core/components/index.d.ts.map +1 -1
  38. package/dist/core/components/index.js.map +1 -1
  39. package/dist/core/components/instance-not-found/index.d.ts.map +1 -1
  40. package/dist/core/components/instance-not-found/index.js.map +1 -1
  41. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  42. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  43. package/dist/core/components/organizationConfig/index.d.ts.map +1 -1
  44. package/dist/core/components/organizationConfig/index.js.map +1 -1
  45. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  46. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  47. package/dist/core/components/settings/index.d.ts.map +1 -1
  48. package/dist/core/components/settings/index.js.map +1 -1
  49. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  50. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  51. package/dist/core/components/settings/src/ChangePassword.d.ts.map +1 -1
  52. package/dist/core/components/settings/src/ChangePassword.js.map +1 -1
  53. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  54. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  55. package/dist/core/components/settings/src/OrganizationSkeleton.d.ts.map +1 -1
  56. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  57. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  58. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  59. package/dist/core/components/settings/src/SettingsHeader.d.ts.map +1 -1
  60. package/dist/core/components/settings/src/SettingsHeader.js.map +1 -1
  61. package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
  62. package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
  63. package/dist/core/components/settings/src/SettingsSkeleton.d.ts.map +1 -1
  64. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  65. package/dist/core/components/settings/src/UsersSettingsPanel.d.ts.map +1 -1
  66. package/dist/core/components/settings/src/UsersSettingsPanel.js.map +1 -1
  67. package/dist/core/components/settings/src/types.d.ts.map +1 -1
  68. package/dist/core/components/ui/Accordion.d.ts.map +1 -1
  69. package/dist/core/components/ui/Accordion.js.map +1 -1
  70. package/dist/core/components/ui/AddItemDialog.d.ts.map +1 -1
  71. package/dist/core/components/ui/AddItemDialog.js.map +1 -1
  72. package/dist/core/components/ui/AlertDialog.d.ts.map +1 -1
  73. package/dist/core/components/ui/AlertDialog.js.map +1 -1
  74. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  75. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  76. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  77. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  78. package/dist/core/components/ui/Avatar.d.ts.map +1 -1
  79. package/dist/core/components/ui/Avatar.js.map +1 -1
  80. package/dist/core/components/ui/Badge.d.ts.map +1 -1
  81. package/dist/core/components/ui/Badge.js.map +1 -1
  82. package/dist/core/components/ui/Breadcrumb.d.ts.map +1 -1
  83. package/dist/core/components/ui/Breadcrumb.js.map +1 -1
  84. package/dist/core/components/ui/Button.d.ts.map +1 -1
  85. package/dist/core/components/ui/Button.js.map +1 -1
  86. package/dist/core/components/ui/Calendar.d.ts.map +1 -1
  87. package/dist/core/components/ui/Calendar.js.map +1 -1
  88. package/dist/core/components/ui/Card.d.ts.map +1 -1
  89. package/dist/core/components/ui/Card.js.map +1 -1
  90. package/dist/core/components/ui/Checkbox.d.ts.map +1 -1
  91. package/dist/core/components/ui/Checkbox.js.map +1 -1
  92. package/dist/core/components/ui/CollapsibleSection.d.ts.map +1 -1
  93. package/dist/core/components/ui/CollapsibleSection.js.map +1 -1
  94. package/dist/core/components/ui/ColorCircle.d.ts.map +1 -1
  95. package/dist/core/components/ui/ColorCircle.js.map +1 -1
  96. package/dist/core/components/ui/Command.d.ts.map +1 -1
  97. package/dist/core/components/ui/Command.js.map +1 -1
  98. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  99. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  100. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  101. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  102. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  103. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  104. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  105. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  106. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  107. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  108. package/dist/core/components/ui/Countdown.d.ts.map +1 -1
  109. package/dist/core/components/ui/Countdown.js.map +1 -1
  110. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  111. package/dist/core/components/ui/DataTable.js.map +1 -1
  112. package/dist/core/components/ui/DatePicker.d.ts.map +1 -1
  113. package/dist/core/components/ui/DatePicker.js.map +1 -1
  114. package/dist/core/components/ui/DescriptionList.d.ts.map +1 -1
  115. package/dist/core/components/ui/DescriptionList.js.map +1 -1
  116. package/dist/core/components/ui/Dialog.d.ts.map +1 -1
  117. package/dist/core/components/ui/Dialog.js.map +1 -1
  118. package/dist/core/components/ui/DropdownMenu.d.ts.map +1 -1
  119. package/dist/core/components/ui/DropdownMenu.js.map +1 -1
  120. package/dist/core/components/ui/ExportData.d.ts.map +1 -1
  121. package/dist/core/components/ui/ExportData.js.map +1 -1
  122. package/dist/core/components/ui/FilesManager/index.d.ts.map +1 -1
  123. package/dist/core/components/ui/FilesManager/index.js.map +1 -1
  124. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  125. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  126. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  127. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  128. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.d.ts.map +1 -1
  129. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.js.map +1 -1
  130. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  131. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  132. package/dist/core/components/ui/FilesManager/src/downloadUtils.d.ts.map +1 -1
  133. package/dist/core/components/ui/FilesManager/src/downloadUtils.js.map +1 -1
  134. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.d.ts.map +1 -1
  135. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.js.map +1 -1
  136. package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts.map +1 -1
  137. package/dist/core/components/ui/FilesManager/src/useFileActions.js.map +1 -1
  138. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.d.ts.map +1 -1
  139. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.js.map +1 -1
  140. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  141. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  142. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  143. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  144. package/dist/core/components/ui/Footer.d.ts.map +1 -1
  145. package/dist/core/components/ui/Footer.js.map +1 -1
  146. package/dist/core/components/ui/GenericTool.d.ts.map +1 -1
  147. package/dist/core/components/ui/GenericTool.js.map +1 -1
  148. package/dist/core/components/ui/Icons/BcfIcon.d.ts.map +1 -1
  149. package/dist/core/components/ui/Icons/BcfIcon.js.map +1 -1
  150. package/dist/core/components/ui/Icons/CdtIcon.d.ts.map +1 -1
  151. package/dist/core/components/ui/Icons/CdtIcon.js.map +1 -1
  152. package/dist/core/components/ui/Icons/FloorPlanIcon.d.ts.map +1 -1
  153. package/dist/core/components/ui/Icons/FloorPlanIcon.js.map +1 -1
  154. package/dist/core/components/ui/Icons/GoogleIcon.d.ts.map +1 -1
  155. package/dist/core/components/ui/Icons/GoogleIcon.js.map +1 -1
  156. package/dist/core/components/ui/Icons/IdsIcon.d.ts.map +1 -1
  157. package/dist/core/components/ui/Icons/IdsIcon.js.map +1 -1
  158. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  159. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  160. package/dist/core/components/ui/Icons/index.d.ts.map +1 -1
  161. package/dist/core/components/ui/Icons/index.js.map +1 -1
  162. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  163. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  164. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  165. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  166. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  167. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  168. package/dist/core/components/ui/Input.d.ts.map +1 -1
  169. package/dist/core/components/ui/Input.js.map +1 -1
  170. package/dist/core/components/ui/Label.d.ts.map +1 -1
  171. package/dist/core/components/ui/Label.js.map +1 -1
  172. package/dist/core/components/ui/LanguageToggle.d.ts.map +1 -1
  173. package/dist/core/components/ui/LanguageToggle.js.map +1 -1
  174. package/dist/core/components/ui/LoadingSpinner.d.ts.map +1 -1
  175. package/dist/core/components/ui/LoadingSpinner.js.map +1 -1
  176. package/dist/core/components/ui/Menubar.d.ts.map +1 -1
  177. package/dist/core/components/ui/Menubar.js.map +1 -1
  178. package/dist/core/components/ui/NavUser.d.ts.map +1 -1
  179. package/dist/core/components/ui/NavUser.js.map +1 -1
  180. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  181. package/dist/core/components/ui/Navbar.js.map +1 -1
  182. package/dist/core/components/ui/Popover.d.ts.map +1 -1
  183. package/dist/core/components/ui/Popover.js.map +1 -1
  184. package/dist/core/components/ui/Progress.d.ts.map +1 -1
  185. package/dist/core/components/ui/Progress.js.map +1 -1
  186. package/dist/core/components/ui/ScrollArea.d.ts.map +1 -1
  187. package/dist/core/components/ui/ScrollArea.js.map +1 -1
  188. package/dist/core/components/ui/SearchInput.d.ts.map +1 -1
  189. package/dist/core/components/ui/SearchInput.js.map +1 -1
  190. package/dist/core/components/ui/Select.d.ts.map +1 -1
  191. package/dist/core/components/ui/Select.js.map +1 -1
  192. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  193. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  194. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  195. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  196. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  197. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  198. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  199. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  200. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  201. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  202. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  203. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  204. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.d.ts.map +1 -1
  205. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.js.map +1 -1
  206. package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
  207. package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
  208. package/dist/core/components/ui/Separator.d.ts.map +1 -1
  209. package/dist/core/components/ui/Separator.js.map +1 -1
  210. package/dist/core/components/ui/SettingsButton.d.ts.map +1 -1
  211. package/dist/core/components/ui/SettingsButton.js.map +1 -1
  212. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.d.ts.map +1 -1
  213. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.js.map +1 -1
  214. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  215. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  216. package/dist/core/components/ui/ShareFeature/index.d.ts.map +1 -1
  217. package/dist/core/components/ui/ShareFeature/index.js.map +1 -1
  218. package/dist/core/components/ui/Sheet.d.ts.map +1 -1
  219. package/dist/core/components/ui/Sheet.js.map +1 -1
  220. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  221. package/dist/core/components/ui/Sidebar.js.map +1 -1
  222. package/dist/core/components/ui/Skeleton.d.ts.map +1 -1
  223. package/dist/core/components/ui/Skeleton.js.map +1 -1
  224. package/dist/core/components/ui/Slider.d.ts.map +1 -1
  225. package/dist/core/components/ui/Slider.js.map +1 -1
  226. package/dist/core/components/ui/Sonner.d.ts.map +1 -1
  227. package/dist/core/components/ui/Sonner.js.map +1 -1
  228. package/dist/core/components/ui/Switch.d.ts.map +1 -1
  229. package/dist/core/components/ui/Switch.js.map +1 -1
  230. package/dist/core/components/ui/Table.d.ts.map +1 -1
  231. package/dist/core/components/ui/Table.js.map +1 -1
  232. package/dist/core/components/ui/Tabs.d.ts.map +1 -1
  233. package/dist/core/components/ui/Tabs.js.map +1 -1
  234. package/dist/core/components/ui/Textarea.d.ts.map +1 -1
  235. package/dist/core/components/ui/Textarea.js.map +1 -1
  236. package/dist/core/components/ui/Toggle.d.ts.map +1 -1
  237. package/dist/core/components/ui/Toggle.js.map +1 -1
  238. package/dist/core/components/ui/ToggleGroup.d.ts.map +1 -1
  239. package/dist/core/components/ui/ToggleGroup.js.map +1 -1
  240. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  241. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  242. package/dist/core/components/ui/Tooltip.d.ts.map +1 -1
  243. package/dist/core/components/ui/Tooltip.js.map +1 -1
  244. package/dist/core/components/ui/UserAvatar.d.ts.map +1 -1
  245. package/dist/core/components/ui/UserAvatar.js.map +1 -1
  246. package/dist/core/components/ui/chart.d.ts.map +1 -1
  247. package/dist/core/components/ui/chart.js.map +1 -1
  248. package/dist/core/components/ui/downloadUtils.d.ts.map +1 -1
  249. package/dist/core/components/ui/downloadUtils.js.map +1 -1
  250. package/dist/core/components/ui/index.d.ts.map +1 -1
  251. package/dist/core/components/ui/index.js.map +1 -1
  252. package/dist/core/components/ui/openPopupWindow.d.ts.map +1 -1
  253. package/dist/core/components/ui/openPopupWindow.js.map +1 -1
  254. package/dist/core/components/ui/openPopupWindowLCA.d.ts.map +1 -1
  255. package/dist/core/components/ui/openPopupWindowLCA.js.map +1 -1
  256. package/dist/core/components/ui/stats.d.ts.map +1 -1
  257. package/dist/core/components/ui/stats.js.map +1 -1
  258. package/dist/core/components/ui/uploadFile.d.ts.map +1 -1
  259. package/dist/core/components/ui/uploadFile.js.map +1 -1
  260. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  261. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  262. package/dist/core/components/viewers/Data/FilterButtons.d.ts.map +1 -1
  263. package/dist/core/components/viewers/Data/FilterButtons.js.map +1 -1
  264. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  265. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  266. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  267. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  268. package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts.map +1 -1
  269. package/dist/core/components/viewers/Data/advancedFilter/Filters.js.map +1 -1
  270. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  271. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  272. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  273. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  274. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
  275. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
  276. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.d.ts.map +1 -1
  277. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js.map +1 -1
  278. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  279. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  280. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  281. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  282. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.d.ts.map +1 -1
  283. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.js.map +1 -1
  284. package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts.map +1 -1
  285. package/dist/core/components/viewers/Data/details/AttachedFiles.js.map +1 -1
  286. package/dist/core/components/viewers/Data/details/CheckboxGroup.d.ts.map +1 -1
  287. package/dist/core/components/viewers/Data/details/CheckboxGroup.js.map +1 -1
  288. package/dist/core/components/viewers/Data/details/DetailActions.d.ts.map +1 -1
  289. package/dist/core/components/viewers/Data/details/DetailActions.js.map +1 -1
  290. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  291. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  292. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  293. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  294. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  295. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  296. package/dist/core/components/viewers/Data/details/FileUpload.d.ts.map +1 -1
  297. package/dist/core/components/viewers/Data/details/FileUpload.js.map +1 -1
  298. package/dist/core/components/viewers/Data/details/FilterFiles.d.ts.map +1 -1
  299. package/dist/core/components/viewers/Data/details/FilterFiles.js.map +1 -1
  300. package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
  301. package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
  302. package/dist/core/components/viewers/Data/details/UnitsGrid.d.ts.map +1 -1
  303. package/dist/core/components/viewers/Data/details/UnitsGrid.js.map +1 -1
  304. package/dist/core/components/viewers/Data/details/getAttachmentFileName.d.ts.map +1 -1
  305. package/dist/core/components/viewers/Data/details/getAttachmentFileName.js.map +1 -1
  306. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  307. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  308. package/dist/core/components/viewers/Data/files/FileDetails.d.ts.map +1 -1
  309. package/dist/core/components/viewers/Data/files/FileDetails.js.map +1 -1
  310. package/dist/core/components/viewers/Data/files/FileMoreOptions.d.ts.map +1 -1
  311. package/dist/core/components/viewers/Data/files/FileMoreOptions.js.map +1 -1
  312. package/dist/core/components/viewers/Data/files/FilePreview.d.ts.map +1 -1
  313. package/dist/core/components/viewers/Data/files/FilePreview.js.map +1 -1
  314. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  315. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  316. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.d.ts.map +1 -1
  317. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js.map +1 -1
  318. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
  319. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
  320. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
  321. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
  322. package/dist/core/components/viewers/Data/siteDetails/AddSite.d.ts.map +1 -1
  323. package/dist/core/components/viewers/Data/siteDetails/AddSite.js.map +1 -1
  324. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  325. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  326. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.d.ts.map +1 -1
  327. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js.map +1 -1
  328. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  329. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  330. package/dist/core/components/viewers/Data/userDetails/AddUser.d.ts.map +1 -1
  331. package/dist/core/components/viewers/Data/userDetails/AddUser.js.map +1 -1
  332. package/dist/core/components/viewers/Data/userDetails/UserDetails.d.ts.map +1 -1
  333. package/dist/core/components/viewers/Data/userDetails/UserDetails.js.map +1 -1
  334. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  335. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  336. package/dist/core/components/viewers/Data/utils/Columns.d.ts.map +1 -1
  337. package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
  338. package/dist/core/components/viewers/Data/utils/Headers.d.ts.map +1 -1
  339. package/dist/core/components/viewers/Data/utils/Headers.js.map +1 -1
  340. package/dist/core/components/viewers/Data/utils/convertDate.d.ts.map +1 -1
  341. package/dist/core/components/viewers/Data/utils/convertDate.js.map +1 -1
  342. package/dist/core/components/viewers/Data/utils/csvUtils.d.ts.map +1 -1
  343. package/dist/core/components/viewers/Data/utils/csvUtils.js.map +1 -1
  344. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  345. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  346. package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
  347. package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
  348. package/dist/core/components/viewers/Data/utils/useViewerData.d.ts.map +1 -1
  349. package/dist/core/components/viewers/Data/utils/useViewerData.js.map +1 -1
  350. package/dist/core/components/viewers/Data/utils/viewerConfig.d.ts.map +1 -1
  351. package/dist/core/components/viewers/Data/utils/viewerConfig.js.map +1 -1
  352. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  353. package/dist/core/components/viewers/Viewer.js.map +1 -1
  354. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  355. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  356. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  357. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  358. package/dist/core/components/viewers/bim/src/BCFTopicsManager.d.ts.map +1 -1
  359. package/dist/core/components/viewers/bim/src/BCFTopicsManager.js.map +1 -1
  360. package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts.map +1 -1
  361. package/dist/core/components/viewers/bim/src/BIMManager/index.js.map +1 -1
  362. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  363. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  364. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.d.ts.map +1 -1
  365. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js.map +1 -1
  366. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  367. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js.map +1 -1
  368. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts.map +1 -1
  369. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js.map +1 -1
  370. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts.map +1 -1
  371. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js.map +1 -1
  372. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  373. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  374. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.d.ts.map +1 -1
  375. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.js.map +1 -1
  376. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  377. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  378. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  379. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  380. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.d.ts.map +1 -1
  381. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js.map +1 -1
  382. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.d.ts.map +1 -1
  383. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.js.map +1 -1
  384. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  385. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  386. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.d.ts.map +1 -1
  387. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js.map +1 -1
  388. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  389. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  390. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.d.ts.map +1 -1
  391. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js.map +1 -1
  392. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  393. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  394. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.d.ts.map +1 -1
  395. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js.map +1 -1
  396. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.d.ts.map +1 -1
  397. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js.map +1 -1
  398. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.d.ts.map +1 -1
  399. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js.map +1 -1
  400. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  401. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  402. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  403. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  404. package/dist/core/components/viewers/bim/src/CameraProjection.d.ts.map +1 -1
  405. package/dist/core/components/viewers/bim/src/CameraProjection.js.map +1 -1
  406. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  407. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  408. package/dist/core/components/viewers/bim/src/CurrentCamera.d.ts.map +1 -1
  409. package/dist/core/components/viewers/bim/src/CurrentCamera.js.map +1 -1
  410. package/dist/core/components/viewers/bim/src/CurrentWorld.d.ts.map +1 -1
  411. package/dist/core/components/viewers/bim/src/CurrentWorld.js.map +1 -1
  412. package/dist/core/components/viewers/bim/src/Cursor.d.ts.map +1 -1
  413. package/dist/core/components/viewers/bim/src/Cursor.js.map +1 -1
  414. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  415. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  416. package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts.map +1 -1
  417. package/dist/core/components/viewers/bim/src/ElevationsTool/index.js.map +1 -1
  418. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts.map +1 -1
  419. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.js.map +1 -1
  420. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts.map +1 -1
  421. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.js.map +1 -1
  422. package/dist/core/components/viewers/bim/src/FitCamera.d.ts.map +1 -1
  423. package/dist/core/components/viewers/bim/src/FitCamera.js.map +1 -1
  424. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  425. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  426. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts.map +1 -1
  427. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.js.map +1 -1
  428. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts.map +1 -1
  429. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.js.map +1 -1
  430. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts.map +1 -1
  431. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.js.map +1 -1
  432. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.d.ts.map +1 -1
  433. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.js.map +1 -1
  434. package/dist/core/components/viewers/bim/src/GhostMode.d.ts.map +1 -1
  435. package/dist/core/components/viewers/bim/src/GhostMode.js.map +1 -1
  436. package/dist/core/components/viewers/bim/src/Highlighter/index.d.ts.map +1 -1
  437. package/dist/core/components/viewers/bim/src/Highlighter/index.js.map +1 -1
  438. package/dist/core/components/viewers/bim/src/IDSManager/index.d.ts.map +1 -1
  439. package/dist/core/components/viewers/bim/src/IDSManager/index.js.map +1 -1
  440. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.d.ts.map +1 -1
  441. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js.map +1 -1
  442. package/dist/core/components/viewers/bim/src/IfcToFragments.d.ts.map +1 -1
  443. package/dist/core/components/viewers/bim/src/IfcToFragments.js.map +1 -1
  444. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.d.ts.map +1 -1
  445. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.js.map +1 -1
  446. package/dist/core/components/viewers/bim/src/LoadModels.d.ts.map +1 -1
  447. package/dist/core/components/viewers/bim/src/LoadModels.js.map +1 -1
  448. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  449. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  450. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  451. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  452. package/dist/core/components/viewers/bim/src/SpatialStructure.d.ts.map +1 -1
  453. package/dist/core/components/viewers/bim/src/SpatialStructure.js.map +1 -1
  454. package/dist/core/components/viewers/bim/src/ViewportGizmo.d.ts.map +1 -1
  455. package/dist/core/components/viewers/bim/src/ViewportGizmo.js.map +1 -1
  456. package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts.map +1 -1
  457. package/dist/core/components/viewers/bim/src/lib/CameraController.js.map +1 -1
  458. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.d.ts.map +1 -1
  459. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.js.map +1 -1
  460. package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts.map +1 -1
  461. package/dist/core/components/viewers/bim/src/lib/ChromeController.js.map +1 -1
  462. package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts.map +1 -1
  463. package/dist/core/components/viewers/bim/src/lib/ClipController.js.map +1 -1
  464. package/dist/core/components/viewers/bim/src/lib/GridController.d.ts.map +1 -1
  465. package/dist/core/components/viewers/bim/src/lib/GridController.js.map +1 -1
  466. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  467. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  468. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.d.ts.map +1 -1
  469. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.js.map +1 -1
  470. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts.map +1 -1
  471. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js.map +1 -1
  472. package/dist/core/components/viewers/bim/src/lib/drawingLayers.d.ts.map +1 -1
  473. package/dist/core/components/viewers/bim/src/lib/drawingLayers.js.map +1 -1
  474. package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts.map +1 -1
  475. package/dist/core/components/viewers/bim/src/lib/drawingProjection.js.map +1 -1
  476. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.d.ts.map +1 -1
  477. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.js.map +1 -1
  478. package/dist/core/components/viewers/bim/src/lib/safeRun.d.ts.map +1 -1
  479. package/dist/core/components/viewers/bim/src/lib/safeRun.js.map +1 -1
  480. package/dist/core/components/viewers/bim/src/lib/useBuildingName.d.ts.map +1 -1
  481. package/dist/core/components/viewers/bim/src/lib/useBuildingName.js.map +1 -1
  482. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  483. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  484. package/dist/core/components/viewers/bim/src/lib/viewSection.d.ts.map +1 -1
  485. package/dist/core/components/viewers/bim/src/lib/viewSection.js.map +1 -1
  486. package/dist/core/components/viewers/bim/src/propertiesMenu/index.d.ts.map +1 -1
  487. package/dist/core/components/viewers/bim/src/propertiesMenu/index.js.map +1 -1
  488. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.d.ts.map +1 -1
  489. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js.map +1 -1
  490. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.d.ts.map +1 -1
  491. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js.map +1 -1
  492. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.d.ts.map +1 -1
  493. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.js.map +1 -1
  494. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts.map +1 -1
  495. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js.map +1 -1
  496. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.d.ts.map +1 -1
  497. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.js.map +1 -1
  498. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  499. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  500. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  501. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  502. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.d.ts.map +1 -1
  503. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js.map +1 -1
  504. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
  505. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
  506. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.d.ts.map +1 -1
  507. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js.map +1 -1
  508. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  509. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  510. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  511. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  512. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  513. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  514. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  515. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  516. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  517. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  518. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.d.ts.map +1 -1
  519. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.js.map +1 -1
  520. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.d.ts.map +1 -1
  521. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.js.map +1 -1
  522. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  523. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  524. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  525. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  526. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  527. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  528. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  529. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  530. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.d.ts.map +1 -1
  531. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js.map +1 -1
  532. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  533. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  534. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  535. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  536. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts.map +1 -1
  537. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js.map +1 -1
  538. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts.map +1 -1
  539. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js.map +1 -1
  540. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  541. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  542. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  543. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  544. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts.map +1 -1
  545. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js.map +1 -1
  546. package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts.map +1 -1
  547. package/dist/core/components/viewers/bim/src/tools/shareBimTool.js.map +1 -1
  548. package/dist/core/components/viewers/bim/utils/GizmoController.d.ts.map +1 -1
  549. package/dist/core/components/viewers/bim/utils/GizmoController.js.map +1 -1
  550. package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts.map +1 -1
  551. package/dist/core/components/viewers/bim/utils/setCameraLookAt.js.map +1 -1
  552. package/dist/core/components/viewers/index.d.ts.map +1 -1
  553. package/dist/core/components/viewers/index.js.map +1 -1
  554. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  555. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  556. package/dist/core/components/viewers/map/datasets/AddPortalDialog.d.ts.map +1 -1
  557. package/dist/core/components/viewers/map/datasets/AddPortalDialog.js.map +1 -1
  558. package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts.map +1 -1
  559. package/dist/core/components/viewers/map/datasets/DatasetDetails.js.map +1 -1
  560. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  561. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  562. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.d.ts.map +1 -1
  563. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js.map +1 -1
  564. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.d.ts.map +1 -1
  565. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.js.map +1 -1
  566. package/dist/core/components/viewers/map/datasets/Filters.d.ts.map +1 -1
  567. package/dist/core/components/viewers/map/datasets/Filters.js.map +1 -1
  568. package/dist/core/components/viewers/map/datasets/NestedFilter.d.ts.map +1 -1
  569. package/dist/core/components/viewers/map/datasets/NestedFilter.js.map +1 -1
  570. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  571. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  572. package/dist/core/components/viewers/map/datasets/data.d.ts.map +1 -1
  573. package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
  574. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  575. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  576. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  577. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  578. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.d.ts.map +1 -1
  579. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.js.map +1 -1
  580. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -1
  581. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -1
  582. package/dist/core/components/viewers/map/datasets/src/cache.d.ts.map +1 -1
  583. package/dist/core/components/viewers/map/datasets/src/cache.js.map +1 -1
  584. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  585. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  586. package/dist/core/components/viewers/map/datasets/src/geojsonFile.d.ts.map +1 -1
  587. package/dist/core/components/viewers/map/datasets/src/geojsonFile.js.map +1 -1
  588. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  589. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  590. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  591. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  592. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  593. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  594. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -1
  595. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -1
  596. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.d.ts.map +1 -1
  597. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js.map +1 -1
  598. package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts.map +1 -1
  599. package/dist/core/components/viewers/map/datasets/src/urlSources.js.map +1 -1
  600. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.d.ts.map +1 -1
  601. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js.map +1 -1
  602. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts.map +1 -1
  603. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.js.map +1 -1
  604. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +0 -8
  605. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -1
  606. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -1
  607. package/dist/core/components/viewers/map/datasets/utils.d.ts.map +1 -1
  608. package/dist/core/components/viewers/map/datasets/utils.js.map +1 -1
  609. package/dist/core/components/viewers/map/legends/MapLegendHost.d.ts.map +1 -1
  610. package/dist/core/components/viewers/map/legends/MapLegendHost.js.map +1 -1
  611. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  612. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  613. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts.map +1 -1
  614. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.js.map +1 -1
  615. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts.map +1 -1
  616. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js.map +1 -1
  617. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  618. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  619. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  620. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  621. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  622. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  623. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.d.ts.map +1 -1
  624. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.js.map +1 -1
  625. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  626. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  627. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  628. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  629. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.d.ts.map +1 -1
  630. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js.map +1 -1
  631. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts.map +1 -1
  632. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.js.map +1 -1
  633. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  634. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  635. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -1
  636. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -1
  637. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  638. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  639. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.d.ts.map +1 -1
  640. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.js.map +1 -1
  641. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  642. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  643. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.d.ts.map +1 -1
  644. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.js.map +1 -1
  645. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts.map +1 -1
  646. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js.map +1 -1
  647. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  648. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  649. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.d.ts.map +1 -1
  650. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.js.map +1 -1
  651. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.d.ts.map +1 -1
  652. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.js.map +1 -1
  653. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  654. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  655. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts.map +1 -1
  656. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.js.map +1 -1
  657. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -1
  658. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -1
  659. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  660. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  661. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.d.ts.map +1 -1
  662. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js.map +1 -1
  663. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  664. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  665. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts.map +1 -1
  666. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.js.map +1 -1
  667. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.d.ts.map +1 -1
  668. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.js.map +1 -1
  669. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.d.ts.map +1 -1
  670. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.js.map +1 -1
  671. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  672. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  673. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  674. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  675. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  676. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.js.map +1 -1
  677. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.d.ts.map +1 -1
  678. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.js.map +1 -1
  679. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  680. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  681. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  682. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  683. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  684. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  685. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.d.ts.map +1 -1
  686. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js.map +1 -1
  687. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.d.ts.map +1 -1
  688. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js.map +1 -1
  689. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  690. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  691. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  692. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  693. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  694. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  695. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.d.ts.map +1 -1
  696. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js.map +1 -1
  697. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
  698. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js.map +1 -1
  699. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  700. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  701. package/dist/core/components/viewers/map/src/SimpleMap.d.ts.map +1 -1
  702. package/dist/core/components/viewers/map/src/SimpleMap.js.map +1 -1
  703. package/dist/core/components/viewers/map/src/compare/AddItem.d.ts.map +1 -1
  704. package/dist/core/components/viewers/map/src/compare/AddItem.js.map +1 -1
  705. package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts.map +1 -1
  706. package/dist/core/components/viewers/map/src/compare/CompareDialog.js.map +1 -1
  707. package/dist/core/components/viewers/map/src/compare/description-list.d.ts.map +1 -1
  708. package/dist/core/components/viewers/map/src/compare/description-list.js.map +1 -1
  709. package/dist/core/components/viewers/map/src/compare/index.d.ts.map +1 -1
  710. package/dist/core/components/viewers/map/src/compare/index.js.map +1 -1
  711. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.d.ts.map +1 -1
  712. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js.map +1 -1
  713. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.d.ts.map +1 -1
  714. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js.map +1 -1
  715. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.d.ts.map +1 -1
  716. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.js.map +1 -1
  717. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  718. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  719. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  720. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  721. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  722. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  723. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  724. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  725. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  726. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  727. package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts.map +1 -1
  728. package/dist/core/components/viewers/map/src/tools/measureMapTool.js.map +1 -1
  729. package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts.map +1 -1
  730. package/dist/core/components/viewers/map/src/tools/shareMapTool.js.map +1 -1
  731. package/dist/core/components/viewers/map/utils/ClusterManager.d.ts.map +1 -1
  732. package/dist/core/components/viewers/map/utils/ClusterManager.js.map +1 -1
  733. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  734. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  735. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.d.ts.map +1 -1
  736. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.js.map +1 -1
  737. package/dist/core/components/viewers/map/utils/MarkerManager.d.ts.map +1 -1
  738. package/dist/core/components/viewers/map/utils/MarkerManager.js.map +1 -1
  739. package/dist/core/components/viewers/map/utils/dateName.d.ts.map +1 -1
  740. package/dist/core/components/viewers/map/utils/dateName.js.map +1 -1
  741. package/dist/core/components/viewers/map/utils/extractCoordinates.d.ts.map +1 -1
  742. package/dist/core/components/viewers/map/utils/extractCoordinates.js.map +1 -1
  743. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts.map +1 -1
  744. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.js.map +1 -1
  745. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.d.ts.map +1 -1
  746. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.js.map +1 -1
  747. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  748. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  749. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  750. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  751. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -1
  752. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -1
  753. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  754. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  755. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  756. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  757. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  758. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  759. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  760. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  761. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts.map +1 -1
  762. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.js.map +1 -1
  763. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  764. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  765. package/dist/core/components/viewers/map/utils/mapStyleCatalog.d.ts.map +1 -1
  766. package/dist/core/components/viewers/map/utils/mapStyleCatalog.js.map +1 -1
  767. package/dist/core/components/viewers/map/utils/stringToColour.d.ts.map +1 -1
  768. package/dist/core/components/viewers/map/utils/stringToColour.js.map +1 -1
  769. package/dist/core/components/viewers/map/utils/toggleBimToMap.d.ts.map +1 -1
  770. package/dist/core/components/viewers/map/utils/toggleBimToMap.js.map +1 -1
  771. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.d.ts.map +1 -1
  772. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.js.map +1 -1
  773. package/dist/core/components/viewers/map/utils/validateBounds.d.ts.map +1 -1
  774. package/dist/core/components/viewers/map/utils/validateBounds.js.map +1 -1
  775. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  776. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  777. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  778. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  779. package/dist/core/components/viewers/pointcloud/define.d.ts.map +1 -1
  780. package/dist/core/components/viewers/pointcloud/define.js.map +1 -1
  781. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  782. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  783. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  784. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  785. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  786. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  787. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  788. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  789. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts.map +1 -1
  790. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js.map +1 -1
  791. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  792. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  793. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  794. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  795. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  796. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  797. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  798. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  799. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.d.ts.map +1 -1
  800. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js.map +1 -1
  801. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.d.ts.map +1 -1
  802. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js.map +1 -1
  803. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  804. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  805. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.d.ts.map +1 -1
  806. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js.map +1 -1
  807. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.d.ts.map +1 -1
  808. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.js.map +1 -1
  809. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts.map +1 -1
  810. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js.map +1 -1
  811. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.d.ts.map +1 -1
  812. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.js.map +1 -1
  813. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.d.ts.map +1 -1
  814. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.js.map +1 -1
  815. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.d.ts.map +1 -1
  816. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.js.map +1 -1
  817. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.d.ts.map +1 -1
  818. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.js.map +1 -1
  819. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts.map +1 -1
  820. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js.map +1 -1
  821. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.d.ts.map +1 -1
  822. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js.map +1 -1
  823. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.d.ts.map +1 -1
  824. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  825. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.d.ts.map +1 -1
  826. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js.map +1 -1
  827. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.d.ts.map +1 -1
  828. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js.map +1 -1
  829. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.d.ts.map +1 -1
  830. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js.map +1 -1
  831. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.d.ts.map +1 -1
  832. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js.map +1 -1
  833. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.d.ts.map +1 -1
  834. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js.map +1 -1
  835. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts.map +1 -1
  836. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js.map +1 -1
  837. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.d.ts.map +1 -1
  838. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.js.map +1 -1
  839. package/dist/core/components/viewers/pointcloud/src/tools/index.d.ts.map +1 -1
  840. package/dist/core/components/viewers/pointcloud/src/tools/index.js.map +1 -1
  841. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts.map +1 -1
  842. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js.map +1 -1
  843. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
  844. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
  845. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts.map +1 -1
  846. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.js.map +1 -1
  847. package/dist/core/components/viewers/useCoordinateSystem.d.ts.map +1 -1
  848. package/dist/core/components/viewers/useCoordinateSystem.js.map +1 -1
  849. package/dist/core/hooks/buildings/buildings.d.ts.map +1 -1
  850. package/dist/core/hooks/buildings/buildings.js.map +1 -1
  851. package/dist/core/hooks/buildings/createBuildingHooks.d.ts.map +1 -1
  852. package/dist/core/hooks/buildings/createBuildingHooks.js.map +1 -1
  853. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  854. package/dist/core/hooks/comments/comments.js.map +1 -1
  855. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  856. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  857. package/dist/core/hooks/files/createFileHooks.d.ts.map +1 -1
  858. package/dist/core/hooks/files/createFileHooks.js.map +1 -1
  859. package/dist/core/hooks/files/files.d.ts.map +1 -1
  860. package/dist/core/hooks/files/files.js.map +1 -1
  861. package/dist/core/hooks/index.d.ts.map +1 -1
  862. package/dist/core/hooks/index.js.map +1 -1
  863. package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts.map +1 -1
  864. package/dist/core/hooks/infrastructures/createInfrastructureHooks.js.map +1 -1
  865. package/dist/core/hooks/infrastructures/infrastructures.d.ts.map +1 -1
  866. package/dist/core/hooks/infrastructures/infrastructures.js.map +1 -1
  867. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts.map +1 -1
  868. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.js.map +1 -1
  869. package/dist/core/hooks/openDataPortals/openDataPortals.d.ts.map +1 -1
  870. package/dist/core/hooks/openDataPortals/openDataPortals.js.map +1 -1
  871. package/dist/core/hooks/organizations/createOrganizationHooks.d.ts.map +1 -1
  872. package/dist/core/hooks/organizations/createOrganizationHooks.js.map +1 -1
  873. package/dist/core/hooks/organizations/organizations.d.ts.map +1 -1
  874. package/dist/core/hooks/organizations/organizations.js.map +1 -1
  875. package/dist/core/hooks/ports/apiAdapter.d.ts.map +1 -1
  876. package/dist/core/hooks/provider.d.ts.map +1 -1
  877. package/dist/core/hooks/provider.js.map +1 -1
  878. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts.map +1 -1
  879. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.js.map +1 -1
  880. package/dist/core/hooks/sensorTypes/sensorTypes.d.ts.map +1 -1
  881. package/dist/core/hooks/sensorTypes/sensorTypes.js.map +1 -1
  882. package/dist/core/hooks/sensors/createSensorHooks.d.ts.map +1 -1
  883. package/dist/core/hooks/sensors/createSensorHooks.js.map +1 -1
  884. package/dist/core/hooks/sensors/sensors.d.ts.map +1 -1
  885. package/dist/core/hooks/sensors/sensors.js.map +1 -1
  886. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  887. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  888. package/dist/core/hooks/sites/sites.d.ts.map +1 -1
  889. package/dist/core/hooks/sites/sites.js.map +1 -1
  890. package/dist/core/hooks/ui/use-mobile.d.ts.map +1 -1
  891. package/dist/core/hooks/ui/use-mobile.js.map +1 -1
  892. package/dist/core/hooks/users/createUserHooks.d.ts.map +1 -1
  893. package/dist/core/hooks/users/createUserHooks.js.map +1 -1
  894. package/dist/core/hooks/users/users.d.ts.map +1 -1
  895. package/dist/core/hooks/users/users.js.map +1 -1
  896. package/dist/core/index.d.ts.map +1 -1
  897. package/dist/core/index.js.map +1 -1
  898. package/dist/core/plugins/host/context.d.ts.map +1 -1
  899. package/dist/core/plugins/host/context.js.map +1 -1
  900. package/dist/core/plugins/host/errors.d.ts.map +1 -1
  901. package/dist/core/plugins/host/errors.js.map +1 -1
  902. package/dist/core/plugins/host/host.d.ts.map +1 -1
  903. package/dist/core/plugins/host/host.js.map +1 -1
  904. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  905. package/dist/core/plugins/host/provider.js.map +1 -1
  906. package/dist/core/plugins/host/registry.d.ts.map +1 -1
  907. package/dist/core/plugins/host/registry.js.map +1 -1
  908. package/dist/core/plugins/installed.d.ts.map +1 -1
  909. package/dist/core/plugins/installed.js.map +1 -1
  910. package/dist/core/plugins/sdk/components.d.ts.map +1 -1
  911. package/dist/core/plugins/sdk/components.js.map +1 -1
  912. package/dist/core/plugins/sdk/index.d.ts.map +1 -1
  913. package/dist/core/plugins/sdk/index.js.map +1 -1
  914. package/dist/core/plugins/sdk/types.d.ts.map +1 -1
  915. package/dist/core/plugins/sdk/types.js.map +1 -1
  916. package/dist/core/store/ActionMap.d.ts.map +1 -1
  917. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  918. package/dist/core/store/AppConfig/context.js.map +1 -1
  919. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  920. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  921. package/dist/core/store/BIM/context.d.ts.map +1 -1
  922. package/dist/core/store/BIM/context.js.map +1 -1
  923. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  924. package/dist/core/store/BIM/reducer.js.map +1 -1
  925. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  926. package/dist/core/store/Buildings/context.js.map +1 -1
  927. package/dist/core/store/Buildings/reducer.d.ts.map +1 -1
  928. package/dist/core/store/Buildings/reducer.js.map +1 -1
  929. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  930. package/dist/core/store/CombineProviders.js.map +1 -1
  931. package/dist/core/store/Content/context.d.ts.map +1 -1
  932. package/dist/core/store/Content/context.js.map +1 -1
  933. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  934. package/dist/core/store/Datasets/context.js.map +1 -1
  935. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  936. package/dist/core/store/Datasets/reducer.js.map +1 -1
  937. package/dist/core/store/Files/context.d.ts.map +1 -1
  938. package/dist/core/store/Files/context.js.map +1 -1
  939. package/dist/core/store/Files/reducer.d.ts.map +1 -1
  940. package/dist/core/store/Files/reducer.js.map +1 -1
  941. package/dist/core/store/Map/context.d.ts.map +1 -1
  942. package/dist/core/store/Map/context.js.map +1 -1
  943. package/dist/core/store/Map/reducer.d.ts.map +1 -1
  944. package/dist/core/store/Map/reducer.js.map +1 -1
  945. package/dist/core/store/Menus/context.d.ts.map +1 -1
  946. package/dist/core/store/Menus/context.js.map +1 -1
  947. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  948. package/dist/core/store/Menus/reducer.js.map +1 -1
  949. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  950. package/dist/core/store/Permissions/context.js.map +1 -1
  951. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  952. package/dist/core/store/PointCloud/context.js.map +1 -1
  953. package/dist/core/store/PointCloud/reducer.d.ts.map +1 -1
  954. package/dist/core/store/PointCloud/reducer.js.map +1 -1
  955. package/dist/core/store/Tools/context.d.ts.map +1 -1
  956. package/dist/core/store/Tools/context.js.map +1 -1
  957. package/dist/core/store/Tools/reducer.d.ts.map +1 -1
  958. package/dist/core/store/Tools/reducer.js.map +1 -1
  959. package/dist/core/store/index.d.ts.map +1 -1
  960. package/dist/core/store/index.js.map +1 -1
  961. package/dist/core/styles/tailwindMerge.d.ts.map +1 -1
  962. package/dist/core/styles/tailwindMerge.js.map +1 -1
  963. package/dist/core/types/bim.d.ts.map +1 -1
  964. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  965. package/dist/core/types/dbTypes.d.ts.map +1 -1
  966. package/dist/core/types/dbTypes.js.map +1 -1
  967. package/dist/core/types/files.d.ts.map +1 -1
  968. package/dist/core/types/global.d.ts.map +1 -1
  969. package/dist/core/types/global.js.map +1 -1
  970. package/dist/core/types/index.d.ts.map +1 -1
  971. package/dist/core/types/index.js.map +1 -1
  972. package/dist/core/types/map.d.ts.map +1 -1
  973. package/dist/core/types/martinTypes.d.ts.map +1 -1
  974. package/dist/core/types/martinTypes.js.map +1 -1
  975. package/dist/core/types/next-auth.d.ts.map +1 -1
  976. package/dist/core/types/tools.d.ts.map +1 -1
  977. package/dist/core/types/users.d.ts.map +1 -1
  978. package/dist/core/utils/acceptedFiles.d.ts.map +1 -1
  979. package/dist/core/utils/acceptedFiles.js.map +1 -1
  980. package/dist/core/utils/errorHandler.d.ts.map +1 -1
  981. package/dist/core/utils/errorHandler.js.map +1 -1
  982. package/dist/core/utils/getFileIcon.d.ts.map +1 -1
  983. package/dist/core/utils/getFileIcon.js.map +1 -1
  984. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  985. package/dist/core/utils/imageUtils.js.map +1 -1
  986. package/dist/core/utils/index.d.ts.map +1 -1
  987. package/dist/core/utils/index.js.map +1 -1
  988. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  989. package/dist/core/utils/markerUtils.js.map +1 -1
  990. package/dist/core/utils/memcache.d.ts.map +1 -1
  991. package/dist/core/utils/memcache.js.map +1 -1
  992. package/dist/core/utils/roles.d.ts.map +1 -1
  993. package/dist/core/utils/roles.js.map +1 -1
  994. package/dist/core/utils/timeUtils.d.ts.map +1 -1
  995. package/dist/core/utils/timeUtils.js.map +1 -1
  996. package/dist/core/utils/utils.d.ts.map +1 -1
  997. package/dist/core/utils/utils.js.map +1 -1
  998. package/dist/index.d.ts.map +1 -1
  999. package/dist/index.js.map +1 -1
  1000. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/Data/utils/useViewerData.ts"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport type { Building, Infrastructure, Site, User, DbFile } from '../../../../types/dbTypes'\r\nimport { ViewerNames } from '../../../../types/dbTypes'\r\nimport type { FileRow } from '../../../../types/files'\r\nimport type { FilterState } from '../../../../types/global'\r\nimport { filterHelper, getNarrowedFilterOptions, getUniqueColumnValues } from './filterHelper'\r\nimport { formatPosition } from './positionParser'\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface UseViewerDataParams {\r\n currentViewer: ViewerNames\r\n buildings: Building[] | undefined\r\n sites: Site[] | undefined\r\n infrastructures: Infrastructure[] | undefined\r\n files: {\r\n id: number | string\r\n name: string\r\n attachedFilesBuildingId?: number | null\r\n uploadedAt: string | Date\r\n extension?: string | null\r\n sizeBytes: number\r\n position?: unknown\r\n }[] | undefined\r\n users: Partial<User>[] | undefined\r\n /** Loading flags from each data hook */\r\n loadingFlags: {\r\n buildings: boolean\r\n sites: boolean\r\n infrastructures: boolean\r\n files: boolean\r\n users: boolean\r\n }\r\n searchTerm: string\r\n activeFilters: FilterState[]\r\n /** Raw filter state (used by getNarrowedFilterOptions) */\r\n filters: FilterState[]\r\n /** Current user email */\r\n userEmail: string\r\n}\r\n\r\ninterface UseViewerDataResult {\r\n data: Building[] | Site[] | Infrastructure[] | FileRow[] | Partial<User>[]\r\n filteredData: Building[] | Site[] | Infrastructure[] | FileRow[] | Partial<User>[]\r\n filtersOptions: ReturnType<typeof getNarrowedFilterOptions>\r\n isLoading: boolean\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Search helpers\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction matchesSearch(value: unknown, term: string): boolean {\r\n return String(value).toLowerCase().includes(term.toLowerCase())\r\n}\r\n\r\nfunction searchFields(fields: unknown[], term: string): boolean {\r\n return fields.some(v => matchesSearch(v, term))\r\n}\r\n\r\nfunction searchAllValues(obj: object, term: string): boolean {\r\n return Object.values(obj).some(v => matchesSearch(v, term))\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Hook\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function useViewerData({\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n files,\r\n users,\r\n loadingFlags,\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n userEmail,\r\n}: UseViewerDataParams): UseViewerDataResult {\r\n\r\n // Memoize the mapped FileRow array independently so the files case below\r\n // doesn't re-derive it on every render unrelated to files data changing.\r\n const mappedFiles: FileRow[] = useMemo(() => {\r\n if (!files) return []\r\n return files.map(file => ({\r\n id: String(file.id),\r\n name: file.name,\r\n attachedTo: [\r\n { type: 'building' as const, buildingId: String(file.attachedFilesBuildingId || '') },\r\n ],\r\n dateUploaded: file.uploadedAt,\r\n uploadedBy: userEmail || 'Unknown',\r\n fileType: file.extension?.toUpperCase() || '',\r\n fileSize: `${(file.sizeBytes / (1024 * 1024)).toFixed(3)} MB`,\r\n position: formatPosition(file.position as string),\r\n metadata: file as unknown as DbFile,\r\n }))\r\n }, [files, userEmail])\r\n\r\n return useMemo((): UseViewerDataResult => {\r\n switch (currentViewer) {\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.buildings: {\r\n const data = buildings || []\r\n const searched = data.filter(b =>\r\n searchFields([\r\n b.buildingName,\r\n b.buildingCountrySubdivision,\r\n b.buildingMunicipality,\r\n b.buildingType,\r\n b.buildingAddress,\r\n ], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.buildings,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.sites: {\r\n const data = sites || []\r\n const searched = data.filter(s => searchAllValues(s, searchTerm))\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.sites,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.infrastructure: {\r\n const data = infrastructures || []\r\n const searched = data.filter((infra: Infrastructure) =>\r\n searchFields([\r\n infra.infrastructureName,\r\n infra.infrastructureType,\r\n infra.infrastructureCountrySubdivision,\r\n infra.infrastructureMunicipality,\r\n ], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.infrastructures,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.files: {\r\n const data = mappedFiles.filter(file => file.metadata.tag?.toLowerCase() !== 'user')\r\n const searched = data.filter(f => searchAllValues(f, searchTerm))\r\n const filteredData = filterHelper(searched, activeFilters)\r\n\r\n const baseFilterOptions = [\r\n {\r\n id: 'name',\r\n label: 'Name',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'name'),\r\n },\r\n {\r\n id: 'dateUploaded',\r\n label: 'Date Uploaded',\r\n type: 'date',\r\n valueOptions: getUniqueColumnValues(data, 'dateUploaded'),\r\n },\r\n {\r\n id: 'fileType',\r\n label: 'File Type',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'fileType'),\r\n },\r\n {\r\n id: 'fileSize',\r\n label: 'File Size',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'fileSize'),\r\n },\r\n {\r\n id: 'uploadedBy',\r\n label: 'Uploaded By',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'uploadedBy'),\r\n },\r\n ]\r\n\r\n const filtersOptions = getNarrowedFilterOptions(data, baseFilterOptions, filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.files,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.users: {\r\n const data = users || []\r\n const searched = data.filter(u =>\r\n searchFields([u.name, u.email, u.organizationId], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.users,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n default:\r\n return {\r\n data: [],\r\n filteredData: [],\r\n filtersOptions: [],\r\n isLoading: false,\r\n }\r\n }\r\n }, [\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n mappedFiles,\r\n users,\r\n loadingFlags,\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n ])\r\n}"],"mappings":"AAAA,SAAS,eAAe;AAGxB,SAAS,mBAAmB;AAG5B,SAAS,cAAc,0BAA0B,6BAA6B;AAC9E,SAAS,sBAAsB;AAgD/B,SAAS,cAAc,OAAgB,MAAuB;AAC5D,SAAO,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,KAAK,YAAY,CAAC;AAChE;AAEA,SAAS,aAAa,QAAmB,MAAuB;AAC9D,SAAO,OAAO,KAAK,OAAK,cAAc,GAAG,IAAI,CAAC;AAChD;AAEA,SAAS,gBAAgB,KAAa,MAAuB;AAC3D,SAAO,OAAO,OAAO,GAAG,EAAE,KAAK,OAAK,cAAc,GAAG,IAAI,CAAC;AAC5D;AAMO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAI3C,QAAM,cAAyB,QAAQ,MAAM;AAC3C,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,WAAO,MAAM,IAAI,UAAK;AAzF1B;AAyF8B;AAAA,QACxB,IAAI,OAAO,KAAK,EAAE;AAAA,QAClB,MAAM,KAAK;AAAA,QACX,YAAY;AAAA,UACV,EAAE,MAAM,YAAqB,YAAY,OAAO,KAAK,2BAA2B,EAAE,EAAE;AAAA,QACtF;AAAA,QACA,cAAc,KAAK;AAAA,QACnB,YAAY,aAAa;AAAA,QACzB,YAAU,UAAK,cAAL,mBAAgB,kBAAiB;AAAA,QAC3C,UAAU,IAAI,KAAK,aAAa,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,QACxD,UAAU,eAAe,KAAK,QAAkB;AAAA,QAChD,UAAU;AAAA,MACZ;AAAA,KAAE;AAAA,EACJ,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,SAAO,QAAQ,MAA2B;AACxC,YAAQ,eAAe;AAAA;AAAA,MAErB,KAAK,YAAY,WAAW;AAC1B,cAAM,OAAO,aAAa,CAAC;AAC3B,cAAM,WAAW,KAAK;AAAA,UAAO,OAC3B,aAAa;AAAA,YACX,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE;AAAA,UACJ,GAAG,UAAU;AAAA,QACf;AACA,cAAM,eAAe,aAAa,UAAU,aAAa;AACzD,cAAM,iBAAiB,yBAAyB,MAAM,CAAC,GAAG,OAAO;AAEjE,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,YAAY,OAAO;AACtB,cAAM,OAAO,SAAS,CAAC;AACvB,cAAM,WAAW,KAAK,OAAO,OAAK,gBAAgB,GAAG,UAAU,CAAC;AAChE,cAAM,eAAe,aAAa,UAAU,aAAa;AACzD,cAAM,iBAAiB,yBAAyB,MAAM,CAAC,GAAG,OAAO;AAEjE,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,YAAY,gBAAgB;AAC/B,cAAM,OAAO,mBAAmB,CAAC;AACjC,cAAM,WAAW,KAAK;AAAA,UAAO,CAAC,UAC5B,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UACR,GAAG,UAAU;AAAA,QACf;AACA,cAAM,eAAe,aAAa,UAAU,aAAa;AACzD,cAAM,iBAAiB,yBAAyB,MAAM,CAAC,GAAG,OAAO;AAEjE,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,YAAY,OAAO;AACtB,cAAM,OAAO,YAAY,OAAO,UAAK;AAxK7C;AAwKgD,6BAAK,SAAS,QAAd,mBAAmB,mBAAkB;AAAA,SAAM;AACnF,cAAM,WAAW,KAAK,OAAO,OAAK,gBAAgB,GAAG,UAAU,CAAC;AAChE,cAAM,eAAe,aAAa,UAAU,aAAa;AAEzD,cAAM,oBAAoB;AAAA,UACxB;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,cAAc,sBAAsB,MAAM,MAAM;AAAA,UAClD;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,cAAc,sBAAsB,MAAM,cAAc;AAAA,UAC1D;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,cAAc,sBAAsB,MAAM,UAAU;AAAA,UACtD;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,cAAc,sBAAsB,MAAM,UAAU;AAAA,UACtD;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,cAAc,sBAAsB,MAAM,YAAY;AAAA,UACxD;AAAA,QACF;AAEA,cAAM,iBAAiB,yBAAyB,MAAM,mBAAmB,OAAO;AAEhF,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,YAAY,OAAO;AACtB,cAAM,OAAO,SAAS,CAAC;AACvB,cAAM,WAAW,KAAK;AAAA,UAAO,OAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,UAAU;AAAA,QAC9D;AACA,cAAM,eAAe,aAAa,UAAU,aAAa;AACzD,cAAM,iBAAiB,yBAAyB,MAAM,CAAC,GAAG,OAAO;AAEjE,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,aAAa;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA,MAGA;AACE,eAAO;AAAA,UACL,MAAM,CAAC;AAAA,UACP,cAAc,CAAC;AAAA,UACf,gBAAgB,CAAC;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,IACJ;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/Data/utils/useViewerData.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { useMemo } from 'react'\r\n\r\nimport type { Building, Infrastructure, Site, User, DbFile } from '../../../../types/dbTypes'\r\nimport { ViewerNames } from '../../../../types/dbTypes'\r\nimport type { FileRow } from '../../../../types/files'\r\nimport type { FilterState } from '../../../../types/global'\r\nimport { filterHelper, getNarrowedFilterOptions, getUniqueColumnValues } from './filterHelper'\r\nimport { formatPosition } from './positionParser'\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface UseViewerDataParams {\r\n currentViewer: ViewerNames\r\n buildings: Building[] | undefined\r\n sites: Site[] | undefined\r\n infrastructures: Infrastructure[] | undefined\r\n files: {\r\n id: number | string\r\n name: string\r\n attachedFilesBuildingId?: number | null\r\n uploadedAt: string | Date\r\n extension?: string | null\r\n sizeBytes: number\r\n position?: unknown\r\n }[] | undefined\r\n users: Partial<User>[] | undefined\r\n /** Loading flags from each data hook */\r\n loadingFlags: {\r\n buildings: boolean\r\n sites: boolean\r\n infrastructures: boolean\r\n files: boolean\r\n users: boolean\r\n }\r\n searchTerm: string\r\n activeFilters: FilterState[]\r\n /** Raw filter state (used by getNarrowedFilterOptions) */\r\n filters: FilterState[]\r\n /** Current user email */\r\n userEmail: string\r\n}\r\n\r\ninterface UseViewerDataResult {\r\n data: Building[] | Site[] | Infrastructure[] | FileRow[] | Partial<User>[]\r\n filteredData: Building[] | Site[] | Infrastructure[] | FileRow[] | Partial<User>[]\r\n filtersOptions: ReturnType<typeof getNarrowedFilterOptions>\r\n isLoading: boolean\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Search helpers\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction matchesSearch(value: unknown, term: string): boolean {\r\n return String(value).toLowerCase().includes(term.toLowerCase())\r\n}\r\n\r\nfunction searchFields(fields: unknown[], term: string): boolean {\r\n return fields.some(v => matchesSearch(v, term))\r\n}\r\n\r\nfunction searchAllValues(obj: object, term: string): boolean {\r\n return Object.values(obj).some(v => matchesSearch(v, term))\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Hook\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function useViewerData({\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n files,\r\n users,\r\n loadingFlags,\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n userEmail,\r\n}: UseViewerDataParams): UseViewerDataResult {\r\n\r\n // Memoize the mapped FileRow array independently so the files case below\r\n // doesn't re-derive it on every render unrelated to files data changing.\r\n const mappedFiles: FileRow[] = useMemo(() => {\r\n if (!files) return []\r\n return files.map(file => ({\r\n id: String(file.id),\r\n name: file.name,\r\n attachedTo: [\r\n { type: 'building' as const, buildingId: String(file.attachedFilesBuildingId || '') },\r\n ],\r\n dateUploaded: file.uploadedAt,\r\n uploadedBy: userEmail || 'Unknown',\r\n fileType: file.extension?.toUpperCase() || '',\r\n fileSize: `${(file.sizeBytes / (1024 * 1024)).toFixed(3)} MB`,\r\n position: formatPosition(file.position as string),\r\n metadata: file as unknown as DbFile,\r\n }))\r\n }, [files, userEmail])\r\n\r\n return useMemo((): UseViewerDataResult => {\r\n switch (currentViewer) {\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.buildings: {\r\n const data = buildings || []\r\n const searched = data.filter(b =>\r\n searchFields([\r\n b.buildingName,\r\n b.buildingCountrySubdivision,\r\n b.buildingMunicipality,\r\n b.buildingType,\r\n b.buildingAddress,\r\n ], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.buildings,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.sites: {\r\n const data = sites || []\r\n const searched = data.filter(s => searchAllValues(s, searchTerm))\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.sites,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.infrastructure: {\r\n const data = infrastructures || []\r\n const searched = data.filter((infra: Infrastructure) =>\r\n searchFields([\r\n infra.infrastructureName,\r\n infra.infrastructureType,\r\n infra.infrastructureCountrySubdivision,\r\n infra.infrastructureMunicipality,\r\n ], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.infrastructures,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.files: {\r\n const data = mappedFiles.filter(file => file.metadata.tag?.toLowerCase() !== 'user')\r\n const searched = data.filter(f => searchAllValues(f, searchTerm))\r\n const filteredData = filterHelper(searched, activeFilters)\r\n\r\n const baseFilterOptions = [\r\n {\r\n id: 'name',\r\n label: 'Name',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'name'),\r\n },\r\n {\r\n id: 'dateUploaded',\r\n label: 'Date Uploaded',\r\n type: 'date',\r\n valueOptions: getUniqueColumnValues(data, 'dateUploaded'),\r\n },\r\n {\r\n id: 'fileType',\r\n label: 'File Type',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'fileType'),\r\n },\r\n {\r\n id: 'fileSize',\r\n label: 'File Size',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'fileSize'),\r\n },\r\n {\r\n id: 'uploadedBy',\r\n label: 'Uploaded By',\r\n type: 'string',\r\n valueOptions: getUniqueColumnValues(data, 'uploadedBy'),\r\n },\r\n ]\r\n\r\n const filtersOptions = getNarrowedFilterOptions(data, baseFilterOptions, filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.files,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n case ViewerNames.users: {\r\n const data = users || []\r\n const searched = data.filter(u =>\r\n searchFields([u.name, u.email, u.organizationId], searchTerm),\r\n )\r\n const filteredData = filterHelper(searched, activeFilters)\r\n const filtersOptions = getNarrowedFilterOptions(data, [], filters)\r\n\r\n return {\r\n data,\r\n filteredData,\r\n filtersOptions,\r\n isLoading: loadingFlags.users,\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n default:\r\n return {\r\n data: [],\r\n filteredData: [],\r\n filtersOptions: [],\r\n isLoading: false,\r\n }\r\n }\r\n }, [\r\n currentViewer,\r\n buildings,\r\n sites,\r\n infrastructures,\r\n mappedFiles,\r\n users,\r\n loadingFlags,\r\n searchTerm,\r\n activeFilters,\r\n filters,\r\n ])\r\n}"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewerConfig.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/utils/viewerConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CA+BpE,CAAA"}
1
+ {"version":3,"file":"viewerConfig.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/utils/viewerConfig.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CA+BpE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/Data/utils/viewerConfig.ts"],"sourcesContent":["import {\r\n Building2,\r\n BoxSelect,\r\n TrainTrack,\r\n GalleryVerticalEnd,\r\n Blocks,\r\n Users,\r\n type LucideIcon,\r\n} from 'lucide-react'\r\n\r\nimport { ViewerNames } from '../../../../types/dbTypes'\r\nimport { DataTypes } from '../../../../types/global'\r\n\r\nexport interface ViewerConfig {\r\n /** Key into the 'DataMenu' translation namespace, e.g. t(cfg.titleKey) */\r\n titleKey: string\r\n icon: LucideIcon\r\n /** Corresponding DataTypes value, undefined for viewers with no data type (map, bim, etc.) */\r\n dataType?: DataTypes\r\n}\r\n\r\n/**\r\n * Static config for every viewer that DataMenu renders.\r\n * - titleKey → key inside the \"DataMenu\" i18n namespace\r\n * - icon → Lucide icon component (pass size/className at the call site)\r\n * - dataType → DataTypes enum value used by MoreOptions, permissions, etc.\r\n */\r\nexport const VIEWER_CONFIG: Partial<Record<ViewerNames, ViewerConfig>> = {\r\n [ViewerNames.buildings]: {\r\n titleKey: 'buildingHeader',\r\n icon: Building2,\r\n dataType: DataTypes.building,\r\n },\r\n [ViewerNames.sites]: {\r\n titleKey: 'siteHeader',\r\n icon: BoxSelect,\r\n dataType: DataTypes.site,\r\n },\r\n [ViewerNames.infrastructure]: {\r\n titleKey: 'infrastructureHeader',\r\n icon: TrainTrack,\r\n dataType: DataTypes.infrastructure,\r\n },\r\n [ViewerNames.files]: {\r\n titleKey: 'fileHeader',\r\n icon: GalleryVerticalEnd,\r\n dataType: DataTypes.file,\r\n },\r\n [ViewerNames.extensions]: {\r\n titleKey: 'extensionsHeader',\r\n icon: Blocks,\r\n dataType: undefined,\r\n },\r\n [ViewerNames.users]: {\r\n titleKey: 'usersHeader',\r\n icon: Users,\r\n dataType: DataTypes.user,\r\n },\r\n}"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAgBnB,MAAM,gBAA4D;AAAA,EACvE,CAAC,YAAY,SAAS,GAAG;AAAA,IACvB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,cAAc,GAAG;AAAA,IAC5B,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,UAAU,GAAG;AAAA,IACxB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/Data/utils/viewerConfig.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport {\r\n Building2,\r\n BoxSelect,\r\n TrainTrack,\r\n GalleryVerticalEnd,\r\n Blocks,\r\n Users,\r\n type LucideIcon,\r\n} from 'lucide-react'\r\n\r\nimport { ViewerNames } from '../../../../types/dbTypes'\r\nimport { DataTypes } from '../../../../types/global'\r\n\r\nexport interface ViewerConfig {\r\n /** Key into the 'DataMenu' translation namespace, e.g. t(cfg.titleKey) */\r\n titleKey: string\r\n icon: LucideIcon\r\n /** Corresponding DataTypes value, undefined for viewers with no data type (map, bim, etc.) */\r\n dataType?: DataTypes\r\n}\r\n\r\n/**\r\n * Static config for every viewer that DataMenu renders.\r\n * - titleKey → key inside the \"DataMenu\" i18n namespace\r\n * - icon → Lucide icon component (pass size/className at the call site)\r\n * - dataType → DataTypes enum value used by MoreOptions, permissions, etc.\r\n */\r\nexport const VIEWER_CONFIG: Partial<Record<ViewerNames, ViewerConfig>> = {\r\n [ViewerNames.buildings]: {\r\n titleKey: 'buildingHeader',\r\n icon: Building2,\r\n dataType: DataTypes.building,\r\n },\r\n [ViewerNames.sites]: {\r\n titleKey: 'siteHeader',\r\n icon: BoxSelect,\r\n dataType: DataTypes.site,\r\n },\r\n [ViewerNames.infrastructure]: {\r\n titleKey: 'infrastructureHeader',\r\n icon: TrainTrack,\r\n dataType: DataTypes.infrastructure,\r\n },\r\n [ViewerNames.files]: {\r\n titleKey: 'fileHeader',\r\n icon: GalleryVerticalEnd,\r\n dataType: DataTypes.file,\r\n },\r\n [ViewerNames.extensions]: {\r\n titleKey: 'extensionsHeader',\r\n icon: Blocks,\r\n dataType: undefined,\r\n },\r\n [ViewerNames.users]: {\r\n titleKey: 'usersHeader',\r\n icon: Users,\r\n dataType: DataTypes.user,\r\n },\r\n}"],"mappings":"AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAgBnB,MAAM,gBAA4D;AAAA,EACvE,CAAC,YAAY,SAAS,GAAG;AAAA,IACvB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,cAAc,GAAG;AAAA,IAC5B,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AAAA,EACA,CAAC,YAAY,UAAU,GAAG;AAAA,IACxB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,CAAC,YAAY,KAAK,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU,UAAU;AAAA,EACtB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Viewer.d.ts","sourceRoot":"","sources":["../../../../src/core/components/viewers/Viewer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAsClD,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,wBAAgB,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,WAAW,qBAyHnD"}
1
+ {"version":3,"file":"Viewer.d.ts","sourceRoot":"","sources":["../../../../src/core/components/viewers/Viewer.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAsClD,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,wBAAgB,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,WAAW,qBAyHnD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/viewers/Viewer.tsx"],"sourcesContent":["'use client'\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { Loader2 } from 'lucide-react'\r\nimport { useSearchParams, useRouter, usePathname } from 'next/navigation'\r\nimport { ViewerNames } from '../../types'\r\nimport { BuildingsContext, MenusContext } from '../../store'\r\nimport { MapViewer } from './map/MapViewer'\r\n// Deep file import (not the ui barrel): the barrel re-exports heavy modules\r\n// (InfoSidebar, useFileUploadHandler, …) that would land in the eager map-route bundle.\r\nimport { SidebarTrigger } from '../ui/Sidebar'\r\nimport { UserSettings } from '../settings'\r\nimport { Toolbar } from '../Toolbar'\r\nimport { switchLanguage } from '../../utils/utils'\r\nimport { Organization } from '../../types/dbTypes'\r\n\r\n// Code-split the heavy viewers: BimViewer pulls in ~456 KB gzipped of\r\n// @thatopen/*, PointCloudViewer the Potree loader stack — loaded only when\r\n// selected, so map-only sessions never pay their cost. MapViewer stays static\r\n// because every user lands on it.\r\nconst BimViewer = dynamic(\r\n () => import('./bim/BimViewer').then(m => ({ default: m.BimViewer })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading BIM viewer…\" /> },\r\n)\r\nconst PointCloudViewer = dynamic(\r\n () => import('./pointcloud/PointCloudViewer').then(m => ({ default: m.PointCloudViewer })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading point cloud viewer…\" /> },\r\n)\r\n\r\n// DataMenu transitively imports BimViewer (via FilePreview), so keep it lazy\r\n// too — a static import would pull @thatopen + three/webgpu back into the eager\r\n// bundle. Only rendered for the data viewers, so map-only sessions skip it.\r\nconst DataMenu = dynamic(\r\n () => import('./Data/DataMenu').then(m => ({ default: m.DataMenu })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading data…\" /> },\r\n)\r\n\r\n// Styled to match the in-viewer loading card (see BimLoadingState): a soft\r\n// backdrop-blurred overlay with a bordered card, spinner + label. Uses only\r\n// Tailwind tokens + one lucide icon, so it adds no meaningful weight to the\r\n// eager map-route bundle (Viewer.tsx is statically imported).\r\nfunction ViewerLoadingFallback({ label }: { label: string }) {\r\n return (\r\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/50 backdrop-blur-[1px]\">\r\n <div className=\"flex items-center gap-3 rounded-md border border-border bg-card px-5 py-4 shadow-sm\">\r\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\r\n <span className=\"text-foreground text-base font-medium font-['Inter'] leading-7\">{label}</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\ninterface ViewerProps {\r\n organization: Organization\r\n}\r\n\r\nexport function Viewer({ organization }: ViewerProps) {\r\n\r\n const searchParams = useSearchParams()\r\n const viewer = (searchParams.get('viewer') as ViewerNames) || ViewerNames.map\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n // const { dispatch: appConfigDispatch } = React.useContext(AppConfigContext)\r\n const { building } = buildingState.buildings\r\n const { currentViewer } = menusState.menus\r\n const router = useRouter()\r\n const pathname = usePathname()\r\n const [isMounted, setIsMounted] = React.useState(false)\r\n\r\n // Use a ref to track if we're currently updating -> prevent circular updates\r\n const isUpdatingRef = React.useRef(false)\r\n\r\n const { appContent } = organization\r\n\r\n // Check if viewer is valid based on appContent\r\n const isViewerValid = appContent.length === 0 || appContent.includes(viewer)\r\n \r\n // Use default viewer (map) if current viewer is not valid\r\n const validViewer = isViewerValid ? viewer : ViewerNames.map\r\n\r\n // Update URL if viewer was not available for the organization\r\n React.useEffect(() => {\r\n if (isMounted && !isViewerValid && viewer !== ViewerNames.map) {\r\n const newSearchParams = new URLSearchParams(searchParams.toString())\r\n newSearchParams.delete('viewer')\r\n if (building?.id) {\r\n newSearchParams.set('buildingId', String(building.id))\r\n }\r\n router.replace(`${pathname}?${newSearchParams.toString()}`, { scroll: false })\r\n }\r\n }, [isMounted, isViewerValid, viewer, searchParams, pathname, router, building?.id])\r\n\r\n // On first mount, respond to URL\r\n React.useEffect(() => {\r\n if (!isMounted) {\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: validViewer },\r\n })\r\n setIsMounted(true)\r\n }\r\n }, [isMounted, validViewer, menusDispatch])\r\n\r\n React.useEffect(() => {\r\n if (!organization) return\r\n const defaultLanguage = organization.languages?.[0] || 'En'\r\n if (defaultLanguage) switchLanguage(defaultLanguage)\r\n }, [organization])\r\n\r\n // Handle context changes (from sidebar, HeaderButtons, etc.)\r\n React.useEffect(() => {\r\n if (!isMounted || !currentViewer || currentViewer === validViewer || isUpdatingRef.current) {\r\n return\r\n }\r\n\r\n isUpdatingRef.current = true\r\n\r\n // Create URLSearchParams to preserve existing search params\r\n\r\n const newSearchParams = new URLSearchParams(searchParams.toString())\r\n newSearchParams.set('viewer', currentViewer)\r\n if (building?.id) {\r\n newSearchParams.set('buildingId', String(building.id))\r\n }\r\n\r\n\r\n router.replace(`${pathname}?${newSearchParams.toString()}`, { scroll: false })\r\n\r\n // Reset the flag after a brief delay to allow the navigation to complete\r\n setTimeout(() => {\r\n isUpdatingRef.current = false\r\n }, 100)\r\n }, [currentViewer, isMounted, pathname, router, viewer, searchParams])\r\n\r\n // Handle URL changes (direct navigation)\r\n React.useEffect(() => {\r\n if (isMounted && currentViewer !== validViewer && !isUpdatingRef.current) {\r\n isUpdatingRef.current = true\r\n\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: validViewer },\r\n })\r\n\r\n // Reset the flag after a brief delay\r\n setTimeout(() => {\r\n isUpdatingRef.current = false\r\n }, 100)\r\n }\r\n }, [validViewer, menusDispatch, isMounted, currentViewer])\r\n\r\n const selectedViewer = (\r\n <>\r\n {[ViewerNames.map, ViewerNames.bim, ViewerNames.pointcloud].includes(validViewer) && <SidebarTrigger />}\r\n <div style={{ height: '100%', width: '100%', position: 'relative' }}>\r\n <div style={{ display: validViewer === ViewerNames.map ? 'block' : 'none', width: '100%', height: '100%' }}>\r\n <MapViewer organization={organization} />\r\n </div>\r\n {validViewer === ViewerNames.bim && <BimViewer />}\r\n {validViewer === ViewerNames.pointcloud && <PointCloudViewer />}\r\n {[ViewerNames.buildings, ViewerNames.sites, ViewerNames.files, ViewerNames.land, ViewerNames.infrastructure, ViewerNames.extensions, ViewerNames.users].includes(validViewer) && (\r\n <DataMenu currentViewer={validViewer} />\r\n )}\r\n {[ViewerNames.settings].includes(validViewer) && (\r\n <UserSettings />\r\n )}\r\n </div>\r\n </>\r\n )\r\n\r\n return (\r\n <>\r\n {selectedViewer}\r\n <Toolbar viewer={validViewer} />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/viewers/Viewer.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { Loader2 } from 'lucide-react'\r\nimport { useSearchParams, useRouter, usePathname } from 'next/navigation'\r\nimport { ViewerNames } from '../../types'\r\nimport { BuildingsContext, MenusContext } from '../../store'\r\nimport { MapViewer } from './map/MapViewer'\r\n// Deep file import (not the ui barrel): the barrel re-exports heavy modules\r\n// (InfoSidebar, useFileUploadHandler, …) that would land in the eager map-route bundle.\r\nimport { SidebarTrigger } from '../ui/Sidebar'\r\nimport { UserSettings } from '../settings'\r\nimport { Toolbar } from '../Toolbar'\r\nimport { switchLanguage } from '../../utils/utils'\r\nimport { Organization } from '../../types/dbTypes'\r\n\r\n// Code-split the heavy viewers: BimViewer pulls in ~456 KB gzipped of\r\n// @thatopen/*, PointCloudViewer the Potree loader stack — loaded only when\r\n// selected, so map-only sessions never pay their cost. MapViewer stays static\r\n// because every user lands on it.\r\nconst BimViewer = dynamic(\r\n () => import('./bim/BimViewer').then(m => ({ default: m.BimViewer })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading BIM viewer…\" /> },\r\n)\r\nconst PointCloudViewer = dynamic(\r\n () => import('./pointcloud/PointCloudViewer').then(m => ({ default: m.PointCloudViewer })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading point cloud viewer…\" /> },\r\n)\r\n\r\n// DataMenu transitively imports BimViewer (via FilePreview), so keep it lazy\r\n// too — a static import would pull @thatopen + three/webgpu back into the eager\r\n// bundle. Only rendered for the data viewers, so map-only sessions skip it.\r\nconst DataMenu = dynamic(\r\n () => import('./Data/DataMenu').then(m => ({ default: m.DataMenu })),\r\n { ssr: false, loading: () => <ViewerLoadingFallback label=\"Loading data…\" /> },\r\n)\r\n\r\n// Styled to match the in-viewer loading card (see BimLoadingState): a soft\r\n// backdrop-blurred overlay with a bordered card, spinner + label. Uses only\r\n// Tailwind tokens + one lucide icon, so it adds no meaningful weight to the\r\n// eager map-route bundle (Viewer.tsx is statically imported).\r\nfunction ViewerLoadingFallback({ label }: { label: string }) {\r\n return (\r\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/50 backdrop-blur-[1px]\">\r\n <div className=\"flex items-center gap-3 rounded-md border border-border bg-card px-5 py-4 shadow-sm\">\r\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\r\n <span className=\"text-foreground text-base font-medium font-['Inter'] leading-7\">{label}</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\ninterface ViewerProps {\r\n organization: Organization\r\n}\r\n\r\nexport function Viewer({ organization }: ViewerProps) {\r\n\r\n const searchParams = useSearchParams()\r\n const viewer = (searchParams.get('viewer') as ViewerNames) || ViewerNames.map\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n // const { dispatch: appConfigDispatch } = React.useContext(AppConfigContext)\r\n const { building } = buildingState.buildings\r\n const { currentViewer } = menusState.menus\r\n const router = useRouter()\r\n const pathname = usePathname()\r\n const [isMounted, setIsMounted] = React.useState(false)\r\n\r\n // Use a ref to track if we're currently updating -> prevent circular updates\r\n const isUpdatingRef = React.useRef(false)\r\n\r\n const { appContent } = organization\r\n\r\n // Check if viewer is valid based on appContent\r\n const isViewerValid = appContent.length === 0 || appContent.includes(viewer)\r\n \r\n // Use default viewer (map) if current viewer is not valid\r\n const validViewer = isViewerValid ? viewer : ViewerNames.map\r\n\r\n // Update URL if viewer was not available for the organization\r\n React.useEffect(() => {\r\n if (isMounted && !isViewerValid && viewer !== ViewerNames.map) {\r\n const newSearchParams = new URLSearchParams(searchParams.toString())\r\n newSearchParams.delete('viewer')\r\n if (building?.id) {\r\n newSearchParams.set('buildingId', String(building.id))\r\n }\r\n router.replace(`${pathname}?${newSearchParams.toString()}`, { scroll: false })\r\n }\r\n }, [isMounted, isViewerValid, viewer, searchParams, pathname, router, building?.id])\r\n\r\n // On first mount, respond to URL\r\n React.useEffect(() => {\r\n if (!isMounted) {\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: validViewer },\r\n })\r\n setIsMounted(true)\r\n }\r\n }, [isMounted, validViewer, menusDispatch])\r\n\r\n React.useEffect(() => {\r\n if (!organization) return\r\n const defaultLanguage = organization.languages?.[0] || 'En'\r\n if (defaultLanguage) switchLanguage(defaultLanguage)\r\n }, [organization])\r\n\r\n // Handle context changes (from sidebar, HeaderButtons, etc.)\r\n React.useEffect(() => {\r\n if (!isMounted || !currentViewer || currentViewer === validViewer || isUpdatingRef.current) {\r\n return\r\n }\r\n\r\n isUpdatingRef.current = true\r\n\r\n // Create URLSearchParams to preserve existing search params\r\n\r\n const newSearchParams = new URLSearchParams(searchParams.toString())\r\n newSearchParams.set('viewer', currentViewer)\r\n if (building?.id) {\r\n newSearchParams.set('buildingId', String(building.id))\r\n }\r\n\r\n\r\n router.replace(`${pathname}?${newSearchParams.toString()}`, { scroll: false })\r\n\r\n // Reset the flag after a brief delay to allow the navigation to complete\r\n setTimeout(() => {\r\n isUpdatingRef.current = false\r\n }, 100)\r\n }, [currentViewer, isMounted, pathname, router, viewer, searchParams])\r\n\r\n // Handle URL changes (direct navigation)\r\n React.useEffect(() => {\r\n if (isMounted && currentViewer !== validViewer && !isUpdatingRef.current) {\r\n isUpdatingRef.current = true\r\n\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: validViewer },\r\n })\r\n\r\n // Reset the flag after a brief delay\r\n setTimeout(() => {\r\n isUpdatingRef.current = false\r\n }, 100)\r\n }\r\n }, [validViewer, menusDispatch, isMounted, currentViewer])\r\n\r\n const selectedViewer = (\r\n <>\r\n {[ViewerNames.map, ViewerNames.bim, ViewerNames.pointcloud].includes(validViewer) && <SidebarTrigger />}\r\n <div style={{ height: '100%', width: '100%', position: 'relative' }}>\r\n <div style={{ display: validViewer === ViewerNames.map ? 'block' : 'none', width: '100%', height: '100%' }}>\r\n <MapViewer organization={organization} />\r\n </div>\r\n {validViewer === ViewerNames.bim && <BimViewer />}\r\n {validViewer === ViewerNames.pointcloud && <PointCloudViewer />}\r\n {[ViewerNames.buildings, ViewerNames.sites, ViewerNames.files, ViewerNames.land, ViewerNames.infrastructure, ViewerNames.extensions, ViewerNames.users].includes(validViewer) && (\r\n <DataMenu currentViewer={validViewer} />\r\n )}\r\n {[ViewerNames.settings].includes(validViewer) && (\r\n <UserSettings />\r\n )}\r\n </div>\r\n </>\r\n )\r\n\r\n return (\r\n <>\r\n {selectedViewer}\r\n <Toolbar viewer={validViewer} />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"BimToolbar.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/bim/BimToolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,wBAAgB,UAAU,sBAEzB"}
1
+ {"version":3,"file":"BimToolbar.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/bim/BimToolbar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,wBAAgB,UAAU,sBAEzB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/viewers/bim/BimToolbar.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { bimToolbarTools } from './src/tools/bimToolbar'\r\nimport { ToolbarBody } from '../../ToolbarBody'\r\n\r\nexport function BimToolbar() {\r\n return <ToolbarBody viewer=\"bim\" tools={bimToolbarTools()} />\r\n}\r\n"],"mappings":";AAOS;AAJT,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAErB,SAAS,aAAa;AAC3B,SAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,GAAG;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/viewers/bim/BimToolbar.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 { bimToolbarTools } from './src/tools/bimToolbar'\r\nimport { ToolbarBody } from '../../ToolbarBody'\r\n\r\nexport function BimToolbar() {\r\n return <ToolbarBody viewer=\"bim\" tools={bimToolbarTools()} />\r\n}\r\n"],"mappings":";AAUS;AAJT,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAErB,SAAS,aAAa;AAC3B,SAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,GAAG;AAC7D;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"BimViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/bim/BimViewer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,wBAAgB,SAAS,sBA2PxB"}
1
+ {"version":3,"file":"BimViewer.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/viewers/bim/BimViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,wBAAgB,SAAS,sBA2PxB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/viewers/bim/BimViewer.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport * as OBC from \"@thatopen/components\";\r\nimport * as OBF from \"@thatopen/components-front\"\r\nimport * as THREE from \"three\";\r\nimport { useTranslations, useLocale } from 'next-intl';\r\nimport { ToolsContext, BimContext, MenusContext } from \"../../../store\";\r\n\r\nimport { CurrentWorld } from \"./src/CurrentWorld\";\r\nimport { CurrentCamera } from './src/CurrentCamera';\r\nimport { Highlighter } from \"./src/Highlighter\";\r\nimport { FloorplanTool } from \"./src/FloorplanTool\";\r\nimport { ElevationsTool } from \"./src/ElevationsTool\";\r\nimport { ViewModeCoordinator } from \"./src/lib/ViewModeCoordinator\";\r\n\r\nimport { PropertiesMenu } from \"./src/propertiesMenu\";\r\nimport { BimLoadingState } from \"./src/BimLoadingState\";\r\nimport { ViewportGizmo } from \"./src/ViewportGizmo\";\r\nimport { useBimCoordinateSystem } from \"../useCoordinateSystem\";\r\n\r\nexport function BimViewer() {\r\n\r\n const t = useTranslations('ViewportGizmo');\r\n const locale = useLocale();\r\n\r\n const { dispatch: bimDispatch, state: bimState } = React.useContext(BimContext);\r\n const { bimComponents } = bimState.bim;\r\n\r\n const { dispatch: toolsDispatch, state: toolsState } = React.useContext(ToolsContext);\r\n const { currentToolId } = toolsState.tools;\r\n\r\n const { state: menusState } = React.useContext(MenusContext);\r\n const { currentViewer } = menusState.menus;\r\n \r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const workerUrlRef = React.useRef<string | null>(null);\r\n const resizeObserverRef = React.useRef<ResizeObserver | null>(null);\r\n // Tracks the Components instance THIS mount created, so cleanup disposes the\r\n // real one and the create-guard can't be defeated by a stale [] closure.\r\n const componentsRef = React.useRef<OBC.Components | null>(null);\r\n\r\n const createViewer = React.useCallback(\r\n async (isCancelled: () => boolean) => {\r\n // Re-entrancy guard keyed to the ref we actually set — NOT the stale\r\n // `bimComponents` from this useCallback's [] closure (always null on\r\n // first run, so it could never stop a second init). Without this,\r\n // React StrictMode (dev) and rapid viewer remounts (prod) build a\r\n // second Components + PostproductionRenderer — a second <canvas> —\r\n // and whichever instance wins the SET_COMPONENTS race may be the one\r\n // whose canvas was detached on remount. Models then load into a scene\r\n // that is never painted: the spatial tree builds (metadata) but no\r\n // geometry shows and floorplan nav drives the dead world's camera.\r\n if (!containerRef.current || componentsRef.current) return;\r\n\r\n const container = containerRef.current;\r\n const components = new OBC.Components();\r\n const worlds = components.get(OBC.Worlds);\r\n const world = worlds.create<\r\n OBC.ShadowedScene,\r\n OBC.OrthoPerspectiveCamera,\r\n OBF.PostproductionRenderer\r\n >();\r\n\r\n world.scene = new OBC.ShadowedScene(components);\r\n\r\n world.renderer = new OBF.PostproductionRenderer(components, container);\r\n world.camera = new OBC.OrthoPerspectiveCamera(components);\r\n\r\n components.init();\r\n\r\n world.scene.setup();\r\n world.scene.three.background = null;\r\n\r\n const grids = components.get(OBC.Grids);\r\n const grid = grids.create(world);\r\n\r\n if (grid) {\r\n bimDispatch({\r\n \"type\": \"SET_GRID\",\r\n \"payload\": { grid }\r\n });\r\n }\r\n\r\n const axesHelper = new THREE.AxesHelper(5);\r\n world.scene.three.add(axesHelper);\r\n\r\n const fragments = components.get(OBC.FragmentsManager);\r\n\r\n const githubUrl =\r\n \"https://thatopen.github.io/engine_fragment/resources/worker.mjs\";\r\n const fetchedUrl = await fetch(githubUrl);\r\n const workerBlob = await fetchedUrl.blob();\r\n const workerFile = new File([workerBlob], \"worker.mjs\", {\r\n type: \"text/javascript\",\r\n });\r\n const workerUrl = URL.createObjectURL(workerFile);\r\n workerUrlRef.current = workerUrl; // Store reference for cleanup\r\n fragments.init(workerUrl);\r\n\r\n world.camera.controls.addEventListener(\"control\", () =>\r\n fragments.core.update(),\r\n );\r\n\r\n world.camera.controls.restThreshold = 0.005;\r\n world.camera.controls.addEventListener(\"rest\", () =>\r\n fragments.core.update(true)\r\n );\r\n\r\n components.get(CurrentWorld).world = world;\r\n components.get(CurrentCamera).camera = world.camera;\r\n components.get(Highlighter);\r\n components.get(ViewModeCoordinator);\r\n components.get(FloorplanTool);\r\n components.get(ElevationsTool);\r\n\r\n // Grid injection is safe here — fragments.core is initialized.\r\n if (grid) {\r\n components.get(FloorplanTool).setGrid(grid);\r\n components.get(ElevationsTool).setGrid(grid);\r\n }\r\n\r\n // Enable shadows\r\n world.renderer.three.shadowMap.enabled = true;\r\n world.renderer.three.shadowMap.type = THREE.PCFSoftShadowMap;\r\n world.scene.setup({\r\n shadows: {\r\n cascade: 1,\r\n resolution: 1024,\r\n },\r\n });\r\n\r\n world.scene.distanceRenderer.excludedObjects.add(grid.three);\r\n\r\n await world.scene.updateShadows();\r\n\r\n world.camera.controls.addEventListener(\"rest\", async () => {\r\n await world.scene.updateShadows();\r\n });\r\n\r\n world.scene.three.background = null;\r\n\r\n // If this init was superseded (StrictMode re-run) or the viewer\r\n // unmounted while we awaited the worker fetch / shadow update, throw\r\n // this instance away instead of publishing it. Prevents an orphaned\r\n // world (whose canvas is detached) from winning the store and starving\r\n // the visible canvas of geometry.\r\n if (isCancelled()) {\r\n components.dispose();\r\n return;\r\n }\r\n componentsRef.current = components;\r\n bimDispatch({\r\n type: \"SET_COMPONENTS\",\r\n payload: { bimComponents: components, world, fragments }\r\n });\r\n\r\n // Ensure canvas takes full container size\r\n const canvas = container.querySelector('canvas');\r\n if (canvas) {\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n canvas.style.display = 'block';\r\n }\r\n\r\n // Handle resize using container dimensions\r\n const handleResize = () => {\r\n const width = container.clientWidth;\r\n const height = container.clientHeight;\r\n if (width && height) {\r\n world.renderer?.resize(new THREE.Vector2(width, height));\r\n }\r\n };\r\n \r\n // Initial resize\r\n handleResize();\r\n \r\n // Watch for container size changes using ResizeObserver. This\r\n // already covers the window-resize case: when the window resizes,\r\n // the flex layout reshapes this container, and ResizeObserver\r\n // fires.\r\n const resizeObserver = new ResizeObserver(() => {\r\n handleResize();\r\n });\r\n resizeObserver.observe(container);\r\n resizeObserverRef.current = resizeObserver;\r\n\r\n // The ResizeObserver above is sufficient for redraws. A window\r\n // 'resize' listener here previously leaked on every mount (no matching\r\n // removeEventListener), so it was removed.\r\n }, []\r\n );\r\n\r\n React.useEffect(() => {\r\n let cancelled = false;\r\n createViewer(() => cancelled);\r\n\r\n // Cleanup: mark this init cancelled (so an in-flight createViewer disposes\r\n // itself instead of publishing), and dispose the instance we actually\r\n // created (componentsRef). The old `if (bimComponents)` read the stale []\r\n // closure value (null at mount), so the real Components was never disposed\r\n // — leaking its renderer/canvas and letting orphans race the store.\r\n return () => {\r\n cancelled = true;\r\n if (resizeObserverRef.current) {\r\n resizeObserverRef.current.disconnect();\r\n }\r\n if (componentsRef.current) {\r\n componentsRef.current.dispose();\r\n componentsRef.current = null;\r\n }\r\n bimDispatch({\r\n type: \"DISPOSE-BIM\"\r\n });\r\n };\r\n }, []);\r\n\r\n // Enforce Y-up coordinate system for Three.js / camera-controls.\r\n // Runs whenever the world (and its controls) becomes available, and resets on unmount.\r\n useBimCoordinateSystem(bimState.bim.world?.camera?.controls ?? null);\r\n\r\n // Control ViewportGizmo based on current viewer\r\n React.useEffect(() => {\r\n if (!bimComponents) return;\r\n\r\n const viewportGizmo = bimComponents.get(ViewportGizmo);\r\n\r\n viewportGizmo.setLabels({\r\n top: t('top'),\r\n right: t('right'),\r\n bottom: t('bottom'),\r\n left: t('left'),\r\n front: t('front'),\r\n back: t('back')\r\n });\r\n\r\n if (!viewportGizmo) return;\r\n\r\n if (currentViewer === 'bim') {\r\n viewportGizmo.enabled = true;\r\n viewportGizmo.add();\r\n } else {\r\n viewportGizmo.enabled = false;\r\n viewportGizmo.remove();\r\n }\r\n }, [bimComponents, currentViewer, locale, t]);\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"hidden\"\r\n }}\r\n >\r\n <BimLoadingState />\r\n <div\r\n className=\"bim-container\"\r\n id=\"bim-viewer-container\"\r\n ref={containerRef}\r\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n position: \"relative\",\r\n background: \"radial-gradient(circle, rgba(255, 255, 255, 1) 50%, rgba(220, 220, 220, 1) 100%)\",\r\n }}\r\n />\r\n <PropertiesMenu />\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/viewers/bim/BimViewer.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 OBC from \"@thatopen/components\";\r\nimport * as OBF from \"@thatopen/components-front\"\r\nimport * as THREE from \"three\";\r\nimport { useTranslations, useLocale } from 'next-intl';\r\nimport { ToolsContext, BimContext, MenusContext } from \"../../../store\";\r\n\r\nimport { CurrentWorld } from \"./src/CurrentWorld\";\r\nimport { CurrentCamera } from './src/CurrentCamera';\r\nimport { Highlighter } from \"./src/Highlighter\";\r\nimport { FloorplanTool } from \"./src/FloorplanTool\";\r\nimport { ElevationsTool } from \"./src/ElevationsTool\";\r\nimport { ViewModeCoordinator } from \"./src/lib/ViewModeCoordinator\";\r\n\r\nimport { PropertiesMenu } from \"./src/propertiesMenu\";\r\nimport { BimLoadingState } from \"./src/BimLoadingState\";\r\nimport { ViewportGizmo } from \"./src/ViewportGizmo\";\r\nimport { useBimCoordinateSystem } from \"../useCoordinateSystem\";\r\n\r\nexport function BimViewer() {\r\n\r\n const t = useTranslations('ViewportGizmo');\r\n const locale = useLocale();\r\n\r\n const { dispatch: bimDispatch, state: bimState } = React.useContext(BimContext);\r\n const { bimComponents } = bimState.bim;\r\n\r\n const { dispatch: toolsDispatch, state: toolsState } = React.useContext(ToolsContext);\r\n const { currentToolId } = toolsState.tools;\r\n\r\n const { state: menusState } = React.useContext(MenusContext);\r\n const { currentViewer } = menusState.menus;\r\n \r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const workerUrlRef = React.useRef<string | null>(null);\r\n const resizeObserverRef = React.useRef<ResizeObserver | null>(null);\r\n // Tracks the Components instance THIS mount created, so cleanup disposes the\r\n // real one and the create-guard can't be defeated by a stale [] closure.\r\n const componentsRef = React.useRef<OBC.Components | null>(null);\r\n\r\n const createViewer = React.useCallback(\r\n async (isCancelled: () => boolean) => {\r\n // Re-entrancy guard keyed to the ref we actually set — NOT the stale\r\n // `bimComponents` from this useCallback's [] closure (always null on\r\n // first run, so it could never stop a second init). Without this,\r\n // React StrictMode (dev) and rapid viewer remounts (prod) build a\r\n // second Components + PostproductionRenderer — a second <canvas> —\r\n // and whichever instance wins the SET_COMPONENTS race may be the one\r\n // whose canvas was detached on remount. Models then load into a scene\r\n // that is never painted: the spatial tree builds (metadata) but no\r\n // geometry shows and floorplan nav drives the dead world's camera.\r\n if (!containerRef.current || componentsRef.current) return;\r\n\r\n const container = containerRef.current;\r\n const components = new OBC.Components();\r\n const worlds = components.get(OBC.Worlds);\r\n const world = worlds.create<\r\n OBC.ShadowedScene,\r\n OBC.OrthoPerspectiveCamera,\r\n OBF.PostproductionRenderer\r\n >();\r\n\r\n world.scene = new OBC.ShadowedScene(components);\r\n\r\n world.renderer = new OBF.PostproductionRenderer(components, container);\r\n world.camera = new OBC.OrthoPerspectiveCamera(components);\r\n\r\n components.init();\r\n\r\n world.scene.setup();\r\n world.scene.three.background = null;\r\n\r\n const grids = components.get(OBC.Grids);\r\n const grid = grids.create(world);\r\n\r\n if (grid) {\r\n bimDispatch({\r\n \"type\": \"SET_GRID\",\r\n \"payload\": { grid }\r\n });\r\n }\r\n\r\n const axesHelper = new THREE.AxesHelper(5);\r\n world.scene.three.add(axesHelper);\r\n\r\n const fragments = components.get(OBC.FragmentsManager);\r\n\r\n const githubUrl =\r\n \"https://thatopen.github.io/engine_fragment/resources/worker.mjs\";\r\n const fetchedUrl = await fetch(githubUrl);\r\n const workerBlob = await fetchedUrl.blob();\r\n const workerFile = new File([workerBlob], \"worker.mjs\", {\r\n type: \"text/javascript\",\r\n });\r\n const workerUrl = URL.createObjectURL(workerFile);\r\n workerUrlRef.current = workerUrl; // Store reference for cleanup\r\n fragments.init(workerUrl);\r\n\r\n world.camera.controls.addEventListener(\"control\", () =>\r\n fragments.core.update(),\r\n );\r\n\r\n world.camera.controls.restThreshold = 0.005;\r\n world.camera.controls.addEventListener(\"rest\", () =>\r\n fragments.core.update(true)\r\n );\r\n\r\n components.get(CurrentWorld).world = world;\r\n components.get(CurrentCamera).camera = world.camera;\r\n components.get(Highlighter);\r\n components.get(ViewModeCoordinator);\r\n components.get(FloorplanTool);\r\n components.get(ElevationsTool);\r\n\r\n // Grid injection is safe here — fragments.core is initialized.\r\n if (grid) {\r\n components.get(FloorplanTool).setGrid(grid);\r\n components.get(ElevationsTool).setGrid(grid);\r\n }\r\n\r\n // Enable shadows\r\n world.renderer.three.shadowMap.enabled = true;\r\n world.renderer.three.shadowMap.type = THREE.PCFSoftShadowMap;\r\n world.scene.setup({\r\n shadows: {\r\n cascade: 1,\r\n resolution: 1024,\r\n },\r\n });\r\n\r\n world.scene.distanceRenderer.excludedObjects.add(grid.three);\r\n\r\n await world.scene.updateShadows();\r\n\r\n world.camera.controls.addEventListener(\"rest\", async () => {\r\n await world.scene.updateShadows();\r\n });\r\n\r\n world.scene.three.background = null;\r\n\r\n // If this init was superseded (StrictMode re-run) or the viewer\r\n // unmounted while we awaited the worker fetch / shadow update, throw\r\n // this instance away instead of publishing it. Prevents an orphaned\r\n // world (whose canvas is detached) from winning the store and starving\r\n // the visible canvas of geometry.\r\n if (isCancelled()) {\r\n components.dispose();\r\n return;\r\n }\r\n componentsRef.current = components;\r\n bimDispatch({\r\n type: \"SET_COMPONENTS\",\r\n payload: { bimComponents: components, world, fragments }\r\n });\r\n\r\n // Ensure canvas takes full container size\r\n const canvas = container.querySelector('canvas');\r\n if (canvas) {\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n canvas.style.display = 'block';\r\n }\r\n\r\n // Handle resize using container dimensions\r\n const handleResize = () => {\r\n const width = container.clientWidth;\r\n const height = container.clientHeight;\r\n if (width && height) {\r\n world.renderer?.resize(new THREE.Vector2(width, height));\r\n }\r\n };\r\n \r\n // Initial resize\r\n handleResize();\r\n \r\n // Watch for container size changes using ResizeObserver. This\r\n // already covers the window-resize case: when the window resizes,\r\n // the flex layout reshapes this container, and ResizeObserver\r\n // fires.\r\n const resizeObserver = new ResizeObserver(() => {\r\n handleResize();\r\n });\r\n resizeObserver.observe(container);\r\n resizeObserverRef.current = resizeObserver;\r\n\r\n // The ResizeObserver above is sufficient for redraws. A window\r\n // 'resize' listener here previously leaked on every mount (no matching\r\n // removeEventListener), so it was removed.\r\n }, []\r\n );\r\n\r\n React.useEffect(() => {\r\n let cancelled = false;\r\n createViewer(() => cancelled);\r\n\r\n // Cleanup: mark this init cancelled (so an in-flight createViewer disposes\r\n // itself instead of publishing), and dispose the instance we actually\r\n // created (componentsRef). The old `if (bimComponents)` read the stale []\r\n // closure value (null at mount), so the real Components was never disposed\r\n // — leaking its renderer/canvas and letting orphans race the store.\r\n return () => {\r\n cancelled = true;\r\n if (resizeObserverRef.current) {\r\n resizeObserverRef.current.disconnect();\r\n }\r\n if (componentsRef.current) {\r\n componentsRef.current.dispose();\r\n componentsRef.current = null;\r\n }\r\n bimDispatch({\r\n type: \"DISPOSE-BIM\"\r\n });\r\n };\r\n }, []);\r\n\r\n // Enforce Y-up coordinate system for Three.js / camera-controls.\r\n // Runs whenever the world (and its controls) becomes available, and resets on unmount.\r\n useBimCoordinateSystem(bimState.bim.world?.camera?.controls ?? null);\r\n\r\n // Control ViewportGizmo based on current viewer\r\n React.useEffect(() => {\r\n if (!bimComponents) return;\r\n\r\n const viewportGizmo = bimComponents.get(ViewportGizmo);\r\n\r\n viewportGizmo.setLabels({\r\n top: t('top'),\r\n right: t('right'),\r\n bottom: t('bottom'),\r\n left: t('left'),\r\n front: t('front'),\r\n back: t('back')\r\n });\r\n\r\n if (!viewportGizmo) return;\r\n\r\n if (currentViewer === 'bim') {\r\n viewportGizmo.enabled = true;\r\n viewportGizmo.add();\r\n } else {\r\n viewportGizmo.enabled = false;\r\n viewportGizmo.remove();\r\n }\r\n }, [bimComponents, currentViewer, locale, t]);\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"hidden\"\r\n }}\r\n >\r\n <BimLoadingState />\r\n <div\r\n className=\"bim-container\"\r\n id=\"bim-viewer-container\"\r\n ref={containerRef}\r\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n position: \"relative\",\r\n background: \"radial-gradient(circle, rgba(255, 255, 255, 1) 50%, rgba(220, 220, 220, 1) 100%)\",\r\n }}\r\n />\r\n <PropertiesMenu />\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BCFTopicsManager.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/BCFTopicsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C,qBAAa,gBAAiB,SAAQ,GAAG,CAAC,SAAS;IAE/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,KAAK,CAAyB;gBAE1B,UAAU,EAAE,GAAG,CAAC,UAAU;IA2BtC,OAAO,CAAC,kBAAkB;IAkB1B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK;IAKzB,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,GAAG,CAAC,KAAK;IAyBxE,IAAI,CAAC,OAAO,EAAE,MAAM;IAY1B,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAO1C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAgBhC,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE;IAIxB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,SAAS;IAIpD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO;IAUlE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI;IAoB9C,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IAYlF,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IAgB1F,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IA2BhF,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IASjE,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE;CAOvD"}
1
+ {"version":3,"file":"BCFTopicsManager.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/BCFTopicsManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C,qBAAa,gBAAiB,SAAQ,GAAG,CAAC,SAAS;IAE/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,KAAK,CAAyB;gBAE1B,UAAU,EAAE,GAAG,CAAC,UAAU;IA2BtC,OAAO,CAAC,kBAAkB;IAkB1B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK;IAKzB,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,GAAG,CAAC,KAAK;IAyBxE,IAAI,CAAC,OAAO,EAAE,MAAM;IAY1B,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAO1C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAgBhC,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE;IAIxB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,SAAS;IAIpD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO;IAUlE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI;IAoB9C,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IAYlF,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IAgB1F,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAA;KAAE,CAAC;IA2BhF,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IASjE,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE;CAOvD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/BCFTopicsManager.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport { CurrentWorld } from './CurrentWorld'\r\n\r\nexport class BCFTopicsManager extends OBC.Component {\r\n\r\n static readonly uuid = '00a7396c-2903-4ad7-b941-f8eca39746ab' as const\r\n\r\n enabled = false\r\n\r\n private bcfTopics: OBC.BCFTopics\r\n private viewpoints: OBC.Viewpoints\r\n private world: OBC.World | null = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(BCFTopicsManager.uuid, this)\r\n \r\n // Initialize BCF components\r\n this.bcfTopics = components.get(OBC.BCFTopics)\r\n this.viewpoints = components.get(OBC.Viewpoints)\r\n \r\n // Get world from CurrentWorld component\r\n this.world = components.get(CurrentWorld).world\r\n if (this.world) {\r\n this.viewpoints.world = this.world\r\n }\r\n \r\n // Setup BCF Topics with default configuration\r\n this.bcfTopics.setup({\r\n author: \"info@collabdigitaltwins.com\", // This will be overridden when creating topics\r\n types: new Set([...this.bcfTopics.config.types, \"Information\", \"Coordination\", \"Issue\", \"Clash\", \"Error\"]),\r\n statuses: new Set([\"Active\", \"In Progress\", \"Done\", \"In Review\", \"Closed\"]),\r\n users: new Set([\"info@collabdigitaltwins.com\"]),\r\n version: \"3\"\r\n })\r\n\r\n // Setup event handlers\r\n this.setupEventHandlers()\r\n }\r\n\r\n private setupEventHandlers() {\r\n // Create a viewpoint whenever a topic is created\r\n this.bcfTopics.list.onItemSet.add(async ({ value: topic }) => {\r\n if (this.world) {\r\n const viewpoint = this.viewpoints.create()\r\n viewpoint.world = this.world\r\n viewpoint.title = `Viewpoint for ${topic.title}`\r\n \r\n // Update camera and take snapshot\r\n await viewpoint.updateCamera()\r\n viewpoint.takeSnapshot()\r\n \r\n // Link viewpoint to topic\r\n topic.viewpoints.add(viewpoint.guid)\r\n }\r\n })\r\n }\r\n\r\n setWorld(world: OBC.World) {\r\n this.world = world\r\n this.viewpoints.world = world\r\n }\r\n\r\n create(topicData: Partial<OBC.Topic> & { creationAuthor?: string }): OBC.Topic {\r\n // Override the author if provided\r\n if (topicData.creationAuthor) {\r\n this.bcfTopics.config.author = topicData.creationAuthor\r\n }\r\n\r\n const topic = this.bcfTopics.create({\r\n title: topicData.title || 'New Topic',\r\n description: topicData.description || '',\r\n type: topicData.type || 'Issue',\r\n status: topicData.status || 'Active',\r\n priority: topicData.priority,\r\n stage: topicData.stage,\r\n assignedTo: topicData.assignedTo,\r\n dueDate: topicData.dueDate,\r\n labels: topicData.labels || new Set()\r\n })\r\n \r\n const viewpoint = this.createViewpoint(`viewpoint-${topic.title}`)\r\n\r\n if (viewpoint) topic.viewpoints.add(viewpoint.guid)\r\n\r\n return topic\r\n }\r\n\r\n async view(topicId: string) {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic && topic.viewpoints.size > 0) {\r\n // Get the first viewpoint and navigate to it\r\n const viewpointId = Array.from(topic.viewpoints)[0]\r\n const viewpoint = this.viewpoints.list.get(viewpointId)\r\n if (viewpoint) {\r\n await viewpoint.go()\r\n }\r\n }\r\n }\r\n\r\n edit(topic: OBC.Topic | Partial<OBC.Topic>) {\r\n const existingTopic = this.bcfTopics.list.get(topic.guid)\r\n if (existingTopic) {\r\n existingTopic.set(topic)\r\n }\r\n }\r\n\r\n remove(topicId: string): boolean {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n // Remove associated viewpoints\r\n for (const viewpointId of topic.viewpoints) {\r\n this.viewpoints.list.delete(viewpointId)\r\n }\r\n \r\n // Remove the topic\r\n const success = this.bcfTopics.list.delete(topicId)\r\n return success\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n getTopics(): OBC.Topic[] {\r\n return Array.from(this.bcfTopics.list.values())\r\n }\r\n\r\n getTopicById(topicId: string): OBC.Topic | undefined {\r\n return this.bcfTopics.list.get(topicId)\r\n }\r\n\r\n updateTopic(topicId: string, updates: Partial<OBC.Topic>): boolean {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n topic.set(updates)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // Create a viewpoint for the current camera position\r\n createViewpoint(title: string): OBC.Viewpoint | null {\r\n if (!this.world) {\r\n return null\r\n }\r\n\r\n const viewpoint = this.viewpoints.create()\r\n viewpoint.world = this.world\r\n viewpoint.title = title\r\n \r\n // const highlighter = this.components.get(OBF.Highlighter)\r\n // const selection = highlighter?.selection\r\n // console.log('Viewpoint selection:', selection)\r\n \r\n // Update camera and take snapshot\r\n // viewpoint.updateCamera()\r\n // viewpoint.takeSnapshot()\r\n\r\n }\r\n\r\n // Export BCF file\r\n async exportBCF(buildingName?: string): Promise<File> {\r\n try {\r\n // Export all topics\r\n const bcfBuffer = await this.bcfTopics.export()\r\n \r\n // Create filename with date and building name\r\n const currentDate = new Date().toISOString().split('T')[0] // YYYY-MM-DD format\r\n const sanitizedBuildingName = buildingName \r\n ? buildingName.replace(/[^a-zA-Z0-9-_]/g, '_') // Replace invalid filename chars with underscore\r\n : 'UnknownBuilding'\r\n const filename = `${currentDate}_${sanitizedBuildingName}.bcf`\r\n \r\n const bcfFile = new File([bcfBuffer], filename, { type: \"application/octet-stream\" })\r\n \r\n return bcfFile\r\n } catch (error) {\r\n console.error('Failed to export BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n // Load BCF file\r\n async loadBCF(file: File): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n try {\r\n const buffer = await file.arrayBuffer()\r\n const result = await this.bcfTopics.load(new Uint8Array(buffer))\r\n \r\n return result\r\n } catch (error) {\r\n console.error('Failed to load BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n async loadBCFFromUrl(url: string): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n try {\r\n const response = await fetch(url)\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n const blob = await response.blob()\r\n const result = await this.bcfTopics.load(new Uint8Array(await blob.arrayBuffer()))\r\n return result\r\n } catch (error) {\r\n console.error('Failed to load BCF from URL:', error)\r\n throw error\r\n } \r\n }\r\n\r\n // Download BCF file\r\n async downloadBCF(buildingName?: string): Promise<void> {\r\n try {\r\n const bcfFile = await this.exportBCF(buildingName)\r\n \r\n // Create download link\r\n const a = document.createElement(\"a\")\r\n a.href = URL.createObjectURL(bcfFile)\r\n a.download = bcfFile.name\r\n a.click()\r\n URL.revokeObjectURL(a.href)\r\n } catch (error) {\r\n console.error('Failed to download BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n // Upload and load BCF file\r\n async uploadBCF(): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n return new Promise((resolve, reject) => {\r\n const input = document.createElement(\"input\")\r\n input.multiple = false\r\n input.accept = \".bcf\"\r\n input.type = \"file\"\r\n \r\n input.addEventListener(\"change\", async () => {\r\n const file = input.files?.[0]\r\n if (!file) {\r\n reject(new Error('No file selected'))\r\n return\r\n }\r\n \r\n try {\r\n const result = await this.loadBCF(file)\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n })\r\n \r\n input.click()\r\n })\r\n }\r\n\r\n // Get viewpoint data (including snapshot)\r\n getViewpointSnapshot(viewpointId: string): Uint8Array | undefined {\r\n const viewpoint = this.viewpoints.list.get(viewpointId)\r\n if (viewpoint && viewpoint.snapshot) {\r\n return this.viewpoints.snapshots.get(viewpoint.snapshot)\r\n }\r\n return undefined\r\n }\r\n\r\n // Get all viewpoints for a topic\r\n getTopicViewpoints(topicId: string): OBC.Viewpoint[] {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n return Array.from(topic.viewpoints).map(id => this.viewpoints.list.get(id)).filter(Boolean) as OBC.Viewpoint[]\r\n }\r\n return []\r\n }\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/BCFTopicsManager.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport { CurrentWorld } from './CurrentWorld'\r\n\r\nexport class BCFTopicsManager extends OBC.Component {\r\n\r\n static readonly uuid = '00a7396c-2903-4ad7-b941-f8eca39746ab' as const\r\n\r\n enabled = false\r\n\r\n private bcfTopics: OBC.BCFTopics\r\n private viewpoints: OBC.Viewpoints\r\n private world: OBC.World | null = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(BCFTopicsManager.uuid, this)\r\n \r\n // Initialize BCF components\r\n this.bcfTopics = components.get(OBC.BCFTopics)\r\n this.viewpoints = components.get(OBC.Viewpoints)\r\n \r\n // Get world from CurrentWorld component\r\n this.world = components.get(CurrentWorld).world\r\n if (this.world) {\r\n this.viewpoints.world = this.world\r\n }\r\n \r\n // Setup BCF Topics with default configuration\r\n this.bcfTopics.setup({\r\n author: \"info@collabdigitaltwins.com\", // This will be overridden when creating topics\r\n types: new Set([...this.bcfTopics.config.types, \"Information\", \"Coordination\", \"Issue\", \"Clash\", \"Error\"]),\r\n statuses: new Set([\"Active\", \"In Progress\", \"Done\", \"In Review\", \"Closed\"]),\r\n users: new Set([\"info@collabdigitaltwins.com\"]),\r\n version: \"3\"\r\n })\r\n\r\n // Setup event handlers\r\n this.setupEventHandlers()\r\n }\r\n\r\n private setupEventHandlers() {\r\n // Create a viewpoint whenever a topic is created\r\n this.bcfTopics.list.onItemSet.add(async ({ value: topic }) => {\r\n if (this.world) {\r\n const viewpoint = this.viewpoints.create()\r\n viewpoint.world = this.world\r\n viewpoint.title = `Viewpoint for ${topic.title}`\r\n \r\n // Update camera and take snapshot\r\n await viewpoint.updateCamera()\r\n viewpoint.takeSnapshot()\r\n \r\n // Link viewpoint to topic\r\n topic.viewpoints.add(viewpoint.guid)\r\n }\r\n })\r\n }\r\n\r\n setWorld(world: OBC.World) {\r\n this.world = world\r\n this.viewpoints.world = world\r\n }\r\n\r\n create(topicData: Partial<OBC.Topic> & { creationAuthor?: string }): OBC.Topic {\r\n // Override the author if provided\r\n if (topicData.creationAuthor) {\r\n this.bcfTopics.config.author = topicData.creationAuthor\r\n }\r\n\r\n const topic = this.bcfTopics.create({\r\n title: topicData.title || 'New Topic',\r\n description: topicData.description || '',\r\n type: topicData.type || 'Issue',\r\n status: topicData.status || 'Active',\r\n priority: topicData.priority,\r\n stage: topicData.stage,\r\n assignedTo: topicData.assignedTo,\r\n dueDate: topicData.dueDate,\r\n labels: topicData.labels || new Set()\r\n })\r\n \r\n const viewpoint = this.createViewpoint(`viewpoint-${topic.title}`)\r\n\r\n if (viewpoint) topic.viewpoints.add(viewpoint.guid)\r\n\r\n return topic\r\n }\r\n\r\n async view(topicId: string) {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic && topic.viewpoints.size > 0) {\r\n // Get the first viewpoint and navigate to it\r\n const viewpointId = Array.from(topic.viewpoints)[0]\r\n const viewpoint = this.viewpoints.list.get(viewpointId)\r\n if (viewpoint) {\r\n await viewpoint.go()\r\n }\r\n }\r\n }\r\n\r\n edit(topic: OBC.Topic | Partial<OBC.Topic>) {\r\n const existingTopic = this.bcfTopics.list.get(topic.guid)\r\n if (existingTopic) {\r\n existingTopic.set(topic)\r\n }\r\n }\r\n\r\n remove(topicId: string): boolean {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n // Remove associated viewpoints\r\n for (const viewpointId of topic.viewpoints) {\r\n this.viewpoints.list.delete(viewpointId)\r\n }\r\n \r\n // Remove the topic\r\n const success = this.bcfTopics.list.delete(topicId)\r\n return success\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n getTopics(): OBC.Topic[] {\r\n return Array.from(this.bcfTopics.list.values())\r\n }\r\n\r\n getTopicById(topicId: string): OBC.Topic | undefined {\r\n return this.bcfTopics.list.get(topicId)\r\n }\r\n\r\n updateTopic(topicId: string, updates: Partial<OBC.Topic>): boolean {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n topic.set(updates)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // Create a viewpoint for the current camera position\r\n createViewpoint(title: string): OBC.Viewpoint | null {\r\n if (!this.world) {\r\n return null\r\n }\r\n\r\n const viewpoint = this.viewpoints.create()\r\n viewpoint.world = this.world\r\n viewpoint.title = title\r\n \r\n // const highlighter = this.components.get(OBF.Highlighter)\r\n // const selection = highlighter?.selection\r\n // console.log('Viewpoint selection:', selection)\r\n \r\n // Update camera and take snapshot\r\n // viewpoint.updateCamera()\r\n // viewpoint.takeSnapshot()\r\n\r\n }\r\n\r\n // Export BCF file\r\n async exportBCF(buildingName?: string): Promise<File> {\r\n try {\r\n // Export all topics\r\n const bcfBuffer = await this.bcfTopics.export()\r\n \r\n // Create filename with date and building name\r\n const currentDate = new Date().toISOString().split('T')[0] // YYYY-MM-DD format\r\n const sanitizedBuildingName = buildingName \r\n ? buildingName.replace(/[^a-zA-Z0-9-_]/g, '_') // Replace invalid filename chars with underscore\r\n : 'UnknownBuilding'\r\n const filename = `${currentDate}_${sanitizedBuildingName}.bcf`\r\n \r\n const bcfFile = new File([bcfBuffer], filename, { type: \"application/octet-stream\" })\r\n \r\n return bcfFile\r\n } catch (error) {\r\n console.error('Failed to export BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n // Load BCF file\r\n async loadBCF(file: File): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n try {\r\n const buffer = await file.arrayBuffer()\r\n const result = await this.bcfTopics.load(new Uint8Array(buffer))\r\n \r\n return result\r\n } catch (error) {\r\n console.error('Failed to load BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n async loadBCFFromUrl(url: string): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n try {\r\n const response = await fetch(url)\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n const blob = await response.blob()\r\n const result = await this.bcfTopics.load(new Uint8Array(await blob.arrayBuffer()))\r\n return result\r\n } catch (error) {\r\n console.error('Failed to load BCF from URL:', error)\r\n throw error\r\n } \r\n }\r\n\r\n // Download BCF file\r\n async downloadBCF(buildingName?: string): Promise<void> {\r\n try {\r\n const bcfFile = await this.exportBCF(buildingName)\r\n \r\n // Create download link\r\n const a = document.createElement(\"a\")\r\n a.href = URL.createObjectURL(bcfFile)\r\n a.download = bcfFile.name\r\n a.click()\r\n URL.revokeObjectURL(a.href)\r\n } catch (error) {\r\n console.error('Failed to download BCF:', error)\r\n throw error\r\n }\r\n }\r\n\r\n // Upload and load BCF file\r\n async uploadBCF(): Promise<{ topics: OBC.Topic[], viewpoints: OBC.Viewpoint[] }> {\r\n return new Promise((resolve, reject) => {\r\n const input = document.createElement(\"input\")\r\n input.multiple = false\r\n input.accept = \".bcf\"\r\n input.type = \"file\"\r\n \r\n input.addEventListener(\"change\", async () => {\r\n const file = input.files?.[0]\r\n if (!file) {\r\n reject(new Error('No file selected'))\r\n return\r\n }\r\n \r\n try {\r\n const result = await this.loadBCF(file)\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n })\r\n \r\n input.click()\r\n })\r\n }\r\n\r\n // Get viewpoint data (including snapshot)\r\n getViewpointSnapshot(viewpointId: string): Uint8Array | undefined {\r\n const viewpoint = this.viewpoints.list.get(viewpointId)\r\n if (viewpoint && viewpoint.snapshot) {\r\n return this.viewpoints.snapshots.get(viewpoint.snapshot)\r\n }\r\n return undefined\r\n }\r\n\r\n // Get all viewpoints for a topic\r\n getTopicViewpoints(topicId: string): OBC.Viewpoint[] {\r\n const topic = this.bcfTopics.list.get(topicId)\r\n if (topic) {\r\n return Array.from(topic.viewpoints).map(id => this.viewpoints.list.get(id)).filter(Boolean) as OBC.Viewpoint[]\r\n }\r\n return []\r\n }\r\n}"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BIMManager/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAG5C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAC,cAAc,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;CAC/B;AAED,qBAAa,UAAW,SAAQ,GAAG,CAAC,SAAS;IAC3C,MAAM,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAE7D,OAAO,UAAO;IAEd,6DAA6D;IAC7D,YAAY,0BAAgC;IAE5C,8EAA8E;IAC9E,kBAAkB,0BAAgC;IAElD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,cAAc,CAAiC;gBAE3C,UAAU,EAAE,GAAG,CAAC,UAAU;IAQtC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAwB1B,gFAAgF;IAChF,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQvC,GAAG,CACD,KAAK,EAAE,KAAK,CAAC,cAAc,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,YAAY;IA0Bf,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAO3B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9C,sCAAsC;IACtC,YAAY,IAAI,YAAY,EAAE;IAIxB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAMhE,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB3D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAerD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;IAQ3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAWzD;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAWpD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO;IAWvD;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiBnC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAYpD,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BIMManager/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAG5C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAC,cAAc,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;CAC/B;AAED,qBAAa,UAAW,SAAQ,GAAG,CAAC,SAAS;IAC3C,MAAM,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAE7D,OAAO,UAAO;IAEd,6DAA6D;IAC7D,YAAY,0BAAgC;IAE5C,8EAA8E;IAC9E,kBAAkB,0BAAgC;IAElD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,cAAc,CAAiC;gBAE3C,UAAU,EAAE,GAAG,CAAC,UAAU;IAQtC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAwB1B,gFAAgF;IAChF,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQvC,GAAG,CACD,KAAK,EAAE,KAAK,CAAC,cAAc,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,YAAY;IA0Bf,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAO3B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9C,sCAAsC;IACtC,YAAY,IAAI,YAAY,EAAE;IAIxB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAMhE,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB3D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAerD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;IAQ3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAWzD;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAWpD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO;IAWvD;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiBnC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAYpD,OAAO,IAAI,IAAI;CAGhB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/BIMManager/index.ts"],"sourcesContent":["import * as THREE from 'three'\r\nimport * as OBC from '@thatopen/components'\r\nimport * as FRAGS from '@thatopen/fragments'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\n\r\nexport interface BimModelInfo {\r\n id: string\r\n name: string\r\n model: FRAGS.FragmentsModel\r\n}\r\n\r\nexport interface BimTransformOptions {\r\n position?: THREE.Vector3\r\n rotation?: THREE.Euler\r\n scale?: number | THREE.Vector3\r\n}\r\n\r\nexport class BIMManager extends OBC.Component {\r\n static uuid = 'b2c1a0f9-3d4e-4c8b-9a7d-1e5f6g7h8i9j' as const\r\n\r\n enabled = true\r\n\r\n /** Triggered when a model is registered with the manager. */\r\n onModelAdded = new OBC.Event<BimModelInfo>()\r\n\r\n /** Triggered whenever a model's transform is changed through this manager. */\r\n onModelTransformed = new OBC.Event<BimModelInfo>()\r\n\r\n private _components: OBC.Components\r\n private _world: OBC.World | null = null\r\n private _models: Map<string, BimModelInfo> = new Map()\r\n private _nameOverrides: Map<string, string> = new Map()\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(BIMManager.uuid, this)\r\n this._components = components\r\n this._world = components.get(CurrentWorld).world\r\n this._syncWithFragments(components)\r\n }\r\n\r\n /**\r\n * Retroactively registers all models already in the fragments list and\r\n * subscribes to future loads so BIMManager stays in sync regardless of\r\n * when it is first instantiated.\r\n */\r\n private _syncWithFragments(components: OBC.Components): void {\r\n let fragManager: OBC.FragmentsManager\r\n try {\r\n fragManager = components.get(OBC.FragmentsManager)\r\n }\r\n catch {\r\n return\r\n }\r\n\r\n // Register models that are already loaded\r\n for (const [modelId, model] of fragManager.core.models.list) {\r\n if (!this._models.has(modelId)) {\r\n this._registerFragModel(model)\r\n }\r\n }\r\n\r\n // Listen for future loads\r\n fragManager.core.onModelLoaded.add((model: FRAGS.FragmentsModel) => {\r\n if (!this._models.has(model.modelId)) {\r\n this._registerFragModel(model)\r\n }\r\n })\r\n }\r\n\r\n /** Low-level helper: register a FragmentsModel using its own modelId as key. */\r\n private _registerFragModel(model: FRAGS.FragmentsModel): void {\r\n const id = model.modelId\r\n const info: BimModelInfo = {\r\n id,\r\n name: this._nameOverrides.get(id) ?? id,\r\n model,\r\n }\r\n this._models.set(id, info)\r\n this.onModelAdded.trigger(info)\r\n }\r\n\r\n /**\r\n * Update the display name for a registered model.\r\n * Useful when the DbFile name becomes known after the model was auto-registered.\r\n */\r\n setName(id: string, name: string): void {\r\n this._nameOverrides.set(id, name)\r\n const info = this._models.get(id)\r\n if (info) {\r\n info.name = name\r\n }\r\n }\r\n\r\n add(\r\n model: FRAGS.FragmentsModel,\r\n id: string,\r\n name: string,\r\n options: BimTransformOptions = {},\r\n ): BimModelInfo {\r\n if (options.position) {\r\n model.object.position.copy(options.position)\r\n }\r\n\r\n if (options.rotation) {\r\n model.object.rotation.copy(options.rotation)\r\n }\r\n\r\n if (options.scale) {\r\n if (typeof options.scale === 'number') {\r\n model.object.scale.setScalar(options.scale)\r\n }\r\n else {\r\n model.object.scale.copy(options.scale)\r\n }\r\n }\r\n\r\n const modelInfo: BimModelInfo = { id, name, model }\r\n this._models.set(id, modelInfo)\r\n ;(model.object as any).bimModelId = id\r\n\r\n this.onModelAdded.trigger(modelInfo)\r\n return modelInfo\r\n }\r\n\r\n remove(id: string): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n this._models.delete(id)\r\n return true\r\n }\r\n\r\n getModel(id: string): BimModelInfo | undefined {\r\n return this._models.get(id)\r\n }\r\n\r\n /** Get all registered model infos. */\r\n getAllModels(): BimModelInfo[] {\r\n return [...this._models.values()]\r\n }\r\n\r\n async getCoordinationMatrix(id: string): Promise<THREE.Matrix4 | null> {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return null\r\n return modelInfo.model.getCoordinationMatrix()\r\n }\r\n\r\n async applyCoordinationMatrix(id: string): Promise<boolean> {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n const coordMatrix = await modelInfo.model.getCoordinationMatrix()\r\n coordMatrix.decompose(\r\n modelInfo.model.object.position,\r\n modelInfo.model.object.quaternion,\r\n modelInfo.model.object.scale,\r\n )\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n setMatrix(id: string, matrix: THREE.Matrix4): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n matrix.decompose(\r\n modelInfo.model.object.position,\r\n modelInfo.model.object.quaternion,\r\n modelInfo.model.object.scale,\r\n )\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n getMatrix(id: string): THREE.Matrix4 | null {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return null\r\n\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n return modelInfo.model.object.matrixWorld.clone()\r\n }\r\n\r\n setPosition(id: string, position: THREE.Vector3): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.copy(position)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Translate (offset) the model relative to its current position.\r\n */\r\n translate(id: string, delta: THREE.Vector3): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.add(delta)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Set the absolute rotation of the model.\r\n */\r\n setRotation(id: string, rotation: THREE.Euler): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.rotation.copy(rotation)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Reset position, rotation, and scale to identity (origin, no rotation, unit scale).\r\n */\r\n resetTransform(id: string): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.set(0, 0, 0)\r\n modelInfo.model.object.rotation.set(0, 0, 0)\r\n modelInfo.model.object.scale.set(1, 1, 1)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Visibility\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Show or hide the model.\r\n */\r\n setVisibility(id: string, visible: boolean): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.visible = visible\r\n return true\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Cleanup\r\n // ---------------------------------------------------------------------------\r\n\r\n dispose(): void {\r\n this._models.clear()\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/BIMManager/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as THREE from 'three'\r\nimport * as OBC from '@thatopen/components'\r\nimport * as FRAGS from '@thatopen/fragments'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\n\r\nexport interface BimModelInfo {\r\n id: string\r\n name: string\r\n model: FRAGS.FragmentsModel\r\n}\r\n\r\nexport interface BimTransformOptions {\r\n position?: THREE.Vector3\r\n rotation?: THREE.Euler\r\n scale?: number | THREE.Vector3\r\n}\r\n\r\nexport class BIMManager extends OBC.Component {\r\n static uuid = 'b2c1a0f9-3d4e-4c8b-9a7d-1e5f6g7h8i9j' as const\r\n\r\n enabled = true\r\n\r\n /** Triggered when a model is registered with the manager. */\r\n onModelAdded = new OBC.Event<BimModelInfo>()\r\n\r\n /** Triggered whenever a model's transform is changed through this manager. */\r\n onModelTransformed = new OBC.Event<BimModelInfo>()\r\n\r\n private _components: OBC.Components\r\n private _world: OBC.World | null = null\r\n private _models: Map<string, BimModelInfo> = new Map()\r\n private _nameOverrides: Map<string, string> = new Map()\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(BIMManager.uuid, this)\r\n this._components = components\r\n this._world = components.get(CurrentWorld).world\r\n this._syncWithFragments(components)\r\n }\r\n\r\n /**\r\n * Retroactively registers all models already in the fragments list and\r\n * subscribes to future loads so BIMManager stays in sync regardless of\r\n * when it is first instantiated.\r\n */\r\n private _syncWithFragments(components: OBC.Components): void {\r\n let fragManager: OBC.FragmentsManager\r\n try {\r\n fragManager = components.get(OBC.FragmentsManager)\r\n }\r\n catch {\r\n return\r\n }\r\n\r\n // Register models that are already loaded\r\n for (const [modelId, model] of fragManager.core.models.list) {\r\n if (!this._models.has(modelId)) {\r\n this._registerFragModel(model)\r\n }\r\n }\r\n\r\n // Listen for future loads\r\n fragManager.core.onModelLoaded.add((model: FRAGS.FragmentsModel) => {\r\n if (!this._models.has(model.modelId)) {\r\n this._registerFragModel(model)\r\n }\r\n })\r\n }\r\n\r\n /** Low-level helper: register a FragmentsModel using its own modelId as key. */\r\n private _registerFragModel(model: FRAGS.FragmentsModel): void {\r\n const id = model.modelId\r\n const info: BimModelInfo = {\r\n id,\r\n name: this._nameOverrides.get(id) ?? id,\r\n model,\r\n }\r\n this._models.set(id, info)\r\n this.onModelAdded.trigger(info)\r\n }\r\n\r\n /**\r\n * Update the display name for a registered model.\r\n * Useful when the DbFile name becomes known after the model was auto-registered.\r\n */\r\n setName(id: string, name: string): void {\r\n this._nameOverrides.set(id, name)\r\n const info = this._models.get(id)\r\n if (info) {\r\n info.name = name\r\n }\r\n }\r\n\r\n add(\r\n model: FRAGS.FragmentsModel,\r\n id: string,\r\n name: string,\r\n options: BimTransformOptions = {},\r\n ): BimModelInfo {\r\n if (options.position) {\r\n model.object.position.copy(options.position)\r\n }\r\n\r\n if (options.rotation) {\r\n model.object.rotation.copy(options.rotation)\r\n }\r\n\r\n if (options.scale) {\r\n if (typeof options.scale === 'number') {\r\n model.object.scale.setScalar(options.scale)\r\n }\r\n else {\r\n model.object.scale.copy(options.scale)\r\n }\r\n }\r\n\r\n const modelInfo: BimModelInfo = { id, name, model }\r\n this._models.set(id, modelInfo)\r\n ;(model.object as any).bimModelId = id\r\n\r\n this.onModelAdded.trigger(modelInfo)\r\n return modelInfo\r\n }\r\n\r\n remove(id: string): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n this._models.delete(id)\r\n return true\r\n }\r\n\r\n getModel(id: string): BimModelInfo | undefined {\r\n return this._models.get(id)\r\n }\r\n\r\n /** Get all registered model infos. */\r\n getAllModels(): BimModelInfo[] {\r\n return [...this._models.values()]\r\n }\r\n\r\n async getCoordinationMatrix(id: string): Promise<THREE.Matrix4 | null> {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return null\r\n return modelInfo.model.getCoordinationMatrix()\r\n }\r\n\r\n async applyCoordinationMatrix(id: string): Promise<boolean> {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n const coordMatrix = await modelInfo.model.getCoordinationMatrix()\r\n coordMatrix.decompose(\r\n modelInfo.model.object.position,\r\n modelInfo.model.object.quaternion,\r\n modelInfo.model.object.scale,\r\n )\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n setMatrix(id: string, matrix: THREE.Matrix4): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n matrix.decompose(\r\n modelInfo.model.object.position,\r\n modelInfo.model.object.quaternion,\r\n modelInfo.model.object.scale,\r\n )\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n getMatrix(id: string): THREE.Matrix4 | null {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return null\r\n\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n return modelInfo.model.object.matrixWorld.clone()\r\n }\r\n\r\n setPosition(id: string, position: THREE.Vector3): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.copy(position)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Translate (offset) the model relative to its current position.\r\n */\r\n translate(id: string, delta: THREE.Vector3): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.add(delta)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Set the absolute rotation of the model.\r\n */\r\n setRotation(id: string, rotation: THREE.Euler): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.rotation.copy(rotation)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n /**\r\n * Reset position, rotation, and scale to identity (origin, no rotation, unit scale).\r\n */\r\n resetTransform(id: string): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.position.set(0, 0, 0)\r\n modelInfo.model.object.rotation.set(0, 0, 0)\r\n modelInfo.model.object.scale.set(1, 1, 1)\r\n modelInfo.model.object.updateMatrixWorld(true)\r\n\r\n this.onModelTransformed.trigger(modelInfo)\r\n return true\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Visibility\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Show or hide the model.\r\n */\r\n setVisibility(id: string, visible: boolean): boolean {\r\n const modelInfo = this._models.get(id)\r\n if (!modelInfo) return false\r\n\r\n modelInfo.model.object.visible = visible\r\n return true\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Cleanup\r\n // ---------------------------------------------------------------------------\r\n\r\n dispose(): void {\r\n this._models.clear()\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BimLoadingState/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CAAA;AAEpG,wBAAgB,eAAe,sBAoa9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BimLoadingState/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CAAA;AAEpG,wBAAgB,eAAe,sBAoa9B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/BimLoadingState/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 { Upload, Box, Building2, Search, X, SquareArrowOutUpRight } from 'lucide-react'\r\nimport { BimContext, BuildingsContext, usePermissions } from '../../../../../store'\r\nimport { LoadModels } from '../LoadModels'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useFilesByBuildingId, useUploadFileToBuilding } from '../../../../../hooks/files/files'\r\nimport { useFileUploadHandler } from '../../../../ui/FilesManager/src/useFileUploadHandler'\r\nimport type { DbFile as 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 { setCameraLookAt } from '../../utils/setCameraLookAt'\r\n\r\nexport type bimViewerState = 'opening' | 'loading' | 'ready' | 'error' | 'noBimFiles' | 'noBuilding'\r\n\r\nexport function BimLoadingState() {\r\n const t = useTranslations('BimLoadingState')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: bimState, dispatch: bimDispatch } = React.useContext(BimContext)\r\n const { bimComponents, world, fragments } = bimState.bim\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) : null)\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 // Upload file hooks\r\n const { uploadFile } = useUploadFileToBuilding(building?.id)\r\n\r\n // Use the reusable upload handler\r\n const { handleFileUpload } = useFileUploadHandler({\r\n buildingId: building?.id,\r\n tag: 'bim-file',\r\n isVisible: true,\r\n uploadFile,\r\n })\r\n\r\n const [currentState, setCurrentState] = React.useState<bimViewerState>('opening')\r\n const [hasLoadedModels, setHasLoadedModels] = React.useState(false)\r\n const [cameraHasMoved, setCameraHasMoved] = React.useState(false)\r\n const isLoadingModelsRef = React.useRef(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 bimFiles: DbFile[] = React.useMemo(() => (\r\n files.filter(file => {\r\n const ext = file?.extension?.toLowerCase()\r\n return ext === 'frag' || ext === 'ifc'\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 // Exact match gets highest score\r\n if (textLower === searchLower) return 1000\r\n // Starts with search term gets high score\r\n if (textLower.startsWith(searchLower)) return 800\r\n // Contains search term gets medium score\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 === 'noBimFiles' || currentState === 'loading' || currentState === 'noBuilding') && !cameraHasMoved\r\n\r\n // Once models have loaded, start a fallback timer to dismiss the card if camera doesn't move\r\n React.useEffect(() => {\r\n if (currentState === 'loading' && hasLoadedModels) {\r\n const fallbackTimer = setTimeout(() => {\r\n setCameraHasMoved(true)\r\n setCurrentState('ready')\r\n }, 5000)\r\n\r\n return () => clearTimeout(fallbackTimer)\r\n }\r\n }, [currentState, hasLoadedModels])\r\n\r\n // Set up camera movement detection\r\n React.useEffect(() => {\r\n if (bimState.bim.world?.camera?.controls) {\r\n const controls = bimState.bim.world.camera.controls\r\n\r\n const handleCameraChange = () => {\r\n setCameraHasMoved(true)\r\n if (hasLoadedModels) {\r\n setCurrentState('ready')\r\n }\r\n }\r\n\r\n // Listen for camera control event (when user moves the camera)\r\n controls.addEventListener('control', handleCameraChange)\r\n\r\n return () => {\r\n controls.removeEventListener('control', handleCameraChange)\r\n }\r\n }\r\n }, [bimState.bim.world, hasLoadedModels])\r\n\r\n const loadBimModels = React.useCallback(async () => {\r\n if (!bimComponents || bimFiles.length === 0) return\r\n if (isLoadingModelsRef.current) return\r\n\r\n isLoadingModelsRef.current = true\r\n\r\n try {\r\n // State should already be 'loading' when this is called\r\n const loadModels = bimComponents.get(LoadModels)\r\n\r\n const {sharing} = setCameraLookAt(world, searchParams)\r\n loadModels.sharing = sharing\r\n\r\n let loadedCount = 0\r\n for (const bimFile of bimFiles) {\r\n try {\r\n await loadModels.load(bimFile.url, bimFile.name)\r\n loadedCount++\r\n // Apply saved 3D position after load (setupModel resets to origin)\r\n if ((bimFile.x != null || bimFile.y != null || bimFile.z != null) && fragments) {\r\n const fragModel = fragments.core.models.list.get(bimFile.name)\r\n if (fragModel) {\r\n fragModel.object.position.set(bimFile.x ?? 0, bimFile.y ?? 0, bimFile.z ?? 0)\r\n if (bimFile.rotation != null) fragModel.object.rotation.y = bimFile.rotation\r\n fragModel.object.updateMatrixWorld(true)\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Error loading BIM file\", bimFile.name, e)\r\n }\r\n }\r\n\r\n // Force update the fragments to render geometry immediately\r\n if (fragments) {\r\n fragments.core.update(true)\r\n }\r\n\r\n // If every file failed to load, surface an error instead of silently\r\n // dismissing the card as though the models were there.\r\n if (loadedCount === 0) {\r\n setCurrentState('error')\r\n return\r\n }\r\n\r\n // Mark each loaded file as visible in the BIM store so ModelsSection reflects it\r\n for (const bimFile of bimFiles) {\r\n bimDispatch({ type: 'SET_MODEL_UI_STATE', payload: { fileId: bimFile.id, isVisible: true } })\r\n }\r\n\r\n // Signal that models have loaded — the fallback timer will dismiss the card\r\n setHasLoadedModels(true)\r\n } catch (error) {\r\n console.error('Error loading BIM models:', error)\r\n setCurrentState('error')\r\n } finally {\r\n isLoadingModelsRef.current = false\r\n }\r\n }, [bimComponents, bimFiles, fragments])\r\n\r\n // Handle initial state transitions\r\n React.useEffect(() => {\r\n // If no bimComponents available, stay in opening state\r\n if (!bimComponents) {\r\n setCurrentState('opening')\r\n setHasLoadedModels(false)\r\n return\r\n }\r\n\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 setHasLoadedModels(false)\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've already loaded models (or are currently loading), don't reload\r\n if (hasLoadedModels) {\r\n return\r\n }\r\n\r\n // If we have a building but no BIM files, show noBimFiles state\r\n if (building && bimFiles.length === 0) {\r\n setCurrentState('noBimFiles')\r\n return\r\n }\r\n\r\n // We have BIM files, set to loading and start loading them\r\n if (building && bimFiles.length > 0) {\r\n setCurrentState('loading')\r\n setCameraHasMoved(false) // Reset camera moved state for new model\r\n loadBimModels()\r\n }\r\n }, [bimComponents, building, buildingLoading, buildingError, buildingId, filesLoading, bimFiles.length, loadBimModels, hasLoadedModels])\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 handleUploadClick = () => {\r\n fileInputRef.current?.click()\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 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\r\n try {\r\n const modelId = file.name\r\n setCurrentState('loading')\r\n setCameraHasMoved(false) // Reset camera moved state for new upload\r\n await handleFileUpload(file)\r\n\r\n window.dispatchEvent(new CustomEvent('bim-model-loaded-from-file', { detail: { modelId } }))\r\n bimDispatch({\r\n type: 'SET_MODEL', payload: { modelId },\r\n })\r\n setCurrentState('ready')\r\n }\r\n catch (error) {\r\n console.error('Error uploading file:', error)\r\n setCurrentState('error')\r\n }\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 <Building2 className={cn(\"w-4 h-5 text-foreground\", buildingsLoading && \"animate-pulse\")} strokeWidth={2} />\r\n ) : (\r\n <Box 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 === 'loading' ? (\r\n <>\r\n {t('loadingBimModel')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : currentState === 'noBuilding' ? (\r\n <>\r\n {t('noBuilding')}\r\n </>\r\n ) : (\r\n t('noBIMLoaded')\r\n )}\r\n </div>\r\n {(currentState === 'noBimFiles' || currentState === 'noBuilding') && (\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 <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 <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', 'Building')}\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 <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 === 'noBimFiles' && (\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=\".ifc,.frag\"\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={!ability.can('create', 'File')}\r\n >\r\n <Upload className=\"w-4 h-4\" />\r\n {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":["buildings","searchTerm","building","files"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/BimLoadingState/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 { Upload, Box, Building2, Search, X, SquareArrowOutUpRight } from 'lucide-react'\r\nimport { BimContext, BuildingsContext, usePermissions } from '../../../../../store'\r\nimport { LoadModels } from '../LoadModels'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useFilesByBuildingId, useUploadFileToBuilding } from '../../../../../hooks/files/files'\r\nimport { useFileUploadHandler } from '../../../../ui/FilesManager/src/useFileUploadHandler'\r\nimport type { DbFile as 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 { setCameraLookAt } from '../../utils/setCameraLookAt'\r\n\r\nexport type bimViewerState = 'opening' | 'loading' | 'ready' | 'error' | 'noBimFiles' | 'noBuilding'\r\n\r\nexport function BimLoadingState() {\r\n const t = useTranslations('BimLoadingState')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: bimState, dispatch: bimDispatch } = React.useContext(BimContext)\r\n const { bimComponents, world, fragments } = bimState.bim\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) : null)\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 // Upload file hooks\r\n const { uploadFile } = useUploadFileToBuilding(building?.id)\r\n\r\n // Use the reusable upload handler\r\n const { handleFileUpload } = useFileUploadHandler({\r\n buildingId: building?.id,\r\n tag: 'bim-file',\r\n isVisible: true,\r\n uploadFile,\r\n })\r\n\r\n const [currentState, setCurrentState] = React.useState<bimViewerState>('opening')\r\n const [hasLoadedModels, setHasLoadedModels] = React.useState(false)\r\n const [cameraHasMoved, setCameraHasMoved] = React.useState(false)\r\n const isLoadingModelsRef = React.useRef(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 bimFiles: DbFile[] = React.useMemo(() => (\r\n files.filter(file => {\r\n const ext = file?.extension?.toLowerCase()\r\n return ext === 'frag' || ext === 'ifc'\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 // Exact match gets highest score\r\n if (textLower === searchLower) return 1000\r\n // Starts with search term gets high score\r\n if (textLower.startsWith(searchLower)) return 800\r\n // Contains search term gets medium score\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 === 'noBimFiles' || currentState === 'loading' || currentState === 'noBuilding') && !cameraHasMoved\r\n\r\n // Once models have loaded, start a fallback timer to dismiss the card if camera doesn't move\r\n React.useEffect(() => {\r\n if (currentState === 'loading' && hasLoadedModels) {\r\n const fallbackTimer = setTimeout(() => {\r\n setCameraHasMoved(true)\r\n setCurrentState('ready')\r\n }, 5000)\r\n\r\n return () => clearTimeout(fallbackTimer)\r\n }\r\n }, [currentState, hasLoadedModels])\r\n\r\n // Set up camera movement detection\r\n React.useEffect(() => {\r\n if (bimState.bim.world?.camera?.controls) {\r\n const controls = bimState.bim.world.camera.controls\r\n\r\n const handleCameraChange = () => {\r\n setCameraHasMoved(true)\r\n if (hasLoadedModels) {\r\n setCurrentState('ready')\r\n }\r\n }\r\n\r\n // Listen for camera control event (when user moves the camera)\r\n controls.addEventListener('control', handleCameraChange)\r\n\r\n return () => {\r\n controls.removeEventListener('control', handleCameraChange)\r\n }\r\n }\r\n }, [bimState.bim.world, hasLoadedModels])\r\n\r\n const loadBimModels = React.useCallback(async () => {\r\n if (!bimComponents || bimFiles.length === 0) return\r\n if (isLoadingModelsRef.current) return\r\n\r\n isLoadingModelsRef.current = true\r\n\r\n try {\r\n // State should already be 'loading' when this is called\r\n const loadModels = bimComponents.get(LoadModels)\r\n\r\n const {sharing} = setCameraLookAt(world, searchParams)\r\n loadModels.sharing = sharing\r\n\r\n let loadedCount = 0\r\n for (const bimFile of bimFiles) {\r\n try {\r\n await loadModels.load(bimFile.url, bimFile.name)\r\n loadedCount++\r\n // Apply saved 3D position after load (setupModel resets to origin)\r\n if ((bimFile.x != null || bimFile.y != null || bimFile.z != null) && fragments) {\r\n const fragModel = fragments.core.models.list.get(bimFile.name)\r\n if (fragModel) {\r\n fragModel.object.position.set(bimFile.x ?? 0, bimFile.y ?? 0, bimFile.z ?? 0)\r\n if (bimFile.rotation != null) fragModel.object.rotation.y = bimFile.rotation\r\n fragModel.object.updateMatrixWorld(true)\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Error loading BIM file\", bimFile.name, e)\r\n }\r\n }\r\n\r\n // Force update the fragments to render geometry immediately\r\n if (fragments) {\r\n fragments.core.update(true)\r\n }\r\n\r\n // If every file failed to load, surface an error instead of silently\r\n // dismissing the card as though the models were there.\r\n if (loadedCount === 0) {\r\n setCurrentState('error')\r\n return\r\n }\r\n\r\n // Mark each loaded file as visible in the BIM store so ModelsSection reflects it\r\n for (const bimFile of bimFiles) {\r\n bimDispatch({ type: 'SET_MODEL_UI_STATE', payload: { fileId: bimFile.id, isVisible: true } })\r\n }\r\n\r\n // Signal that models have loaded — the fallback timer will dismiss the card\r\n setHasLoadedModels(true)\r\n } catch (error) {\r\n console.error('Error loading BIM models:', error)\r\n setCurrentState('error')\r\n } finally {\r\n isLoadingModelsRef.current = false\r\n }\r\n }, [bimComponents, bimFiles, fragments])\r\n\r\n // Handle initial state transitions\r\n React.useEffect(() => {\r\n // If no bimComponents available, stay in opening state\r\n if (!bimComponents) {\r\n setCurrentState('opening')\r\n setHasLoadedModels(false)\r\n return\r\n }\r\n\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 setHasLoadedModels(false)\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've already loaded models (or are currently loading), don't reload\r\n if (hasLoadedModels) {\r\n return\r\n }\r\n\r\n // If we have a building but no BIM files, show noBimFiles state\r\n if (building && bimFiles.length === 0) {\r\n setCurrentState('noBimFiles')\r\n return\r\n }\r\n\r\n // We have BIM files, set to loading and start loading them\r\n if (building && bimFiles.length > 0) {\r\n setCurrentState('loading')\r\n setCameraHasMoved(false) // Reset camera moved state for new model\r\n loadBimModels()\r\n }\r\n }, [bimComponents, building, buildingLoading, buildingError, buildingId, filesLoading, bimFiles.length, loadBimModels, hasLoadedModels])\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 handleUploadClick = () => {\r\n fileInputRef.current?.click()\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 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\r\n try {\r\n const modelId = file.name\r\n setCurrentState('loading')\r\n setCameraHasMoved(false) // Reset camera moved state for new upload\r\n await handleFileUpload(file)\r\n\r\n window.dispatchEvent(new CustomEvent('bim-model-loaded-from-file', { detail: { modelId } }))\r\n bimDispatch({\r\n type: 'SET_MODEL', payload: { modelId },\r\n })\r\n setCurrentState('ready')\r\n }\r\n catch (error) {\r\n console.error('Error uploading file:', error)\r\n setCurrentState('error')\r\n }\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 <Building2 className={cn(\"w-4 h-5 text-foreground\", buildingsLoading && \"animate-pulse\")} strokeWidth={2} />\r\n ) : (\r\n <Box 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 === 'loading' ? (\r\n <>\r\n {t('loadingBimModel')}\r\n <LoadingSpinner size={20} />\r\n </>\r\n ) : currentState === 'noBuilding' ? (\r\n <>\r\n {t('noBuilding')}\r\n </>\r\n ) : (\r\n t('noBIMLoaded')\r\n )}\r\n </div>\r\n {(currentState === 'noBimFiles' || currentState === 'noBuilding') && (\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 <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 <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', 'Building')}\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 <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 === 'noBimFiles' && (\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=\".ifc,.frag\"\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={!ability.can('create', 'File')}\r\n >\r\n <Upload className=\"w-4 h-4\" />\r\n {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":["buildings","searchTerm","building","files"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LenghtMeasurement.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAK3C,qBAAa,iBAAkB,SAAQ,GAAG,CAAC,SAAS;IAEhD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,OAAO,CAAC,QAAQ,CAAqC;IAErD,OAAO,CAAC,KAAK,CAAyB;IAEtC,QAAQ,CAAC,iBAAiB;gBAA2B,MAAM;OAAK;gBAEpD,UAAU,EAAE,GAAG,CAAC,UAAU;IActC,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,wBAAwB;IAahC,sBAAsB;IAStB,sBAAsB;IAStB,MAAM;IAQN,MAAM;IAQN,SAAS;IAST,YAAY;IAUZ,OAAO;CAUV"}
1
+ {"version":3,"file":"LenghtMeasurement.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAK3C,qBAAa,iBAAkB,SAAQ,GAAG,CAAC,SAAS;IAEhD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,OAAO,CAAC,QAAQ,CAAqC;IAErD,OAAO,CAAC,KAAK,CAAyB;IAEtC,QAAQ,CAAC,iBAAiB;gBAA2B,MAAM;OAAK;gBAEpD,UAAU,EAAE,GAAG,CAAC,UAAU;IActC,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,wBAAwB;IAahC,sBAAsB;IAStB,sBAAsB;IAStB,MAAM;IAQN,MAAM;IAQN,SAAS;IAST,YAAY;IAUZ,OAAO;CAUV"}