@collabdt/core 0.0.51 → 0.0.54

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/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Source, Layer, Popup } from \"react-map-gl/maplibre\";\r\nimport type { MapMouseEvent } from \"maplibre-gl\";\r\n\r\nimport { MapContext } from \"../../../../../../../../store/Map/context\";\r\nimport type { Building } from '../../../../../../../../types/dbTypes';\r\nimport { DatasetsContext } from '../../../../../../../../store';\r\nimport { MapLayerClickPriority } from \"../../../../../utils/MapEventManager/MapClickManager\";\r\nimport MapFeaturePopoverMenu from \"../../../../MapFeaturePopoverMenu\";\r\nimport { fitGeoJsonBounds } from \"../../../../../utils/fitGeojsonBounds\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { WmsTimeControl } from \"./WmsTimeControl\";\r\nimport { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from \"../../../../../datasets/src/wmsTime\";\r\n\r\ninterface BuildingDataset {\r\n \"type\": \"buildings\";\r\n \"data\": Building[];\r\n \"name\": string;\r\n \"visible\"?: boolean;\r\n}\r\n\r\nconst isBuildingDataset = (dataset: any): dataset is BuildingDataset => {\r\n return dataset.type === \"buildings\" && \"data\" in dataset;\r\n};\r\n\r\nconst parseNumericValue = (value: unknown): number | null => {\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value !== 'string') return null;\r\n const cleaned = value.replace(/[$%\\s]/g, '').replace(/,/g, '');\r\n const parsed = Number.parseFloat(cleaned);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n};\r\n\r\nconst computeMinMax = (\r\n features: import('geojson').Feature[],\r\n fieldName: string,\r\n): { min: number; max: number } | null => {\r\n let min = Number.POSITIVE_INFINITY;\r\n let max = Number.NEGATIVE_INFINITY;\r\n let found = false;\r\n for (const feature of features) {\r\n const properties = (feature.properties || {}) as Record<string, unknown>;\r\n const value = parseNumericValue(properties[fieldName]);\r\n if (value === null) continue;\r\n found = true;\r\n if (value < min) min = value;\r\n if (value > max) max = value;\r\n }\r\n if (!found) return null;\r\n return { min, max: max === min ? min + 1 : max };\r\n};\r\n\r\n// ─── Per-dataset GeoJSON layer ────────────────────────────────────────\r\n// Each dataset manages its own fetch lifecycle. This means:\r\n// • datasets render PROGRESSIVELY as each one loads (no blocking)\r\n// • unmounting a dataset cancels only ITS fetch\r\n// • re-renders of one dataset never cancel fetches for another\r\n\r\ninterface GeoJsonDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst GeoJsonDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: GeoJsonDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const [featureCollection, setFeatureCollection] = React.useState<import('geojson').FeatureCollection | null>(null);\r\n const fitBoundsAppliedRef = React.useRef(false);\r\n\r\n // Fetch features once when the component mounts (or dataset identity changes)\r\n React.useEffect(() => {\r\n if (!map) return;\r\n let cancelled = false;\r\n\r\n const load = async () => {\r\n try {\r\n const fetched = await dataset.getFeatures();\r\n if (cancelled) return;\r\n\r\n const fc: import('geojson').FeatureCollection =\r\n fetched?.type === 'FeatureCollection'\r\n ? fetched\r\n : { type: 'FeatureCollection', features: [] };\r\n\r\n setFeatureCollection(fc);\r\n } catch (error) {\r\n console.error(`OpenDataLayers: Error fetching features for \"${dataset.name}\":`, error);\r\n }\r\n };\r\n\r\n load();\r\n return () => { cancelled = true; };\r\n }, [map, dataset.name]);\r\n\r\n // Build the layer JSX from the loaded feature collection\r\n const layerContent = React.useMemo(() => {\r\n if (!featureCollection || featureCollection.features.length === 0) return null;\r\n\r\n const geometryType = featureCollection.features[0]?.geometry?.type;\r\n if (!geometryType) return null;\r\n\r\n // ── colour resolution ──\r\n let layerColor: any = dataset.layerColor?.color || '#0d9488';\r\n let numericFieldName: string | undefined;\r\n\r\n if (dataset.selectedFieldName) {\r\n const selectedField = dataset.fields?.find((field: any) => field.name === dataset.selectedFieldName);\r\n if (selectedField?.layerColor) {\r\n if (selectedField.colorType === 'single') {\r\n layerColor = selectedField.layerColor.color;\r\n }\r\n if (selectedField.colorType === 'minMax') {\r\n try {\r\n const fieldName = dataset.selectedFieldName;\r\n numericFieldName = `__numeric_${fieldName}`;\r\n const range = computeMinMax(featureCollection.features, fieldName);\r\n if (range) {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n layerColor = [\r\n 'interpolate', ['linear'],\r\n ['to-number', ['get', numericFieldName], range.min],\r\n range.min, minColor,\r\n range.max, maxColor,\r\n ];\r\n }\r\n } catch (error) {\r\n console.warn('Failed to build interpolate for field', dataset.selectedFieldName, error);\r\n }\r\n }\r\n if (selectedField.colorType === 'boolean') {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n const fieldName = dataset.selectedFieldName;\r\n layerColor = [\r\n 'case',\r\n ['any',\r\n ['==', ['get', fieldName], true],\r\n ['==', ['get', fieldName], 1],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'true'],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'yes'],\r\n ],\r\n maxColor,\r\n minColor,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n // ── inject datasetName + numeric shadow field into each feature ──\r\n const enrichedFC: import('geojson').FeatureCollection = {\r\n ...featureCollection,\r\n features: featureCollection.features.map((feature) => {\r\n let numericVal: number | undefined;\r\n if (numericFieldName && dataset.selectedFieldName) {\r\n const v = parseNumericValue((feature.properties || {})[dataset.selectedFieldName]);\r\n if (v !== null) numericVal = v;\r\n }\r\n return {\r\n ...feature,\r\n properties: {\r\n ...feature.properties,\r\n datasetName: dataset.name,\r\n layer_color: layerColor,\r\n ...(numericFieldName && numericVal !== undefined ? { [numericFieldName]: numericVal } : {}),\r\n },\r\n };\r\n }),\r\n };\r\n\r\n // ── build layer props per geometry type ──\r\n const registeredIds: string[] = [];\r\n\r\n if (geometryType === 'Point' || geometryType === 'MultiPoint') {\r\n const paint = {\r\n 'circle-radius': 6,\r\n 'circle-color': layerColor,\r\n 'circle-opacity': 0.8,\r\n 'circle-stroke-width': 2,\r\n 'circle-stroke-color': '#ffffff',\r\n };\r\n registeredIds.push(`${dataset.name}-unclustered-point`);\r\n\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n cluster={true}\r\n clusterMaxZoom={11}\r\n clusterRadius={50}\r\n >\r\n <Layer\r\n id={`${dataset.name}-clusters`}\r\n filter={['has', 'point_count']}\r\n type=\"circle\"\r\n paint={{\r\n 'circle-color': dataset.layerColor?.color || '#0d9488',\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n 'circle-opacity': 0.9,\r\n }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-cluster-count`}\r\n filter={['has', 'point_count']}\r\n type=\"symbol\"\r\n layout={{\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n }}\r\n paint={{ 'text-color': '#fff' }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-unclustered-point`}\r\n filter={['!', ['has', 'point_count']]}\r\n type=\"circle\"\r\n paint={paint}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'LineString' || geometryType === 'MultiLineString') {\r\n const mainId = `${dataset.name}-line`;\r\n registeredIds.push(mainId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={mainId}\r\n type=\"line\"\r\n paint={{ 'line-color': layerColor, 'line-width': 3, 'line-opacity': 1 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {\r\n const fillId = `${dataset.name}-fill`;\r\n const outlineId = `${dataset.name}-outline`;\r\n registeredIds.push(fillId, outlineId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={fillId}\r\n type=\"fill\"\r\n paint={{ 'fill-color': layerColor, 'fill-opacity': 0.5 }}\r\n />\r\n <Layer\r\n id={outlineId}\r\n type=\"line\"\r\n paint={{ 'line-color': '#ffffff', 'line-width': 2 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }, [featureCollection, dataset.name, dataset.layerColor, dataset.selectedFieldName, dataset.fields, index]);\r\n\r\n // Register / unregister interactive layer IDs with the parent\r\n React.useEffect(() => {\r\n if (layerContent?.registeredIds) {\r\n onLayerReady(dataset.name, layerContent.registeredIds);\r\n }\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [layerContent?.registeredIds, dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n return layerContent?.jsx ?? null;\r\n});\r\nGeoJsonDatasetLayer.displayName = 'GeoJsonDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset MVT layer ────────────────────────────────────────────\r\n\r\ninterface MVTDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst MVTDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: MVTDatasetLayerProps) => {\r\n const tileUrl = dataset.url || dataset.information;\r\n const sourceLayer = (dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name.toLowerCase().replace(/\\s+/g, '_');\r\n const layerColor = dataset.layerColor?.color || '#0d9488';\r\n const isPointLayer = dataset.layerType === 'circle' || /point/i.test(sourceLayer);\r\n const isMartinBuilding = /buildings?/i.test((dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name);\r\n // Only extrude actual building layers. A polygon dataset resolves to layerType\r\n // 'fill', so keying extrusion off 'fill' alone routed every polygon (e.g. published\r\n // open-data boundaries) into the zero-height, minzoom-15.5 extrusion branch — leaving\r\n // only the outline visible. Non-building polygons fall through to the flat-fill branch.\r\n const extraIsBuilding = isMartinBuilding && !isPointLayer;\r\n\r\n const mainLayerId = isPointLayer\r\n ? `${dataset.name}-points`\r\n : extraIsBuilding\r\n ? `${dataset.name}-extrusion`\r\n : `${dataset.name}-fill`;\r\n const outlineLayerId = `${dataset.name}-outline`;\r\n\r\n // Register interactive layer IDs\r\n React.useEffect(() => {\r\n const ids = isPointLayer ? [mainLayerId] : [mainLayerId, outlineLayerId];\r\n onLayerReady(dataset.name, ids);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, mainLayerId, outlineLayerId, isPointLayer, onLayerReady, onLayerRemoved]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for MVT dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n if (extraIsBuilding) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"fill-extrusion\" source-layer={sourceLayer}\r\n paint={{\r\n 'fill-extrusion-color': layerColor,\r\n 'fill-extrusion-height': ['coalesce', ['to-number', ['get', 'heightmax']], 0],\r\n 'fill-extrusion-opacity': 0.8,\r\n }}\r\n minzoom={15.5}\r\n />\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': layerColor, 'line-width': 1, 'line-opacity': 0.8 }} />\r\n </Source>\r\n );\r\n }\r\n\r\n if (isPointLayer) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"circle\" source-layer={sourceLayer}\r\n paint={{ 'circle-radius': 6, 'circle-color': layerColor, 'circle-opacity': 0.8, 'circle-stroke-width': 2, 'circle-stroke-color': '#ffffff' }}\r\n />\r\n </Source>\r\n );\r\n }\r\n\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer id={mainLayerId} type=\"fill\" source-layer={sourceLayer} paint={{ 'fill-color': layerColor, 'fill-opacity': 0.6 }} />\r\n {/* White outline (matches the original GeoJSON polygon style) so subdivision\r\n boundaries stay legible — a same-colour outline read as one solid blob. */}\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': '#ffffff', 'line-width': 2 }} />\r\n </Source>\r\n );\r\n});\r\nMVTDatasetLayer.displayName = 'MVTDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset WMS raster layer ─────────────────────────────────────\r\n// Live/federated WMS overlays (e.g. the GeoMet weather radar). The dataset's\r\n// `url` is a MapLibre raster tile template (GetMap with a literal\r\n// {bbox-epsg-3857}); MapLibre fetches tiles directly, so there's nothing to\r\n// parse and no features to query (raster → not interactive).\r\n\r\ninterface WMSDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst WMSDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: WMSDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const tileUrl = dataset.url || dataset.information;\r\n const layerId = `${dataset.name}-wms`;\r\n const sourceId = `${dataset.name}-source`;\r\n\r\n const timeEnabled = !!dataset.timeEnabled && !!dataset.wms;\r\n const [frames, setFrames] = React.useState<string[]>([]);\r\n const [activeTime, setActiveTime] = React.useState<string | null>(null);\r\n // The bottom-left overlay stack's portal slot (MapViewer renders it). Resolved\r\n // in an effect so the node exists (post-commit) before we portal into it.\r\n const [controlSlot, setControlSlot] = React.useState<HTMLElement | null>(null);\r\n React.useEffect(() => {\r\n if (timeEnabled) setControlSlot(document.getElementById('wms-time-slot'));\r\n }, [timeEnabled]);\r\n\r\n // Register with no interactive layer ids — a raster has no queryable features.\r\n React.useEffect(() => {\r\n onLayerReady(dataset.name, []);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n // Load the WMS time extent once (time-enabled datasets only).\r\n React.useEffect(() => {\r\n if (!timeEnabled || !dataset.wms) return;\r\n let cancelled = false;\r\n fetchWmsFrames(dataset.wms.baseUrl, dataset.wms.layers)\r\n .then(f => { if (!cancelled) setFrames(f); })\r\n .catch(() => { /* fetchWmsFrames already swallows; keep static */ });\r\n return () => { cancelled = true; };\r\n }, [timeEnabled, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n // Imperatively swap the raster source's tiles per frame. The <Source tiles>\r\n // prop below never changes after mount, so there's no react-map-gl tug-of-war\r\n // and no flicker — this setTiles call is the single source of truth for TIME.\r\n React.useEffect(() => {\r\n if (!map || !activeTime || !dataset.wms) return;\r\n const src = map.getSource(sourceId) as { setTiles?: (t: string[]) => void } | undefined;\r\n if (src?.setTiles) {\r\n src.setTiles([buildWmsTimeUrl(dataset.wms.baseUrl, dataset.wms.layers, activeTime)]);\r\n }\r\n }, [map, activeTime, sourceId, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for WMS dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n const showControl = timeEnabled && frames.length > 1 && map && controlSlot;\r\n\r\n return (\r\n <>\r\n <Source id={sourceId} key={`${index}-${dataset.name}-source`} type=\"raster\" tiles={[tileUrl]} tileSize={256}>\r\n <Layer id={layerId} type=\"raster\" paint={{ 'raster-opacity': 0.85 }} />\r\n </Source>\r\n {showControl && createPortal(\r\n <WmsTimeControl\r\n frames={frames}\r\n onTimeChange={setActiveTime}\r\n label={dataset.name}\r\n legendUrl={dataset.wms ? wmsLegendUrl(dataset.wms.baseUrl, dataset.wms.layers) : undefined}\r\n />,\r\n controlSlot,\r\n )}\r\n </>\r\n );\r\n});\r\nWMSDatasetLayer.displayName = 'WMSDatasetLayer';\r\n\r\n\r\n// ─── Main orchestrator ────────────────────────────────────────────────\r\n\r\nexport const OpenDataLayers = () => {\r\n const { \"state\": mapState, \"dispatch\": mapDispatch } = React.useContext(MapContext);\r\n const { map, mapClickManager } = mapState.map;\r\n\r\n const { state: datasetState } = React.useContext(DatasetsContext);\r\n const { addedDatasets } = datasetState.datasets;\r\n\r\n const [clickedFeature, setClickedFeature] = React.useState<any>(null);\r\n const [addedFeaturesPopup, setAddedFeaturesPopup] = React.useState<Array<{\r\n id: string | number;\r\n popup: React.ReactElement;\r\n }>>([]);\r\n\r\n // Track interactive layer IDs per dataset for click handling\r\n const layerIdsMapRef = React.useRef<Record<string, string[]>>({});\r\n const [allLayerNames, setAllLayerNames] = React.useState<string[]>([]);\r\n\r\n const handleLayerReady = React.useCallback((datasetName: string, layerIds: string[]) => {\r\n layerIdsMapRef.current[datasetName] = layerIds;\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n const handleLayerRemoved = React.useCallback((datasetName: string) => {\r\n delete layerIdsMapRef.current[datasetName];\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n // ── Click handling ──\r\n React.useEffect(() => {\r\n if (!map || !mapClickManager || allLayerNames.length === 0) return;\r\n\r\n const handleMapClick = (e: MapMouseEvent) => {\r\n const clicked = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n const localClickedFeature = clicked?.[0];\r\n\r\n if (!localClickedFeature) {\r\n setClickedFeature(null);\r\n return;\r\n }\r\n\r\n const lng = e.lngLat.lng;\r\n const lat = e.lngLat.lat;\r\n const coordinates = [lng, lat];\r\n const properties = localClickedFeature.properties || {};\r\n const _name = Object.entries(properties).find(([key]) => key.toLowerCase().includes('name'))?.[1] || undefined;\r\n\r\n let datasetNameFromFeature = properties.datasetName;\r\n if (!datasetNameFromFeature && localClickedFeature.layer) {\r\n const layerId = localClickedFeature.layer.id;\r\n const suffixes = ['-unclustered-point', '-clusters', '-cluster-count', '-outline', '-fill', '-line', '-circle', '-extrusion', '-points'];\r\n let extractedName = layerId;\r\n for (const suffix of suffixes) {\r\n if (layerId.endsWith(suffix)) {\r\n extractedName = layerId.slice(0, -suffix.length);\r\n break;\r\n }\r\n }\r\n if (extractedName === layerId && layerId.includes('-')) {\r\n extractedName = layerId.slice(0, layerId.lastIndexOf('-'));\r\n }\r\n datasetNameFromFeature = extractedName;\r\n }\r\n\r\n const featureId = properties.globalid || properties.id || `temp-${Date.now()}`;\r\n localClickedFeature.id = featureId;\r\n localClickedFeature.properties = { ...properties, coordinates, _name, datasetName: datasetNameFromFeature };\r\n setClickedFeature(localClickedFeature);\r\n };\r\n\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.register(layerId, MapLayerClickPriority.OpenDataLayerClickPriority, handleMapClick);\r\n }\r\n\r\n return () => {\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.unregister(layerId);\r\n }\r\n };\r\n }, [map, mapClickManager, allLayerNames]);\r\n\r\n // ── Hover cursor handling ──\r\n React.useEffect(() => {\r\n if (!map) return;\r\n\r\n const canvas = map.getCanvas();\r\n\r\n const setDefaultCursor = () => {\r\n canvas.style.cursor = 'default';\r\n };\r\n\r\n if (allLayerNames.length === 0) {\r\n setDefaultCursor();\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MapMouseEvent) => {\r\n const hoveredFeatures = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n canvas.style.cursor = hoveredFeatures.length > 0 ? 'pointer' : 'default';\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setDefaultCursor();\r\n };\r\n\r\n map.on('mousemove', handleMouseMove);\r\n map.on('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n map.off('mousemove', handleMouseMove);\r\n map.off('mouseleave', handleMouseLeave);\r\n setDefaultCursor();\r\n };\r\n }, [map, allLayerNames]);\r\n\r\n // ── Popup ──\r\n React.useEffect(() => {\r\n if (!clickedFeature || !clickedFeature.properties?.coordinates) {\r\n setAddedFeaturesPopup([]);\r\n return;\r\n }\r\n const popup = (\r\n <Popup\r\n anchor=\"bottom\"\r\n closeButton={true}\r\n closeOnClick={false}\r\n closeOnMove={false}\r\n focusAfterOpen={true}\r\n key={clickedFeature.id}\r\n latitude={clickedFeature.properties.coordinates[1]}\r\n longitude={clickedFeature.properties.coordinates[0]}\r\n >\r\n <MapFeaturePopoverMenu\r\n feature={clickedFeature}\r\n onCloseAction={() => clearClickedFeature()}\r\n />\r\n </Popup>\r\n );\r\n setAddedFeaturesPopup([{ id: clickedFeature.id as string | number, popup }]);\r\n }, [clickedFeature]);\r\n\r\n function clearClickedFeature() {\r\n mapDispatch({ type: \"SET_CLICKED_FEATURE\", payload: { clickedFeature: null } });\r\n setClickedFeature(null);\r\n }\r\n\r\n // ── Sort datasets by display order ──\r\n const sortedDatasets = React.useMemo(() => {\r\n if (!addedDatasets?.length) return [];\r\n return [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }, [addedDatasets]);\r\n\r\n return (\r\n <>\r\n {sortedDatasets.map((dataset, index) => {\r\n if (dataset.visible === false) return null;\r\n if (isBuildingDataset(dataset)) return null;\r\n\r\n if (dataset.type === 'WMS' || dataset.datasetType === 'WMS') {\r\n return (\r\n <WMSDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n if (dataset.type === 'MVT' || dataset.datasetType === 'MVT') {\r\n return (\r\n <MVTDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <GeoJsonDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n })}\r\n\r\n {addedFeaturesPopup.map((popup) => (\r\n <React.Fragment key={popup.id}>{popup.popup}</React.Fragment>\r\n ))}\r\n </>\r\n );\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+LoB,SA6PZ,UApPgB,KATJ;AA7LpB,YAAY,WAAW;AACvB,SAAS,QAAQ,OAAO,aAAa;AAGrC,SAAS,kBAAkB;AAE3B,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,OAAO,2BAA2B;AAElC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB,iBAAiB,oBAAoB;AAS9D,MAAM,oBAAoB,CAAC,YAA6C;AACpE,SAAO,QAAQ,SAAS,eAAe,UAAU;AACrD;AAEA,MAAM,oBAAoB,CAAC,UAAkC;AACzD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,EAAE,QAAQ,MAAM,EAAE;AAC7D,QAAM,SAAS,OAAO,WAAW,OAAO;AACxC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,MAAM,gBAAgB,CAClB,UACA,cACsC;AACtC,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,OAAO;AACjB,MAAI,QAAQ;AACZ,aAAW,WAAW,UAAU;AAC5B,UAAM,aAAc,QAAQ,cAAc,CAAC;AAC3C,UAAM,QAAQ,kBAAkB,WAAW,SAAS,CAAC;AACrD,QAAI,UAAU,KAAM;AACpB,YAAQ;AACR,QAAI,QAAQ,IAAK,OAAM;AACvB,QAAI,QAAQ,IAAK,OAAM;AAAA,EAC3B;AACA,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,KAAK,KAAK,QAAQ,MAAM,MAAM,IAAI,IAAI;AACnD;AAeA,MAAM,sBAAsB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAAgC;AAnEvH;AAoEI,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAqD,IAAI;AACjH,QAAM,sBAAsB,MAAM,OAAO,KAAK;AAG9C,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AACV,QAAI,YAAY;AAEhB,UAAM,OAAO,YAAY;AACrB,UAAI;AACA,cAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,YAAI,UAAW;AAEf,cAAM,MACF,mCAAS,UAAS,sBACZ,UACA,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE;AAEpD,6BAAqB,EAAE;AAAA,MAC3B,SAAS,OAAO;AACZ,gBAAQ,MAAM,gDAAgD,QAAQ,IAAI,MAAM,KAAK;AAAA,MACzF;AAAA,IACJ;AAEA,SAAK;AACL,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACrC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC;AAGtB,QAAM,eAAe,MAAM,QAAQ,MAAM;AApG7C,QAAAA,KAAA;AAqGQ,QAAI,CAAC,qBAAqB,kBAAkB,SAAS,WAAW,EAAG,QAAO;AAE1E,UAAM,gBAAe,MAAAA,MAAA,kBAAkB,SAAS,CAAC,MAA5B,gBAAAA,IAA+B,aAA/B,mBAAyC;AAC9D,QAAI,CAAC,aAAc,QAAO;AAG1B,QAAI,eAAkB,aAAQ,eAAR,mBAAoB,UAAS;AACnD,QAAI;AAEJ,QAAI,QAAQ,mBAAmB;AAC3B,YAAM,iBAAgB,aAAQ,WAAR,mBAAgB,KAAK,CAAC,UAAe,MAAM,SAAS,QAAQ;AAClF,UAAI,+CAAe,YAAY;AAC3B,YAAI,cAAc,cAAc,UAAU;AACtC,uBAAa,cAAc,WAAW;AAAA,QAC1C;AACA,YAAI,cAAc,cAAc,UAAU;AACtC,cAAI;AACA,kBAAM,YAAY,QAAQ;AAC1B,+BAAmB,aAAa,SAAS;AACzC,kBAAM,QAAQ,cAAc,kBAAkB,UAAU,SAAS;AACjE,gBAAI,OAAO;AACP,oBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,oBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,2BAAa;AAAA,gBACT;AAAA,gBAAe,CAAC,QAAQ;AAAA,gBACxB,CAAC,aAAa,CAAC,OAAO,gBAAgB,GAAG,MAAM,GAAG;AAAA,gBAClD,MAAM;AAAA,gBAAK;AAAA,gBACX,MAAM;AAAA,gBAAK;AAAA,cACf;AAAA,YACJ;AAAA,UACJ,SAAS,OAAO;AACZ,oBAAQ,KAAK,yCAAyC,QAAQ,mBAAmB,KAAK;AAAA,UAC1F;AAAA,QACJ;AACA,YAAI,cAAc,cAAc,WAAW;AACvC,gBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,gBAAM,WAAW,cAAc,WAAW,cAAY,aAAQ,eAAR,mBAAoB,eAAY,aAAQ,eAAR,mBAAoB,UAAS;AACnH,gBAAM,YAAY,QAAQ;AAC1B,uBAAa;AAAA,YACT;AAAA,YACA;AAAA,cAAC;AAAA,cACG,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,IAAI;AAAA,cAC/B,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,CAAC;AAAA,cAC5B,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,MAAM;AAAA,cAC9D,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK;AAAA,YACjE;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,aAAkD,iCACjD,oBADiD;AAAA,MAEpD,UAAU,kBAAkB,SAAS,IAAI,CAAC,YAAY;AAClD,YAAI;AACJ,YAAI,oBAAoB,QAAQ,mBAAmB;AAC/C,gBAAM,IAAI,mBAAmB,QAAQ,cAAc,CAAC,GAAG,QAAQ,iBAAiB,CAAC;AACjF,cAAI,MAAM,KAAM,cAAa;AAAA,QACjC;AACA,eAAO,iCACA,UADA;AAAA,UAEH,YAAY,gDACL,QAAQ,aADH;AAAA,YAER,aAAa,QAAQ;AAAA,YACrB,aAAa;AAAA,cACT,oBAAoB,eAAe,SAAY,EAAE,CAAC,gBAAgB,GAAG,WAAW,IAAI,CAAC;AAAA,QAEjG;AAAA,MACJ,CAAC;AAAA,IACL;AAGA,UAAM,gBAA0B,CAAC;AAEjC,QAAI,iBAAiB,WAAW,iBAAiB,cAAc;AAC3D,YAAM,QAAQ;AAAA,QACV,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,MAC3B;AACA,oBAAc,KAAK,GAAG,QAAQ,IAAI,oBAAoB;AAEtD,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe;AAAA,YAEf;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,OAAO,aAAa;AAAA,kBAC7B,MAAK;AAAA,kBACL,OAAO;AAAA,oBACH,kBAAgB,aAAQ,eAAR,mBAAoB,UAAS;AAAA,oBAC7C,iBAAiB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,oBACtE,kBAAkB;AAAA,kBACtB;AAAA;AAAA,cACJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,OAAO,aAAa;AAAA,kBAC7B,MAAK;AAAA,kBACL,QAAQ;AAAA,oBACJ,cAAc;AAAA,oBACd,aAAa,CAAC,uBAAuB,uBAAuB;AAAA,oBAC5D,aAAa;AAAA,kBACjB;AAAA,kBACA,OAAO,EAAE,cAAc,OAAO;AAAA;AAAA,cAClC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI,GAAG,QAAQ,IAAI;AAAA,kBACnB,QAAQ,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC;AAAA,kBACpC,MAAK;AAAA,kBACL;AAAA;AAAA,cACJ;AAAA;AAAA;AAAA,UAjCK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QAkCjC;AAAA,MAER;AAAA,IACJ;AAEA,QAAI,iBAAiB,gBAAgB,iBAAiB,mBAAmB;AACrE,YAAM,SAAS,GAAG,QAAQ,IAAI;AAC9B,oBAAc,KAAK,MAAM;AACzB,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YAEN;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,OAAO,EAAE,cAAc,YAAY,cAAc,GAAG,gBAAgB,EAAE;AAAA;AAAA,YAC1E;AAAA;AAAA,UARK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QASjC;AAAA,MAER;AAAA,IACJ;AAEA,QAAI,iBAAiB,aAAa,iBAAiB,gBAAgB;AAC/D,YAAM,SAAS,GAAG,QAAQ,IAAI;AAC9B,YAAM,YAAY,GAAG,QAAQ,IAAI;AACjC,oBAAc,KAAK,QAAQ,SAAS;AACpC,aAAO;AAAA,QACH;AAAA,QACA,KACI;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,QAAQ,IAAI;AAAA,YAEnB,MAAK;AAAA,YACL,MAAM;AAAA,YAEN;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,OAAO,EAAE,cAAc,YAAY,gBAAgB,IAAI;AAAA;AAAA,cAC3D;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,IAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,OAAO,EAAE,cAAc,WAAW,cAAc,EAAE;AAAA;AAAA,cACtD;AAAA;AAAA;AAAA,UAbK,GAAG,KAAK,IAAI,QAAQ,IAAI;AAAA,QAcjC;AAAA,MAER;AAAA,IACJ;AAEA,WAAO;AAAA,EACX,GAAG,CAAC,mBAAmB,QAAQ,MAAM,QAAQ,YAAY,QAAQ,mBAAmB,QAAQ,QAAQ,KAAK,CAAC;AAG1G,QAAM,UAAU,MAAM;AAClB,QAAI,6CAAc,eAAe;AAC7B,mBAAa,QAAQ,MAAM,aAAa,aAAa;AAAA,IACzD;AACA,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,6CAAc,eAAe,QAAQ,MAAM,cAAc,cAAc,CAAC;AAE5E,UAAO,kDAAc,QAAd,YAAqB;AAChC,CAAC;AACD,oBAAoB,cAAc;AAYlC,MAAM,kBAAkB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAA4B;AAnT/G;AAoTI,QAAM,UAAU,QAAQ,OAAO,QAAQ;AACvC,QAAM,gBAAe,wCAAiB,gBAAjB,mBAA8B,gBAAe,QAAQ,MAAM,QAAQ,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC9H,QAAM,eAAa,aAAQ,eAAR,mBAAoB,UAAS;AAChD,QAAM,eAAe,QAAQ,cAAc,YAAY,SAAS,KAAK,WAAW;AAChF,QAAM,mBAAmB,cAAc,OAAM,wCAAiB,gBAAjB,mBAA8B,gBAAe,QAAQ,MAAM,QAAQ,IAAI;AAKpH,QAAM,kBAAkB,oBAAoB,CAAC;AAE7C,QAAM,cAAc,eACd,GAAG,QAAQ,IAAI,YACf,kBACI,GAAG,QAAQ,IAAI,eACf,GAAG,QAAQ,IAAI;AACzB,QAAM,iBAAiB,GAAG,QAAQ,IAAI;AAGtC,QAAM,UAAU,MAAM;AAClB,UAAM,MAAM,eAAe,CAAC,WAAW,IAAI,CAAC,aAAa,cAAc;AACvE,iBAAa,QAAQ,MAAM,GAAG;AAC9B,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,QAAQ,MAAM,aAAa,gBAAgB,cAAc,cAAc,cAAc,CAAC;AAE1F,MAAI,CAAC,SAAS;AACV,YAAQ,MAAM,6DAAwD,QAAQ,IAAI,GAAG;AACrF,WAAO;AAAA,EACX;AAEA,MAAI,iBAAiB;AACjB,WACI,qBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,IAAI;AAAA,UAAa,MAAK;AAAA,UAAiB,gBAAc;AAAA,UACrD,OAAO;AAAA,YACH,wBAAwB;AAAA,YACxB,yBAAyB,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC;AAAA,YAC5E,0BAA0B;AAAA,UAC9B;AAAA,UACA,SAAS;AAAA;AAAA,MACb;AAAA,MACA,oBAAC,SAAM,IAAI,gBAAgB,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,YAAY,cAAc,GAAG,gBAAgB,IAAI,GAAG;AAAA,SAVtG,GAAG,KAAK,IAAI,QAAQ,IAAI,SAWnE;AAAA,EAER;AAEA,MAAI,cAAc;AACd,WACI,oBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA,MAAC;AAAA;AAAA,QACG,IAAI;AAAA,QAAa,MAAK;AAAA,QAAS,gBAAc;AAAA,QAC7C,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,YAAY,kBAAkB,KAAK,uBAAuB,GAAG,uBAAuB,UAAU;AAAA;AAAA,IAC/I,KAJuC,GAAG,KAAK,IAAI,QAAQ,IAAI,SAKnE;AAAA,EAER;AAEA,SACI,qBAAC,UAAO,IAAI,GAAG,QAAQ,IAAI,WAAmD,MAAK,UAAS,OAAO,CAAC,OAAO,GACvG;AAAA,wBAAC,SAAM,IAAI,aAAa,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,YAAY,gBAAgB,IAAI,GAAG;AAAA,IAGzH,oBAAC,SAAM,IAAI,gBAAgB,MAAK,QAAO,gBAAc,aAAa,OAAO,EAAE,cAAc,WAAW,cAAc,EAAE,GAAG;AAAA,OAJhF,GAAG,KAAK,IAAI,QAAQ,IAAI,SAKnE;AAER,CAAC;AACD,gBAAgB,cAAc;AAgB9B,MAAM,kBAAkB,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,cAAc,eAAe,MAA4B;AAvY/G;AAwYI,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,QAAM,UAAU,QAAQ,OAAO,QAAQ;AACvC,QAAM,UAAU,GAAG,QAAQ,IAAI;AAC/B,QAAM,WAAW,GAAG,QAAQ,IAAI;AAEhC,QAAM,cAAc,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ;AACvD,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAmB,CAAC,CAAC;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAwB,IAAI;AAGtE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAA6B,IAAI;AAC7E,QAAM,UAAU,MAAM;AAClB,QAAI,YAAa,gBAAe,SAAS,eAAe,eAAe,CAAC;AAAA,EAC5E,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,UAAU,MAAM;AAClB,iBAAa,QAAQ,MAAM,CAAC,CAAC;AAC7B,WAAO,MAAM;AAAE,qBAAe,QAAQ,IAAI;AAAA,IAAG;AAAA,EACjD,GAAG,CAAC,QAAQ,MAAM,cAAc,cAAc,CAAC;AAG/C,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,eAAe,CAAC,QAAQ,IAAK;AAClC,QAAI,YAAY;AAChB,mBAAe,QAAQ,IAAI,SAAS,QAAQ,IAAI,MAAM,EACjD,KAAK,OAAK;AAAE,UAAI,CAAC,UAAW,WAAU,CAAC;AAAA,IAAG,CAAC,EAC3C,MAAM,MAAM;AAAA,IAAqD,CAAC;AACvE,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACrC,GAAG,CAAC,cAAa,aAAQ,QAAR,mBAAa,UAAS,aAAQ,QAAR,mBAAa,MAAM,CAAC;AAK3D,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,IAAK;AACzC,UAAM,MAAM,IAAI,UAAU,QAAQ;AAClC,QAAI,2BAAK,UAAU;AACf,UAAI,SAAS,CAAC,gBAAgB,QAAQ,IAAI,SAAS,QAAQ,IAAI,QAAQ,UAAU,CAAC,CAAC;AAAA,IACvF;AAAA,EACJ,GAAG,CAAC,KAAK,YAAY,WAAU,aAAQ,QAAR,mBAAa,UAAS,aAAQ,QAAR,mBAAa,MAAM,CAAC;AAEzE,MAAI,CAAC,SAAS;AACV,YAAQ,MAAM,6DAAwD,QAAQ,IAAI,GAAG;AACrF,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,eAAe,OAAO,SAAS,KAAK,OAAO;AAE/D,SACI,iCACI;AAAA,wBAAC,UAAO,IAAI,UAAkD,MAAK,UAAS,OAAO,CAAC,OAAO,GAAG,UAAU,KACpG,8BAAC,SAAM,IAAI,SAAS,MAAK,UAAS,OAAO,EAAE,kBAAkB,KAAK,GAAG,KAD9C,GAAG,KAAK,IAAI,QAAQ,IAAI,SAEnD;AAAA,IACC,eAAe;AAAA,MACZ;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,cAAc;AAAA,UACd,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,MAAM,aAAa,QAAQ,IAAI,SAAS,QAAQ,IAAI,MAAM,IAAI;AAAA;AAAA,MACrF;AAAA,MACA;AAAA,IACJ;AAAA,KACJ;AAER,CAAC;AACD,gBAAgB,cAAc;AAKvB,MAAM,iBAAiB,MAAM;AAChC,QAAM,EAAE,SAAS,UAAU,YAAY,YAAY,IAAI,MAAM,WAAW,UAAU;AAClF,QAAM,EAAE,KAAK,gBAAgB,IAAI,SAAS;AAE1C,QAAM,EAAE,OAAO,aAAa,IAAI,MAAM,WAAW,eAAe;AAChE,QAAM,EAAE,cAAc,IAAI,aAAa;AAEvC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAAc,IAAI;AACpE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAGtD,CAAC,CAAC;AAGN,QAAM,iBAAiB,MAAM,OAAiC,CAAC,CAAC;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAmB,CAAC,CAAC;AAErE,QAAM,mBAAmB,MAAM,YAAY,CAAC,aAAqB,aAAuB;AACpF,mBAAe,QAAQ,WAAW,IAAI;AACtC,qBAAiB,OAAO,OAAO,eAAe,OAAO,EAAE,KAAK,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,MAAM,YAAY,CAAC,gBAAwB;AAClE,WAAO,eAAe,QAAQ,WAAW;AACzC,qBAAiB,OAAO,OAAO,eAAe,OAAO,EAAE,KAAK,CAAC;AAAA,EACjE,GAAG,CAAC,CAAC;AAGL,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,OAAO,CAAC,mBAAmB,cAAc,WAAW,EAAG;AAE5D,UAAM,iBAAiB,CAAC,MAAqB;AAhfrD;AAifY,YAAM,UAAU,IAAI,sBAAsB,EAAE,OAAO,EAAE,QAAQ,cAAc,CAAC;AAC5E,YAAM,sBAAsB,mCAAU;AAEtC,UAAI,CAAC,qBAAqB;AACtB,0BAAkB,IAAI;AACtB;AAAA,MACJ;AAEA,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,cAAc,CAAC,KAAK,GAAG;AAC7B,YAAM,aAAa,oBAAoB,cAAc,CAAC;AACtD,YAAM,UAAQ,YAAO,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,SAAS,MAAM,CAAC,MAA7E,mBAAiF,OAAM;AAErG,UAAI,yBAAyB,WAAW;AACxC,UAAI,CAAC,0BAA0B,oBAAoB,OAAO;AACtD,cAAM,UAAU,oBAAoB,MAAM;AAC1C,cAAM,WAAW,CAAC,sBAAsB,aAAa,kBAAkB,YAAY,SAAS,SAAS,WAAW,cAAc,SAAS;AACvI,YAAI,gBAAgB;AACpB,mBAAW,UAAU,UAAU;AAC3B,cAAI,QAAQ,SAAS,MAAM,GAAG;AAC1B,4BAAgB,QAAQ,MAAM,GAAG,CAAC,OAAO,MAAM;AAC/C;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,kBAAkB,WAAW,QAAQ,SAAS,GAAG,GAAG;AACpD,0BAAgB,QAAQ,MAAM,GAAG,QAAQ,YAAY,GAAG,CAAC;AAAA,QAC7D;AACA,iCAAyB;AAAA,MAC7B;AAEA,YAAM,YAAY,WAAW,YAAY,WAAW,MAAM,QAAQ,KAAK,IAAI,CAAC;AAC5E,0BAAoB,KAAK;AACzB,0BAAoB,aAAa,iCAAK,aAAL,EAAiB,aAAa,OAAO,aAAa,uBAAuB;AAC1G,wBAAkB,mBAAmB;AAAA,IACzC;AAEA,eAAW,WAAW,eAAe;AACjC,sBAAgB,SAAS,SAAS,sBAAsB,4BAA4B,cAAc;AAAA,IACtG;AAEA,WAAO,MAAM;AACT,iBAAW,WAAW,eAAe;AACjC,wBAAgB,WAAW,OAAO;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,KAAK,iBAAiB,aAAa,CAAC;AAGxC,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,IAAI,UAAU;AAE7B,UAAM,mBAAmB,MAAM;AAC3B,aAAO,MAAM,SAAS;AAAA,IAC1B;AAEA,QAAI,cAAc,WAAW,GAAG;AAC5B,uBAAiB;AACjB;AAAA,IACJ;AAEA,UAAM,kBAAkB,CAAC,MAAqB;AAC1C,YAAM,kBAAkB,IAAI,sBAAsB,EAAE,OAAO,EAAE,QAAQ,cAAc,CAAC;AACpF,aAAO,MAAM,SAAS,gBAAgB,SAAS,IAAI,YAAY;AAAA,IACnE;AAEA,UAAM,mBAAmB,MAAM;AAC3B,uBAAiB;AAAA,IACrB;AAEA,QAAI,GAAG,aAAa,eAAe;AACnC,QAAI,GAAG,cAAc,gBAAgB;AAErC,WAAO,MAAM;AACT,UAAI,IAAI,aAAa,eAAe;AACpC,UAAI,IAAI,cAAc,gBAAgB;AACtC,uBAAiB;AAAA,IACrB;AAAA,EACJ,GAAG,CAAC,KAAK,aAAa,CAAC;AAGvB,QAAM,UAAU,MAAM;AApkB1B;AAqkBQ,QAAI,CAAC,kBAAkB,GAAC,oBAAe,eAAf,mBAA2B,cAAa;AAC5D,4BAAsB,CAAC,CAAC;AACxB;AAAA,IACJ;AACA,UAAM,QACF;AAAA,MAAC;AAAA;AAAA,QACG,QAAO;AAAA,QACP,aAAa;AAAA,QACb,cAAc;AAAA,QACd,aAAa;AAAA,QACb,gBAAgB;AAAA,QAEhB,UAAU,eAAe,WAAW,YAAY,CAAC;AAAA,QACjD,WAAW,eAAe,WAAW,YAAY,CAAC;AAAA,QAElD;AAAA,UAAC;AAAA;AAAA,YACG,SAAS;AAAA,YACT,eAAe,MAAM,oBAAoB;AAAA;AAAA,QAC7C;AAAA;AAAA,MAPK,eAAe;AAAA,IAQxB;AAEJ,0BAAsB,CAAC,EAAE,IAAI,eAAe,IAAuB,MAAM,CAAC,CAAC;AAAA,EAC/E,GAAG,CAAC,cAAc,CAAC;AAEnB,WAAS,sBAAsB;AAC3B,gBAAY,EAAE,MAAM,uBAAuB,SAAS,EAAE,gBAAgB,KAAK,EAAE,CAAC;AAC9E,sBAAkB,IAAI;AAAA,EAC1B;AAGA,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACvC,QAAI,EAAC,+CAAe,QAAQ,QAAO,CAAC;AACpC,WAAO,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,MAAG;AArmB9C;AAqmBkD,sBAAE,UAAF,YAAW,OAAM,OAAE,UAAF,YAAW;AAAA,KAAE;AAAA,EAC5E,GAAG,CAAC,aAAa,CAAC;AAElB,SACI,iCACK;AAAA,mBAAe,IAAI,CAAC,SAAS,UAAU;AACpC,UAAI,QAAQ,YAAY,MAAO,QAAO;AACtC,UAAI,kBAAkB,OAAO,EAAG,QAAO;AAEvC,UAAI,QAAQ,SAAS,SAAS,QAAQ,gBAAgB,OAAO;AACzD,eACI;AAAA,UAAC;AAAA;AAAA,YAEG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,gBAAgB;AAAA;AAAA,UAJX,QAAQ;AAAA,QAKjB;AAAA,MAER;AAEA,UAAI,QAAQ,SAAS,SAAS,QAAQ,gBAAgB,OAAO;AACzD,eACI;AAAA,UAAC;AAAA;AAAA,YAEG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,gBAAgB;AAAA;AAAA,UAJX,QAAQ;AAAA,QAKjB;AAAA,MAER;AAEA,aACI;AAAA,QAAC;AAAA;AAAA,UAEG;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,gBAAgB;AAAA;AAAA,QAJX,QAAQ;AAAA,MAKjB;AAAA,IAER,CAAC;AAAA,IAEA,mBAAmB,IAAI,CAAC,UACrB,oBAAC,MAAM,UAAN,EAA+B,gBAAM,SAAjB,MAAM,EAAiB,CAC/C;AAAA,KACL;AAER;","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.tsx"],"sourcesContent":["\"use client\";\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { Source, Layer, Popup } from \"react-map-gl/maplibre\";\r\nimport type { MapMouseEvent } from \"maplibre-gl\";\r\n\r\nimport { MapContext } from \"../../../../../../../../store/Map/context\";\r\nimport type { Building } from '../../../../../../../../types/dbTypes';\r\nimport { DatasetsContext } from '../../../../../../../../store';\r\nimport { MapLayerClickPriority } from \"../../../../../utils/MapEventManager/MapClickManager\";\r\nimport MapFeaturePopoverMenu from \"../../../../MapFeaturePopoverMenu\";\r\nimport { fitGeoJsonBounds } from \"../../../../../utils/fitGeojsonBounds\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { WmsTimeControl } from \"./WmsTimeControl\";\r\nimport { fetchWmsFrames, buildWmsTimeUrl, wmsLegendUrl } from \"../../../../../datasets/src/wmsTime\";\r\n\r\ninterface BuildingDataset {\r\n \"type\": \"buildings\";\r\n \"data\": Building[];\r\n \"name\": string;\r\n \"visible\"?: boolean;\r\n}\r\n\r\nconst isBuildingDataset = (dataset: any): dataset is BuildingDataset => {\r\n return dataset.type === \"buildings\" && \"data\" in dataset;\r\n};\r\n\r\nconst parseNumericValue = (value: unknown): number | null => {\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value !== 'string') return null;\r\n const cleaned = value.replace(/[$%\\s]/g, '').replace(/,/g, '');\r\n const parsed = Number.parseFloat(cleaned);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n};\r\n\r\nconst computeMinMax = (\r\n features: import('geojson').Feature[],\r\n fieldName: string,\r\n): { min: number; max: number } | null => {\r\n let min = Number.POSITIVE_INFINITY;\r\n let max = Number.NEGATIVE_INFINITY;\r\n let found = false;\r\n for (const feature of features) {\r\n const properties = (feature.properties || {}) as Record<string, unknown>;\r\n const value = parseNumericValue(properties[fieldName]);\r\n if (value === null) continue;\r\n found = true;\r\n if (value < min) min = value;\r\n if (value > max) max = value;\r\n }\r\n if (!found) return null;\r\n return { min, max: max === min ? min + 1 : max };\r\n};\r\n\r\n// ─── Per-dataset GeoJSON layer ────────────────────────────────────────\r\n// Each dataset manages its own fetch lifecycle. This means:\r\n// • datasets render PROGRESSIVELY as each one loads (no blocking)\r\n// • unmounting a dataset cancels only ITS fetch\r\n// • re-renders of one dataset never cancel fetches for another\r\n\r\ninterface GeoJsonDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst GeoJsonDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: GeoJsonDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const [featureCollection, setFeatureCollection] = React.useState<import('geojson').FeatureCollection | null>(null);\r\n const fitBoundsAppliedRef = React.useRef(false);\r\n\r\n // Fetch features once when the component mounts (or dataset identity changes)\r\n React.useEffect(() => {\r\n if (!map) return;\r\n let cancelled = false;\r\n\r\n const load = async () => {\r\n try {\r\n const fetched = await dataset.getFeatures();\r\n if (cancelled) return;\r\n\r\n const fc: import('geojson').FeatureCollection =\r\n fetched?.type === 'FeatureCollection'\r\n ? fetched\r\n : { type: 'FeatureCollection', features: [] };\r\n\r\n setFeatureCollection(fc);\r\n } catch (error) {\r\n console.error(`OpenDataLayers: Error fetching features for \"${dataset.name}\":`, error);\r\n }\r\n };\r\n\r\n load();\r\n return () => { cancelled = true; };\r\n }, [map, dataset.name]);\r\n\r\n // Build the layer JSX from the loaded feature collection\r\n const layerContent = React.useMemo(() => {\r\n if (!featureCollection || featureCollection.features.length === 0) return null;\r\n\r\n const geometryType = featureCollection.features[0]?.geometry?.type;\r\n if (!geometryType) return null;\r\n\r\n // ── colour resolution ──\r\n let layerColor: any = dataset.layerColor?.color || '#0d9488';\r\n let numericFieldName: string | undefined;\r\n\r\n if (dataset.selectedFieldName) {\r\n const selectedField = dataset.fields?.find((field: any) => field.name === dataset.selectedFieldName);\r\n if (selectedField?.layerColor) {\r\n if (selectedField.colorType === 'single') {\r\n layerColor = selectedField.layerColor.color;\r\n }\r\n if (selectedField.colorType === 'minMax') {\r\n try {\r\n const fieldName = dataset.selectedFieldName;\r\n numericFieldName = `__numeric_${fieldName}`;\r\n const range = computeMinMax(featureCollection.features, fieldName);\r\n if (range) {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n layerColor = [\r\n 'interpolate', ['linear'],\r\n ['to-number', ['get', numericFieldName], range.min],\r\n range.min, minColor,\r\n range.max, maxColor,\r\n ];\r\n }\r\n } catch (error) {\r\n console.warn('Failed to build interpolate for field', dataset.selectedFieldName, error);\r\n }\r\n }\r\n if (selectedField.colorType === 'boolean') {\r\n const minColor = selectedField.layerColor.minColor || dataset.layerColor?.minColor || dataset.layerColor?.color || '#0d9488';\r\n const maxColor = selectedField.layerColor.maxColor || dataset.layerColor?.maxColor || dataset.layerColor?.color || '#0d9488';\r\n const fieldName = dataset.selectedFieldName;\r\n layerColor = [\r\n 'case',\r\n ['any',\r\n ['==', ['get', fieldName], true],\r\n ['==', ['get', fieldName], 1],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'true'],\r\n ['==', ['downcase', ['to-string', ['get', fieldName]]], 'yes'],\r\n ],\r\n maxColor,\r\n minColor,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n // ── inject datasetName + numeric shadow field into each feature ──\r\n const enrichedFC: import('geojson').FeatureCollection = {\r\n ...featureCollection,\r\n features: featureCollection.features.map((feature) => {\r\n let numericVal: number | undefined;\r\n if (numericFieldName && dataset.selectedFieldName) {\r\n const v = parseNumericValue((feature.properties || {})[dataset.selectedFieldName]);\r\n if (v !== null) numericVal = v;\r\n }\r\n return {\r\n ...feature,\r\n properties: {\r\n ...feature.properties,\r\n datasetName: dataset.name,\r\n layer_color: layerColor,\r\n ...(numericFieldName && numericVal !== undefined ? { [numericFieldName]: numericVal } : {}),\r\n },\r\n };\r\n }),\r\n };\r\n\r\n // ── build layer props per geometry type ──\r\n const registeredIds: string[] = [];\r\n\r\n if (geometryType === 'Point' || geometryType === 'MultiPoint') {\r\n const paint = {\r\n 'circle-radius': 6,\r\n 'circle-color': layerColor,\r\n 'circle-opacity': 0.8,\r\n 'circle-stroke-width': 2,\r\n 'circle-stroke-color': '#ffffff',\r\n };\r\n registeredIds.push(`${dataset.name}-unclustered-point`);\r\n\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n cluster={true}\r\n clusterMaxZoom={11}\r\n clusterRadius={50}\r\n >\r\n <Layer\r\n id={`${dataset.name}-clusters`}\r\n filter={['has', 'point_count']}\r\n type=\"circle\"\r\n paint={{\r\n 'circle-color': dataset.layerColor?.color || '#0d9488',\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n 'circle-opacity': 0.9,\r\n }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-cluster-count`}\r\n filter={['has', 'point_count']}\r\n type=\"symbol\"\r\n layout={{\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n }}\r\n paint={{ 'text-color': '#fff' }}\r\n />\r\n <Layer\r\n id={`${dataset.name}-unclustered-point`}\r\n filter={['!', ['has', 'point_count']]}\r\n type=\"circle\"\r\n paint={paint}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'LineString' || geometryType === 'MultiLineString') {\r\n const mainId = `${dataset.name}-line`;\r\n registeredIds.push(mainId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={mainId}\r\n type=\"line\"\r\n paint={{ 'line-color': layerColor, 'line-width': 3, 'line-opacity': 1 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {\r\n const fillId = `${dataset.name}-fill`;\r\n const outlineId = `${dataset.name}-outline`;\r\n registeredIds.push(fillId, outlineId);\r\n return {\r\n registeredIds,\r\n jsx: (\r\n <Source\r\n id={`${dataset.name}-source`}\r\n key={`${index}-${dataset.name}-source`}\r\n type=\"geojson\"\r\n data={enrichedFC}\r\n >\r\n <Layer\r\n id={fillId}\r\n type=\"fill\"\r\n paint={{ 'fill-color': layerColor, 'fill-opacity': 0.5 }}\r\n />\r\n <Layer\r\n id={outlineId}\r\n type=\"line\"\r\n paint={{ 'line-color': '#ffffff', 'line-width': 2 }}\r\n />\r\n </Source>\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }, [featureCollection, dataset.name, dataset.layerColor, dataset.selectedFieldName, dataset.fields, index]);\r\n\r\n // Register / unregister interactive layer IDs with the parent\r\n React.useEffect(() => {\r\n if (layerContent?.registeredIds) {\r\n onLayerReady(dataset.name, layerContent.registeredIds);\r\n }\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [layerContent?.registeredIds, dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n return layerContent?.jsx ?? null;\r\n});\r\nGeoJsonDatasetLayer.displayName = 'GeoJsonDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset MVT layer ────────────────────────────────────────────\r\n\r\ninterface MVTDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst MVTDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: MVTDatasetLayerProps) => {\r\n const tileUrl = dataset.url || dataset.information;\r\n const sourceLayer = (dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name.toLowerCase().replace(/\\s+/g, '_');\r\n const layerColor = dataset.layerColor?.color || '#0d9488';\r\n const isPointLayer = dataset.layerType === 'circle' || /point/i.test(sourceLayer);\r\n const isMartinBuilding = /buildings?/i.test((dataset as any)?.serviceInfo?.sourceLayer || dataset.id || dataset.name);\r\n // Only extrude actual building layers. A polygon dataset resolves to layerType\r\n // 'fill', so keying extrusion off 'fill' alone routed every polygon (e.g. published\r\n // open-data boundaries) into the zero-height, minzoom-15.5 extrusion branch — leaving\r\n // only the outline visible. Non-building polygons fall through to the flat-fill branch.\r\n const extraIsBuilding = isMartinBuilding && !isPointLayer;\r\n\r\n const mainLayerId = isPointLayer\r\n ? `${dataset.name}-points`\r\n : extraIsBuilding\r\n ? `${dataset.name}-extrusion`\r\n : `${dataset.name}-fill`;\r\n const outlineLayerId = `${dataset.name}-outline`;\r\n\r\n // Register interactive layer IDs\r\n React.useEffect(() => {\r\n const ids = isPointLayer ? [mainLayerId] : [mainLayerId, outlineLayerId];\r\n onLayerReady(dataset.name, ids);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, mainLayerId, outlineLayerId, isPointLayer, onLayerReady, onLayerRemoved]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for MVT dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n if (extraIsBuilding) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"fill-extrusion\" source-layer={sourceLayer}\r\n paint={{\r\n 'fill-extrusion-color': layerColor,\r\n 'fill-extrusion-height': ['coalesce', ['to-number', ['get', 'heightmax']], 0],\r\n 'fill-extrusion-opacity': 0.8,\r\n }}\r\n minzoom={15.5}\r\n />\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': layerColor, 'line-width': 1, 'line-opacity': 0.8 }} />\r\n </Source>\r\n );\r\n }\r\n\r\n if (isPointLayer) {\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer\r\n id={mainLayerId} type=\"circle\" source-layer={sourceLayer}\r\n paint={{ 'circle-radius': 6, 'circle-color': layerColor, 'circle-opacity': 0.8, 'circle-stroke-width': 2, 'circle-stroke-color': '#ffffff' }}\r\n />\r\n </Source>\r\n );\r\n }\r\n\r\n return (\r\n <Source id={`${dataset.name}-source`} key={`${index}-${dataset.name}-source`} type=\"vector\" tiles={[tileUrl]}>\r\n <Layer id={mainLayerId} type=\"fill\" source-layer={sourceLayer} paint={{ 'fill-color': layerColor, 'fill-opacity': 0.6 }} />\r\n {/* White outline (matches the original GeoJSON polygon style) so subdivision\r\n boundaries stay legible — a same-colour outline read as one solid blob. */}\r\n <Layer id={outlineLayerId} type=\"line\" source-layer={sourceLayer} paint={{ 'line-color': '#ffffff', 'line-width': 2 }} />\r\n </Source>\r\n );\r\n});\r\nMVTDatasetLayer.displayName = 'MVTDatasetLayer';\r\n\r\n\r\n// ─── Per-dataset WMS raster layer ─────────────────────────────────────\r\n// Live/federated WMS overlays (e.g. the GeoMet weather radar). The dataset's\r\n// `url` is a MapLibre raster tile template (GetMap with a literal\r\n// {bbox-epsg-3857}); MapLibre fetches tiles directly, so there's nothing to\r\n// parse and no features to query (raster → not interactive).\r\n\r\ninterface WMSDatasetLayerProps {\r\n dataset: any;\r\n index: number;\r\n onLayerReady: (datasetName: string, layerIds: string[]) => void;\r\n onLayerRemoved: (datasetName: string) => void;\r\n}\r\n\r\nconst WMSDatasetLayer = React.memo(({ dataset, index, onLayerReady, onLayerRemoved }: WMSDatasetLayerProps) => {\r\n const { state: mapState } = React.useContext(MapContext);\r\n const { map } = mapState.map;\r\n\r\n const tileUrl = dataset.url || dataset.information;\r\n const layerId = `${dataset.name}-wms`;\r\n const sourceId = `${dataset.name}-source`;\r\n\r\n const timeEnabled = !!dataset.timeEnabled && !!dataset.wms;\r\n const [frames, setFrames] = React.useState<string[]>([]);\r\n const [activeTime, setActiveTime] = React.useState<string | null>(null);\r\n // The bottom-left overlay stack's portal slot (MapViewer renders it). Resolved\r\n // in an effect so the node exists (post-commit) before we portal into it.\r\n const [controlSlot, setControlSlot] = React.useState<HTMLElement | null>(null);\r\n React.useEffect(() => {\r\n if (timeEnabled) setControlSlot(document.getElementById('wms-time-slot'));\r\n }, [timeEnabled]);\r\n\r\n // Register with no interactive layer ids — a raster has no queryable features.\r\n React.useEffect(() => {\r\n onLayerReady(dataset.name, []);\r\n return () => { onLayerRemoved(dataset.name); };\r\n }, [dataset.name, onLayerReady, onLayerRemoved]);\r\n\r\n // Load the WMS time extent once (time-enabled datasets only).\r\n React.useEffect(() => {\r\n if (!timeEnabled || !dataset.wms) return;\r\n let cancelled = false;\r\n fetchWmsFrames(dataset.wms.baseUrl, dataset.wms.layers)\r\n .then(f => { if (!cancelled) setFrames(f); })\r\n .catch(() => { /* fetchWmsFrames already swallows; keep static */ });\r\n return () => { cancelled = true; };\r\n }, [timeEnabled, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n // Imperatively swap the raster source's tiles per frame. The <Source tiles>\r\n // prop below never changes after mount, so there's no react-map-gl tug-of-war\r\n // and no flicker — this setTiles call is the single source of truth for TIME.\r\n React.useEffect(() => {\r\n if (!map || !activeTime || !dataset.wms) return;\r\n const src = map.getSource(sourceId) as { setTiles?: (t: string[]) => void } | undefined;\r\n if (src?.setTiles) {\r\n src.setTiles([buildWmsTimeUrl(dataset.wms.baseUrl, dataset.wms.layers, activeTime)]);\r\n }\r\n }, [map, activeTime, sourceId, dataset.wms?.baseUrl, dataset.wms?.layers]);\r\n\r\n if (!tileUrl) {\r\n console.error(`❌ OpenDataLayers: No tile URL found for WMS dataset \"${dataset.name}\"`);\r\n return null;\r\n }\r\n\r\n const showControl = timeEnabled && frames.length > 1 && map && controlSlot;\r\n\r\n return (\r\n <>\r\n <Source id={sourceId} key={`${index}-${dataset.name}-source`} type=\"raster\" tiles={[tileUrl]} tileSize={256}>\r\n <Layer id={layerId} type=\"raster\" paint={{ 'raster-opacity': 0.85 }} />\r\n </Source>\r\n {showControl && createPortal(\r\n <WmsTimeControl\r\n frames={frames}\r\n onTimeChange={setActiveTime}\r\n label={dataset.name}\r\n legendUrl={dataset.wms ? wmsLegendUrl(dataset.wms.baseUrl, dataset.wms.layers) : undefined}\r\n />,\r\n controlSlot,\r\n )}\r\n </>\r\n );\r\n});\r\nWMSDatasetLayer.displayName = 'WMSDatasetLayer';\r\n\r\n\r\n// ─── Main orchestrator ────────────────────────────────────────────────\r\n\r\nexport const OpenDataLayers = () => {\r\n const { \"state\": mapState, \"dispatch\": mapDispatch } = React.useContext(MapContext);\r\n const { map, mapClickManager } = mapState.map;\r\n\r\n const { state: datasetState } = React.useContext(DatasetsContext);\r\n const { addedDatasets } = datasetState.datasets;\r\n\r\n const [clickedFeature, setClickedFeature] = React.useState<any>(null);\r\n const [addedFeaturesPopup, setAddedFeaturesPopup] = React.useState<Array<{\r\n id: string | number;\r\n popup: React.ReactElement;\r\n }>>([]);\r\n\r\n // Track interactive layer IDs per dataset for click handling\r\n const layerIdsMapRef = React.useRef<Record<string, string[]>>({});\r\n const [allLayerNames, setAllLayerNames] = React.useState<string[]>([]);\r\n\r\n const handleLayerReady = React.useCallback((datasetName: string, layerIds: string[]) => {\r\n layerIdsMapRef.current[datasetName] = layerIds;\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n const handleLayerRemoved = React.useCallback((datasetName: string) => {\r\n delete layerIdsMapRef.current[datasetName];\r\n setAllLayerNames(Object.values(layerIdsMapRef.current).flat());\r\n }, []);\r\n\r\n // ── Click handling ──\r\n React.useEffect(() => {\r\n if (!map || !mapClickManager || allLayerNames.length === 0) return;\r\n\r\n const handleMapClick = (e: MapMouseEvent) => {\r\n const clicked = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n const localClickedFeature = clicked?.[0];\r\n\r\n if (!localClickedFeature) {\r\n setClickedFeature(null);\r\n return;\r\n }\r\n\r\n const lng = e.lngLat.lng;\r\n const lat = e.lngLat.lat;\r\n const coordinates = [lng, lat];\r\n const properties = localClickedFeature.properties || {};\r\n const _name = Object.entries(properties).find(([key]) => key.toLowerCase().includes('name'))?.[1] || undefined;\r\n\r\n let datasetNameFromFeature = properties.datasetName;\r\n if (!datasetNameFromFeature && localClickedFeature.layer) {\r\n const layerId = localClickedFeature.layer.id;\r\n const suffixes = ['-unclustered-point', '-clusters', '-cluster-count', '-outline', '-fill', '-line', '-circle', '-extrusion', '-points'];\r\n let extractedName = layerId;\r\n for (const suffix of suffixes) {\r\n if (layerId.endsWith(suffix)) {\r\n extractedName = layerId.slice(0, -suffix.length);\r\n break;\r\n }\r\n }\r\n if (extractedName === layerId && layerId.includes('-')) {\r\n extractedName = layerId.slice(0, layerId.lastIndexOf('-'));\r\n }\r\n datasetNameFromFeature = extractedName;\r\n }\r\n\r\n const featureId = properties.globalid || properties.id || `temp-${Date.now()}`;\r\n localClickedFeature.id = featureId;\r\n localClickedFeature.properties = { ...properties, coordinates, _name, datasetName: datasetNameFromFeature };\r\n setClickedFeature(localClickedFeature);\r\n };\r\n\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.register(layerId, MapLayerClickPriority.OpenDataLayerClickPriority, handleMapClick);\r\n }\r\n\r\n return () => {\r\n for (const layerId of allLayerNames) {\r\n mapClickManager.unregister(layerId);\r\n }\r\n };\r\n }, [map, mapClickManager, allLayerNames]);\r\n\r\n // ── Hover cursor handling ──\r\n React.useEffect(() => {\r\n if (!map) return;\r\n\r\n const canvas = map.getCanvas();\r\n\r\n const setDefaultCursor = () => {\r\n canvas.style.cursor = 'default';\r\n };\r\n\r\n if (allLayerNames.length === 0) {\r\n setDefaultCursor();\r\n return;\r\n }\r\n\r\n const handleMouseMove = (e: MapMouseEvent) => {\r\n const hoveredFeatures = map.queryRenderedFeatures(e.point, { layers: allLayerNames });\r\n canvas.style.cursor = hoveredFeatures.length > 0 ? 'pointer' : 'default';\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setDefaultCursor();\r\n };\r\n\r\n map.on('mousemove', handleMouseMove);\r\n map.on('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n map.off('mousemove', handleMouseMove);\r\n map.off('mouseleave', handleMouseLeave);\r\n setDefaultCursor();\r\n };\r\n }, [map, allLayerNames]);\r\n\r\n // ── Popup ──\r\n React.useEffect(() => {\r\n if (!clickedFeature || !clickedFeature.properties?.coordinates) {\r\n setAddedFeaturesPopup([]);\r\n return;\r\n }\r\n const popup = (\r\n <Popup\r\n anchor=\"bottom\"\r\n closeButton={true}\r\n closeOnClick={false}\r\n closeOnMove={false}\r\n focusAfterOpen={true}\r\n key={clickedFeature.id}\r\n latitude={clickedFeature.properties.coordinates[1]}\r\n longitude={clickedFeature.properties.coordinates[0]}\r\n >\r\n <MapFeaturePopoverMenu\r\n feature={clickedFeature}\r\n onCloseAction={() => clearClickedFeature()}\r\n />\r\n </Popup>\r\n );\r\n setAddedFeaturesPopup([{ id: clickedFeature.id as string | number, popup }]);\r\n }, [clickedFeature]);\r\n\r\n function clearClickedFeature() {\r\n mapDispatch({ type: \"SET_CLICKED_FEATURE\", payload: { clickedFeature: null } });\r\n setClickedFeature(null);\r\n }\r\n\r\n // ── Sort datasets by display order ──\r\n const sortedDatasets = React.useMemo(() => {\r\n if (!addedDatasets?.length) return [];\r\n return [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }, [addedDatasets]);\r\n\r\n return (\r\n <>\r\n {sortedDatasets.map((dataset, index) => {\r\n if (dataset.visible === false) return null;\r\n if (isBuildingDataset(dataset)) return null;\r\n\r\n if (dataset.type === 'WMS' || dataset.datasetType === 'WMS') {\r\n return (\r\n <WMSDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n if (dataset.type === 'MVT' || dataset.datasetType === 'MVT') {\r\n return (\r\n <MVTDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <GeoJsonDatasetLayer\r\n key={dataset.name}\r\n dataset={dataset}\r\n index={index}\r\n onLayerReady={handleLayerReady}\r\n onLayerRemoved={handleLayerRemoved}\r\n />\r\n );\r\n })}\r\n\r\n {addedFeaturesPopup.map((popup) => (\r\n <React.Fragment key={popup.id}>{popup.popup}</React.Fragment>\r\n ))}\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlaceOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAK7D,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkEhD,CAAA"}
1
+ {"version":3,"file":"PlaceOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAK7D,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkEhD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.tsx"],"sourcesContent":["\"use client\"\r\nimport * as React from \"react\"\r\nimport type maplibregl from \"maplibre-gl\"\r\nimport { MapContext } from \"../../../../../../store\"\r\nimport type { DbFile } from \"../../../../../../types/dbTypes\"\r\nimport { useFile } from \"../../../../../../hooks/files/files\"\r\nimport { toast } from \"sonner\"\r\nimport { useTranslations } from \"next-intl\"\r\n\r\ninterface PlaceOnMapProps {\r\n file: DbFile\r\n onPlaced: (file: DbFile, lat: number, lng: number) => void\r\n onCancel: () => void\r\n}\r\n\r\n/**\r\n * Invisible component that puts the map into \"click-to-place\" mode.\r\n * Sets crosshair cursor, listens for a single click, saves the coords to the DB,\r\n * then calls onPlaced. Esc calls onCancel.\r\n */\r\nexport const PlaceOnMap: React.FC<PlaceOnMapProps> = ({ file, onPlaced, onCancel }) => {\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n const { updateFile } = useFile(file.id)\r\n const t = useTranslations(\"EditFilePosition\")\r\n\r\n // Stable refs so the map effect never needs to re-register\r\n const onPlacedRef = React.useRef(onPlaced)\r\n const onCancelRef = React.useRef(onCancel)\r\n onPlacedRef.current = onPlaced\r\n onCancelRef.current = onCancel\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const canvas = map.getCanvas()\r\n\r\n // MapLibre resets the cursor on every mousemove, so we re-apply it each time\r\n const keepCrosshair = () => { canvas.style.cursor = \"crosshair\" }\r\n const clearCursor = () => { canvas.style.cursor = \"\" }\r\n\r\n canvas.style.cursor = \"crosshair\"\r\n map.on(\"mousemove\", keepCrosshair)\r\n\r\n const handleClick = async (e: maplibregl.MapMouseEvent) => {\r\n const lat = e.lngLat.lat\r\n const lng = e.lngLat.lng\r\n\r\n map.off(\"mousemove\", keepCrosshair)\r\n clearCursor()\r\n\r\n try {\r\n await updateFile({ lat, lng, type: 'map-file' } as Partial<DbFile>)\r\n file.lat = lat\r\n file.lng = lng\r\n file.type = 'map-file'\r\n onPlacedRef.current(file, lat, lng)\r\n toast.success(t(\"positionAcceptedToast\"))\r\n } catch (err) {\r\n console.error(\"Error placing file:\", err)\r\n // Restore on failure\r\n map.on(\"mousemove\", keepCrosshair)\r\n canvas.style.cursor = \"crosshair\"\r\n }\r\n }\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n map.off(\"mousemove\", keepCrosshair)\r\n clearCursor()\r\n onCancelRef.current()\r\n }\r\n }\r\n\r\n map.on(\"click\", handleClick)\r\n document.addEventListener(\"keydown\", handleKeyDown)\r\n\r\n return () => {\r\n map.off(\"mousemove\", keepCrosshair)\r\n map.off(\"click\", handleClick)\r\n document.removeEventListener(\"keydown\", handleKeyDown)\r\n clearCursor()\r\n }\r\n }, [map, updateFile])\r\n\r\n return null\r\n}\r\n"],"mappings":";AACA,YAAY,WAAW;AAEvB,SAAS,kBAAkB;AAE3B,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAazB,MAAM,aAAwC,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM;AACnF,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AACzB,QAAM,EAAE,WAAW,IAAI,QAAQ,KAAK,EAAE;AACtC,QAAM,IAAI,gBAAgB,kBAAkB;AAG5C,QAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,QAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,cAAY,UAAU;AACtB,cAAY,UAAU;AAEtB,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,IAAI,UAAU;AAG7B,UAAM,gBAAgB,MAAM;AAAE,aAAO,MAAM,SAAS;AAAA,IAAY;AAChE,UAAM,cAAgB,MAAM;AAAE,aAAO,MAAM,SAAS;AAAA,IAAG;AAEvD,WAAO,MAAM,SAAS;AACtB,QAAI,GAAG,aAAa,aAAa;AAEjC,UAAM,cAAc,OAAO,MAAgC;AACvD,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,MAAM,EAAE,OAAO;AAErB,UAAI,IAAI,aAAa,aAAa;AAClC,kBAAY;AAEZ,UAAI;AACA,cAAM,WAAW,EAAE,KAAK,KAAK,MAAM,WAAW,CAAoB;AAClE,aAAK,MAAM;AACX,aAAK,MAAM;AACX,aAAK,OAAO;AACZ,oBAAY,QAAQ,MAAM,KAAK,GAAG;AAClC,cAAM,QAAQ,EAAE,uBAAuB,CAAC;AAAA,MAC5C,SAAS,KAAK;AACV,gBAAQ,MAAM,uBAAuB,GAAG;AAExC,YAAI,GAAG,aAAa,aAAa;AACjC,eAAO,MAAM,SAAS;AAAA,MAC1B;AAAA,IACJ;AAEA,UAAM,gBAAgB,CAAC,MAAqB;AACxC,UAAI,EAAE,QAAQ,UAAU;AACpB,YAAI,IAAI,aAAa,aAAa;AAClC,oBAAY;AACZ,oBAAY,QAAQ;AAAA,MACxB;AAAA,IACJ;AAEA,QAAI,GAAG,SAAS,WAAW;AAC3B,aAAS,iBAAiB,WAAW,aAAa;AAElD,WAAO,MAAM;AACT,UAAI,IAAI,aAAa,aAAa;AAClC,UAAI,IAAI,SAAS,WAAW;AAC5B,eAAS,oBAAoB,WAAW,aAAa;AACrD,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,KAAK,UAAU,CAAC;AAEpB,SAAO;AACX;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.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 type maplibregl from \"maplibre-gl\"\r\nimport { MapContext } from \"../../../../../../store\"\r\nimport type { DbFile } from \"../../../../../../types/dbTypes\"\r\nimport { useFile } from \"../../../../../../hooks/files/files\"\r\nimport { toast } from \"sonner\"\r\nimport { useTranslations } from \"next-intl\"\r\n\r\ninterface PlaceOnMapProps {\r\n file: DbFile\r\n onPlaced: (file: DbFile, lat: number, lng: number) => void\r\n onCancel: () => void\r\n}\r\n\r\n/**\r\n * Invisible component that puts the map into \"click-to-place\" mode.\r\n * Sets crosshair cursor, listens for a single click, saves the coords to the DB,\r\n * then calls onPlaced. Esc calls onCancel.\r\n */\r\nexport const PlaceOnMap: React.FC<PlaceOnMapProps> = ({ file, onPlaced, onCancel }) => {\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n const { updateFile } = useFile(file.id)\r\n const t = useTranslations(\"EditFilePosition\")\r\n\r\n // Stable refs so the map effect never needs to re-register\r\n const onPlacedRef = React.useRef(onPlaced)\r\n const onCancelRef = React.useRef(onCancel)\r\n onPlacedRef.current = onPlaced\r\n onCancelRef.current = onCancel\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const canvas = map.getCanvas()\r\n\r\n // MapLibre resets the cursor on every mousemove, so we re-apply it each time\r\n const keepCrosshair = () => { canvas.style.cursor = \"crosshair\" }\r\n const clearCursor = () => { canvas.style.cursor = \"\" }\r\n\r\n canvas.style.cursor = \"crosshair\"\r\n map.on(\"mousemove\", keepCrosshair)\r\n\r\n const handleClick = async (e: maplibregl.MapMouseEvent) => {\r\n const lat = e.lngLat.lat\r\n const lng = e.lngLat.lng\r\n\r\n map.off(\"mousemove\", keepCrosshair)\r\n clearCursor()\r\n\r\n try {\r\n await updateFile({ lat, lng, type: 'map-file' } as Partial<DbFile>)\r\n file.lat = lat\r\n file.lng = lng\r\n file.type = 'map-file'\r\n onPlacedRef.current(file, lat, lng)\r\n toast.success(t(\"positionAcceptedToast\"))\r\n } catch (err) {\r\n console.error(\"Error placing file:\", err)\r\n // Restore on failure\r\n map.on(\"mousemove\", keepCrosshair)\r\n canvas.style.cursor = \"crosshair\"\r\n }\r\n }\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n map.off(\"mousemove\", keepCrosshair)\r\n clearCursor()\r\n onCancelRef.current()\r\n }\r\n }\r\n\r\n map.on(\"click\", handleClick)\r\n document.addEventListener(\"keydown\", handleKeyDown)\r\n\r\n return () => {\r\n map.off(\"mousemove\", keepCrosshair)\r\n map.off(\"click\", handleClick)\r\n document.removeEventListener(\"keydown\", handleKeyDown)\r\n clearCursor()\r\n }\r\n }, [map, updateFile])\r\n\r\n return null\r\n}\r\n"],"mappings":";AAKA,YAAY,WAAW;AAEvB,SAAS,kBAAkB;AAE3B,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAazB,MAAM,aAAwC,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM;AACnF,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AACzB,QAAM,EAAE,WAAW,IAAI,QAAQ,KAAK,EAAE;AACtC,QAAM,IAAI,gBAAgB,kBAAkB;AAG5C,QAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,QAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,cAAY,UAAU;AACtB,cAAY,UAAU;AAEtB,QAAM,UAAU,MAAM;AAClB,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,IAAI,UAAU;AAG7B,UAAM,gBAAgB,MAAM;AAAE,aAAO,MAAM,SAAS;AAAA,IAAY;AAChE,UAAM,cAAgB,MAAM;AAAE,aAAO,MAAM,SAAS;AAAA,IAAG;AAEvD,WAAO,MAAM,SAAS;AACtB,QAAI,GAAG,aAAa,aAAa;AAEjC,UAAM,cAAc,OAAO,MAAgC;AACvD,YAAM,MAAM,EAAE,OAAO;AACrB,YAAM,MAAM,EAAE,OAAO;AAErB,UAAI,IAAI,aAAa,aAAa;AAClC,kBAAY;AAEZ,UAAI;AACA,cAAM,WAAW,EAAE,KAAK,KAAK,MAAM,WAAW,CAAoB;AAClE,aAAK,MAAM;AACX,aAAK,MAAM;AACX,aAAK,OAAO;AACZ,oBAAY,QAAQ,MAAM,KAAK,GAAG;AAClC,cAAM,QAAQ,EAAE,uBAAuB,CAAC;AAAA,MAC5C,SAAS,KAAK;AACV,gBAAQ,MAAM,uBAAuB,GAAG;AAExC,YAAI,GAAG,aAAa,aAAa;AACjC,eAAO,MAAM,SAAS;AAAA,MAC1B;AAAA,IACJ;AAEA,UAAM,gBAAgB,CAAC,MAAqB;AACxC,UAAI,EAAE,QAAQ,UAAU;AACpB,YAAI,IAAI,aAAa,aAAa;AAClC,oBAAY;AACZ,oBAAY,QAAQ;AAAA,MACxB;AAAA,IACJ;AAEA,QAAI,GAAG,SAAS,WAAW;AAC3B,aAAS,iBAAiB,WAAW,aAAa;AAElD,WAAO,MAAM;AACT,UAAI,IAAI,aAAa,aAAa;AAClC,UAAI,IAAI,SAAS,WAAW;AAC5B,eAAS,oBAAoB,WAAW,aAAa;AACrD,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,KAAK,UAAU,CAAC;AAEpB,SAAO;AACX;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoD9B,eAAO,MAAM,YAAY,yBA4TxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoD9B,eAAO,MAAM,YAAY,yBA4TxB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.tsx"],"sourcesContent":["'use client'\r\nimport { MapContext, MenusContext } from '../../../../../../../store'\r\nimport * as React from 'react'\r\nimport { Source, Layer, Popup, Marker } from 'react-map-gl/maplibre'\r\nimport type { MapGeoJSONFeature, MapLayerMouseEvent } from 'maplibre-gl'\r\nimport Sensor from '../../../../../../ui/Sensors/Sensor'\r\nimport { SensorType, ViewerNames, type Sensor as ISensor} from '../../../../../../../types/dbTypes'\r\n\r\nimport { MapLayerClickPriority, ClickCallback } from '../../../../utils/MapEventManager/MapClickManager'\r\nimport { extractCoordinatesFromFeature } from '../../../../utils/extractCoordinates'\r\nimport { useSensor, useSensors } from '../../../../../../../hooks/sensors/sensors'\r\nimport { useUsers } from '../../../../../../../hooks/users/users'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useSession } from 'next-auth/react'\r\nimport { createClusterLayer, createClusterCountLayer, createUnclusteredPointLayer } from '../mapLayersUtils'\r\nimport { useSensorTypes } from '../../../../../../../hooks/sensorTypes/sensorTypes'\r\nimport * as LR from 'lucide-react'\r\nimport { UNTAGGED_TAG } from '../../../../../../ui/Sensors/SensorsSection'\r\n\r\nconst SensorIconMarker = ({ feature, isHighlighted, onMouseEnter, onMouseLeave, sensorTypes }: { feature: MapGeoJSONFeature; isHighlighted?: boolean; onMouseEnter?: () => void; onMouseLeave?: () => void; sensorTypes: SensorType[] }) => {\r\n\r\n const coords = extractCoordinatesFromFeature(feature)\r\n if (!coords) return null\r\n\r\n const sensorType = sensorTypes.find(t => t.id === feature.properties?.typeId)\r\n const icon = sensorType?.icon || 'Radio'\r\n const SensorIcon = LR[icon] || LR.Radio\r\n\r\n return (\r\n <Marker key={String(feature.properties?.id ?? `${coords.lng},${coords.lat}`)} longitude={coords.lng} latitude={coords.lat} anchor=\"center\">\r\n <div\r\n style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n border: isHighlighted ? '3px solid #73cee2' : '2px solid white',\r\n backgroundColor: 'black',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n boxShadow: isHighlighted ? '0 0 12px rgba(115, 206, 226, 0.5)' : 'none',\r\n transition: 'all 0.2s ease-in-out',\r\n transform: isHighlighted ? 'scale(1.2)' : 'scale(1)',\r\n }}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n <SensorIcon style={{ width: '20px', height: '20px', color: 'hsl(var(--primary-foreground))' }} />\r\n </div>\r\n </Marker>\r\n )\r\n}\r\n\r\nexport const SensorLayers = () => {\r\n const [hoveredSensorId, setHoveredSensorId] = React.useState<number | null>(null)\r\n const clusterLayer = createClusterLayer('sensors')\r\n const clusterCountLayer = createClusterCountLayer('sensors')\r\n const unclusteredPointLayer = createUnclusteredPointLayer('sensors')\r\n\r\n // global map state\r\n\r\n const t = useTranslations('SensorLayers')\r\n const tSensors = useTranslations('SensorsSection')\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map, mapClickManager } = mapState.map\r\n const { sensors } = useSensors()\r\n const { users } = useUsers()\r\n const user = useSession().data?.user\r\n\r\n const [popupInfo, setPopUpInfo] = React.useState<Partial<ISensor & { sensorType: SensorType }> | null>(null)\r\n const { deleteSensor, updateSensor } = useSensor(popupInfo?.id ?? null)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { visibleSensorTypes, visibleSensorTags, currentSensorId } = menusState.menus\r\n const typesVisible = visibleSensorTypes?.[ViewerNames.map] || []\r\n const tagsVisible = visibleSensorTags?.[ViewerNames.map] || []\r\n\r\n const {sensorTypes} = useSensorTypes()\r\n\r\n const eligibleSensors: Array<ISensor & { authorName: string } & { sensorType: SensorType }> = sensors\r\n .filter((sensor) => sensor.viewer === ViewerNames.map)\r\n .filter((sensor) => {\r\n const matchesType = typesVisible.includes(sensor.typeId)\r\n const hasNoTags = !sensor.tags?.length\r\n const matchesTag = hasNoTags\r\n ? tagsVisible.includes(UNTAGGED_TAG)\r\n : sensor.tags?.some(tag => tagsVisible.includes(tag)) ?? false\r\n return matchesType || matchesTag\r\n })\r\n .map((sensor) => {\r\n const user = users.find(u => u.id === sensor.authorId)\r\n const sensorType = sensorTypes.find(t => t.id === sensor.typeId)\r\n return {\r\n ...sensor,\r\n authorName: user?.name ?? 'Unknown User',\r\n sensorType,\r\n }\r\n })\r\n\r\n // Close popup if the sensor was deleted\r\n React.useEffect(() => {\r\n if (popupInfo && !sensors.find((s) => s.id === popupInfo.id)) {\r\n setPopUpInfo(null)\r\n }\r\n }, [sensors, popupInfo])\r\n\r\n const geojsonSensorData = React.useMemo(() => {\r\n const convertDataToGeojson = (sensorData: typeof eligibleSensors): GeoJSON.FeatureCollection<GeoJSON.Point, { [key: string]: any }> => {\r\n const sensorFeatures: GeoJSON.Feature<GeoJSON.Point, { [key: string]: any }>[] = sensorData\r\n .map((sensor) => {\r\n const { longitude, latitude, id, name, typeId, sensorType, data, dataFormat, updateFrequency, createdAt, authorId, organizationId, visible, url, authorName } = sensor\r\n\r\n return {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude],\r\n },\r\n properties: {\r\n id: Number(id),\r\n organizationId,\r\n visible,\r\n longitude,\r\n latitude,\r\n authorId: Number(authorId),\r\n authorName,\r\n name,\r\n typeId: Number(typeId),\r\n typeIcon: sensorType?.icon,\r\n data,\r\n dataFormat,\r\n updateFrequency,\r\n url,\r\n createdAt,\r\n viewer: ViewerNames.map,\r\n },\r\n }\r\n })\r\n\r\n \r\n\r\n const sensorFC: GeoJSON.FeatureCollection<GeoJSON.Point, { [key: string]: any }> = {\r\n type: 'FeatureCollection',\r\n features: sensorFeatures,\r\n }\r\n return sensorFC\r\n }\r\n return convertDataToGeojson(eligibleSensors)\r\n }, [eligibleSensors])\r\n\r\n // event listeners for sensor unclustered points\r\n React.useEffect(() => {\r\n if (!map) return\r\n const showSensorPopUp: ClickCallback = (e: MapLayerMouseEvent, features: MapGeoJSONFeature[]) => {\r\n const feature = features?.[0]\r\n\r\n if (!feature || feature.properties.point_count) return\r\n\r\n if (feature.geometry.type != 'Point') return\r\n const [longitude, latitude] = feature.geometry.coordinates\r\n const { id, authorId, name, typeId, data, dataFormat, updateFrequency, createdAt, url } = feature.properties\r\n setPopUpInfo({\r\n id: Number(id),\r\n authorId: Number(authorId),\r\n organizationId: feature.properties?.organizationId,\r\n visible: feature.properties?.visible,\r\n longitude,\r\n latitude,\r\n name,\r\n typeId: Number(typeId),\r\n data,\r\n dataFormat,\r\n updateFrequency,\r\n url,\r\n createdAt,\r\n viewer: ViewerNames.map,\r\n })\r\n }\r\n\r\n const mouseEnterChangeCursor = () => {\r\n map.getCanvas().style.cursor = 'pointer'\r\n }\r\n const mouseLeaveChangeCursor = () => {\r\n map.getCanvas().style.cursor = ''\r\n }\r\n\r\n // event listener for clicking on single point to show sensor, hover to change cursor\r\n mapClickManager.register('sensors-unclustered-points', MapLayerClickPriority.CommentLayersClickPriority, showSensorPopUp)\r\n\r\n map.on('mouseenter', 'sensors-unclustered-points', mouseEnterChangeCursor)\r\n map.on('mouseleave', 'sensors-unclustered-points', mouseLeaveChangeCursor)\r\n return () => {\r\n mapClickManager.unregister('sensors-unclustered-points')\r\n map.off('mouseenter', 'sensors-unclustered-points', mouseEnterChangeCursor)\r\n map.off('mouseleave', 'sensors-unclustered-points', mouseLeaveChangeCursor)\r\n }\r\n }, [map, mapClickManager])\r\n\r\n const handleRemoveSensor = () => {\r\n toast.success(t('sensorDeleted'))\r\n deleteSensor()\r\n setPopUpInfo(null)\r\n }\r\n\r\n // event listeners for clustered points\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const zoomInToDecluster = (e: MapLayerMouseEvent) => {\r\n const feature = e.features?.[0] // only proceed if this is actually a cluster\r\n if (!feature || !feature.properties.cluster_id) return\r\n\r\n const clusterId = feature.properties.cluster_id as number\r\n\r\n // Check if geometry has coordinates (not a GeometryCollection)\r\n if (!('coordinates' in feature.geometry)) return\r\n const [lng, lat] = feature.geometry.coordinates as [number, number]\r\n\r\n const source = map.getSource('sensors') as any\r\n console.log(source)\r\n console.log(clusterId)\r\n source.getClusterExpansionZoom(clusterId).then(\r\n (zoom: number) => {\r\n console.log('easing to')\r\n map.easeTo({ center: [lng, lat], zoom })\r\n },\r\n )\r\n .catch((error) => {\r\n console.error(error)\r\n })\r\n }\r\n\r\n const mouseEnterChangeCursor = () => { map.getCanvas().style.cursor = 'pointer' }\r\n const mouseLeaveChangeCursor = () => { map.getCanvas().style.cursor = '' }\r\n\r\n // event listener for clicking on single point to zoom in and decluster, hover to change cursor\r\n map.on('click', 'sensors-clusters', zoomInToDecluster)\r\n map.on('mouseenter', 'sensors-clusters', mouseEnterChangeCursor)\r\n map.on('mouseleave', 'sensors-clusters', mouseLeaveChangeCursor)\r\n return () => {\r\n map.off('click', 'sensors-clusters', zoomInToDecluster)\r\n map.off('mouseenter', 'sensors-clusters', mouseEnterChangeCursor)\r\n map.off('mouseleave', 'sensors-clusters', mouseLeaveChangeCursor)\r\n }\r\n }, [map])\r\n\r\n const renderPopup = () => {\r\n if (!popupInfo) return null\r\n const sensorType = sensorTypes.find(t => t.id === popupInfo.typeId)\r\n const liveSensor = sensors.find(s => s.id === popupInfo.id)\r\n const dataUrl = popupInfo.url \r\n ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/sensors/${popupInfo.url}`\r\n : popupInfo.data || ''\r\n \r\n return (\r\n <Popup\r\n className=\"noBorderPopup\"\r\n longitude={popupInfo.longitude}\r\n latitude={popupInfo.latitude}\r\n closeOnClick={false}\r\n onClose={() => setPopUpInfo(null)}\r\n anchor=\"bottom\"\r\n style={{ height: '50px', border: 'none', boxShadow: 'none' }}\r\n offset={[0, 10]}\r\n >\r\n <Sensor\r\n sensorName={popupInfo.name || ''}\r\n sensorType={sensorType}\r\n sensorId={popupInfo.id}\r\n tags={liveSensor?.tags ?? []}\r\n onAddTag={async (tag) => { await updateSensor({ tags: [...(liveSensor?.tags ?? []), tag] }) }}\r\n onDeleteTag={async (tag) => { await updateSensor({ tags: (liveSensor?.tags ?? []).filter(t => t !== tag) }) }}\r\n tagsTranslations={{\r\n addTag: tSensors('addTag'),\r\n removeTag: tSensors('removeTag'),\r\n cancel: tSensors('cancel'),\r\n newTagPlaceholder: tSensors('newTagPlaceholder'),\r\n }}\r\n dataUrl={dataUrl}\r\n dataFormat={popupInfo.dataFormat}\r\n updateFrequency={popupInfo.updateFrequency}\r\n buildingId={popupInfo.buildingId}\r\n createdAt={popupInfo.createdAt}\r\n onRemove={user.id === String(popupInfo.authorId) ? handleRemoveSensor : null}\r\n onClose={() => setPopUpInfo(null)}\r\n size=\"sm\"\r\n />\r\n {/* inline styles to override MapLibre's Pop up CSS */}\r\n <style>\r\n {`\r\n .noBorderPopup .maplibregl-popup-content {\r\n border: none !important;\r\n box-shadow: none !important;\r\n background: transparent !important;\r\n }\r\n .noBorderPopup .maplibregl-popup-tip {\r\n display: none !important;\r\n }\r\n `}\r\n </style>\r\n </Popup>\r\n )\r\n }\r\n\r\n // Track unclustered sensors to display icons\r\n const [unclusteredFeatures, setUnclusteredFeatures] = React.useState<MapGeoJSONFeature[]>([])\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const updateUnclusteredFeatures = () => {\r\n const allFeatures = map.querySourceFeatures('sensors')\r\n const unclusteredOnly = allFeatures.filter(\r\n (f) => !f.properties?.cluster && !f.properties?.point_count\r\n )\r\n // Deduplicate by id\r\n const uniqueFeatures = new Map()\r\n unclusteredOnly.forEach((f) => uniqueFeatures.set(f.properties.id, f))\r\n setUnclusteredFeatures(Array.from(uniqueFeatures.values()))\r\n }\r\n\r\n const onSourceData = (e: any) => {\r\n if (e?.sourceId === 'sensors') updateUnclusteredFeatures()\r\n }\r\n\r\n map.on('sourcedata', onSourceData)\r\n map.on('moveend', updateUnclusteredFeatures)\r\n map.on('zoomend', updateUnclusteredFeatures)\r\n\r\n updateUnclusteredFeatures()\r\n\r\n return () => {\r\n map.off('sourcedata', onSourceData)\r\n map.off('moveend', updateUnclusteredFeatures)\r\n map.off('zoomend', updateUnclusteredFeatures)\r\n }\r\n }, [map])\r\n\r\n return (\r\n <>\r\n {(typesVisible.length > 0 || tagsVisible.length > 0) &&\r\n <Source\r\n id=\"sensors\"\r\n type=\"geojson\"\r\n data={geojsonSensorData}\r\n cluster={true}\r\n clusterMaxZoom={14}\r\n clusterRadius={40}\r\n >\r\n <Layer {...clusterLayer} />\r\n <Layer {...clusterCountLayer} />\r\n <Layer {...unclusteredPointLayer} />\r\n\r\n {renderPopup()}\r\n {unclusteredFeatures\r\n .filter((feature) => feature.properties?.id !== popupInfo?.id)\r\n .map((feature) => (\r\n <SensorIconMarker\r\n key={String(feature.properties?.id)}\r\n feature={feature}\r\n isHighlighted={currentSensorId === feature.properties?.id || hoveredSensorId === feature.properties?.id}\r\n onMouseEnter={() => setHoveredSensorId(feature.properties?.id)}\r\n onMouseLeave={() => setHoveredSensorId(null)}\r\n sensorTypes={sensorTypes}\r\n />\r\n ))}\r\n </Source>}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b","user","t"]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SensorsLayer/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 { MapContext, MenusContext } from '../../../../../../../store'\r\nimport * as React from 'react'\r\nimport { Source, Layer, Popup, Marker } from 'react-map-gl/maplibre'\r\nimport type { MapGeoJSONFeature, MapLayerMouseEvent } from 'maplibre-gl'\r\nimport Sensor from '../../../../../../ui/Sensors/Sensor'\r\nimport { SensorType, ViewerNames, type Sensor as ISensor} from '../../../../../../../types/dbTypes'\r\n\r\nimport { MapLayerClickPriority, ClickCallback } from '../../../../utils/MapEventManager/MapClickManager'\r\nimport { extractCoordinatesFromFeature } from '../../../../utils/extractCoordinates'\r\nimport { useSensor, useSensors } from '../../../../../../../hooks/sensors/sensors'\r\nimport { useUsers } from '../../../../../../../hooks/users/users'\r\nimport { toast } from 'sonner'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useSession } from 'next-auth/react'\r\nimport { createClusterLayer, createClusterCountLayer, createUnclusteredPointLayer } from '../mapLayersUtils'\r\nimport { useSensorTypes } from '../../../../../../../hooks/sensorTypes/sensorTypes'\r\nimport * as LR from 'lucide-react'\r\nimport { UNTAGGED_TAG } from '../../../../../../ui/Sensors/SensorsSection'\r\n\r\nconst SensorIconMarker = ({ feature, isHighlighted, onMouseEnter, onMouseLeave, sensorTypes }: { feature: MapGeoJSONFeature; isHighlighted?: boolean; onMouseEnter?: () => void; onMouseLeave?: () => void; sensorTypes: SensorType[] }) => {\r\n\r\n const coords = extractCoordinatesFromFeature(feature)\r\n if (!coords) return null\r\n\r\n const sensorType = sensorTypes.find(t => t.id === feature.properties?.typeId)\r\n const icon = sensorType?.icon || 'Radio'\r\n const SensorIcon = LR[icon] || LR.Radio\r\n\r\n return (\r\n <Marker key={String(feature.properties?.id ?? `${coords.lng},${coords.lat}`)} longitude={coords.lng} latitude={coords.lat} anchor=\"center\">\r\n <div\r\n style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n border: isHighlighted ? '3px solid #73cee2' : '2px solid white',\r\n backgroundColor: 'black',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n boxShadow: isHighlighted ? '0 0 12px rgba(115, 206, 226, 0.5)' : 'none',\r\n transition: 'all 0.2s ease-in-out',\r\n transform: isHighlighted ? 'scale(1.2)' : 'scale(1)',\r\n }}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n <SensorIcon style={{ width: '20px', height: '20px', color: 'hsl(var(--primary-foreground))' }} />\r\n </div>\r\n </Marker>\r\n )\r\n}\r\n\r\nexport const SensorLayers = () => {\r\n const [hoveredSensorId, setHoveredSensorId] = React.useState<number | null>(null)\r\n const clusterLayer = createClusterLayer('sensors')\r\n const clusterCountLayer = createClusterCountLayer('sensors')\r\n const unclusteredPointLayer = createUnclusteredPointLayer('sensors')\r\n\r\n // global map state\r\n\r\n const t = useTranslations('SensorLayers')\r\n const tSensors = useTranslations('SensorsSection')\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map, mapClickManager } = mapState.map\r\n const { sensors } = useSensors()\r\n const { users } = useUsers()\r\n const user = useSession().data?.user\r\n\r\n const [popupInfo, setPopUpInfo] = React.useState<Partial<ISensor & { sensorType: SensorType }> | null>(null)\r\n const { deleteSensor, updateSensor } = useSensor(popupInfo?.id ?? null)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { visibleSensorTypes, visibleSensorTags, currentSensorId } = menusState.menus\r\n const typesVisible = visibleSensorTypes?.[ViewerNames.map] || []\r\n const tagsVisible = visibleSensorTags?.[ViewerNames.map] || []\r\n\r\n const {sensorTypes} = useSensorTypes()\r\n\r\n const eligibleSensors: Array<ISensor & { authorName: string } & { sensorType: SensorType }> = sensors\r\n .filter((sensor) => sensor.viewer === ViewerNames.map)\r\n .filter((sensor) => {\r\n const matchesType = typesVisible.includes(sensor.typeId)\r\n const hasNoTags = !sensor.tags?.length\r\n const matchesTag = hasNoTags\r\n ? tagsVisible.includes(UNTAGGED_TAG)\r\n : sensor.tags?.some(tag => tagsVisible.includes(tag)) ?? false\r\n return matchesType || matchesTag\r\n })\r\n .map((sensor) => {\r\n const user = users.find(u => u.id === sensor.authorId)\r\n const sensorType = sensorTypes.find(t => t.id === sensor.typeId)\r\n return {\r\n ...sensor,\r\n authorName: user?.name ?? 'Unknown User',\r\n sensorType,\r\n }\r\n })\r\n\r\n // Close popup if the sensor was deleted\r\n React.useEffect(() => {\r\n if (popupInfo && !sensors.find((s) => s.id === popupInfo.id)) {\r\n setPopUpInfo(null)\r\n }\r\n }, [sensors, popupInfo])\r\n\r\n const geojsonSensorData = React.useMemo(() => {\r\n const convertDataToGeojson = (sensorData: typeof eligibleSensors): GeoJSON.FeatureCollection<GeoJSON.Point, { [key: string]: any }> => {\r\n const sensorFeatures: GeoJSON.Feature<GeoJSON.Point, { [key: string]: any }>[] = sensorData\r\n .map((sensor) => {\r\n const { longitude, latitude, id, name, typeId, sensorType, data, dataFormat, updateFrequency, createdAt, authorId, organizationId, visible, url, authorName } = sensor\r\n\r\n return {\r\n type: 'Feature',\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude],\r\n },\r\n properties: {\r\n id: Number(id),\r\n organizationId,\r\n visible,\r\n longitude,\r\n latitude,\r\n authorId: Number(authorId),\r\n authorName,\r\n name,\r\n typeId: Number(typeId),\r\n typeIcon: sensorType?.icon,\r\n data,\r\n dataFormat,\r\n updateFrequency,\r\n url,\r\n createdAt,\r\n viewer: ViewerNames.map,\r\n },\r\n }\r\n })\r\n\r\n \r\n\r\n const sensorFC: GeoJSON.FeatureCollection<GeoJSON.Point, { [key: string]: any }> = {\r\n type: 'FeatureCollection',\r\n features: sensorFeatures,\r\n }\r\n return sensorFC\r\n }\r\n return convertDataToGeojson(eligibleSensors)\r\n }, [eligibleSensors])\r\n\r\n // event listeners for sensor unclustered points\r\n React.useEffect(() => {\r\n if (!map) return\r\n const showSensorPopUp: ClickCallback = (e: MapLayerMouseEvent, features: MapGeoJSONFeature[]) => {\r\n const feature = features?.[0]\r\n\r\n if (!feature || feature.properties.point_count) return\r\n\r\n if (feature.geometry.type != 'Point') return\r\n const [longitude, latitude] = feature.geometry.coordinates\r\n const { id, authorId, name, typeId, data, dataFormat, updateFrequency, createdAt, url } = feature.properties\r\n setPopUpInfo({\r\n id: Number(id),\r\n authorId: Number(authorId),\r\n organizationId: feature.properties?.organizationId,\r\n visible: feature.properties?.visible,\r\n longitude,\r\n latitude,\r\n name,\r\n typeId: Number(typeId),\r\n data,\r\n dataFormat,\r\n updateFrequency,\r\n url,\r\n createdAt,\r\n viewer: ViewerNames.map,\r\n })\r\n }\r\n\r\n const mouseEnterChangeCursor = () => {\r\n map.getCanvas().style.cursor = 'pointer'\r\n }\r\n const mouseLeaveChangeCursor = () => {\r\n map.getCanvas().style.cursor = ''\r\n }\r\n\r\n // event listener for clicking on single point to show sensor, hover to change cursor\r\n mapClickManager.register('sensors-unclustered-points', MapLayerClickPriority.CommentLayersClickPriority, showSensorPopUp)\r\n\r\n map.on('mouseenter', 'sensors-unclustered-points', mouseEnterChangeCursor)\r\n map.on('mouseleave', 'sensors-unclustered-points', mouseLeaveChangeCursor)\r\n return () => {\r\n mapClickManager.unregister('sensors-unclustered-points')\r\n map.off('mouseenter', 'sensors-unclustered-points', mouseEnterChangeCursor)\r\n map.off('mouseleave', 'sensors-unclustered-points', mouseLeaveChangeCursor)\r\n }\r\n }, [map, mapClickManager])\r\n\r\n const handleRemoveSensor = () => {\r\n toast.success(t('sensorDeleted'))\r\n deleteSensor()\r\n setPopUpInfo(null)\r\n }\r\n\r\n // event listeners for clustered points\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const zoomInToDecluster = (e: MapLayerMouseEvent) => {\r\n const feature = e.features?.[0] // only proceed if this is actually a cluster\r\n if (!feature || !feature.properties.cluster_id) return\r\n\r\n const clusterId = feature.properties.cluster_id as number\r\n\r\n // Check if geometry has coordinates (not a GeometryCollection)\r\n if (!('coordinates' in feature.geometry)) return\r\n const [lng, lat] = feature.geometry.coordinates as [number, number]\r\n\r\n const source = map.getSource('sensors') as any\r\n console.log(source)\r\n console.log(clusterId)\r\n source.getClusterExpansionZoom(clusterId).then(\r\n (zoom: number) => {\r\n console.log('easing to')\r\n map.easeTo({ center: [lng, lat], zoom })\r\n },\r\n )\r\n .catch((error) => {\r\n console.error(error)\r\n })\r\n }\r\n\r\n const mouseEnterChangeCursor = () => { map.getCanvas().style.cursor = 'pointer' }\r\n const mouseLeaveChangeCursor = () => { map.getCanvas().style.cursor = '' }\r\n\r\n // event listener for clicking on single point to zoom in and decluster, hover to change cursor\r\n map.on('click', 'sensors-clusters', zoomInToDecluster)\r\n map.on('mouseenter', 'sensors-clusters', mouseEnterChangeCursor)\r\n map.on('mouseleave', 'sensors-clusters', mouseLeaveChangeCursor)\r\n return () => {\r\n map.off('click', 'sensors-clusters', zoomInToDecluster)\r\n map.off('mouseenter', 'sensors-clusters', mouseEnterChangeCursor)\r\n map.off('mouseleave', 'sensors-clusters', mouseLeaveChangeCursor)\r\n }\r\n }, [map])\r\n\r\n const renderPopup = () => {\r\n if (!popupInfo) return null\r\n const sensorType = sensorTypes.find(t => t.id === popupInfo.typeId)\r\n const liveSensor = sensors.find(s => s.id === popupInfo.id)\r\n const dataUrl = popupInfo.url \r\n ? `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/sensors/${popupInfo.url}`\r\n : popupInfo.data || ''\r\n \r\n return (\r\n <Popup\r\n className=\"noBorderPopup\"\r\n longitude={popupInfo.longitude}\r\n latitude={popupInfo.latitude}\r\n closeOnClick={false}\r\n onClose={() => setPopUpInfo(null)}\r\n anchor=\"bottom\"\r\n style={{ height: '50px', border: 'none', boxShadow: 'none' }}\r\n offset={[0, 10]}\r\n >\r\n <Sensor\r\n sensorName={popupInfo.name || ''}\r\n sensorType={sensorType}\r\n sensorId={popupInfo.id}\r\n tags={liveSensor?.tags ?? []}\r\n onAddTag={async (tag) => { await updateSensor({ tags: [...(liveSensor?.tags ?? []), tag] }) }}\r\n onDeleteTag={async (tag) => { await updateSensor({ tags: (liveSensor?.tags ?? []).filter(t => t !== tag) }) }}\r\n tagsTranslations={{\r\n addTag: tSensors('addTag'),\r\n removeTag: tSensors('removeTag'),\r\n cancel: tSensors('cancel'),\r\n newTagPlaceholder: tSensors('newTagPlaceholder'),\r\n }}\r\n dataUrl={dataUrl}\r\n dataFormat={popupInfo.dataFormat}\r\n updateFrequency={popupInfo.updateFrequency}\r\n buildingId={popupInfo.buildingId}\r\n createdAt={popupInfo.createdAt}\r\n onRemove={user.id === String(popupInfo.authorId) ? handleRemoveSensor : null}\r\n onClose={() => setPopUpInfo(null)}\r\n size=\"sm\"\r\n />\r\n {/* inline styles to override MapLibre's Pop up CSS */}\r\n <style>\r\n {`\r\n .noBorderPopup .maplibregl-popup-content {\r\n border: none !important;\r\n box-shadow: none !important;\r\n background: transparent !important;\r\n }\r\n .noBorderPopup .maplibregl-popup-tip {\r\n display: none !important;\r\n }\r\n `}\r\n </style>\r\n </Popup>\r\n )\r\n }\r\n\r\n // Track unclustered sensors to display icons\r\n const [unclusteredFeatures, setUnclusteredFeatures] = React.useState<MapGeoJSONFeature[]>([])\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n\r\n const updateUnclusteredFeatures = () => {\r\n const allFeatures = map.querySourceFeatures('sensors')\r\n const unclusteredOnly = allFeatures.filter(\r\n (f) => !f.properties?.cluster && !f.properties?.point_count\r\n )\r\n // Deduplicate by id\r\n const uniqueFeatures = new Map()\r\n unclusteredOnly.forEach((f) => uniqueFeatures.set(f.properties.id, f))\r\n setUnclusteredFeatures(Array.from(uniqueFeatures.values()))\r\n }\r\n\r\n const onSourceData = (e: any) => {\r\n if (e?.sourceId === 'sensors') updateUnclusteredFeatures()\r\n }\r\n\r\n map.on('sourcedata', onSourceData)\r\n map.on('moveend', updateUnclusteredFeatures)\r\n map.on('zoomend', updateUnclusteredFeatures)\r\n\r\n updateUnclusteredFeatures()\r\n\r\n return () => {\r\n map.off('sourcedata', onSourceData)\r\n map.off('moveend', updateUnclusteredFeatures)\r\n map.off('zoomend', updateUnclusteredFeatures)\r\n }\r\n }, [map])\r\n\r\n return (\r\n <>\r\n {(typesVisible.length > 0 || tagsVisible.length > 0) &&\r\n <Source\r\n id=\"sensors\"\r\n type=\"geojson\"\r\n data={geojsonSensorData}\r\n cluster={true}\r\n clusterMaxZoom={14}\r\n clusterRadius={40}\r\n >\r\n <Layer {...clusterLayer} />\r\n <Layer {...clusterCountLayer} />\r\n <Layer {...unclusteredPointLayer} />\r\n\r\n {renderPopup()}\r\n {unclusteredFeatures\r\n .filter((feature) => feature.properties?.id !== popupInfo?.id)\r\n .map((feature) => (\r\n <SensorIconMarker\r\n key={String(feature.properties?.id)}\r\n feature={feature}\r\n isHighlighted={currentSensorId === feature.properties?.id || hoveredSensorId === feature.properties?.id}\r\n onMouseEnter={() => setHoveredSensorId(feature.properties?.id)}\r\n onMouseLeave={() => setHoveredSensorId(null)}\r\n sensorTypes={sensorTypes}\r\n />\r\n ))}\r\n </Source>}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b","user","t"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAA;AACtE,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAI5E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoDvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAA;AACtE,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAI5E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoDvE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.ts"],"sourcesContent":["import type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type Site } from '../../../../../../../types/dbTypes'\r\n\r\nimport { layerColorByName } from '../../../../utils/stringToColour'\r\n\r\nexport function createSitesDataset(sites: Site[], name: string): Dataset {\r\n const layerColor = layerColorByName(name)\r\n\r\n const getFields = async () => [\r\n { name: 'siteType', type: 'string' },\r\n { name: 'siteUnitsTotal', type: 'number' },\r\n { name: 'siteTotalSqft', type: 'number' },\r\n { name: 'siteStoreyNum', type: 'number' },\r\n ]\r\n\r\n const getFeatures = async () => ({\r\n type: 'FeatureCollection',\r\n features: sites\r\n .filter(s => s.siteLongitude != null && s.siteLatitude != null)\r\n .map(site => ({\r\n type: 'Feature',\r\n\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [site.siteLongitude, site.siteLatitude],\r\n },\r\n properties: {\r\n id: site.id,\r\n dbId: site.id,\r\n isBuilding: true,\r\n isDbBuilding: true,\r\n name: site.siteName,\r\n // type: site.siteType,\r\n // unitsTotal: site.siteUnitsTotal,\r\n // totalSqft: site.siteTotalSqft,\r\n // storeyNum: site.siteStoreyNum,\r\n },\r\n })),\r\n } as import('geojson').FeatureCollection)\r\n\r\n return {\r\n id: name.toLowerCase().replaceAll(/\\s+/g, '_'),\r\n name,\r\n type: 'sites',\r\n visible: true,\r\n total: sites.length,\r\n getFields,\r\n getFeatures,\r\n layerColor,\r\n dataManagementSystem: 'other',\r\n datasetType: 'GeoJSON',\r\n countrySubdivision: undefined,\r\n municipality: undefined,\r\n publisher: 'EnviroCentre',\r\n keywords: ['sites', 'Database', 'GeoJSON'],\r\n group: DatasetGroup.Organizational,\r\n }\r\n}\r\n"],"mappings":"AACA,SAAS,oBAA+B;AAExC,SAAS,wBAAwB;AAE1B,SAAS,mBAAmB,OAAe,MAAuB;AACvE,QAAM,aAAa,iBAAiB,IAAI;AAExC,QAAM,YAAY,YAAY;AAAA,IAC5B,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,IACnC,EAAE,MAAM,kBAAkB,MAAM,SAAS;AAAA,IACzC,EAAE,MAAM,iBAAiB,MAAM,SAAS;AAAA,IACxC,EAAE,MAAM,iBAAiB,MAAM,SAAS;AAAA,EAC1C;AAEA,QAAM,cAAc,aAAa;AAAA,IAC/B,MAAM;AAAA,IACN,UAAU,MACP,OAAO,OAAK,EAAE,iBAAiB,QAAQ,EAAE,gBAAgB,IAAI,EAC7D,IAAI,WAAS;AAAA,MACZ,MAAM;AAAA,MAEN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa,CAAC,KAAK,eAAe,KAAK,YAAY;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,QACV,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAKb;AAAA,IACF,EAAE;AAAA,EACN;AAEA,SAAO;AAAA,IACL,IAAI,KAAK,YAAY,EAAE,WAAW,QAAQ,GAAG;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU,CAAC,SAAS,YAAY,SAAS;AAAA,IACzC,OAAO,aAAa;AAAA,EACtB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type Site } from '../../../../../../../types/dbTypes'\r\n\r\nimport { layerColorByName } from '../../../../utils/stringToColour'\r\n\r\nexport function createSitesDataset(sites: Site[], name: string): Dataset {\r\n const layerColor = layerColorByName(name)\r\n\r\n const getFields = async () => [\r\n { name: 'siteType', type: 'string' },\r\n { name: 'siteUnitsTotal', type: 'number' },\r\n { name: 'siteTotalSqft', type: 'number' },\r\n { name: 'siteStoreyNum', type: 'number' },\r\n ]\r\n\r\n const getFeatures = async () => ({\r\n type: 'FeatureCollection',\r\n features: sites\r\n .filter(s => s.siteLongitude != null && s.siteLatitude != null)\r\n .map(site => ({\r\n type: 'Feature',\r\n\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [site.siteLongitude, site.siteLatitude],\r\n },\r\n properties: {\r\n id: site.id,\r\n dbId: site.id,\r\n isBuilding: true,\r\n isDbBuilding: true,\r\n name: site.siteName,\r\n // type: site.siteType,\r\n // unitsTotal: site.siteUnitsTotal,\r\n // totalSqft: site.siteTotalSqft,\r\n // storeyNum: site.siteStoreyNum,\r\n },\r\n })),\r\n } as import('geojson').FeatureCollection)\r\n\r\n return {\r\n id: name.toLowerCase().replaceAll(/\\s+/g, '_'),\r\n name,\r\n type: 'sites',\r\n visible: true,\r\n total: sites.length,\r\n getFields,\r\n getFeatures,\r\n layerColor,\r\n dataManagementSystem: 'other',\r\n datasetType: 'GeoJSON',\r\n countrySubdivision: undefined,\r\n municipality: undefined,\r\n publisher: 'EnviroCentre',\r\n keywords: ['sites', 'Database', 'GeoJSON'],\r\n group: DatasetGroup.Organizational,\r\n }\r\n}\r\n"],"mappings":"AAIA,SAAS,oBAA+B;AAExC,SAAS,wBAAwB;AAE1B,SAAS,mBAAmB,OAAe,MAAuB;AACvE,QAAM,aAAa,iBAAiB,IAAI;AAExC,QAAM,YAAY,YAAY;AAAA,IAC5B,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,IACnC,EAAE,MAAM,kBAAkB,MAAM,SAAS;AAAA,IACzC,EAAE,MAAM,iBAAiB,MAAM,SAAS;AAAA,IACxC,EAAE,MAAM,iBAAiB,MAAM,SAAS;AAAA,EAC1C;AAEA,QAAM,cAAc,aAAa;AAAA,IAC/B,MAAM;AAAA,IACN,UAAU,MACP,OAAO,OAAK,EAAE,iBAAiB,QAAQ,EAAE,gBAAgB,IAAI,EAC7D,IAAI,WAAS;AAAA,MACZ,MAAM;AAAA,MAEN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa,CAAC,KAAK,eAAe,KAAK,YAAY;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,QACV,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAKb;AAAA,IACF,EAAE;AAAA,EACN;AAEA,SAAO;AAAA,IACL,IAAI,KAAK,YAAY,EAAE,WAAW,QAAQ,GAAG;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,UAAU,CAAC,SAAS,YAAY,SAAS;AAAA,IACzC,OAAO,aAAa;AAAA,EACtB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"disposeThreeScene.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAuB1D"}
1
+ {"version":3,"file":"disposeThreeScene.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAuB1D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.ts"],"sourcesContent":["import * as THREE from 'three'\r\n\r\n/**\r\n * Fully disposes all GPU resources in a Three.js scene:\r\n * geometries, materials, and every texture referenced by those materials.\r\n * Call this before nulling out a scene to avoid WebGL memory leaks.\r\n */\r\nexport function disposeThreeScene(scene: THREE.Scene): void {\r\n scene.traverse((object) => {\r\n const mesh = object as THREE.Mesh\r\n if (!mesh.isMesh) return\r\n\r\n mesh.geometry?.dispose()\r\n\r\n const materials: THREE.Material[] = Array.isArray(mesh.material)\r\n ? mesh.material\r\n : [mesh.material]\r\n\r\n for (const mat of materials) {\r\n if (!mat) continue\r\n // Dispose every texture property on the material\r\n for (const value of Object.values(mat)) {\r\n if (value instanceof THREE.Texture) (value as THREE.Texture).dispose()\r\n }\r\n mat.dispose()\r\n }\r\n })\r\n\r\n // Detach all children so the scene graph is clean\r\n while (scene.children.length > 0) scene.remove(scene.children[0])\r\n}\r\n"],"mappings":"AAAA,YAAY,WAAW;AAOhB,SAAS,kBAAkB,OAA0B;AACxD,QAAM,SAAS,CAAC,WAAW;AAR/B;AASQ,UAAM,OAAO;AACb,QAAI,CAAC,KAAK,OAAQ;AAElB,eAAK,aAAL,mBAAe;AAEf,UAAM,YAA8B,MAAM,QAAQ,KAAK,QAAQ,IACzD,KAAK,WACL,CAAC,KAAK,QAAQ;AAEpB,eAAW,OAAO,WAAW;AACzB,UAAI,CAAC,IAAK;AAEV,iBAAW,SAAS,OAAO,OAAO,GAAG,GAAG;AACpC,YAAI,iBAAiB,MAAM,QAAS,CAAC,MAAwB,QAAQ;AAAA,MACzE;AACA,UAAI,QAAQ;AAAA,IAChB;AAAA,EACJ,CAAC;AAGD,SAAO,MAAM,SAAS,SAAS,EAAG,OAAM,OAAO,MAAM,SAAS,CAAC,CAAC;AACpE;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as THREE from 'three'\r\n\r\n/**\r\n * Fully disposes all GPU resources in a Three.js scene:\r\n * geometries, materials, and every texture referenced by those materials.\r\n * Call this before nulling out a scene to avoid WebGL memory leaks.\r\n */\r\nexport function disposeThreeScene(scene: THREE.Scene): void {\r\n scene.traverse((object) => {\r\n const mesh = object as THREE.Mesh\r\n if (!mesh.isMesh) return\r\n\r\n mesh.geometry?.dispose()\r\n\r\n const materials: THREE.Material[] = Array.isArray(mesh.material)\r\n ? mesh.material\r\n : [mesh.material]\r\n\r\n for (const mat of materials) {\r\n if (!mat) continue\r\n // Dispose every texture property on the material\r\n for (const value of Object.values(mat)) {\r\n if (value instanceof THREE.Texture) (value as THREE.Texture).dispose()\r\n }\r\n mat.dispose()\r\n }\r\n })\r\n\r\n // Detach all children so the scene graph is clean\r\n while (scene.children.length > 0) scene.remove(scene.children[0])\r\n}\r\n"],"mappings":"AAGA,YAAY,WAAW;AAOhB,SAAS,kBAAkB,OAA0B;AACxD,QAAM,SAAS,CAAC,WAAW;AAX/B;AAYQ,UAAM,OAAO;AACb,QAAI,CAAC,KAAK,OAAQ;AAElB,eAAK,aAAL,mBAAe;AAEf,UAAM,YAA8B,MAAM,QAAQ,KAAK,QAAQ,IACzD,KAAK,WACL,CAAC,KAAK,QAAQ;AAEpB,eAAW,OAAO,WAAW;AACzB,UAAI,CAAC,IAAK;AAEV,iBAAW,SAAS,OAAO,OAAO,GAAG,GAAG;AACpC,YAAI,iBAAiB,MAAM,QAAS,CAAC,MAAwB,QAAQ;AAAA,MACzE;AACA,UAAI,QAAQ;AAAA,IAChB;AAAA,EACJ,CAAC;AAGD,SAAO,MAAM,SAAS,SAAS,EAAG,OAAM,OAAO,MAAM,SAAS,CAAC,CAAC;AACpE;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"mapLayersUtils.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEtD,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,UASrD,CAAA;AAEF,eAAO,MAAM,uBAAuB,GAAI,UAAU,MAAM,KAAG,UAezD,CAAA;AAEF,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,KAAG,UAa7D,CAAA"}
1
+ {"version":3,"file":"mapLayersUtils.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEtD,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,UASrD,CAAA;AAEF,eAAO,MAAM,uBAAuB,GAAI,UAAU,MAAM,KAAG,UAezD,CAAA;AAEF,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,KAAG,UAa7D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.ts"],"sourcesContent":["import type { LayerProps } from 'react-map-gl/maplibre'\r\n\r\n export const createClusterLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-clusters`,\r\n type: 'circle',\r\n source: sourceId,\r\n filter: ['has', 'point_count'],\r\n paint: {\r\n 'circle-color': ['step', ['get', 'point_count'], '#51bbd6', 100, '#f1f075', 750, '#f28cb1'],\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n },\r\n})\r\n\r\nexport const createClusterCountLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-cluster-count`,\r\n type: 'symbol',\r\n source: sourceId,\r\n filter: ['has', 'point_count'],\r\n layout: {\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n },\r\n paint: {\r\n 'text-color': '#000',\r\n 'text-halo-color': '#fff',\r\n 'text-halo-width': 1,\r\n },\r\n})\r\n\r\nexport const createUnclusteredPointLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-unclustered-points`,\r\n type: 'circle',\r\n source: sourceId,\r\n filter: ['!', ['has', 'point_count']],\r\n paint: {\r\n 'circle-color': '#11b4da',\r\n 'circle-radius': 20,\r\n 'circle-stroke-width': 1,\r\n 'circle-stroke-color': '#fff',\r\n 'circle-opacity': 0, // fully transparent to hide circle but allow clickable\r\n 'circle-stroke-opacity': 0, // makes stroke invisible too\r\n },\r\n})\r\n"],"mappings":"AAEQ,MAAM,qBAAqB,CAAC,cAAkC;AAAA,EACpE,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,OAAO,aAAa;AAAA,EAC7B,OAAO;AAAA,IACL,gBAAgB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,WAAW,KAAK,WAAW,KAAK,SAAS;AAAA,IAC1F,iBAAiB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,EACxE;AACF;AAEO,MAAM,0BAA0B,CAAC,cAAkC;AAAA,EACxE,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,OAAO,aAAa;AAAA,EAC7B,QAAQ;AAAA,IACN,cAAc;AAAA,IACd,aAAa,CAAC,uBAAuB,uBAAuB;AAAA,IAC5D,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB;AACF;AAEO,MAAM,8BAA8B,CAAC,cAAkC;AAAA,EAC5E,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC;AAAA,EACpC,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,kBAAkB;AAAA;AAAA,IAClB,yBAAyB;AAAA;AAAA,EAC3B;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { LayerProps } from 'react-map-gl/maplibre'\r\n\r\n export const createClusterLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-clusters`,\r\n type: 'circle',\r\n source: sourceId,\r\n filter: ['has', 'point_count'],\r\n paint: {\r\n 'circle-color': ['step', ['get', 'point_count'], '#51bbd6', 100, '#f1f075', 750, '#f28cb1'],\r\n 'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],\r\n },\r\n})\r\n\r\nexport const createClusterCountLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-cluster-count`,\r\n type: 'symbol',\r\n source: sourceId,\r\n filter: ['has', 'point_count'],\r\n layout: {\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 12,\r\n },\r\n paint: {\r\n 'text-color': '#000',\r\n 'text-halo-color': '#fff',\r\n 'text-halo-width': 1,\r\n },\r\n})\r\n\r\nexport const createUnclusteredPointLayer = (sourceId: string): LayerProps => ({\r\n id: `${sourceId}-unclustered-points`,\r\n type: 'circle',\r\n source: sourceId,\r\n filter: ['!', ['has', 'point_count']],\r\n paint: {\r\n 'circle-color': '#11b4da',\r\n 'circle-radius': 20,\r\n 'circle-stroke-width': 1,\r\n 'circle-stroke-color': '#fff',\r\n 'circle-opacity': 0, // fully transparent to hide circle but allow clickable\r\n 'circle-stroke-opacity': 0, // makes stroke invisible too\r\n },\r\n})\r\n"],"mappings":"AAKQ,MAAM,qBAAqB,CAAC,cAAkC;AAAA,EACpE,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,OAAO,aAAa;AAAA,EAC7B,OAAO;AAAA,IACL,gBAAgB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,WAAW,KAAK,WAAW,KAAK,SAAS;AAAA,IAC1F,iBAAiB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,EACxE;AACF;AAEO,MAAM,0BAA0B,CAAC,cAAkC;AAAA,EACxE,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,OAAO,aAAa;AAAA,EAC7B,QAAQ;AAAA,IACN,cAAc;AAAA,IACd,aAAa,CAAC,uBAAuB,uBAAuB;AAAA,IAC5D,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB;AACF;AAEO,MAAM,8BAA8B,CAAC,cAAkC;AAAA,EAC5E,IAAI,GAAG,QAAQ;AAAA,EACf,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC;AAAA,EACpC,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,kBAAkB;AAAA;AAAA,IAClB,yBAAyB;AAAA;AAAA,EAC3B;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TabSelector.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/TabSelector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAEnE,UAAU,gBAAgB;IACxB,SAAS,EAAE,cAAc,CAAA;IACzB,iBAAiB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;CACjD;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,qBAuC7E"}
1
+ {"version":3,"file":"TabSelector.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/TabSelector.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAEnE,UAAU,gBAAgB;IACxB,SAAS,EAAE,cAAc,CAAA;IACzB,iBAAiB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;CACjD;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,qBAuC7E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/TabSelector.tsx"],"sourcesContent":["'use client'\r\nimport * as React from 'react'\r\nimport { Separator } from '../../../../ui/Separator'\r\nimport { useTranslations } from 'next-intl'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\n\r\ninterface TabSelectorProps {\r\n activeTab: SidebarTabType\r\n onTabChangeAction: (tab: SidebarTabType) => void\r\n}\r\n\r\nexport function TabSelector({ activeTab, onTabChangeAction }: TabSelectorProps) {\r\n // Translation\r\n const t = useTranslations('TabSelector')\r\n\r\n const tabs = [\r\n { id: 'file', label: t('fileLabel') },\r\n { id: 'layers', label: t('layersTitle') },\r\n { id: 'communication', label: t('communicationTitle') },\r\n { id: 'sensors', label: t('sensorsTitle') },\r\n { id: 'settings', label: t('settingsTitle') },\r\n ]\r\n\r\n return (\r\n <div>\r\n <Separator />\r\n\r\n <div className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-1\">\r\n {tabs.map(tab => (\r\n <div\r\n key={tab.id}\r\n className={`px-3 py-2 rounded-md cursor-pointer transition-colors text-xs font-medium ${\r\n activeTab === tab.id\r\n ? 'bg-accent text-accent-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-accent/50'\r\n }`}\r\n onClick={() => onTabChangeAction(tab.id as SidebarTabType)}\r\n >\r\n {tab.label}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAwBI,SACE,KADF;AAtBJ,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAQzB,SAAS,YAAY,EAAE,WAAW,kBAAkB,GAAqB;AAE9E,QAAM,IAAI,gBAAgB,aAAa;AAEvC,QAAM,OAAO;AAAA,IACX,EAAE,IAAI,QAAQ,OAAO,EAAE,WAAW,EAAE;AAAA,IACpC,EAAE,IAAI,UAAU,OAAO,EAAE,aAAa,EAAE;AAAA,IACxC,EAAE,IAAI,iBAAiB,OAAO,EAAE,oBAAoB,EAAE;AAAA,IACtD,EAAE,IAAI,WAAW,OAAO,EAAE,cAAc,EAAE;AAAA,IAC1C,EAAE,IAAI,YAAY,OAAO,EAAE,eAAe,EAAE;AAAA,EAC9C;AAEA,SACE,qBAAC,SACC;AAAA,wBAAC,aAAU;AAAA,IAEX,oBAAC,SAAI,WAAU,aACb,8BAAC,SAAI,WAAU,qCACb,8BAAC,SAAI,WAAU,2BACZ,eAAK,IAAI,SACR;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,6EACT,cAAc,IAAI,KACd,qCACA,gEACN;AAAA,QACA,SAAS,MAAM,kBAAkB,IAAI,EAAoB;AAAA,QAExD,cAAI;AAAA;AAAA,MARA,IAAI;AAAA,IASX,CACD,GACH,GACF,GACF;AAAA,IAEA,oBAAC,aAAU;AAAA,KACb;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/TabSelector.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 { Separator } from '../../../../ui/Separator'\r\nimport { useTranslations } from 'next-intl'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\n\r\ninterface TabSelectorProps {\r\n activeTab: SidebarTabType\r\n onTabChangeAction: (tab: SidebarTabType) => void\r\n}\r\n\r\nexport function TabSelector({ activeTab, onTabChangeAction }: TabSelectorProps) {\r\n // Translation\r\n const t = useTranslations('TabSelector')\r\n\r\n const tabs = [\r\n { id: 'file', label: t('fileLabel') },\r\n { id: 'layers', label: t('layersTitle') },\r\n { id: 'communication', label: t('communicationTitle') },\r\n { id: 'sensors', label: t('sensorsTitle') },\r\n { id: 'settings', label: t('settingsTitle') },\r\n ]\r\n\r\n return (\r\n <div>\r\n <Separator />\r\n\r\n <div className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-1\">\r\n {tabs.map(tab => (\r\n <div\r\n key={tab.id}\r\n className={`px-3 py-2 rounded-md cursor-pointer transition-colors text-xs font-medium ${\r\n activeTab === tab.id\r\n ? 'bg-accent text-accent-foreground'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-accent/50'\r\n }`}\r\n onClick={() => onTabChangeAction(tab.id as SidebarTabType)}\r\n >\r\n {tab.label}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Separator />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA4BI,SACE,KADF;AAtBJ,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAQzB,SAAS,YAAY,EAAE,WAAW,kBAAkB,GAAqB;AAE9E,QAAM,IAAI,gBAAgB,aAAa;AAEvC,QAAM,OAAO;AAAA,IACX,EAAE,IAAI,QAAQ,OAAO,EAAE,WAAW,EAAE;AAAA,IACpC,EAAE,IAAI,UAAU,OAAO,EAAE,aAAa,EAAE;AAAA,IACxC,EAAE,IAAI,iBAAiB,OAAO,EAAE,oBAAoB,EAAE;AAAA,IACtD,EAAE,IAAI,WAAW,OAAO,EAAE,cAAc,EAAE;AAAA,IAC1C,EAAE,IAAI,YAAY,OAAO,EAAE,eAAe,EAAE;AAAA,EAC9C;AAEA,SACE,qBAAC,SACC;AAAA,wBAAC,aAAU;AAAA,IAEX,oBAAC,SAAI,WAAU,aACb,8BAAC,SAAI,WAAU,qCACb,8BAAC,SAAI,WAAU,2BACZ,eAAK,IAAI,SACR;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,6EACT,cAAc,IAAI,KACd,qCACA,gEACN;AAAA,QACA,SAAS,MAAM,kBAAkB,IAAI,EAAoB;AAAA,QAExD,cAAI;AAAA;AAAA,MARA,IAAI;AAAA,IASX,CACD,GACH,GACF,GACF;AAAA,IAEA,oBAAC,aAAU;AAAA,KACb;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,wBAAgB,UAAU,sBA2BzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,wBAAgB,UAAU,sBA2BzB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\n\r\nexport function MapSidebar() {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab />}\r\n {selectedTab === 'settings' && <SettingsTab />} \r\n </InfoSidebarContainer>\r\n )\r\n}"],"mappings":";AAyBI,SAEI,KAFJ;AAxBJ,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,sBAAsB;AAE7C,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAEpB,SAAS,aAAa;AAE3B,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,kBAAkB,CAACA,iBAAgC;AACvD,kBAAc,EAAE,MAAM,4BAA4B,SAAS,EAAE,aAAAA,aAAY,EAAE,CAAC;AAAA,EAC9E;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAmB;AAAA;AAAA,MACrB;AAAA,MAGD;AAAA,wBAAgB,UAAU,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,WAAQ;AAAA,QAClE,gBAAgB,YAAY,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,aAAU;AAAA,QACtE,gBAAgB,mBAAmB,QAAQ,IAAI,QAAQ,SAAS,KAAK,oBAAC,oBAAiB;AAAA,QACvF,gBAAgB,aAAa,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAC,cAAW;AAAA,QAC1E,gBAAgB,cAAc,oBAAC,eAAY;AAAA;AAAA;AAAA,EAC9C;AAEJ;","names":["selectedTab"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\n\r\nexport function MapSidebar() {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab />}\r\n {selectedTab === 'settings' && <SettingsTab />} \r\n </InfoSidebarContainer>\r\n )\r\n}"],"mappings":";AA6BI,SAEI,KAFJ;AAxBJ,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,sBAAsB;AAE7C,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAEpB,SAAS,aAAa;AAE3B,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,kBAAkB,CAACA,iBAAgC;AACvD,kBAAc,EAAE,MAAM,4BAA4B,SAAS,EAAE,aAAAA,aAAY,EAAE,CAAC;AAAA,EAC9E;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAmB;AAAA;AAAA,MACrB;AAAA,MAGD;AAAA,wBAAgB,UAAU,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,WAAQ;AAAA,QAClE,gBAAgB,YAAY,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,aAAU;AAAA,QACtE,gBAAgB,mBAAmB,QAAQ,IAAI,QAAQ,SAAS,KAAK,oBAAC,oBAAiB;AAAA,QACvF,gBAAgB,aAAa,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAC,cAAW;AAAA,QAC1E,gBAAgB,cAAc,oBAAC,eAAY;AAAA;AAAA;AAAA,EAC9C;AAEJ;","names":["selectedTab"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,gBAAgB,sBAM/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,gBAAgB,sBAM/B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { CommentsSection } from '../../../../../../ui/Comments/CommentsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function CommunicationTab() {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <CommentsSection />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAcM;AAVN,SAAS,uBAAuB;AAOzB,SAAS,mBAAmB;AACjC,SACE,oBAAC,SAAI,WAAU,uDACb,8BAAC,mBAAgB,GACnB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { CommentsSection } from '../../../../../../ui/Comments/CommentsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function CommunicationTab() {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <CommentsSection />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAiBM;AAVN,SAAS,uBAAuB;AAOzB,SAAS,mBAAmB;AACjC,SACE,oBAAC,SAAI,WAAU,uDACb,8BAAC,mBAAgB,GACnB;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,wBAAgB,OAAO,sBAuCtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,wBAAgB,OAAO,sBAuCtB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { FilesSection } from './src/FilesSection'\r\n\r\n\r\nimport { ModelsSection } from './src/ModelsSection'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { useFiles } from '../../../../../../../hooks/files/files'\r\nimport { SearchInput } from '../../../../../../ui'\r\n\r\nexport function FileTab() {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const filesData: DbFile[] = useFiles().files || []\r\n\r\n const BIMFiles: DbFile[] = []\r\n const nonBIMFiles: DbFile[] = []\r\n\r\n // single .map pass to populate both arrays\r\n filesData.map((file) => {\r\n const {extension} = file\r\n if (!extension) return\r\n const isBIM = extension.toLowerCase() === 'frag'\r\n\r\n if (isBIM) {\r\n BIMFiles.push(file)\r\n } else {\r\n nonBIMFiles.push(file)\r\n }\r\n })\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 flex flex-col divide-y\">\r\n <div className=\"basis-1/2 min-h-0 overflow-hidden\">\r\n <ModelsSection files={BIMFiles} query={searchQuery} />\r\n </div>\r\n <div className=\"basis-1/2 min-h-0 overflow-hidden pt-4\">\r\n <FilesSection files={nonBIMFiles} query={searchQuery} />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAkCQ,cAMF,YANE;AAhCR,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAG7B,SAAS,qBAAqB;AAE9B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAErB,SAAS,UAAU;AACxB,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,YAAsB,SAAS,EAAE,SAAS,CAAC;AAEjD,QAAM,WAAqB,CAAC;AAC5B,QAAM,cAAwB,CAAC;AAG/B,YAAU,IAAI,CAAC,SAAS;AACtB,UAAM,EAAC,UAAS,IAAI;AACpB,QAAI,CAAC,UAAW;AAChB,UAAM,QAAQ,UAAU,YAAY,MAAM;AAE1C,QAAI,OAAO;AACT,eAAS,KAAK,IAAI;AAAA,IACpB,OAAO;AACL,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,uDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,yCACb;AAAA,0BAAC,SAAI,WAAU,qCACb,8BAAC,iBAAc,OAAO,UAAU,OAAO,aAAa,GACtD;AAAA,MACA,oBAAC,SAAI,WAAU,0CACb,8BAAC,gBAAa,OAAO,aAAa,OAAO,aAAa,GACxD;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { FilesSection } from './src/FilesSection'\r\n\r\n\r\nimport { ModelsSection } from './src/ModelsSection'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { useFiles } from '../../../../../../../hooks/files/files'\r\nimport { SearchInput } from '../../../../../../ui'\r\n\r\nexport function FileTab() {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const filesData: DbFile[] = useFiles().files || []\r\n\r\n const BIMFiles: DbFile[] = []\r\n const nonBIMFiles: DbFile[] = []\r\n\r\n // single .map pass to populate both arrays\r\n filesData.map((file) => {\r\n const {extension} = file\r\n if (!extension) return\r\n const isBIM = extension.toLowerCase() === 'frag'\r\n\r\n if (isBIM) {\r\n BIMFiles.push(file)\r\n } else {\r\n nonBIMFiles.push(file)\r\n }\r\n })\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 flex flex-col divide-y\">\r\n <div className=\"basis-1/2 min-h-0 overflow-hidden\">\r\n <ModelsSection files={BIMFiles} query={searchQuery} />\r\n </div>\r\n <div className=\"basis-1/2 min-h-0 overflow-hidden pt-4\">\r\n <FilesSection files={nonBIMFiles} query={searchQuery} />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAqCQ,cAMF,YANE;AAhCR,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAG7B,SAAS,qBAAqB;AAE9B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAErB,SAAS,UAAU;AACxB,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,YAAsB,SAAS,EAAE,SAAS,CAAC;AAEjD,QAAM,WAAqB,CAAC;AAC5B,QAAM,cAAwB,CAAC;AAG/B,YAAU,IAAI,CAAC,SAAS;AACtB,UAAM,EAAC,UAAS,IAAI;AACpB,QAAI,CAAC,UAAW;AAChB,UAAM,QAAQ,UAAU,YAAY,MAAM;AAE1C,QAAI,OAAO;AACT,eAAS,KAAK,IAAI;AAAA,IACpB,OAAO;AACL,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,uDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,yCACb;AAAA,0BAAC,SAAI,WAAU,qCACb,8BAAC,iBAAc,OAAO,UAAU,OAAO,aAAa,GACtD;AAAA,MACA,oBAAC,SAAI,WAAU,0CACb,8BAAC,gBAAa,OAAO,aAAa,OAAO,aAAa,GACxD;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FilesSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAoBvE,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,EAAE,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAU,EAAE,EAAE,iBAAiB,qBA6IhF"}
1
+ {"version":3,"file":"FilesSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAoBvE,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,EAAE,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAU,EAAE,EAAE,iBAAiB,qBA6IhF"}