@collabdt/core 0.0.51 → 0.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1000) hide show
  1. package/NOTICE +1021 -0
  2. package/README.md +32 -4
  3. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/ConfirmDialog.d.ts.map +1 -1
  6. package/dist/core/components/ConfirmDialog.js.map +1 -1
  7. package/dist/core/components/DataTableSkeleton.d.ts.map +1 -1
  8. package/dist/core/components/DataTableSkeleton.js.map +1 -1
  9. package/dist/core/components/LanguageSwitch.d.ts.map +1 -1
  10. package/dist/core/components/LanguageSwitch.js.map +1 -1
  11. package/dist/core/components/Logo.d.ts.map +1 -1
  12. package/dist/core/components/Logo.js.map +1 -1
  13. package/dist/core/components/Toolbar.d.ts.map +1 -1
  14. package/dist/core/components/Toolbar.js.map +1 -1
  15. package/dist/core/components/ToolbarBody.d.ts.map +1 -1
  16. package/dist/core/components/ToolbarBody.js.map +1 -1
  17. package/dist/core/components/ToolbarSubmenu.d.ts.map +1 -1
  18. package/dist/core/components/ToolbarSubmenu.js.map +1 -1
  19. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  20. package/dist/core/components/TopNavigationBar.js.map +1 -1
  21. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  22. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  23. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  24. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  25. package/dist/core/components/authentication/PasswordError.d.ts.map +1 -1
  26. package/dist/core/components/authentication/PasswordError.js.map +1 -1
  27. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  28. package/dist/core/components/authentication/Signin.js.map +1 -1
  29. package/dist/core/components/authentication/SigninEmail.d.ts.map +1 -1
  30. package/dist/core/components/authentication/SigninEmail.js.map +1 -1
  31. package/dist/core/components/authentication/Signup.d.ts.map +1 -1
  32. package/dist/core/components/authentication/Signup.js.map +1 -1
  33. package/dist/core/components/authentication/VerifyEmail.d.ts.map +1 -1
  34. package/dist/core/components/authentication/VerifyEmail.js.map +1 -1
  35. package/dist/core/components/authentication/index.d.ts.map +1 -1
  36. package/dist/core/components/authentication/index.js.map +1 -1
  37. package/dist/core/components/index.d.ts.map +1 -1
  38. package/dist/core/components/index.js.map +1 -1
  39. package/dist/core/components/instance-not-found/index.d.ts.map +1 -1
  40. package/dist/core/components/instance-not-found/index.js.map +1 -1
  41. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  42. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  43. package/dist/core/components/organizationConfig/index.d.ts.map +1 -1
  44. package/dist/core/components/organizationConfig/index.js.map +1 -1
  45. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  46. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  47. package/dist/core/components/settings/index.d.ts.map +1 -1
  48. package/dist/core/components/settings/index.js.map +1 -1
  49. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  50. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  51. package/dist/core/components/settings/src/ChangePassword.d.ts.map +1 -1
  52. package/dist/core/components/settings/src/ChangePassword.js.map +1 -1
  53. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  54. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  55. package/dist/core/components/settings/src/OrganizationSkeleton.d.ts.map +1 -1
  56. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  57. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  58. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  59. package/dist/core/components/settings/src/SettingsHeader.d.ts.map +1 -1
  60. package/dist/core/components/settings/src/SettingsHeader.js.map +1 -1
  61. package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
  62. package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
  63. package/dist/core/components/settings/src/SettingsSkeleton.d.ts.map +1 -1
  64. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  65. package/dist/core/components/settings/src/UsersSettingsPanel.d.ts.map +1 -1
  66. package/dist/core/components/settings/src/UsersSettingsPanel.js.map +1 -1
  67. package/dist/core/components/settings/src/types.d.ts.map +1 -1
  68. package/dist/core/components/ui/Accordion.d.ts.map +1 -1
  69. package/dist/core/components/ui/Accordion.js.map +1 -1
  70. package/dist/core/components/ui/AddItemDialog.d.ts.map +1 -1
  71. package/dist/core/components/ui/AddItemDialog.js.map +1 -1
  72. package/dist/core/components/ui/AlertDialog.d.ts.map +1 -1
  73. package/dist/core/components/ui/AlertDialog.js.map +1 -1
  74. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  75. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  76. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  77. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  78. package/dist/core/components/ui/Avatar.d.ts.map +1 -1
  79. package/dist/core/components/ui/Avatar.js.map +1 -1
  80. package/dist/core/components/ui/Badge.d.ts.map +1 -1
  81. package/dist/core/components/ui/Badge.js.map +1 -1
  82. package/dist/core/components/ui/Breadcrumb.d.ts.map +1 -1
  83. package/dist/core/components/ui/Breadcrumb.js.map +1 -1
  84. package/dist/core/components/ui/Button.d.ts.map +1 -1
  85. package/dist/core/components/ui/Button.js.map +1 -1
  86. package/dist/core/components/ui/Calendar.d.ts.map +1 -1
  87. package/dist/core/components/ui/Calendar.js.map +1 -1
  88. package/dist/core/components/ui/Card.d.ts.map +1 -1
  89. package/dist/core/components/ui/Card.js.map +1 -1
  90. package/dist/core/components/ui/Checkbox.d.ts.map +1 -1
  91. package/dist/core/components/ui/Checkbox.js.map +1 -1
  92. package/dist/core/components/ui/CollapsibleSection.d.ts.map +1 -1
  93. package/dist/core/components/ui/CollapsibleSection.js.map +1 -1
  94. package/dist/core/components/ui/ColorCircle.d.ts.map +1 -1
  95. package/dist/core/components/ui/ColorCircle.js.map +1 -1
  96. package/dist/core/components/ui/Command.d.ts.map +1 -1
  97. package/dist/core/components/ui/Command.js.map +1 -1
  98. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  99. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  100. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  101. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  102. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  103. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  104. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  105. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  106. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  107. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  108. package/dist/core/components/ui/Countdown.d.ts.map +1 -1
  109. package/dist/core/components/ui/Countdown.js.map +1 -1
  110. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  111. package/dist/core/components/ui/DataTable.js.map +1 -1
  112. package/dist/core/components/ui/DatePicker.d.ts.map +1 -1
  113. package/dist/core/components/ui/DatePicker.js.map +1 -1
  114. package/dist/core/components/ui/DescriptionList.d.ts.map +1 -1
  115. package/dist/core/components/ui/DescriptionList.js.map +1 -1
  116. package/dist/core/components/ui/Dialog.d.ts.map +1 -1
  117. package/dist/core/components/ui/Dialog.js.map +1 -1
  118. package/dist/core/components/ui/DropdownMenu.d.ts.map +1 -1
  119. package/dist/core/components/ui/DropdownMenu.js.map +1 -1
  120. package/dist/core/components/ui/ExportData.d.ts.map +1 -1
  121. package/dist/core/components/ui/ExportData.js.map +1 -1
  122. package/dist/core/components/ui/FilesManager/index.d.ts.map +1 -1
  123. package/dist/core/components/ui/FilesManager/index.js.map +1 -1
  124. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  125. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  126. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  127. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  128. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.d.ts.map +1 -1
  129. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.js.map +1 -1
  130. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  131. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  132. package/dist/core/components/ui/FilesManager/src/downloadUtils.d.ts.map +1 -1
  133. package/dist/core/components/ui/FilesManager/src/downloadUtils.js.map +1 -1
  134. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.d.ts.map +1 -1
  135. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.js.map +1 -1
  136. package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts.map +1 -1
  137. package/dist/core/components/ui/FilesManager/src/useFileActions.js.map +1 -1
  138. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.d.ts.map +1 -1
  139. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.js.map +1 -1
  140. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  141. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  142. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  143. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  144. package/dist/core/components/ui/Footer.d.ts.map +1 -1
  145. package/dist/core/components/ui/Footer.js.map +1 -1
  146. package/dist/core/components/ui/GenericTool.d.ts.map +1 -1
  147. package/dist/core/components/ui/GenericTool.js.map +1 -1
  148. package/dist/core/components/ui/Icons/BcfIcon.d.ts.map +1 -1
  149. package/dist/core/components/ui/Icons/BcfIcon.js.map +1 -1
  150. package/dist/core/components/ui/Icons/CdtIcon.d.ts.map +1 -1
  151. package/dist/core/components/ui/Icons/CdtIcon.js.map +1 -1
  152. package/dist/core/components/ui/Icons/FloorPlanIcon.d.ts.map +1 -1
  153. package/dist/core/components/ui/Icons/FloorPlanIcon.js.map +1 -1
  154. package/dist/core/components/ui/Icons/GoogleIcon.d.ts.map +1 -1
  155. package/dist/core/components/ui/Icons/GoogleIcon.js.map +1 -1
  156. package/dist/core/components/ui/Icons/IdsIcon.d.ts.map +1 -1
  157. package/dist/core/components/ui/Icons/IdsIcon.js.map +1 -1
  158. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  159. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  160. package/dist/core/components/ui/Icons/index.d.ts.map +1 -1
  161. package/dist/core/components/ui/Icons/index.js.map +1 -1
  162. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  163. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  164. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  165. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  166. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  167. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  168. package/dist/core/components/ui/Input.d.ts.map +1 -1
  169. package/dist/core/components/ui/Input.js.map +1 -1
  170. package/dist/core/components/ui/Label.d.ts.map +1 -1
  171. package/dist/core/components/ui/Label.js.map +1 -1
  172. package/dist/core/components/ui/LanguageToggle.d.ts.map +1 -1
  173. package/dist/core/components/ui/LanguageToggle.js.map +1 -1
  174. package/dist/core/components/ui/LoadingSpinner.d.ts.map +1 -1
  175. package/dist/core/components/ui/LoadingSpinner.js.map +1 -1
  176. package/dist/core/components/ui/Menubar.d.ts.map +1 -1
  177. package/dist/core/components/ui/Menubar.js.map +1 -1
  178. package/dist/core/components/ui/NavUser.d.ts.map +1 -1
  179. package/dist/core/components/ui/NavUser.js.map +1 -1
  180. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  181. package/dist/core/components/ui/Navbar.js.map +1 -1
  182. package/dist/core/components/ui/Popover.d.ts.map +1 -1
  183. package/dist/core/components/ui/Popover.js.map +1 -1
  184. package/dist/core/components/ui/Progress.d.ts.map +1 -1
  185. package/dist/core/components/ui/Progress.js.map +1 -1
  186. package/dist/core/components/ui/ScrollArea.d.ts.map +1 -1
  187. package/dist/core/components/ui/ScrollArea.js.map +1 -1
  188. package/dist/core/components/ui/SearchInput.d.ts.map +1 -1
  189. package/dist/core/components/ui/SearchInput.js.map +1 -1
  190. package/dist/core/components/ui/Select.d.ts.map +1 -1
  191. package/dist/core/components/ui/Select.js.map +1 -1
  192. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  193. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  194. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  195. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  196. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  197. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  198. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  199. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  200. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  201. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  202. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  203. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  204. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.d.ts.map +1 -1
  205. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.js.map +1 -1
  206. package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
  207. package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
  208. package/dist/core/components/ui/Separator.d.ts.map +1 -1
  209. package/dist/core/components/ui/Separator.js.map +1 -1
  210. package/dist/core/components/ui/SettingsButton.d.ts.map +1 -1
  211. package/dist/core/components/ui/SettingsButton.js.map +1 -1
  212. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.d.ts.map +1 -1
  213. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.js.map +1 -1
  214. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  215. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  216. package/dist/core/components/ui/ShareFeature/index.d.ts.map +1 -1
  217. package/dist/core/components/ui/ShareFeature/index.js.map +1 -1
  218. package/dist/core/components/ui/Sheet.d.ts.map +1 -1
  219. package/dist/core/components/ui/Sheet.js.map +1 -1
  220. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  221. package/dist/core/components/ui/Sidebar.js.map +1 -1
  222. package/dist/core/components/ui/Skeleton.d.ts.map +1 -1
  223. package/dist/core/components/ui/Skeleton.js.map +1 -1
  224. package/dist/core/components/ui/Slider.d.ts.map +1 -1
  225. package/dist/core/components/ui/Slider.js.map +1 -1
  226. package/dist/core/components/ui/Sonner.d.ts.map +1 -1
  227. package/dist/core/components/ui/Sonner.js.map +1 -1
  228. package/dist/core/components/ui/Switch.d.ts.map +1 -1
  229. package/dist/core/components/ui/Switch.js.map +1 -1
  230. package/dist/core/components/ui/Table.d.ts.map +1 -1
  231. package/dist/core/components/ui/Table.js.map +1 -1
  232. package/dist/core/components/ui/Tabs.d.ts.map +1 -1
  233. package/dist/core/components/ui/Tabs.js.map +1 -1
  234. package/dist/core/components/ui/Textarea.d.ts.map +1 -1
  235. package/dist/core/components/ui/Textarea.js.map +1 -1
  236. package/dist/core/components/ui/Toggle.d.ts.map +1 -1
  237. package/dist/core/components/ui/Toggle.js.map +1 -1
  238. package/dist/core/components/ui/ToggleGroup.d.ts.map +1 -1
  239. package/dist/core/components/ui/ToggleGroup.js.map +1 -1
  240. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  241. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  242. package/dist/core/components/ui/Tooltip.d.ts.map +1 -1
  243. package/dist/core/components/ui/Tooltip.js.map +1 -1
  244. package/dist/core/components/ui/UserAvatar.d.ts.map +1 -1
  245. package/dist/core/components/ui/UserAvatar.js.map +1 -1
  246. package/dist/core/components/ui/chart.d.ts.map +1 -1
  247. package/dist/core/components/ui/chart.js.map +1 -1
  248. package/dist/core/components/ui/downloadUtils.d.ts.map +1 -1
  249. package/dist/core/components/ui/downloadUtils.js.map +1 -1
  250. package/dist/core/components/ui/index.d.ts.map +1 -1
  251. package/dist/core/components/ui/index.js.map +1 -1
  252. package/dist/core/components/ui/openPopupWindow.d.ts.map +1 -1
  253. package/dist/core/components/ui/openPopupWindow.js.map +1 -1
  254. package/dist/core/components/ui/openPopupWindowLCA.d.ts.map +1 -1
  255. package/dist/core/components/ui/openPopupWindowLCA.js.map +1 -1
  256. package/dist/core/components/ui/stats.d.ts.map +1 -1
  257. package/dist/core/components/ui/stats.js.map +1 -1
  258. package/dist/core/components/ui/uploadFile.d.ts.map +1 -1
  259. package/dist/core/components/ui/uploadFile.js.map +1 -1
  260. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  261. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  262. package/dist/core/components/viewers/Data/FilterButtons.d.ts.map +1 -1
  263. package/dist/core/components/viewers/Data/FilterButtons.js.map +1 -1
  264. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  265. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  266. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  267. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  268. package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts.map +1 -1
  269. package/dist/core/components/viewers/Data/advancedFilter/Filters.js.map +1 -1
  270. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  271. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  272. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  273. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  274. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
  275. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
  276. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.d.ts.map +1 -1
  277. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js.map +1 -1
  278. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  279. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  280. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  281. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  282. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.d.ts.map +1 -1
  283. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.js.map +1 -1
  284. package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts.map +1 -1
  285. package/dist/core/components/viewers/Data/details/AttachedFiles.js.map +1 -1
  286. package/dist/core/components/viewers/Data/details/CheckboxGroup.d.ts.map +1 -1
  287. package/dist/core/components/viewers/Data/details/CheckboxGroup.js.map +1 -1
  288. package/dist/core/components/viewers/Data/details/DetailActions.d.ts.map +1 -1
  289. package/dist/core/components/viewers/Data/details/DetailActions.js.map +1 -1
  290. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  291. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  292. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  293. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  294. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  295. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  296. package/dist/core/components/viewers/Data/details/FileUpload.d.ts.map +1 -1
  297. package/dist/core/components/viewers/Data/details/FileUpload.js.map +1 -1
  298. package/dist/core/components/viewers/Data/details/FilterFiles.d.ts.map +1 -1
  299. package/dist/core/components/viewers/Data/details/FilterFiles.js.map +1 -1
  300. package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
  301. package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
  302. package/dist/core/components/viewers/Data/details/UnitsGrid.d.ts.map +1 -1
  303. package/dist/core/components/viewers/Data/details/UnitsGrid.js.map +1 -1
  304. package/dist/core/components/viewers/Data/details/getAttachmentFileName.d.ts.map +1 -1
  305. package/dist/core/components/viewers/Data/details/getAttachmentFileName.js.map +1 -1
  306. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  307. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  308. package/dist/core/components/viewers/Data/files/FileDetails.d.ts.map +1 -1
  309. package/dist/core/components/viewers/Data/files/FileDetails.js.map +1 -1
  310. package/dist/core/components/viewers/Data/files/FileMoreOptions.d.ts.map +1 -1
  311. package/dist/core/components/viewers/Data/files/FileMoreOptions.js.map +1 -1
  312. package/dist/core/components/viewers/Data/files/FilePreview.d.ts.map +1 -1
  313. package/dist/core/components/viewers/Data/files/FilePreview.js.map +1 -1
  314. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  315. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  316. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.d.ts.map +1 -1
  317. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js.map +1 -1
  318. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
  319. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
  320. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
  321. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
  322. package/dist/core/components/viewers/Data/siteDetails/AddSite.d.ts.map +1 -1
  323. package/dist/core/components/viewers/Data/siteDetails/AddSite.js.map +1 -1
  324. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  325. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  326. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.d.ts.map +1 -1
  327. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js.map +1 -1
  328. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  329. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  330. package/dist/core/components/viewers/Data/userDetails/AddUser.d.ts.map +1 -1
  331. package/dist/core/components/viewers/Data/userDetails/AddUser.js.map +1 -1
  332. package/dist/core/components/viewers/Data/userDetails/UserDetails.d.ts.map +1 -1
  333. package/dist/core/components/viewers/Data/userDetails/UserDetails.js.map +1 -1
  334. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  335. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  336. package/dist/core/components/viewers/Data/utils/Columns.d.ts.map +1 -1
  337. package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
  338. package/dist/core/components/viewers/Data/utils/Headers.d.ts.map +1 -1
  339. package/dist/core/components/viewers/Data/utils/Headers.js.map +1 -1
  340. package/dist/core/components/viewers/Data/utils/convertDate.d.ts.map +1 -1
  341. package/dist/core/components/viewers/Data/utils/convertDate.js.map +1 -1
  342. package/dist/core/components/viewers/Data/utils/csvUtils.d.ts.map +1 -1
  343. package/dist/core/components/viewers/Data/utils/csvUtils.js.map +1 -1
  344. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  345. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  346. package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
  347. package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
  348. package/dist/core/components/viewers/Data/utils/useViewerData.d.ts.map +1 -1
  349. package/dist/core/components/viewers/Data/utils/useViewerData.js.map +1 -1
  350. package/dist/core/components/viewers/Data/utils/viewerConfig.d.ts.map +1 -1
  351. package/dist/core/components/viewers/Data/utils/viewerConfig.js.map +1 -1
  352. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  353. package/dist/core/components/viewers/Viewer.js.map +1 -1
  354. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  355. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  356. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  357. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  358. package/dist/core/components/viewers/bim/src/BCFTopicsManager.d.ts.map +1 -1
  359. package/dist/core/components/viewers/bim/src/BCFTopicsManager.js.map +1 -1
  360. package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts.map +1 -1
  361. package/dist/core/components/viewers/bim/src/BIMManager/index.js.map +1 -1
  362. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  363. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  364. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.d.ts.map +1 -1
  365. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js.map +1 -1
  366. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  367. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js.map +1 -1
  368. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts.map +1 -1
  369. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js.map +1 -1
  370. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts.map +1 -1
  371. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js.map +1 -1
  372. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  373. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  374. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.d.ts.map +1 -1
  375. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.js.map +1 -1
  376. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  377. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  378. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  379. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  380. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.d.ts.map +1 -1
  381. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js.map +1 -1
  382. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.d.ts.map +1 -1
  383. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.js.map +1 -1
  384. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  385. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  386. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.d.ts.map +1 -1
  387. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js.map +1 -1
  388. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  389. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  390. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.d.ts.map +1 -1
  391. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js.map +1 -1
  392. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  393. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  394. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.d.ts.map +1 -1
  395. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js.map +1 -1
  396. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.d.ts.map +1 -1
  397. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js.map +1 -1
  398. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.d.ts.map +1 -1
  399. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js.map +1 -1
  400. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  401. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  402. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  403. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  404. package/dist/core/components/viewers/bim/src/CameraProjection.d.ts.map +1 -1
  405. package/dist/core/components/viewers/bim/src/CameraProjection.js.map +1 -1
  406. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  407. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  408. package/dist/core/components/viewers/bim/src/CurrentCamera.d.ts.map +1 -1
  409. package/dist/core/components/viewers/bim/src/CurrentCamera.js.map +1 -1
  410. package/dist/core/components/viewers/bim/src/CurrentWorld.d.ts.map +1 -1
  411. package/dist/core/components/viewers/bim/src/CurrentWorld.js.map +1 -1
  412. package/dist/core/components/viewers/bim/src/Cursor.d.ts.map +1 -1
  413. package/dist/core/components/viewers/bim/src/Cursor.js.map +1 -1
  414. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  415. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  416. package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts.map +1 -1
  417. package/dist/core/components/viewers/bim/src/ElevationsTool/index.js.map +1 -1
  418. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts.map +1 -1
  419. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.js.map +1 -1
  420. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts.map +1 -1
  421. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.js.map +1 -1
  422. package/dist/core/components/viewers/bim/src/FitCamera.d.ts.map +1 -1
  423. package/dist/core/components/viewers/bim/src/FitCamera.js.map +1 -1
  424. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  425. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  426. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts.map +1 -1
  427. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.js.map +1 -1
  428. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts.map +1 -1
  429. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.js.map +1 -1
  430. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts.map +1 -1
  431. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.js.map +1 -1
  432. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.d.ts.map +1 -1
  433. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.js.map +1 -1
  434. package/dist/core/components/viewers/bim/src/GhostMode.d.ts.map +1 -1
  435. package/dist/core/components/viewers/bim/src/GhostMode.js.map +1 -1
  436. package/dist/core/components/viewers/bim/src/Highlighter/index.d.ts.map +1 -1
  437. package/dist/core/components/viewers/bim/src/Highlighter/index.js.map +1 -1
  438. package/dist/core/components/viewers/bim/src/IDSManager/index.d.ts.map +1 -1
  439. package/dist/core/components/viewers/bim/src/IDSManager/index.js.map +1 -1
  440. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.d.ts.map +1 -1
  441. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js.map +1 -1
  442. package/dist/core/components/viewers/bim/src/IfcToFragments.d.ts.map +1 -1
  443. package/dist/core/components/viewers/bim/src/IfcToFragments.js.map +1 -1
  444. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.d.ts.map +1 -1
  445. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.js.map +1 -1
  446. package/dist/core/components/viewers/bim/src/LoadModels.d.ts.map +1 -1
  447. package/dist/core/components/viewers/bim/src/LoadModels.js.map +1 -1
  448. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  449. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  450. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  451. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  452. package/dist/core/components/viewers/bim/src/SpatialStructure.d.ts.map +1 -1
  453. package/dist/core/components/viewers/bim/src/SpatialStructure.js.map +1 -1
  454. package/dist/core/components/viewers/bim/src/ViewportGizmo.d.ts.map +1 -1
  455. package/dist/core/components/viewers/bim/src/ViewportGizmo.js.map +1 -1
  456. package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts.map +1 -1
  457. package/dist/core/components/viewers/bim/src/lib/CameraController.js.map +1 -1
  458. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.d.ts.map +1 -1
  459. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.js.map +1 -1
  460. package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts.map +1 -1
  461. package/dist/core/components/viewers/bim/src/lib/ChromeController.js.map +1 -1
  462. package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts.map +1 -1
  463. package/dist/core/components/viewers/bim/src/lib/ClipController.js.map +1 -1
  464. package/dist/core/components/viewers/bim/src/lib/GridController.d.ts.map +1 -1
  465. package/dist/core/components/viewers/bim/src/lib/GridController.js.map +1 -1
  466. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  467. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  468. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.d.ts.map +1 -1
  469. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.js.map +1 -1
  470. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts.map +1 -1
  471. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js.map +1 -1
  472. package/dist/core/components/viewers/bim/src/lib/drawingLayers.d.ts.map +1 -1
  473. package/dist/core/components/viewers/bim/src/lib/drawingLayers.js.map +1 -1
  474. package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts.map +1 -1
  475. package/dist/core/components/viewers/bim/src/lib/drawingProjection.js.map +1 -1
  476. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.d.ts.map +1 -1
  477. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.js.map +1 -1
  478. package/dist/core/components/viewers/bim/src/lib/safeRun.d.ts.map +1 -1
  479. package/dist/core/components/viewers/bim/src/lib/safeRun.js.map +1 -1
  480. package/dist/core/components/viewers/bim/src/lib/useBuildingName.d.ts.map +1 -1
  481. package/dist/core/components/viewers/bim/src/lib/useBuildingName.js.map +1 -1
  482. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  483. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  484. package/dist/core/components/viewers/bim/src/lib/viewSection.d.ts.map +1 -1
  485. package/dist/core/components/viewers/bim/src/lib/viewSection.js.map +1 -1
  486. package/dist/core/components/viewers/bim/src/propertiesMenu/index.d.ts.map +1 -1
  487. package/dist/core/components/viewers/bim/src/propertiesMenu/index.js.map +1 -1
  488. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.d.ts.map +1 -1
  489. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js.map +1 -1
  490. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.d.ts.map +1 -1
  491. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js.map +1 -1
  492. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.d.ts.map +1 -1
  493. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.js.map +1 -1
  494. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts.map +1 -1
  495. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js.map +1 -1
  496. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.d.ts.map +1 -1
  497. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.js.map +1 -1
  498. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  499. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  500. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  501. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  502. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.d.ts.map +1 -1
  503. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js.map +1 -1
  504. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
  505. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
  506. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.d.ts.map +1 -1
  507. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js.map +1 -1
  508. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  509. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  510. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  511. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  512. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  513. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  514. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  515. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  516. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  517. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  518. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.d.ts.map +1 -1
  519. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.js.map +1 -1
  520. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.d.ts.map +1 -1
  521. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.js.map +1 -1
  522. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  523. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  524. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  525. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  526. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  527. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  528. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  529. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  530. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.d.ts.map +1 -1
  531. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js.map +1 -1
  532. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  533. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  534. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  535. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  536. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts.map +1 -1
  537. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js.map +1 -1
  538. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts.map +1 -1
  539. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js.map +1 -1
  540. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  541. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  542. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  543. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  544. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts.map +1 -1
  545. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js.map +1 -1
  546. package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts.map +1 -1
  547. package/dist/core/components/viewers/bim/src/tools/shareBimTool.js.map +1 -1
  548. package/dist/core/components/viewers/bim/utils/GizmoController.d.ts.map +1 -1
  549. package/dist/core/components/viewers/bim/utils/GizmoController.js.map +1 -1
  550. package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts.map +1 -1
  551. package/dist/core/components/viewers/bim/utils/setCameraLookAt.js.map +1 -1
  552. package/dist/core/components/viewers/index.d.ts.map +1 -1
  553. package/dist/core/components/viewers/index.js.map +1 -1
  554. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  555. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  556. package/dist/core/components/viewers/map/datasets/AddPortalDialog.d.ts.map +1 -1
  557. package/dist/core/components/viewers/map/datasets/AddPortalDialog.js.map +1 -1
  558. package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts.map +1 -1
  559. package/dist/core/components/viewers/map/datasets/DatasetDetails.js.map +1 -1
  560. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  561. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  562. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.d.ts.map +1 -1
  563. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js.map +1 -1
  564. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.d.ts.map +1 -1
  565. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.js.map +1 -1
  566. package/dist/core/components/viewers/map/datasets/Filters.d.ts.map +1 -1
  567. package/dist/core/components/viewers/map/datasets/Filters.js.map +1 -1
  568. package/dist/core/components/viewers/map/datasets/NestedFilter.d.ts.map +1 -1
  569. package/dist/core/components/viewers/map/datasets/NestedFilter.js.map +1 -1
  570. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  571. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  572. package/dist/core/components/viewers/map/datasets/data.d.ts.map +1 -1
  573. package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
  574. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  575. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  576. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  577. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  578. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.d.ts.map +1 -1
  579. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.js.map +1 -1
  580. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -1
  581. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -1
  582. package/dist/core/components/viewers/map/datasets/src/cache.d.ts.map +1 -1
  583. package/dist/core/components/viewers/map/datasets/src/cache.js.map +1 -1
  584. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  585. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  586. package/dist/core/components/viewers/map/datasets/src/geojsonFile.d.ts.map +1 -1
  587. package/dist/core/components/viewers/map/datasets/src/geojsonFile.js.map +1 -1
  588. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  589. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  590. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  591. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  592. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  593. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  594. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -1
  595. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -1
  596. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.d.ts.map +1 -1
  597. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js.map +1 -1
  598. package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts.map +1 -1
  599. package/dist/core/components/viewers/map/datasets/src/urlSources.js.map +1 -1
  600. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.d.ts.map +1 -1
  601. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js.map +1 -1
  602. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts.map +1 -1
  603. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.js.map +1 -1
  604. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +0 -8
  605. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -1
  606. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -1
  607. package/dist/core/components/viewers/map/datasets/utils.d.ts.map +1 -1
  608. package/dist/core/components/viewers/map/datasets/utils.js.map +1 -1
  609. package/dist/core/components/viewers/map/legends/MapLegendHost.d.ts.map +1 -1
  610. package/dist/core/components/viewers/map/legends/MapLegendHost.js.map +1 -1
  611. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  612. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  613. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts.map +1 -1
  614. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.js.map +1 -1
  615. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts.map +1 -1
  616. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js.map +1 -1
  617. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  618. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  619. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  620. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  621. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  622. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  623. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.d.ts.map +1 -1
  624. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.js.map +1 -1
  625. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  626. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  627. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  628. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  629. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.d.ts.map +1 -1
  630. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js.map +1 -1
  631. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts.map +1 -1
  632. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.js.map +1 -1
  633. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  634. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  635. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -1
  636. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -1
  637. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  638. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  639. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.d.ts.map +1 -1
  640. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.js.map +1 -1
  641. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  642. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  643. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.d.ts.map +1 -1
  644. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.js.map +1 -1
  645. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts.map +1 -1
  646. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js.map +1 -1
  647. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  648. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  649. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.d.ts.map +1 -1
  650. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.js.map +1 -1
  651. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.d.ts.map +1 -1
  652. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.js.map +1 -1
  653. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  654. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  655. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts.map +1 -1
  656. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.js.map +1 -1
  657. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -1
  658. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -1
  659. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  660. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  661. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.d.ts.map +1 -1
  662. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js.map +1 -1
  663. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  664. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  665. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts.map +1 -1
  666. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.js.map +1 -1
  667. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.d.ts.map +1 -1
  668. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.js.map +1 -1
  669. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.d.ts.map +1 -1
  670. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.js.map +1 -1
  671. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  672. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  673. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  674. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  675. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  676. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.js.map +1 -1
  677. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.d.ts.map +1 -1
  678. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.js.map +1 -1
  679. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  680. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  681. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  682. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  683. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  684. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  685. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.d.ts.map +1 -1
  686. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js.map +1 -1
  687. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.d.ts.map +1 -1
  688. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js.map +1 -1
  689. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  690. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  691. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  692. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  693. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  694. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  695. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.d.ts.map +1 -1
  696. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js.map +1 -1
  697. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
  698. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js.map +1 -1
  699. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  700. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  701. package/dist/core/components/viewers/map/src/SimpleMap.d.ts.map +1 -1
  702. package/dist/core/components/viewers/map/src/SimpleMap.js.map +1 -1
  703. package/dist/core/components/viewers/map/src/compare/AddItem.d.ts.map +1 -1
  704. package/dist/core/components/viewers/map/src/compare/AddItem.js.map +1 -1
  705. package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts.map +1 -1
  706. package/dist/core/components/viewers/map/src/compare/CompareDialog.js.map +1 -1
  707. package/dist/core/components/viewers/map/src/compare/description-list.d.ts.map +1 -1
  708. package/dist/core/components/viewers/map/src/compare/description-list.js.map +1 -1
  709. package/dist/core/components/viewers/map/src/compare/index.d.ts.map +1 -1
  710. package/dist/core/components/viewers/map/src/compare/index.js.map +1 -1
  711. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.d.ts.map +1 -1
  712. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js.map +1 -1
  713. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.d.ts.map +1 -1
  714. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js.map +1 -1
  715. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.d.ts.map +1 -1
  716. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.js.map +1 -1
  717. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  718. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  719. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  720. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  721. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  722. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  723. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  724. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  725. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  726. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  727. package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts.map +1 -1
  728. package/dist/core/components/viewers/map/src/tools/measureMapTool.js.map +1 -1
  729. package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts.map +1 -1
  730. package/dist/core/components/viewers/map/src/tools/shareMapTool.js.map +1 -1
  731. package/dist/core/components/viewers/map/utils/ClusterManager.d.ts.map +1 -1
  732. package/dist/core/components/viewers/map/utils/ClusterManager.js.map +1 -1
  733. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  734. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  735. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.d.ts.map +1 -1
  736. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.js.map +1 -1
  737. package/dist/core/components/viewers/map/utils/MarkerManager.d.ts.map +1 -1
  738. package/dist/core/components/viewers/map/utils/MarkerManager.js.map +1 -1
  739. package/dist/core/components/viewers/map/utils/dateName.d.ts.map +1 -1
  740. package/dist/core/components/viewers/map/utils/dateName.js.map +1 -1
  741. package/dist/core/components/viewers/map/utils/extractCoordinates.d.ts.map +1 -1
  742. package/dist/core/components/viewers/map/utils/extractCoordinates.js.map +1 -1
  743. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts.map +1 -1
  744. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.js.map +1 -1
  745. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.d.ts.map +1 -1
  746. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.js.map +1 -1
  747. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  748. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  749. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  750. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  751. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -1
  752. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -1
  753. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  754. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  755. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  756. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  757. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  758. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  759. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  760. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  761. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts.map +1 -1
  762. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.js.map +1 -1
  763. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  764. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  765. package/dist/core/components/viewers/map/utils/mapStyleCatalog.d.ts.map +1 -1
  766. package/dist/core/components/viewers/map/utils/mapStyleCatalog.js.map +1 -1
  767. package/dist/core/components/viewers/map/utils/stringToColour.d.ts.map +1 -1
  768. package/dist/core/components/viewers/map/utils/stringToColour.js.map +1 -1
  769. package/dist/core/components/viewers/map/utils/toggleBimToMap.d.ts.map +1 -1
  770. package/dist/core/components/viewers/map/utils/toggleBimToMap.js.map +1 -1
  771. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.d.ts.map +1 -1
  772. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.js.map +1 -1
  773. package/dist/core/components/viewers/map/utils/validateBounds.d.ts.map +1 -1
  774. package/dist/core/components/viewers/map/utils/validateBounds.js.map +1 -1
  775. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  776. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  777. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  778. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  779. package/dist/core/components/viewers/pointcloud/define.d.ts.map +1 -1
  780. package/dist/core/components/viewers/pointcloud/define.js.map +1 -1
  781. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  782. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  783. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  784. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  785. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  786. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  787. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  788. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  789. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts.map +1 -1
  790. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js.map +1 -1
  791. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  792. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  793. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  794. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  795. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  796. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  797. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  798. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  799. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.d.ts.map +1 -1
  800. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js.map +1 -1
  801. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.d.ts.map +1 -1
  802. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js.map +1 -1
  803. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  804. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  805. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.d.ts.map +1 -1
  806. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js.map +1 -1
  807. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.d.ts.map +1 -1
  808. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.js.map +1 -1
  809. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts.map +1 -1
  810. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js.map +1 -1
  811. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.d.ts.map +1 -1
  812. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.js.map +1 -1
  813. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.d.ts.map +1 -1
  814. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.js.map +1 -1
  815. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.d.ts.map +1 -1
  816. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.js.map +1 -1
  817. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.d.ts.map +1 -1
  818. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.js.map +1 -1
  819. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts.map +1 -1
  820. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js.map +1 -1
  821. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.d.ts.map +1 -1
  822. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js.map +1 -1
  823. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.d.ts.map +1 -1
  824. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  825. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.d.ts.map +1 -1
  826. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js.map +1 -1
  827. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.d.ts.map +1 -1
  828. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js.map +1 -1
  829. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.d.ts.map +1 -1
  830. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js.map +1 -1
  831. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.d.ts.map +1 -1
  832. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js.map +1 -1
  833. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.d.ts.map +1 -1
  834. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js.map +1 -1
  835. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts.map +1 -1
  836. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js.map +1 -1
  837. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.d.ts.map +1 -1
  838. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.js.map +1 -1
  839. package/dist/core/components/viewers/pointcloud/src/tools/index.d.ts.map +1 -1
  840. package/dist/core/components/viewers/pointcloud/src/tools/index.js.map +1 -1
  841. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts.map +1 -1
  842. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js.map +1 -1
  843. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
  844. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
  845. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts.map +1 -1
  846. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.js.map +1 -1
  847. package/dist/core/components/viewers/useCoordinateSystem.d.ts.map +1 -1
  848. package/dist/core/components/viewers/useCoordinateSystem.js.map +1 -1
  849. package/dist/core/hooks/buildings/buildings.d.ts.map +1 -1
  850. package/dist/core/hooks/buildings/buildings.js.map +1 -1
  851. package/dist/core/hooks/buildings/createBuildingHooks.d.ts.map +1 -1
  852. package/dist/core/hooks/buildings/createBuildingHooks.js.map +1 -1
  853. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  854. package/dist/core/hooks/comments/comments.js.map +1 -1
  855. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  856. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  857. package/dist/core/hooks/files/createFileHooks.d.ts.map +1 -1
  858. package/dist/core/hooks/files/createFileHooks.js.map +1 -1
  859. package/dist/core/hooks/files/files.d.ts.map +1 -1
  860. package/dist/core/hooks/files/files.js.map +1 -1
  861. package/dist/core/hooks/index.d.ts.map +1 -1
  862. package/dist/core/hooks/index.js.map +1 -1
  863. package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts.map +1 -1
  864. package/dist/core/hooks/infrastructures/createInfrastructureHooks.js.map +1 -1
  865. package/dist/core/hooks/infrastructures/infrastructures.d.ts.map +1 -1
  866. package/dist/core/hooks/infrastructures/infrastructures.js.map +1 -1
  867. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts.map +1 -1
  868. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.js.map +1 -1
  869. package/dist/core/hooks/openDataPortals/openDataPortals.d.ts.map +1 -1
  870. package/dist/core/hooks/openDataPortals/openDataPortals.js.map +1 -1
  871. package/dist/core/hooks/organizations/createOrganizationHooks.d.ts.map +1 -1
  872. package/dist/core/hooks/organizations/createOrganizationHooks.js.map +1 -1
  873. package/dist/core/hooks/organizations/organizations.d.ts.map +1 -1
  874. package/dist/core/hooks/organizations/organizations.js.map +1 -1
  875. package/dist/core/hooks/ports/apiAdapter.d.ts.map +1 -1
  876. package/dist/core/hooks/provider.d.ts.map +1 -1
  877. package/dist/core/hooks/provider.js.map +1 -1
  878. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts.map +1 -1
  879. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.js.map +1 -1
  880. package/dist/core/hooks/sensorTypes/sensorTypes.d.ts.map +1 -1
  881. package/dist/core/hooks/sensorTypes/sensorTypes.js.map +1 -1
  882. package/dist/core/hooks/sensors/createSensorHooks.d.ts.map +1 -1
  883. package/dist/core/hooks/sensors/createSensorHooks.js.map +1 -1
  884. package/dist/core/hooks/sensors/sensors.d.ts.map +1 -1
  885. package/dist/core/hooks/sensors/sensors.js.map +1 -1
  886. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  887. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  888. package/dist/core/hooks/sites/sites.d.ts.map +1 -1
  889. package/dist/core/hooks/sites/sites.js.map +1 -1
  890. package/dist/core/hooks/ui/use-mobile.d.ts.map +1 -1
  891. package/dist/core/hooks/ui/use-mobile.js.map +1 -1
  892. package/dist/core/hooks/users/createUserHooks.d.ts.map +1 -1
  893. package/dist/core/hooks/users/createUserHooks.js.map +1 -1
  894. package/dist/core/hooks/users/users.d.ts.map +1 -1
  895. package/dist/core/hooks/users/users.js.map +1 -1
  896. package/dist/core/index.d.ts.map +1 -1
  897. package/dist/core/index.js.map +1 -1
  898. package/dist/core/plugins/host/context.d.ts.map +1 -1
  899. package/dist/core/plugins/host/context.js.map +1 -1
  900. package/dist/core/plugins/host/errors.d.ts.map +1 -1
  901. package/dist/core/plugins/host/errors.js.map +1 -1
  902. package/dist/core/plugins/host/host.d.ts.map +1 -1
  903. package/dist/core/plugins/host/host.js.map +1 -1
  904. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  905. package/dist/core/plugins/host/provider.js.map +1 -1
  906. package/dist/core/plugins/host/registry.d.ts.map +1 -1
  907. package/dist/core/plugins/host/registry.js.map +1 -1
  908. package/dist/core/plugins/installed.d.ts.map +1 -1
  909. package/dist/core/plugins/installed.js.map +1 -1
  910. package/dist/core/plugins/sdk/components.d.ts.map +1 -1
  911. package/dist/core/plugins/sdk/components.js.map +1 -1
  912. package/dist/core/plugins/sdk/index.d.ts.map +1 -1
  913. package/dist/core/plugins/sdk/index.js.map +1 -1
  914. package/dist/core/plugins/sdk/types.d.ts.map +1 -1
  915. package/dist/core/plugins/sdk/types.js.map +1 -1
  916. package/dist/core/store/ActionMap.d.ts.map +1 -1
  917. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  918. package/dist/core/store/AppConfig/context.js.map +1 -1
  919. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  920. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  921. package/dist/core/store/BIM/context.d.ts.map +1 -1
  922. package/dist/core/store/BIM/context.js.map +1 -1
  923. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  924. package/dist/core/store/BIM/reducer.js.map +1 -1
  925. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  926. package/dist/core/store/Buildings/context.js.map +1 -1
  927. package/dist/core/store/Buildings/reducer.d.ts.map +1 -1
  928. package/dist/core/store/Buildings/reducer.js.map +1 -1
  929. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  930. package/dist/core/store/CombineProviders.js.map +1 -1
  931. package/dist/core/store/Content/context.d.ts.map +1 -1
  932. package/dist/core/store/Content/context.js.map +1 -1
  933. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  934. package/dist/core/store/Datasets/context.js.map +1 -1
  935. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  936. package/dist/core/store/Datasets/reducer.js.map +1 -1
  937. package/dist/core/store/Files/context.d.ts.map +1 -1
  938. package/dist/core/store/Files/context.js.map +1 -1
  939. package/dist/core/store/Files/reducer.d.ts.map +1 -1
  940. package/dist/core/store/Files/reducer.js.map +1 -1
  941. package/dist/core/store/Map/context.d.ts.map +1 -1
  942. package/dist/core/store/Map/context.js.map +1 -1
  943. package/dist/core/store/Map/reducer.d.ts.map +1 -1
  944. package/dist/core/store/Map/reducer.js.map +1 -1
  945. package/dist/core/store/Menus/context.d.ts.map +1 -1
  946. package/dist/core/store/Menus/context.js.map +1 -1
  947. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  948. package/dist/core/store/Menus/reducer.js.map +1 -1
  949. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  950. package/dist/core/store/Permissions/context.js.map +1 -1
  951. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  952. package/dist/core/store/PointCloud/context.js.map +1 -1
  953. package/dist/core/store/PointCloud/reducer.d.ts.map +1 -1
  954. package/dist/core/store/PointCloud/reducer.js.map +1 -1
  955. package/dist/core/store/Tools/context.d.ts.map +1 -1
  956. package/dist/core/store/Tools/context.js.map +1 -1
  957. package/dist/core/store/Tools/reducer.d.ts.map +1 -1
  958. package/dist/core/store/Tools/reducer.js.map +1 -1
  959. package/dist/core/store/index.d.ts.map +1 -1
  960. package/dist/core/store/index.js.map +1 -1
  961. package/dist/core/styles/tailwindMerge.d.ts.map +1 -1
  962. package/dist/core/styles/tailwindMerge.js.map +1 -1
  963. package/dist/core/types/bim.d.ts.map +1 -1
  964. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  965. package/dist/core/types/dbTypes.d.ts.map +1 -1
  966. package/dist/core/types/dbTypes.js.map +1 -1
  967. package/dist/core/types/files.d.ts.map +1 -1
  968. package/dist/core/types/global.d.ts.map +1 -1
  969. package/dist/core/types/global.js.map +1 -1
  970. package/dist/core/types/index.d.ts.map +1 -1
  971. package/dist/core/types/index.js.map +1 -1
  972. package/dist/core/types/map.d.ts.map +1 -1
  973. package/dist/core/types/martinTypes.d.ts.map +1 -1
  974. package/dist/core/types/martinTypes.js.map +1 -1
  975. package/dist/core/types/next-auth.d.ts.map +1 -1
  976. package/dist/core/types/tools.d.ts.map +1 -1
  977. package/dist/core/types/users.d.ts.map +1 -1
  978. package/dist/core/utils/acceptedFiles.d.ts.map +1 -1
  979. package/dist/core/utils/acceptedFiles.js.map +1 -1
  980. package/dist/core/utils/errorHandler.d.ts.map +1 -1
  981. package/dist/core/utils/errorHandler.js.map +1 -1
  982. package/dist/core/utils/getFileIcon.d.ts.map +1 -1
  983. package/dist/core/utils/getFileIcon.js.map +1 -1
  984. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  985. package/dist/core/utils/imageUtils.js.map +1 -1
  986. package/dist/core/utils/index.d.ts.map +1 -1
  987. package/dist/core/utils/index.js.map +1 -1
  988. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  989. package/dist/core/utils/markerUtils.js.map +1 -1
  990. package/dist/core/utils/memcache.d.ts.map +1 -1
  991. package/dist/core/utils/memcache.js.map +1 -1
  992. package/dist/core/utils/roles.d.ts.map +1 -1
  993. package/dist/core/utils/roles.js.map +1 -1
  994. package/dist/core/utils/timeUtils.d.ts.map +1 -1
  995. package/dist/core/utils/timeUtils.js.map +1 -1
  996. package/dist/core/utils/utils.d.ts.map +1 -1
  997. package/dist/core/utils/utils.js.map +1 -1
  998. package/dist/index.d.ts.map +1 -1
  999. package/dist/index.js.map +1 -1
  1000. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../store'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { useOpenDataPortalsByCountrySubdivision, useOpenDataPortalsByGroup, useOpenDataPortalsByMunicipality } from '../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../store'\r\nimport { useAppConfigContext } from '../../../../store/AppConfig/context'\r\nimport { Badge } from '../../../../components/ui/Badge'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../../../components/ui/Breadcrumb'\r\nimport { Button } from '../../../../components/ui/Button'\r\nimport { DataTable } from '../../../../components/ui/DataTable'\r\nimport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../../../components/ui/Dialog'\r\nimport { Input } from '../../../../components/ui/Input'\r\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../../components/ui/Tabs'\r\n// Data\r\nimport { useColumns } from './data'\r\nimport DatasetDetails from './DatasetDetails'\r\n// Custom components\r\nimport { AddPortalDialog } from './AddPortalDialog'\r\nimport DatasetSkeleton from './DatasetSkeleton'\r\nimport Filters from './Filters'\r\nimport RowActions from './RowActions'\r\nimport { useDatasetsForPortals } from './src/useDatasetsForPortals'\r\nimport { handleFavouriteDataset } from './utils'\r\nimport { fetchLocalDatasets } from './src/localDatasets'\r\nimport { fetchOrganizationalMinioDatasets } from './src/minioDatasets'\r\nimport { buildPublishedCatalogMap, stampPublished, type PublishedCatalogEntry } from './src/publishedTiles'\r\nimport { builtinLiveDatasets } from './src/builtinLiveDatasets'\r\nimport { useFastDatasetCache } from './src/useFastDatasetCache'\r\nimport { DatasetGroup } from '../../../../types/dbTypes'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return {\r\n isAdmin: true,\r\n currentOrgId: 1,\r\n allowedOrgIds: ADMIN_ALLOWED_ORGS,\r\n }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n const allowedOrgIds = Array.from(new Set([2, currentOrgId]))\r\n\r\n return {\r\n isAdmin: false,\r\n currentOrgId,\r\n allowedOrgIds,\r\n }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\n\r\ntype DatasetsProps = {\r\n isOpen: boolean\r\n setIsOpenAction: (open: boolean) => void\r\n}\r\n\r\nexport default function Datasets({ isOpen, setIsOpenAction }: DatasetsProps) {\r\n // Translation\r\n const t = useTranslations('Datasets')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const datasetColumns = useColumns()\r\n\r\n // Contexts\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const { state: appConfigState } = useAppConfigContext()\r\n const orgCountry = (appConfigState.appConfig.organization?.country || '').toUpperCase()\r\n const org = appConfigState.appConfig.organization\r\n // Fall back to org fixed location when currentLocation hasn't been set yet (e.g. before map hover)\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n // UI State\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedDataset, setSelectedDataset] = React.useState<Dataset | null>(null)\r\n const [favouriteDatasets, setFavouriteDatasets] = React.useState<Dataset[]>([])\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [appliedFilters, setAppliedFilters] = React.useState<{ countrySubdivisions: string[], municipalities: string[], types: string[], sources: string[] }>({ countrySubdivisions: [], municipalities: [], types: [], sources: [] })\r\n const [currentTab, setCurrentTab] = React.useState('all')\r\n const [isAddPortalOpen, setIsAddPortalOpen] = React.useState(false)\r\n // Open-data datasets already published to Martin tiles, keyed by\r\n // \"{portalId}:{datasetId}\". Lets the original portal entry (National/Applied/\r\n // All tabs) show as converted, not just the organizational-list copy.\r\n const [publishedCatalog, setPublishedCatalog] = React.useState<Map<string, PublishedCatalogEntry>>(new Map())\r\n const showMunicipalTab = React.useMemo(() => Boolean(municipality), [municipality])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n // Belt-and-suspenders country guard: portal.country must match org, or be unset (legacy/global)\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true // org country unknown — show everything\r\n if (!portalCountry) return true // portal has no country set — treat as global\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(() => {\r\n if (!Array.isArray(municipalPortals)) return []\r\n const filtered = municipalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [municipalPortals, matchesOrgCountry, municipality])\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(() => {\r\n if (!Array.isArray(nationalPortals)) return []\r\n const filtered = nationalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [nationalPortals, orgCountry, matchesOrgCountry])\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n // First, refresh the published-catalog lookup (a fast /api/files read) so\r\n // converted open-data datasets flip promptly across every tab — ahead of\r\n // the slower Martin tile-sampling below. Non-fatal on failure.\r\n try {\r\n const filesRes = await fetch('/api/files')\r\n if (filesRes.ok) {\r\n const body = await filesRes.json()\r\n const rows = Array.isArray(body?.files) ? body.files : []\r\n setPublishedCatalog(buildPublishedCatalogMap(rows))\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to refresh published-catalog map:', err)\r\n }\r\n\r\n // Two parallel sources: Martin vector tiles (if configured) and MinIO-\r\n // backed GeoJSON uploads (the \"Add Dataset\" path). Errors from either\r\n // are isolated so a failure on one side does not block the other.\r\n const martinBaseUrl = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL?.replace(/\\/+$/, '')\r\n\r\n const martinPromise: Promise<Dataset[]> = martinBaseUrl\r\n ? (async () => {\r\n const datasetsUrl = martinBaseUrl.includes('/tiles/index.json')\r\n ? martinBaseUrl\r\n : `${martinBaseUrl}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n try {\r\n return await fetchLocalDatasets(localPortal as any)\r\n }\r\n catch (err) {\r\n console.error('Failed to load Martin organizational datasets:', err)\r\n return []\r\n }\r\n })()\r\n : Promise.resolve([])\r\n\r\n if (!martinBaseUrl) {\r\n console.warn('NEXT_PUBLIC_MARTIN_SERVER_URL not configured — skipping Martin pre-load')\r\n }\r\n\r\n // The MinIO key prefix is the *session* organization (set server-side\r\n // by the upload route), not orgVisibility.currentOrgId (which is\r\n // path-derived and hardcoded for admin routes like /cdt).\r\n const sessionOrgId = typeof org?.id === 'number'\r\n ? org.id\r\n : Number.parseInt(String(org?.id ?? ''), 10)\r\n\r\n // Martin must resolve first so MinIO suppression can check live catalog\r\n // membership — prevents \"file disappeared\" during the publish→restart gap.\r\n const martinDatasets = await martinPromise\r\n const publishedTilesInCatalog = new Set<string>(\r\n martinDatasets.map(d => typeof d.id === 'string' ? d.id : '').filter(Boolean),\r\n )\r\n\r\n const minioDatasets: Dataset[] = Number.isFinite(sessionOrgId)\r\n ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog).catch((err) => {\r\n console.error('Failed to load MinIO organizational datasets:', err)\r\n return []\r\n })\r\n : []\r\n\r\n const combined = [...martinDatasets, ...minioDatasets]\r\n const visibleOrgDatasets = combined.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n if (visibleOrgDatasets.length === 0) {\r\n console.warn('No organizational datasets found')\r\n }\r\n datasetDispatch({\r\n type: 'SET_DATASETS',\r\n payload: { datasets: visibleOrgDatasets },\r\n })\r\n }\r\n\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility, org?.id, datasetState.datasets.orgRefreshNonce])\r\n\r\n // Stamp each portal list with published-tile identity so a converted open-data\r\n // dataset shows as converted on its own tab (National/Subdivision/Municipal),\r\n // not only on the organizational tab. No-op for unpublished datasets.\r\n const nationalDatasets = React.useMemo(() => stampPublished(national.datasets, publishedCatalog), [national.datasets, publishedCatalog])\r\n const subdivisionDatasets = React.useMemo(() => stampPublished(subdivision.datasets, publishedCatalog), [subdivision.datasets, publishedCatalog])\r\n const municipalDatasets = React.useMemo(() => stampPublished(municipal.datasets, publishedCatalog), [municipal.datasets, publishedCatalog])\r\n\r\n const isLoadingNational = national.isLoading && nationalDatasets.length === 0\r\n const isLoadingSubdivision = subdivision.isLoading && subdivisionDatasets.length === 0\r\n const isLoadingMunicipal = municipal.isLoading && municipalDatasets.length === 0\r\n\r\n const datasetsError = React.useMemo(() => {\r\n if (currentTab === 'municipal' && municipal.isError && municipalDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'countrySubdivision' && subdivision.isError && subdivisionDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'national' && national.isError && nationalDatasets.length === 0) return t('failedFetchError')\r\n return null\r\n }, [currentTab, municipal.isError, municipalDatasets.length, subdivision.isError, subdivisionDatasets.length, national.isError, nationalDatasets.length, t])\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const unfiltered = [\r\n ...builtinLiveDatasets, // curated live feeds (e.g. GeoMet weather radar) → Live Data tab\r\n ...nationalDatasets,\r\n ...subdivisionDatasets,\r\n ...municipalDatasets,\r\n ...addedDatasets,\r\n ...(datasetState.datasets.datasets || []),\r\n ]\r\n\r\n const filtered = unfiltered.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n // Also stamp here so the addedDatasets snapshot (applied at add-time, before\r\n // conversion) and any org-list entries pick up published identity on the\r\n // Applied/All tabs. Already-stamped portal entries are unchanged.\r\n return stampPublished(filtered, publishedCatalog)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility, publishedCatalog])\r\n\r\n const currentTabLoading = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'national':\r\n return isLoadingNational\r\n case 'countrySubdivision':\r\n return isLoadingSubdivision\r\n case 'municipal':\r\n return isLoadingMunicipal\r\n case 'all':\r\n // Show loading for \"all\" if any datasets are loading and we have no data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.length === 0\r\n case 'organizational':\r\n // Show loading for \"organizational\" if any datasets are loading and we have no organizational data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.filter(ds => ds.group === 'Organizational').length === 0\r\n default:\r\n return false\r\n }\r\n }, [currentTab, isLoadingNational, isLoadingSubdivision, isLoadingMunicipal, allDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!showMunicipalTab && currentTab === 'municipal') {\r\n setCurrentTab('all')\r\n }\r\n }, [showMunicipalTab, currentTab])\r\n\r\n // Memoized datasets for current tab\r\n const currentTabDatasets = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'applied':\r\n return allDatasets.filter(ds => addedDatasets.some(d => d.name === ds.name))\r\n case 'favourites':\r\n return allDatasets.filter(ds => favouriteDatasets.some(fav => fav.name === ds.name))\r\n case 'organizational':\r\n return allDatasets.filter(ds => ds.group === 'Organizational')\r\n case 'liveData':\r\n return allDatasets.filter(ds => ds.portal?.live === true)\r\n case 'national':\r\n return nationalDatasets\r\n case 'countrySubdivision':\r\n return subdivisionDatasets\r\n case 'municipal':\r\n return municipalDatasets\r\n case 'all':\r\n default:\r\n return allDatasets\r\n }\r\n }, [currentTab, allDatasets, addedDatasets, favouriteDatasets, nationalDatasets, subdivisionDatasets, municipalDatasets])\r\n\r\n // Memoized filtered data\r\n const filteredData = React.useMemo(() => {\r\n return currentTabDatasets.filter((dataset) => {\r\n // Search filter\r\n const matchesSearch = Object.values(dataset).some(value =>\r\n String(value).toLowerCase().includes(searchTerm.toLowerCase()),\r\n )\r\n if (!matchesSearch)\r\n return false\r\n\r\n // Country subdivision filter\r\n const matchesSubdivision\r\n = appliedFilters.countrySubdivisions.length === 0\r\n || !dataset.countrySubdivision\r\n || appliedFilters.countrySubdivisions.includes(dataset.countrySubdivision)\r\n\r\n // Municipality filter\r\n const matchesMunicipality\r\n = appliedFilters.municipalities.length === 0\r\n || !dataset.municipality\r\n || appliedFilters.municipalities.includes(dataset.municipality)\r\n\r\n // Type filter\r\n const matchesType\r\n = appliedFilters.types.length === 0\r\n || appliedFilters.types.includes(dataset.type)\r\n\r\n // Source filter (dataset.portal?.name, falling back to publisher)\r\n const datasetSource = dataset.portal?.name ?? dataset.publisher\r\n const matchesSource\r\n = appliedFilters.sources.length === 0\r\n || (datasetSource ? appliedFilters.sources.includes(datasetSource) : false)\r\n\r\n return matchesSubdivision && matchesMunicipality && matchesType && matchesSource\r\n })\r\n }, [currentTabDatasets, searchTerm, appliedFilters])\r\n\r\n const sortedFilteredData = React.useMemo(() => {\r\n // Remove duplicates by name\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of filteredData) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) {\r\n uniqueByName.set(name, ds)\r\n }\r\n }\r\n\r\n // Filter out unwanted names/types\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding')\r\n })\r\n\r\n // HARD CODE BLOCK LIST\r\n const blocklisted = (ds: Dataset) => {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return (\r\n url.includes('/2021_statistics_canada_boundaries/featureserver')\r\n || name.includes('2021 statistics canada boundaries')\r\n || url.includes('/limites_du_recensement_de_statistique_canada_(2021)/featureserver')\r\n || name.includes('limites du recensement de statistique canada (2021)')\r\n )\r\n }\r\n\r\n const safe = filtered.filter(ds => !blocklisted(ds))\r\n\r\n // Sort by name\r\n return safe.sort((a, b) =>\r\n (a.name || '').localeCompare(b.name || ''),\r\n )\r\n }, [filteredData])\r\n\r\n const { prefetch } = useFastDatasetCache()\r\n\r\n React.useEffect(() => {\r\n if (isOpen && sortedFilteredData.length > 0) {\r\n const datasetsToPreload = sortedFilteredData.slice(0, 10)\r\n datasetsToPreload.forEach((dataset, index) => {\r\n setTimeout(() => {\r\n prefetch(dataset)\r\n }, index * 200)\r\n })\r\n }\r\n }, [isOpen, sortedFilteredData, prefetch])\r\n\r\n // Handlers\r\n const handleTabChange = React.useCallback((value: string) => setCurrentTab(value), [])\r\n const handleRowClick = React.useCallback((dataset: Dataset) => {\r\n setSelectedDataset(dataset)\r\n setView('detail')\r\n }, [])\r\n const handleRowHover = React.useCallback((dataset: Dataset) => {\r\n prefetch(dataset)\r\n \r\n const currentIndex = sortedFilteredData.indexOf(dataset)\r\n if (currentIndex >= 0 && currentIndex < sortedFilteredData.length - 2) {\r\n setTimeout(() => {\r\n if (sortedFilteredData[currentIndex + 1]) {\r\n prefetch(sortedFilteredData[currentIndex + 1])\r\n }\r\n }, 100)\r\n }\r\n }, [prefetch, sortedFilteredData])\r\n const handleBackToTable = React.useCallback(() => {\r\n setView('table')\r\n setSelectedDataset(null)\r\n }, [])\r\n const handleAddDatasetToMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: selectedDataset } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleRemoveDatasetFromMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: selectedDataset.id } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleFavourite = handleFavouriteDataset(selectedDataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const handleAddDataset = () => {\r\n // Logic to add a new dataset\r\n }\r\n\r\n // UI\r\n return (\r\n <Dialog open={isOpen} onOpenChange={setIsOpenAction}>\r\n <DialogContent className=\"h-screen sm:h-[90vh] sm:max-h-[90vh] w-full max-w-full sm:w-[88vw] sm:max-w-[88vw] p-0 gap-0 overflow-hidden flex flex-col\">\r\n {view === 'table' ? (\r\n <>\r\n <DialogHeader className=\"bg-background z-50 sticky top-0 p-6 flex flex-row flex-wrap justify-between items-end gap-2 text-left\">\r\n <div className=\"flex flex-col justify-end p-0\">\r\n <DialogTitle className=\"text-2xl\">{t('dialogTitle')}</DialogTitle>\r\n <DialogDescription className=\"text-sm\">\r\n {t('dialogDescription')}\r\n </DialogDescription>\r\n </div>\r\n <div className=\"flex flex-row flex-wrap justify-between items-center\">\r\n <div className=\"flex flex-wrap gap-2 font-medium\">\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"Search\"\r\n className=\"pl-8 w-[250px]\"\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Filters\r\n datasets={currentTabDatasets}\r\n appliedFilters={appliedFilters}\r\n onFiltersChange={setAppliedFilters}\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setIsAddPortalOpen(true)}\r\n title=\"Register a new open data portal\"\r\n >\r\n <LR.Plus className=\"h-4 w-4 mr-1\" />\r\n Add Portal\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n <DialogClose className=\"absolute right-2 top-2 h-5 w-5 rounded-xl text-muted-foreground hover:bg-transparent focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-background focus:ring-primary\">\r\n <LR.X className=\"!h-4 !w-4\" />\r\n </DialogClose>\r\n </DialogHeader>\r\n <div className=\"relative flex flex-col flex-1 min-h-0\">\r\n <Tabs value={currentTab} className=\"flex flex-col gap-0 h-full\" onValueChange={handleTabChange}>\r\n <div className=\"hidden md:!flex justify-between px-3 flex-shrink-0\">\r\n {' '}\r\n {/* Prevent tabs from shrinking */}\r\n <TabsList className=\"pointer-events-auto sticky flex z-40 top-[100px] bg-transparent\">\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"applied\">\r\n <Badge variant=\"outline\">{addedDatasets.length}</Badge>\r\n {t('appliedTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"favourites\">\r\n {t('favoritesTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"organizational\">{t('organizationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"all\">{t('allDataTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"national\">{t('nationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"countrySubdivision\">{t('countrySubdivisionTab')}</TabsTrigger>\r\n {showMunicipalTab && (\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"municipal\">{t('municipalTab')}</TabsTrigger>\r\n )}\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"liveData\">{t('liveDataTab')}</TabsTrigger>\r\n </TabsList>\r\n </div>\r\n <TabsContent\r\n value={currentTab}\r\n className=\"flex-1 pointer-events-auto mt-0 min-h-0\" // min-h-0 is crucial for flex children\r\n >\r\n {currentTabLoading ? (\r\n <DatasetSkeleton />\r\n ) : (datasetsError ? (\r\n <div className=\"flex flex-col justify-center items-center h-32 text-muted-foreground\">\r\n <LR.AlertCircle className=\"h-6 w-6 mb-2\" />\r\n <span>{datasetsError}</span>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.location.reload()} className=\"mt-2\">\r\n <LR.RefreshCw className=\"h-4 w-4 mr-2\" />\r\n {t('refreshButton')}\r\n </Button>\r\n </div>\r\n ) : (\r\n <DataTable\r\n showPagination={true}\r\n columns={datasetColumns}\r\n data={sortedFilteredData}\r\n tab={currentTab}\r\n onRowClick={handleRowClick}\r\n onRowHover={handleRowHover}\r\n className=\"rounded-none w-auto h-full\" \r\n paginationClasses=\"bg-background z-20 w-full border-t\" \r\n isLoading={currentTabLoading}\r\n leadingCell={props => (\r\n <RowActions\r\n {...props}\r\n favouriteDatasets={favouriteDatasets}\r\n setFavouriteDatasets={setFavouriteDatasets}\r\n />\r\n )}\r\n trailingCell={({ row, index }) => (\r\n <div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"pointer-events-none\"\r\n >\r\n <LR.ChevronRight />\r\n </Button>\r\n </div>\r\n )}\r\n />\r\n ))}\r\n </TabsContent>\r\n </Tabs>\r\n </div>\r\n </>\r\n ) : (\r\n // Detail View Content\r\n <>\r\n <DialogHeader className=\"px-6 pt-6\">\r\n <div>\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n handleBackToTable()\r\n setCurrentTab('all')\r\n }}\r\n >\r\n {t('breadcrumbTitle')}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n setCurrentTab(currentTab)\r\n handleBackToTable()\r\n }}\r\n >\r\n {currentTab.charAt(0).toUpperCase() + currentTab.slice(1)}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{selectedDataset?.name}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n <div className=\"flex flex-row justify-between\">\r\n <div className=\"flex items-center\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n >\r\n <LR.Star\r\n className=\"!h-5 !w-5\"\r\n size={24}\r\n color={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n <DialogTitle>{selectedDataset?.name}</DialogTitle>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handleBackToTable}\r\n >\r\n <LR.ArrowLeft />\r\n {t('backToDataButton')}\r\n </Button>\r\n {selectedDataset && addedDatasets.some(d => d.name === selectedDataset.name)\r\n ? (\r\n <Button onClick={handleRemoveDatasetFromMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Minus />\r\n {t('removeButton')}\r\n </Button>\r\n )\r\n : (\r\n <Button onClick={handleAddDatasetToMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Plus />\r\n {t('applyButton')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </DialogHeader>\r\n <DatasetDetails selectedDataset={selectedDataset} />\r\n </>\r\n )}\r\n </DialogContent>\r\n <AddPortalDialog open={isAddPortalOpen} onOpenChange={setIsAddPortalOpen} />\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/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\n// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../store'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { useOpenDataPortalsByCountrySubdivision, useOpenDataPortalsByGroup, useOpenDataPortalsByMunicipality } from '../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../store'\r\nimport { useAppConfigContext } from '../../../../store/AppConfig/context'\r\nimport { Badge } from '../../../../components/ui/Badge'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../../../components/ui/Breadcrumb'\r\nimport { Button } from '../../../../components/ui/Button'\r\nimport { DataTable } from '../../../../components/ui/DataTable'\r\nimport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../../../components/ui/Dialog'\r\nimport { Input } from '../../../../components/ui/Input'\r\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../../components/ui/Tabs'\r\n// Data\r\nimport { useColumns } from './data'\r\nimport DatasetDetails from './DatasetDetails'\r\n// Custom components\r\nimport { AddPortalDialog } from './AddPortalDialog'\r\nimport DatasetSkeleton from './DatasetSkeleton'\r\nimport Filters from './Filters'\r\nimport RowActions from './RowActions'\r\nimport { useDatasetsForPortals } from './src/useDatasetsForPortals'\r\nimport { handleFavouriteDataset } from './utils'\r\nimport { fetchLocalDatasets } from './src/localDatasets'\r\nimport { fetchOrganizationalMinioDatasets } from './src/minioDatasets'\r\nimport { buildPublishedCatalogMap, stampPublished, type PublishedCatalogEntry } from './src/publishedTiles'\r\nimport { builtinLiveDatasets } from './src/builtinLiveDatasets'\r\nimport { useFastDatasetCache } from './src/useFastDatasetCache'\r\nimport { DatasetGroup } from '../../../../types/dbTypes'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return {\r\n isAdmin: true,\r\n currentOrgId: 1,\r\n allowedOrgIds: ADMIN_ALLOWED_ORGS,\r\n }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n const allowedOrgIds = Array.from(new Set([2, currentOrgId]))\r\n\r\n return {\r\n isAdmin: false,\r\n currentOrgId,\r\n allowedOrgIds,\r\n }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\n\r\ntype DatasetsProps = {\r\n isOpen: boolean\r\n setIsOpenAction: (open: boolean) => void\r\n}\r\n\r\nexport default function Datasets({ isOpen, setIsOpenAction }: DatasetsProps) {\r\n // Translation\r\n const t = useTranslations('Datasets')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const datasetColumns = useColumns()\r\n\r\n // Contexts\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const { state: appConfigState } = useAppConfigContext()\r\n const orgCountry = (appConfigState.appConfig.organization?.country || '').toUpperCase()\r\n const org = appConfigState.appConfig.organization\r\n // Fall back to org fixed location when currentLocation hasn't been set yet (e.g. before map hover)\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n // UI State\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedDataset, setSelectedDataset] = React.useState<Dataset | null>(null)\r\n const [favouriteDatasets, setFavouriteDatasets] = React.useState<Dataset[]>([])\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [appliedFilters, setAppliedFilters] = React.useState<{ countrySubdivisions: string[], municipalities: string[], types: string[], sources: string[] }>({ countrySubdivisions: [], municipalities: [], types: [], sources: [] })\r\n const [currentTab, setCurrentTab] = React.useState('all')\r\n const [isAddPortalOpen, setIsAddPortalOpen] = React.useState(false)\r\n // Open-data datasets already published to Martin tiles, keyed by\r\n // \"{portalId}:{datasetId}\". Lets the original portal entry (National/Applied/\r\n // All tabs) show as converted, not just the organizational-list copy.\r\n const [publishedCatalog, setPublishedCatalog] = React.useState<Map<string, PublishedCatalogEntry>>(new Map())\r\n const showMunicipalTab = React.useMemo(() => Boolean(municipality), [municipality])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n // Belt-and-suspenders country guard: portal.country must match org, or be unset (legacy/global)\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true // org country unknown — show everything\r\n if (!portalCountry) return true // portal has no country set — treat as global\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(() => {\r\n if (!Array.isArray(municipalPortals)) return []\r\n const filtered = municipalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [municipalPortals, matchesOrgCountry, municipality])\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(() => {\r\n if (!Array.isArray(nationalPortals)) return []\r\n const filtered = nationalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [nationalPortals, orgCountry, matchesOrgCountry])\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n // First, refresh the published-catalog lookup (a fast /api/files read) so\r\n // converted open-data datasets flip promptly across every tab — ahead of\r\n // the slower Martin tile-sampling below. Non-fatal on failure.\r\n try {\r\n const filesRes = await fetch('/api/files')\r\n if (filesRes.ok) {\r\n const body = await filesRes.json()\r\n const rows = Array.isArray(body?.files) ? body.files : []\r\n setPublishedCatalog(buildPublishedCatalogMap(rows))\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to refresh published-catalog map:', err)\r\n }\r\n\r\n // Two parallel sources: Martin vector tiles (if configured) and MinIO-\r\n // backed GeoJSON uploads (the \"Add Dataset\" path). Errors from either\r\n // are isolated so a failure on one side does not block the other.\r\n const martinBaseUrl = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL?.replace(/\\/+$/, '')\r\n\r\n const martinPromise: Promise<Dataset[]> = martinBaseUrl\r\n ? (async () => {\r\n const datasetsUrl = martinBaseUrl.includes('/tiles/index.json')\r\n ? martinBaseUrl\r\n : `${martinBaseUrl}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n try {\r\n return await fetchLocalDatasets(localPortal as any)\r\n }\r\n catch (err) {\r\n console.error('Failed to load Martin organizational datasets:', err)\r\n return []\r\n }\r\n })()\r\n : Promise.resolve([])\r\n\r\n if (!martinBaseUrl) {\r\n console.warn('NEXT_PUBLIC_MARTIN_SERVER_URL not configured — skipping Martin pre-load')\r\n }\r\n\r\n // The MinIO key prefix is the *session* organization (set server-side\r\n // by the upload route), not orgVisibility.currentOrgId (which is\r\n // path-derived and hardcoded for admin routes like /cdt).\r\n const sessionOrgId = typeof org?.id === 'number'\r\n ? org.id\r\n : Number.parseInt(String(org?.id ?? ''), 10)\r\n\r\n // Martin must resolve first so MinIO suppression can check live catalog\r\n // membership — prevents \"file disappeared\" during the publish→restart gap.\r\n const martinDatasets = await martinPromise\r\n const publishedTilesInCatalog = new Set<string>(\r\n martinDatasets.map(d => typeof d.id === 'string' ? d.id : '').filter(Boolean),\r\n )\r\n\r\n const minioDatasets: Dataset[] = Number.isFinite(sessionOrgId)\r\n ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog).catch((err) => {\r\n console.error('Failed to load MinIO organizational datasets:', err)\r\n return []\r\n })\r\n : []\r\n\r\n const combined = [...martinDatasets, ...minioDatasets]\r\n const visibleOrgDatasets = combined.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n if (visibleOrgDatasets.length === 0) {\r\n console.warn('No organizational datasets found')\r\n }\r\n datasetDispatch({\r\n type: 'SET_DATASETS',\r\n payload: { datasets: visibleOrgDatasets },\r\n })\r\n }\r\n\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility, org?.id, datasetState.datasets.orgRefreshNonce])\r\n\r\n // Stamp each portal list with published-tile identity so a converted open-data\r\n // dataset shows as converted on its own tab (National/Subdivision/Municipal),\r\n // not only on the organizational tab. No-op for unpublished datasets.\r\n const nationalDatasets = React.useMemo(() => stampPublished(national.datasets, publishedCatalog), [national.datasets, publishedCatalog])\r\n const subdivisionDatasets = React.useMemo(() => stampPublished(subdivision.datasets, publishedCatalog), [subdivision.datasets, publishedCatalog])\r\n const municipalDatasets = React.useMemo(() => stampPublished(municipal.datasets, publishedCatalog), [municipal.datasets, publishedCatalog])\r\n\r\n const isLoadingNational = national.isLoading && nationalDatasets.length === 0\r\n const isLoadingSubdivision = subdivision.isLoading && subdivisionDatasets.length === 0\r\n const isLoadingMunicipal = municipal.isLoading && municipalDatasets.length === 0\r\n\r\n const datasetsError = React.useMemo(() => {\r\n if (currentTab === 'municipal' && municipal.isError && municipalDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'countrySubdivision' && subdivision.isError && subdivisionDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'national' && national.isError && nationalDatasets.length === 0) return t('failedFetchError')\r\n return null\r\n }, [currentTab, municipal.isError, municipalDatasets.length, subdivision.isError, subdivisionDatasets.length, national.isError, nationalDatasets.length, t])\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const unfiltered = [\r\n ...builtinLiveDatasets, // curated live feeds (e.g. GeoMet weather radar) → Live Data tab\r\n ...nationalDatasets,\r\n ...subdivisionDatasets,\r\n ...municipalDatasets,\r\n ...addedDatasets,\r\n ...(datasetState.datasets.datasets || []),\r\n ]\r\n\r\n const filtered = unfiltered.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n // Also stamp here so the addedDatasets snapshot (applied at add-time, before\r\n // conversion) and any org-list entries pick up published identity on the\r\n // Applied/All tabs. Already-stamped portal entries are unchanged.\r\n return stampPublished(filtered, publishedCatalog)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility, publishedCatalog])\r\n\r\n const currentTabLoading = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'national':\r\n return isLoadingNational\r\n case 'countrySubdivision':\r\n return isLoadingSubdivision\r\n case 'municipal':\r\n return isLoadingMunicipal\r\n case 'all':\r\n // Show loading for \"all\" if any datasets are loading and we have no data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.length === 0\r\n case 'organizational':\r\n // Show loading for \"organizational\" if any datasets are loading and we have no organizational data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.filter(ds => ds.group === 'Organizational').length === 0\r\n default:\r\n return false\r\n }\r\n }, [currentTab, isLoadingNational, isLoadingSubdivision, isLoadingMunicipal, allDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!showMunicipalTab && currentTab === 'municipal') {\r\n setCurrentTab('all')\r\n }\r\n }, [showMunicipalTab, currentTab])\r\n\r\n // Memoized datasets for current tab\r\n const currentTabDatasets = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'applied':\r\n return allDatasets.filter(ds => addedDatasets.some(d => d.name === ds.name))\r\n case 'favourites':\r\n return allDatasets.filter(ds => favouriteDatasets.some(fav => fav.name === ds.name))\r\n case 'organizational':\r\n return allDatasets.filter(ds => ds.group === 'Organizational')\r\n case 'liveData':\r\n return allDatasets.filter(ds => ds.portal?.live === true)\r\n case 'national':\r\n return nationalDatasets\r\n case 'countrySubdivision':\r\n return subdivisionDatasets\r\n case 'municipal':\r\n return municipalDatasets\r\n case 'all':\r\n default:\r\n return allDatasets\r\n }\r\n }, [currentTab, allDatasets, addedDatasets, favouriteDatasets, nationalDatasets, subdivisionDatasets, municipalDatasets])\r\n\r\n // Memoized filtered data\r\n const filteredData = React.useMemo(() => {\r\n return currentTabDatasets.filter((dataset) => {\r\n // Search filter\r\n const matchesSearch = Object.values(dataset).some(value =>\r\n String(value).toLowerCase().includes(searchTerm.toLowerCase()),\r\n )\r\n if (!matchesSearch)\r\n return false\r\n\r\n // Country subdivision filter\r\n const matchesSubdivision\r\n = appliedFilters.countrySubdivisions.length === 0\r\n || !dataset.countrySubdivision\r\n || appliedFilters.countrySubdivisions.includes(dataset.countrySubdivision)\r\n\r\n // Municipality filter\r\n const matchesMunicipality\r\n = appliedFilters.municipalities.length === 0\r\n || !dataset.municipality\r\n || appliedFilters.municipalities.includes(dataset.municipality)\r\n\r\n // Type filter\r\n const matchesType\r\n = appliedFilters.types.length === 0\r\n || appliedFilters.types.includes(dataset.type)\r\n\r\n // Source filter (dataset.portal?.name, falling back to publisher)\r\n const datasetSource = dataset.portal?.name ?? dataset.publisher\r\n const matchesSource\r\n = appliedFilters.sources.length === 0\r\n || (datasetSource ? appliedFilters.sources.includes(datasetSource) : false)\r\n\r\n return matchesSubdivision && matchesMunicipality && matchesType && matchesSource\r\n })\r\n }, [currentTabDatasets, searchTerm, appliedFilters])\r\n\r\n const sortedFilteredData = React.useMemo(() => {\r\n // Remove duplicates by name\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of filteredData) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) {\r\n uniqueByName.set(name, ds)\r\n }\r\n }\r\n\r\n // Filter out unwanted names/types\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding')\r\n })\r\n\r\n // HARD CODE BLOCK LIST\r\n const blocklisted = (ds: Dataset) => {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return (\r\n url.includes('/2021_statistics_canada_boundaries/featureserver')\r\n || name.includes('2021 statistics canada boundaries')\r\n || url.includes('/limites_du_recensement_de_statistique_canada_(2021)/featureserver')\r\n || name.includes('limites du recensement de statistique canada (2021)')\r\n )\r\n }\r\n\r\n const safe = filtered.filter(ds => !blocklisted(ds))\r\n\r\n // Sort by name\r\n return safe.sort((a, b) =>\r\n (a.name || '').localeCompare(b.name || ''),\r\n )\r\n }, [filteredData])\r\n\r\n const { prefetch } = useFastDatasetCache()\r\n\r\n React.useEffect(() => {\r\n if (isOpen && sortedFilteredData.length > 0) {\r\n const datasetsToPreload = sortedFilteredData.slice(0, 10)\r\n datasetsToPreload.forEach((dataset, index) => {\r\n setTimeout(() => {\r\n prefetch(dataset)\r\n }, index * 200)\r\n })\r\n }\r\n }, [isOpen, sortedFilteredData, prefetch])\r\n\r\n // Handlers\r\n const handleTabChange = React.useCallback((value: string) => setCurrentTab(value), [])\r\n const handleRowClick = React.useCallback((dataset: Dataset) => {\r\n setSelectedDataset(dataset)\r\n setView('detail')\r\n }, [])\r\n const handleRowHover = React.useCallback((dataset: Dataset) => {\r\n prefetch(dataset)\r\n \r\n const currentIndex = sortedFilteredData.indexOf(dataset)\r\n if (currentIndex >= 0 && currentIndex < sortedFilteredData.length - 2) {\r\n setTimeout(() => {\r\n if (sortedFilteredData[currentIndex + 1]) {\r\n prefetch(sortedFilteredData[currentIndex + 1])\r\n }\r\n }, 100)\r\n }\r\n }, [prefetch, sortedFilteredData])\r\n const handleBackToTable = React.useCallback(() => {\r\n setView('table')\r\n setSelectedDataset(null)\r\n }, [])\r\n const handleAddDatasetToMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: selectedDataset } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleRemoveDatasetFromMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: selectedDataset.id } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleFavourite = handleFavouriteDataset(selectedDataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const handleAddDataset = () => {\r\n // Logic to add a new dataset\r\n }\r\n\r\n // UI\r\n return (\r\n <Dialog open={isOpen} onOpenChange={setIsOpenAction}>\r\n <DialogContent className=\"h-screen sm:h-[90vh] sm:max-h-[90vh] w-full max-w-full sm:w-[88vw] sm:max-w-[88vw] p-0 gap-0 overflow-hidden flex flex-col\">\r\n {view === 'table' ? (\r\n <>\r\n <DialogHeader className=\"bg-background z-50 sticky top-0 p-6 flex flex-row flex-wrap justify-between items-end gap-2 text-left\">\r\n <div className=\"flex flex-col justify-end p-0\">\r\n <DialogTitle className=\"text-2xl\">{t('dialogTitle')}</DialogTitle>\r\n <DialogDescription className=\"text-sm\">\r\n {t('dialogDescription')}\r\n </DialogDescription>\r\n </div>\r\n <div className=\"flex flex-row flex-wrap justify-between items-center\">\r\n <div className=\"flex flex-wrap gap-2 font-medium\">\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"Search\"\r\n className=\"pl-8 w-[250px]\"\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Filters\r\n datasets={currentTabDatasets}\r\n appliedFilters={appliedFilters}\r\n onFiltersChange={setAppliedFilters}\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setIsAddPortalOpen(true)}\r\n title=\"Register a new open data portal\"\r\n >\r\n <LR.Plus className=\"h-4 w-4 mr-1\" />\r\n Add Portal\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n <DialogClose className=\"absolute right-2 top-2 h-5 w-5 rounded-xl text-muted-foreground hover:bg-transparent focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-background focus:ring-primary\">\r\n <LR.X className=\"!h-4 !w-4\" />\r\n </DialogClose>\r\n </DialogHeader>\r\n <div className=\"relative flex flex-col flex-1 min-h-0\">\r\n <Tabs value={currentTab} className=\"flex flex-col gap-0 h-full\" onValueChange={handleTabChange}>\r\n <div className=\"hidden md:!flex justify-between px-3 flex-shrink-0\">\r\n {' '}\r\n {/* Prevent tabs from shrinking */}\r\n <TabsList className=\"pointer-events-auto sticky flex z-40 top-[100px] bg-transparent\">\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"applied\">\r\n <Badge variant=\"outline\">{addedDatasets.length}</Badge>\r\n {t('appliedTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"favourites\">\r\n {t('favoritesTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"organizational\">{t('organizationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"all\">{t('allDataTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"national\">{t('nationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"countrySubdivision\">{t('countrySubdivisionTab')}</TabsTrigger>\r\n {showMunicipalTab && (\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"municipal\">{t('municipalTab')}</TabsTrigger>\r\n )}\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"liveData\">{t('liveDataTab')}</TabsTrigger>\r\n </TabsList>\r\n </div>\r\n <TabsContent\r\n value={currentTab}\r\n className=\"flex-1 pointer-events-auto mt-0 min-h-0\" // min-h-0 is crucial for flex children\r\n >\r\n {currentTabLoading ? (\r\n <DatasetSkeleton />\r\n ) : (datasetsError ? (\r\n <div className=\"flex flex-col justify-center items-center h-32 text-muted-foreground\">\r\n <LR.AlertCircle className=\"h-6 w-6 mb-2\" />\r\n <span>{datasetsError}</span>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.location.reload()} className=\"mt-2\">\r\n <LR.RefreshCw className=\"h-4 w-4 mr-2\" />\r\n {t('refreshButton')}\r\n </Button>\r\n </div>\r\n ) : (\r\n <DataTable\r\n showPagination={true}\r\n columns={datasetColumns}\r\n data={sortedFilteredData}\r\n tab={currentTab}\r\n onRowClick={handleRowClick}\r\n onRowHover={handleRowHover}\r\n className=\"rounded-none w-auto h-full\" \r\n paginationClasses=\"bg-background z-20 w-full border-t\" \r\n isLoading={currentTabLoading}\r\n leadingCell={props => (\r\n <RowActions\r\n {...props}\r\n favouriteDatasets={favouriteDatasets}\r\n setFavouriteDatasets={setFavouriteDatasets}\r\n />\r\n )}\r\n trailingCell={({ row, index }) => (\r\n <div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"pointer-events-none\"\r\n >\r\n <LR.ChevronRight />\r\n </Button>\r\n </div>\r\n )}\r\n />\r\n ))}\r\n </TabsContent>\r\n </Tabs>\r\n </div>\r\n </>\r\n ) : (\r\n // Detail View Content\r\n <>\r\n <DialogHeader className=\"px-6 pt-6\">\r\n <div>\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n handleBackToTable()\r\n setCurrentTab('all')\r\n }}\r\n >\r\n {t('breadcrumbTitle')}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n setCurrentTab(currentTab)\r\n handleBackToTable()\r\n }}\r\n >\r\n {currentTab.charAt(0).toUpperCase() + currentTab.slice(1)}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{selectedDataset?.name}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n <div className=\"flex flex-row justify-between\">\r\n <div className=\"flex items-center\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n >\r\n <LR.Star\r\n className=\"!h-5 !w-5\"\r\n size={24}\r\n color={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n <DialogTitle>{selectedDataset?.name}</DialogTitle>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handleBackToTable}\r\n >\r\n <LR.ArrowLeft />\r\n {t('backToDataButton')}\r\n </Button>\r\n {selectedDataset && addedDatasets.some(d => d.name === selectedDataset.name)\r\n ? (\r\n <Button onClick={handleRemoveDatasetFromMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Minus />\r\n {t('removeButton')}\r\n </Button>\r\n )\r\n : (\r\n <Button onClick={handleAddDatasetToMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Plus />\r\n {t('applyButton')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </DialogHeader>\r\n <DatasetDetails selectedDataset={selectedDataset} />\r\n </>\r\n )}\r\n </DialogContent>\r\n <AddPortalDialog open={isAddPortalOpen} onOpenChange={setIsAddPortalOpen} />\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
@@ -1 +1 @@
1
- {"version":3,"file":"arcGISDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcGISDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAG3E,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAMxF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AA8CD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAwQpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CACxD;AAED,wBAAgB,cAAc,IAAI,cAAc,CAmB/C"}
1
+ {"version":3,"file":"arcGISDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcGISDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAG3E,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAMxF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AA8CD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAwQpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CACxD;AAED,wBAAgB,cAAc,IAAI,cAAc,CAmB/C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcGISDatasets.ts"],"sourcesContent":["import type { Dataset, FieldType } from '../../../../../types/datasetTypes'\r\nimport { formatName, stripHtml } from '../utils'\r\nimport { type AllGeoJSON } from '@turf/turf'\r\nimport { DataManagementSystem, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { buildValidationKey, getCache, setCache, withCache } from './cache'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\n\r\nconst inFlightFeatureRequests = new Map<string, Promise<AllGeoJSON>>()\r\n\r\nexport type ViewportOptions = {\r\n bbox?: [number, number, number, number] // [west, south, east, north]\r\n zoom?: number\r\n}\r\n\r\nasync function fetchWithTimeout(url: string, timeout = 10_000): Promise<Response> {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(() => controller.abort(), timeout)\r\n try {\r\n const response = await fetch(url, { signal: controller.signal })\r\n clearTimeout(timeoutId)\r\n return response\r\n }\r\n catch (error) {\r\n clearTimeout(timeoutId)\r\n throw error\r\n }\r\n}\r\n\r\n/**\r\n * Run `fn` over `items` with at most `limit` concurrent executions.\r\n * Preserves order of results matching input order.\r\n */\r\nasync function withConcurrencyLimit<T, R>(\r\n items: T[],\r\n limit: number,\r\n fn: (item: T) => Promise<R>,\r\n): Promise<PromiseSettledResult<R>[]> {\r\n const results: PromiseSettledResult<R>[] = new Array(items.length)\r\n let next = 0\r\n\r\n async function worker() {\r\n while (next < items.length) {\r\n const i = next++\r\n try {\r\n results[i] = { status: 'fulfilled', value: await fn(items[i]) }\r\n }\r\n catch (reason) {\r\n results[i] = { status: 'rejected', reason }\r\n }\r\n }\r\n }\r\n\r\n await Promise.all(\r\n Array.from({ length: Math.min(limit, items.length) }, worker),\r\n )\r\n return results\r\n}\r\n\r\nexport async function fetchArcGISDatasets(\r\n portal: OpenDataPortal,\r\n rowsPerPage: number,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n\r\n try {\r\n const baseUrl = (apiUrl || '').replace(/\\/+$/, '')\r\n const servicesUrl = `${baseUrl}/services?f=pjson`\r\n console.log(`[ArcGIS] Fetching services for portal \"${portal.name}\": ${servicesUrl}`)\r\n\r\n const response = await fetchWithTimeout(servicesUrl)\r\n if (!response.ok) {\r\n console.error(`[ArcGIS] \"${portal.name}\" services request failed — status ${response.status}`)\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data = await response.json()\r\n console.log(`[ArcGIS] \"${portal.name}\" — ${data.services?.length ?? 0} services found`)\r\n\r\n const transformedDatasets: Dataset[] = []\r\n\r\n const processService = async (service: any): Promise<Dataset[]> => {\r\n const url = `${baseUrl}/services/${service.name}/${service.type}`\r\n const infoUrl = `${url}/info/itemInfo?f=pjson`\r\n\r\n const [infoRes, serviceRes] = await Promise.allSettled([\r\n fetchWithTimeout(infoUrl),\r\n fetchWithTimeout(`${url}?f=pjson`),\r\n ])\r\n\r\n let extraInfo: any = {}\r\n let serviceInfo: any = {}\r\n\r\n if (infoRes.status === 'fulfilled' && infoRes.value.ok)\r\n extraInfo = await infoRes.value.json()\r\n if (serviceRes.status === 'fulfilled' && serviceRes.value.ok)\r\n serviceInfo = await serviceRes.value.json()\r\n\r\n const layers = serviceInfo.layers && serviceInfo.layers.length > 0\r\n ? serviceInfo.layers.filter((l: any) => l.type === 'Feature Layer')\r\n : [{ id: 0, name: null, geometryType: null }]\r\n\r\n const hasNonNullGeometry = (featuresUrl: string, cacheKey: string): Promise<boolean> =>\r\n withCache<boolean>(cacheKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const res = await fetchWithTimeout(`${featuresUrl}&resultRecordCount=1`)\r\n if (!res.ok) return false\r\n const d = await res.json()\r\n if (d?.error?.code || d?.error?.message) return false\r\n if (!d || d.type !== 'FeatureCollection' || !Array.isArray(d.features)) return false\r\n return d.features.some((f: any) => f && f.geometry)\r\n }\r\n catch { return false }\r\n })\r\n\r\n // Layers within a service are few (2-5 typically) — parallel is fine here\r\n const layerResults = await Promise.allSettled(\r\n layers.map(async (layer: any): Promise<Dataset | null> => {\r\n const layerIndex = layer.id\r\n const featuresUrl = `${url}/${layerIndex}/query?outFields=*&where=1%3D1&f=geojson`\r\n const featureInfoUrl = `${url}/${layerIndex}?f=pjson`\r\n\r\n const validKey = buildValidationKey(\r\n 'arcgis',\r\n `${service.name}_${layerIndex}`,\r\n serviceInfo?.documentInfo?.ModifiedTime || extraInfo?.modified || undefined,\r\n )\r\n const hasGeom = await hasNonNullGeometry(featuresUrl, validKey)\r\n if (!hasGeom) return null\r\n\r\n const modTime = serviceInfo?.documentInfo?.ModifiedTime || extraInfo?.modified || ''\r\n\r\n /**\r\n * getFeatures — viewport-aware, paginated.\r\n * If `bbox` is provided, only features intersecting the viewport are fetched.\r\n * Automatically paginates beyond the per-page limit.\r\n */\r\n const getFeatures = async (options?: ViewportOptions): Promise<AllGeoJSON> => {\r\n const zoom = options?.zoom ?? 10\r\n const bbox = options?.bbox\r\n\r\n // Page size scales with zoom: fewer records at low zoom (overview), more at high zoom (detail)\r\n const pageSize = zoom < 6 ? 500 : zoom < 10 ? 1000 : 2000\r\n\r\n // Build spatial filter string for ArcGIS when viewport is available\r\n let spatialFilter = ''\r\n if (bbox) {\r\n const [west, south, east, north] = bbox\r\n const geomStr = encodeURIComponent(\r\n JSON.stringify({ xmin: west, ymin: south, xmax: east, ymax: north, spatialReference: { wkid: 4326 } }),\r\n )\r\n spatialFilter = `&geometry=${geomStr}&geometryType=esriGeometryEnvelope&spatialRel=esriSpatialRelIntersects&inSR=4326`\r\n }\r\n\r\n // Round bbox to 0.1° grid to maximise cache hits while panning\r\n const bboxKey = bbox\r\n ? bbox.map(n => (Math.round(n * 10) / 10).toFixed(1)).join(',')\r\n : 'global'\r\n const zoomBucket = Math.floor(zoom / 2)\r\n const featuresKey = `features:arcgis:${service.name}_${layerIndex}:${bboxKey}:z${zoomBucket}:${modTime}`\r\n\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) return cached\r\n\r\n const inFlight = inFlightFeatureRequests.get(featuresKey)\r\n if (inFlight) return inFlight\r\n\r\n const baseQuery = `${url}/${layerIndex}/query?outFields=*&where=1%3D1&f=geojson${spatialFilter}`\r\n\r\n const request = (async () => {\r\n try {\r\n const firstRes = await fetchWithTimeout(`${baseQuery}&resultOffset=0&resultRecordCount=${pageSize}`, 15_000)\r\n if (!firstRes.ok) return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n\r\n const firstPage = await firstRes.json()\r\n if (!firstPage?.features) return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n\r\n const allFeatures = [...firstPage.features]\r\n\r\n // If the server returned fewer features than the requested page size, the first page is complete.\r\n // This avoids an unnecessary count request for small datasets that have already finished loading.\r\n if (firstPage.exceededTransferLimit && firstPage.features.length >= pageSize) {\r\n try {\r\n const countRes = await fetchWithTimeout(`${baseQuery}&returnCountOnly=true&f=json`, 5_000)\r\n if (countRes.ok) {\r\n const { count: total } = await countRes.json()\r\n if (total > pageSize) {\r\n // Cap at 10 additional pages (~20 000 records max) to avoid browser memory issues\r\n const numPages = Math.min(Math.ceil((total - pageSize) / pageSize), 10)\r\n const morePages = await Promise.all(\r\n Array.from({ length: numPages }, (_, i) =>\r\n fetchWithTimeout(\r\n `${baseQuery}&resultOffset=${pageSize * (i + 1)}&resultRecordCount=${pageSize}`,\r\n 15_000,\r\n )\r\n .then(r => r.ok ? r.json() : null)\r\n .then(p => p?.features ?? [])\r\n .catch(() => []),\r\n ),\r\n )\r\n for (const page of morePages) allFeatures.push(...page)\r\n }\r\n }\r\n }\r\n catch { /* use first page only */ }\r\n }\r\n\r\n const result = { type: 'FeatureCollection', features: allFeatures } as AllGeoJSON\r\n // Viewport-constrained results cached for 15 min; global results for 1 hr\r\n setCache(featuresKey, result, bbox ? 15 * 60 * 1000 : 60 * 60 * 1000)\r\n return result\r\n }\r\n catch (error) {\r\n console.error(`ArcGIS: Error fetching features for layer ${layerIndex}:`, error)\r\n return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n }\r\n finally {\r\n inFlightFeatureRequests.delete(featuresKey)\r\n }\r\n })()\r\n\r\n inFlightFeatureRequests.set(featuresKey, request)\r\n return request\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n const res = await fetchWithTimeout(`${url}/${layerIndex}?f=pjson`)\r\n return res.ok ? res.json() : undefined\r\n }\r\n catch { return undefined }\r\n }\r\n\r\n const getFields = async () => {\r\n try {\r\n const fieldsKey = `fields:arcgis:${service.name}:${layerIndex}:${modTime}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n\r\n const res = await fetchWithTimeout(featureInfoUrl)\r\n if (!res.ok) return []\r\n const featureData = await res.json()\r\n if (!featureData.fields) return []\r\n\r\n const typeMap = esriFieldTypes()\r\n\r\n const nameBasedType = (raw: any): FieldType | undefined => {\r\n const lc = (raw.name || '').toLowerCase()\r\n if (/(percentage|percent|ratio|average)/.test(lc)) return 'number'\r\n if (/(date|year|month|day|time)/.test(lc)) return 'datetime'\r\n return undefined\r\n }\r\n\r\n const inferFieldType = (raw: any): FieldType => {\r\n const norm = ([raw.type, raw.actualType, raw.sqlType, raw.esriType] as (string | undefined)[])\r\n .filter(Boolean).map(v => String(v).toLowerCase())\r\n if (norm.some(v => v.includes('boolean') || v === 'bool' || v === 'esrifieldtypeboolean')) return 'boolean'\r\n if (norm.some(v => /(double|float|integer|smallint|single|numeric|number|decimal)/.test(v)\r\n || ['esrifieldtypeinteger', 'esrifieldtypesmallinteger', 'esrifieldtypedouble', 'esrifieldtypefloat', 'esrifieldtypesingle'].includes(v))) return 'number'\r\n if (norm.some(v => /(date|time|timestamp)/.test(v))) return 'datetime'\r\n if (norm.some(v => /(globalid|guid|objectid|^oid$|_id$|id$)/.test(v))) return 'id'\r\n if (norm.some(v => v.includes('blob'))) return 'blob'\r\n if (norm.some(v => v.includes('raster') || v.includes('geometry'))) return 'object'\r\n return 'string'\r\n }\r\n\r\n const mapped = featureData.fields.map((field: any) => {\r\n const rawEsriType = field.type\r\n const inferred = nameBasedType(field) || typeMap[rawEsriType]?.type || inferFieldType(field)\r\n return { ...field, esriType: rawEsriType, type: inferred }\r\n })\r\n setCache(fieldsKey, mapped, 24 * 60 * 60 * 1000)\r\n return mapped\r\n }\r\n catch { return [] }\r\n }\r\n\r\n const baseName = formatName(service.name)\r\n const layerName = layer.name || `Layer ${layerIndex}`\r\n const name = layers.length > 1 ? `${baseName} - ${layerName}` : baseName\r\n\r\n return {\r\n id: extraInfo.id ? `${extraInfo.id}_${layerIndex}` : `${service.name}_${layerIndex}`,\r\n name,\r\n type: Array.isArray(service.layers) && service.layers[0]?.geometryType\r\n ? service.layers[0].geometryType\r\n : extraInfo.type || 'Feature Layer',\r\n datasetType: 'GeoJSON',\r\n dataManagementSystem: DataManagementSystem.Arcgis,\r\n url,\r\n license: extraInfo.licenseInfo || 'Unknown',\r\n description: extraInfo.description ? stripHtml(extraInfo.description) : 'No description available',\r\n publisher: extraInfo.owner || 'Unknown',\r\n contact: extraInfo.contact || 'Unknown',\r\n keywords: extraInfo.tags || extraInfo.typedKeywords || [],\r\n subject: extraInfo.subject || [],\r\n countrySubdivision,\r\n municipality,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group,\r\n portal,\r\n layerColor: layerColorByName(name),\r\n } satisfies Dataset\r\n }),\r\n )\r\n\r\n return layerResults\r\n .filter((r): r is PromiseFulfilledResult<Dataset> => r.status === 'fulfilled' && r.value !== null)\r\n .map(r => r.value)\r\n }\r\n\r\n // Process at most 5 services concurrently — prevents ArcGIS rate-limiting\r\n const serviceResults = await withConcurrencyLimit(data.services, 5, processService)\r\n\r\n for (const result of serviceResults) {\r\n if (result.status === 'fulfilled') transformedDatasets.push(...result.value)\r\n }\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error(`[ArcGIS] Failed to fetch datasets for portal \"${portal.name}\":`, error)\r\n return []\r\n }\r\n}\r\n\r\nexport interface EsriFieldTypes {\r\n [key: string]: { description: string, type: FieldType }\r\n}\r\n\r\nexport function esriFieldTypes(): EsriFieldTypes {\r\n return {\r\n esriFieldTypeString: { description: 'Text Field', type: 'string' },\r\n esriFieldTypeGlobalID: { description: 'Global ID', type: 'id' },\r\n esriFieldTypeGUID: { description: 'Global UID', type: 'id' },\r\n esriFieldTypeSmallInteger: { description: '16-bit Integer', type: 'number' },\r\n esriFieldTypeInteger: { description: '32-bit Integer', type: 'number' },\r\n esriFieldTypeSingle: { description: 'Single Precision Float', type: 'number' },\r\n esriFieldTypeDouble: { description: 'Double Precision Float', type: 'number' },\r\n esriFieldTypeDate: { description: 'Date/Time', type: 'datetime' },\r\n esriFieldTypedOnly: { description: 'Date', type: 'datetime' },\r\n esriFieldTypeTimeOnly: { description: 'Time', type: 'string' },\r\n esriFieldTypeTimestampOffset: { description: 'Timestamp', type: 'string' },\r\n esriFieldTypeBlob: { description: 'Binary', type: 'blob' },\r\n esriFieldTypeRaster: { description: 'Raster', type: 'object' },\r\n esriFieldTypeXML: { description: 'XML', type: 'string' },\r\n esriFieldTypeGeometry: { description: 'Spatial Geometry', type: 'object' },\r\n esriFieldTypeOID: { description: 'Object ID', type: 'id' },\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcGISDatasets.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset, FieldType } from '../../../../../types/datasetTypes'\r\nimport { formatName, stripHtml } from '../utils'\r\nimport { type AllGeoJSON } from '@turf/turf'\r\nimport { DataManagementSystem, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { buildValidationKey, getCache, setCache, withCache } from './cache'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\n\r\nconst inFlightFeatureRequests = new Map<string, Promise<AllGeoJSON>>()\r\n\r\nexport type ViewportOptions = {\r\n bbox?: [number, number, number, number] // [west, south, east, north]\r\n zoom?: number\r\n}\r\n\r\nasync function fetchWithTimeout(url: string, timeout = 10_000): Promise<Response> {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(() => controller.abort(), timeout)\r\n try {\r\n const response = await fetch(url, { signal: controller.signal })\r\n clearTimeout(timeoutId)\r\n return response\r\n }\r\n catch (error) {\r\n clearTimeout(timeoutId)\r\n throw error\r\n }\r\n}\r\n\r\n/**\r\n * Run `fn` over `items` with at most `limit` concurrent executions.\r\n * Preserves order of results matching input order.\r\n */\r\nasync function withConcurrencyLimit<T, R>(\r\n items: T[],\r\n limit: number,\r\n fn: (item: T) => Promise<R>,\r\n): Promise<PromiseSettledResult<R>[]> {\r\n const results: PromiseSettledResult<R>[] = new Array(items.length)\r\n let next = 0\r\n\r\n async function worker() {\r\n while (next < items.length) {\r\n const i = next++\r\n try {\r\n results[i] = { status: 'fulfilled', value: await fn(items[i]) }\r\n }\r\n catch (reason) {\r\n results[i] = { status: 'rejected', reason }\r\n }\r\n }\r\n }\r\n\r\n await Promise.all(\r\n Array.from({ length: Math.min(limit, items.length) }, worker),\r\n )\r\n return results\r\n}\r\n\r\nexport async function fetchArcGISDatasets(\r\n portal: OpenDataPortal,\r\n rowsPerPage: number,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n\r\n try {\r\n const baseUrl = (apiUrl || '').replace(/\\/+$/, '')\r\n const servicesUrl = `${baseUrl}/services?f=pjson`\r\n console.log(`[ArcGIS] Fetching services for portal \"${portal.name}\": ${servicesUrl}`)\r\n\r\n const response = await fetchWithTimeout(servicesUrl)\r\n if (!response.ok) {\r\n console.error(`[ArcGIS] \"${portal.name}\" services request failed — status ${response.status}`)\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data = await response.json()\r\n console.log(`[ArcGIS] \"${portal.name}\" — ${data.services?.length ?? 0} services found`)\r\n\r\n const transformedDatasets: Dataset[] = []\r\n\r\n const processService = async (service: any): Promise<Dataset[]> => {\r\n const url = `${baseUrl}/services/${service.name}/${service.type}`\r\n const infoUrl = `${url}/info/itemInfo?f=pjson`\r\n\r\n const [infoRes, serviceRes] = await Promise.allSettled([\r\n fetchWithTimeout(infoUrl),\r\n fetchWithTimeout(`${url}?f=pjson`),\r\n ])\r\n\r\n let extraInfo: any = {}\r\n let serviceInfo: any = {}\r\n\r\n if (infoRes.status === 'fulfilled' && infoRes.value.ok)\r\n extraInfo = await infoRes.value.json()\r\n if (serviceRes.status === 'fulfilled' && serviceRes.value.ok)\r\n serviceInfo = await serviceRes.value.json()\r\n\r\n const layers = serviceInfo.layers && serviceInfo.layers.length > 0\r\n ? serviceInfo.layers.filter((l: any) => l.type === 'Feature Layer')\r\n : [{ id: 0, name: null, geometryType: null }]\r\n\r\n const hasNonNullGeometry = (featuresUrl: string, cacheKey: string): Promise<boolean> =>\r\n withCache<boolean>(cacheKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const res = await fetchWithTimeout(`${featuresUrl}&resultRecordCount=1`)\r\n if (!res.ok) return false\r\n const d = await res.json()\r\n if (d?.error?.code || d?.error?.message) return false\r\n if (!d || d.type !== 'FeatureCollection' || !Array.isArray(d.features)) return false\r\n return d.features.some((f: any) => f && f.geometry)\r\n }\r\n catch { return false }\r\n })\r\n\r\n // Layers within a service are few (2-5 typically) — parallel is fine here\r\n const layerResults = await Promise.allSettled(\r\n layers.map(async (layer: any): Promise<Dataset | null> => {\r\n const layerIndex = layer.id\r\n const featuresUrl = `${url}/${layerIndex}/query?outFields=*&where=1%3D1&f=geojson`\r\n const featureInfoUrl = `${url}/${layerIndex}?f=pjson`\r\n\r\n const validKey = buildValidationKey(\r\n 'arcgis',\r\n `${service.name}_${layerIndex}`,\r\n serviceInfo?.documentInfo?.ModifiedTime || extraInfo?.modified || undefined,\r\n )\r\n const hasGeom = await hasNonNullGeometry(featuresUrl, validKey)\r\n if (!hasGeom) return null\r\n\r\n const modTime = serviceInfo?.documentInfo?.ModifiedTime || extraInfo?.modified || ''\r\n\r\n /**\r\n * getFeatures — viewport-aware, paginated.\r\n * If `bbox` is provided, only features intersecting the viewport are fetched.\r\n * Automatically paginates beyond the per-page limit.\r\n */\r\n const getFeatures = async (options?: ViewportOptions): Promise<AllGeoJSON> => {\r\n const zoom = options?.zoom ?? 10\r\n const bbox = options?.bbox\r\n\r\n // Page size scales with zoom: fewer records at low zoom (overview), more at high zoom (detail)\r\n const pageSize = zoom < 6 ? 500 : zoom < 10 ? 1000 : 2000\r\n\r\n // Build spatial filter string for ArcGIS when viewport is available\r\n let spatialFilter = ''\r\n if (bbox) {\r\n const [west, south, east, north] = bbox\r\n const geomStr = encodeURIComponent(\r\n JSON.stringify({ xmin: west, ymin: south, xmax: east, ymax: north, spatialReference: { wkid: 4326 } }),\r\n )\r\n spatialFilter = `&geometry=${geomStr}&geometryType=esriGeometryEnvelope&spatialRel=esriSpatialRelIntersects&inSR=4326`\r\n }\r\n\r\n // Round bbox to 0.1° grid to maximise cache hits while panning\r\n const bboxKey = bbox\r\n ? bbox.map(n => (Math.round(n * 10) / 10).toFixed(1)).join(',')\r\n : 'global'\r\n const zoomBucket = Math.floor(zoom / 2)\r\n const featuresKey = `features:arcgis:${service.name}_${layerIndex}:${bboxKey}:z${zoomBucket}:${modTime}`\r\n\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) return cached\r\n\r\n const inFlight = inFlightFeatureRequests.get(featuresKey)\r\n if (inFlight) return inFlight\r\n\r\n const baseQuery = `${url}/${layerIndex}/query?outFields=*&where=1%3D1&f=geojson${spatialFilter}`\r\n\r\n const request = (async () => {\r\n try {\r\n const firstRes = await fetchWithTimeout(`${baseQuery}&resultOffset=0&resultRecordCount=${pageSize}`, 15_000)\r\n if (!firstRes.ok) return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n\r\n const firstPage = await firstRes.json()\r\n if (!firstPage?.features) return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n\r\n const allFeatures = [...firstPage.features]\r\n\r\n // If the server returned fewer features than the requested page size, the first page is complete.\r\n // This avoids an unnecessary count request for small datasets that have already finished loading.\r\n if (firstPage.exceededTransferLimit && firstPage.features.length >= pageSize) {\r\n try {\r\n const countRes = await fetchWithTimeout(`${baseQuery}&returnCountOnly=true&f=json`, 5_000)\r\n if (countRes.ok) {\r\n const { count: total } = await countRes.json()\r\n if (total > pageSize) {\r\n // Cap at 10 additional pages (~20 000 records max) to avoid browser memory issues\r\n const numPages = Math.min(Math.ceil((total - pageSize) / pageSize), 10)\r\n const morePages = await Promise.all(\r\n Array.from({ length: numPages }, (_, i) =>\r\n fetchWithTimeout(\r\n `${baseQuery}&resultOffset=${pageSize * (i + 1)}&resultRecordCount=${pageSize}`,\r\n 15_000,\r\n )\r\n .then(r => r.ok ? r.json() : null)\r\n .then(p => p?.features ?? [])\r\n .catch(() => []),\r\n ),\r\n )\r\n for (const page of morePages) allFeatures.push(...page)\r\n }\r\n }\r\n }\r\n catch { /* use first page only */ }\r\n }\r\n\r\n const result = { type: 'FeatureCollection', features: allFeatures } as AllGeoJSON\r\n // Viewport-constrained results cached for 15 min; global results for 1 hr\r\n setCache(featuresKey, result, bbox ? 15 * 60 * 1000 : 60 * 60 * 1000)\r\n return result\r\n }\r\n catch (error) {\r\n console.error(`ArcGIS: Error fetching features for layer ${layerIndex}:`, error)\r\n return { type: 'FeatureCollection', features: [] } as AllGeoJSON\r\n }\r\n finally {\r\n inFlightFeatureRequests.delete(featuresKey)\r\n }\r\n })()\r\n\r\n inFlightFeatureRequests.set(featuresKey, request)\r\n return request\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n const res = await fetchWithTimeout(`${url}/${layerIndex}?f=pjson`)\r\n return res.ok ? res.json() : undefined\r\n }\r\n catch { return undefined }\r\n }\r\n\r\n const getFields = async () => {\r\n try {\r\n const fieldsKey = `fields:arcgis:${service.name}:${layerIndex}:${modTime}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n\r\n const res = await fetchWithTimeout(featureInfoUrl)\r\n if (!res.ok) return []\r\n const featureData = await res.json()\r\n if (!featureData.fields) return []\r\n\r\n const typeMap = esriFieldTypes()\r\n\r\n const nameBasedType = (raw: any): FieldType | undefined => {\r\n const lc = (raw.name || '').toLowerCase()\r\n if (/(percentage|percent|ratio|average)/.test(lc)) return 'number'\r\n if (/(date|year|month|day|time)/.test(lc)) return 'datetime'\r\n return undefined\r\n }\r\n\r\n const inferFieldType = (raw: any): FieldType => {\r\n const norm = ([raw.type, raw.actualType, raw.sqlType, raw.esriType] as (string | undefined)[])\r\n .filter(Boolean).map(v => String(v).toLowerCase())\r\n if (norm.some(v => v.includes('boolean') || v === 'bool' || v === 'esrifieldtypeboolean')) return 'boolean'\r\n if (norm.some(v => /(double|float|integer|smallint|single|numeric|number|decimal)/.test(v)\r\n || ['esrifieldtypeinteger', 'esrifieldtypesmallinteger', 'esrifieldtypedouble', 'esrifieldtypefloat', 'esrifieldtypesingle'].includes(v))) return 'number'\r\n if (norm.some(v => /(date|time|timestamp)/.test(v))) return 'datetime'\r\n if (norm.some(v => /(globalid|guid|objectid|^oid$|_id$|id$)/.test(v))) return 'id'\r\n if (norm.some(v => v.includes('blob'))) return 'blob'\r\n if (norm.some(v => v.includes('raster') || v.includes('geometry'))) return 'object'\r\n return 'string'\r\n }\r\n\r\n const mapped = featureData.fields.map((field: any) => {\r\n const rawEsriType = field.type\r\n const inferred = nameBasedType(field) || typeMap[rawEsriType]?.type || inferFieldType(field)\r\n return { ...field, esriType: rawEsriType, type: inferred }\r\n })\r\n setCache(fieldsKey, mapped, 24 * 60 * 60 * 1000)\r\n return mapped\r\n }\r\n catch { return [] }\r\n }\r\n\r\n const baseName = formatName(service.name)\r\n const layerName = layer.name || `Layer ${layerIndex}`\r\n const name = layers.length > 1 ? `${baseName} - ${layerName}` : baseName\r\n\r\n return {\r\n id: extraInfo.id ? `${extraInfo.id}_${layerIndex}` : `${service.name}_${layerIndex}`,\r\n name,\r\n type: Array.isArray(service.layers) && service.layers[0]?.geometryType\r\n ? service.layers[0].geometryType\r\n : extraInfo.type || 'Feature Layer',\r\n datasetType: 'GeoJSON',\r\n dataManagementSystem: DataManagementSystem.Arcgis,\r\n url,\r\n license: extraInfo.licenseInfo || 'Unknown',\r\n description: extraInfo.description ? stripHtml(extraInfo.description) : 'No description available',\r\n publisher: extraInfo.owner || 'Unknown',\r\n contact: extraInfo.contact || 'Unknown',\r\n keywords: extraInfo.tags || extraInfo.typedKeywords || [],\r\n subject: extraInfo.subject || [],\r\n countrySubdivision,\r\n municipality,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group,\r\n portal,\r\n layerColor: layerColorByName(name),\r\n } satisfies Dataset\r\n }),\r\n )\r\n\r\n return layerResults\r\n .filter((r): r is PromiseFulfilledResult<Dataset> => r.status === 'fulfilled' && r.value !== null)\r\n .map(r => r.value)\r\n }\r\n\r\n // Process at most 5 services concurrently — prevents ArcGIS rate-limiting\r\n const serviceResults = await withConcurrencyLimit(data.services, 5, processService)\r\n\r\n for (const result of serviceResults) {\r\n if (result.status === 'fulfilled') transformedDatasets.push(...result.value)\r\n }\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error(`[ArcGIS] Failed to fetch datasets for portal \"${portal.name}\":`, error)\r\n return []\r\n }\r\n}\r\n\r\nexport interface EsriFieldTypes {\r\n [key: string]: { description: string, type: FieldType }\r\n}\r\n\r\nexport function esriFieldTypes(): EsriFieldTypes {\r\n return {\r\n esriFieldTypeString: { description: 'Text Field', type: 'string' },\r\n esriFieldTypeGlobalID: { description: 'Global ID', type: 'id' },\r\n esriFieldTypeGUID: { description: 'Global UID', type: 'id' },\r\n esriFieldTypeSmallInteger: { description: '16-bit Integer', type: 'number' },\r\n esriFieldTypeInteger: { description: '32-bit Integer', type: 'number' },\r\n esriFieldTypeSingle: { description: 'Single Precision Float', type: 'number' },\r\n esriFieldTypeDouble: { description: 'Double Precision Float', type: 'number' },\r\n esriFieldTypeDate: { description: 'Date/Time', type: 'datetime' },\r\n esriFieldTypedOnly: { description: 'Date', type: 'datetime' },\r\n esriFieldTypeTimeOnly: { description: 'Time', type: 'string' },\r\n esriFieldTypeTimestampOffset: { description: 'Timestamp', type: 'string' },\r\n esriFieldTypeBlob: { description: 'Binary', type: 'blob' },\r\n esriFieldTypeRaster: { description: 'Raster', type: 'object' },\r\n esriFieldTypeXML: { description: 'XML', type: 'string' },\r\n esriFieldTypeGeometry: { description: 'Spatial Geometry', type: 'object' },\r\n esriFieldTypeOID: { description: 'Object ID', type: 'id' },\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
@@ -1 +1 @@
1
- {"version":3,"file":"arcgisFetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcgisFetch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8FAA8F;AAC9F,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,SAAS,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAenB;AAED;;;;GAIG;AACH,wBAAuB,wBAAwB,CAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACxE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAqBhC"}
1
+ {"version":3,"file":"arcgisFetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcgisFetch.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,8FAA8F;AAC9F,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,SAAS,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAenB;AAED;;;;GAIG;AACH,wBAAuB,wBAAwB,CAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACxE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAqBhC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcgisFetch.ts"],"sourcesContent":["/**\r\n * Minimal ArcGIS Feature Service fetch helpers for the \"Add dataset\" URL import.\r\n *\r\n * Lifted from the connector SDK's `arcgis.ts`, trimmed to just what the URL\r\n * importer needs (`fetchWithTimeout` + `fetchArcGISLayerFeatures`). ArcGIS\r\n * supports `f=geojson` directly, so no Esri-JSON → GeoJSON conversion is needed.\r\n */\r\n\r\n/** `fetch()` with an AbortController-backed timeout, chained to an optional caller signal. */\r\nexport async function fetchWithTimeout(\r\n url: string,\r\n timeoutMs = 10_000,\r\n signal?: AbortSignal,\r\n): Promise<Response> {\r\n const controller = new AbortController()\r\n const onAbort = () => controller.abort()\r\n if (signal) {\r\n if (signal.aborted) controller.abort()\r\n else signal.addEventListener('abort', onAbort, { once: true })\r\n }\r\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n try {\r\n return await fetch(url, { signal: controller.signal })\r\n }\r\n finally {\r\n clearTimeout(timeoutId)\r\n if (signal) signal.removeEventListener('abort', onAbort)\r\n }\r\n}\r\n\r\n/**\r\n * Page through every feature of an ArcGIS Feature Service layer as GeoJSON.\r\n * Yields features one at a time. `layerUrl` is the full layer endpoint, e.g.\r\n * `https://…/FeatureServer/0`.\r\n */\r\nexport async function* fetchArcGISLayerFeatures(\r\n layerUrl: string,\r\n opts: { pageSize?: number, maxPages?: number, signal?: AbortSignal } = {},\r\n): AsyncIterable<GeoJSON.Feature> {\r\n const pageSize = opts.pageSize ?? 1000\r\n const maxPages = opts.maxPages ?? 50\r\n const base = `${layerUrl.replace(/\\/+$/, '')}/query?outFields=*&where=1%3D1&f=geojson`\r\n\r\n for (let page = 0; page < maxPages; page++) {\r\n if (opts.signal?.aborted) return\r\n const url = `${base}&resultOffset=${page * pageSize}&resultRecordCount=${pageSize}`\r\n const res = await fetchWithTimeout(url, 15_000, opts.signal)\r\n if (!res.ok) throw new Error(`ArcGIS query failed: HTTP ${res.status}`)\r\n\r\n const json = await res.json() as {\r\n features?: GeoJSON.Feature[]\r\n exceededTransferLimit?: boolean\r\n }\r\n const features = json.features ?? []\r\n for (const feature of features) yield feature\r\n\r\n // Stop once the server returns a short page or stops flagging more data.\r\n if (features.length < pageSize || !json.exceededTransferLimit) return\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AASA,eAAsB,iBACpB,KACA,YAAY,KACZ,QACmB;AACnB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,MAAM,WAAW,MAAM;AACvC,MAAI,QAAQ;AACV,QAAI,OAAO,QAAS,YAAW,MAAM;AAAA,QAChC,QAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC/D;AACA,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAChE,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAAA,EACvD,UACA;AACE,iBAAa,SAAS;AACtB,QAAI,OAAQ,QAAO,oBAAoB,SAAS,OAAO;AAAA,EACzD;AACF;AAOA,SAAuB,yBACrB,IAEgC;AAAA,sDAFhC,UACA,OAAuE,CAAC,GACxC;AAtClC;AAuCE,UAAM,YAAW,UAAK,aAAL,YAAiB;AAClC,UAAM,YAAW,UAAK,aAAL,YAAiB;AAClC,UAAM,OAAO,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAE5C,aAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,WAAI,UAAK,WAAL,mBAAa,QAAS;AAC1B,YAAM,MAAM,GAAG,IAAI,iBAAiB,OAAO,QAAQ,sBAAsB,QAAQ;AACjF,YAAM,MAAM,kBAAM,iBAAiB,KAAK,MAAQ,KAAK,MAAM;AAC3D,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,EAAE;AAEtE,YAAM,OAAO,kBAAM,IAAI,KAAK;AAI5B,YAAM,YAAW,UAAK,aAAL,YAAiB,CAAC;AACnC,iBAAW,WAAW,SAAU,OAAM;AAGtC,UAAI,SAAS,SAAS,YAAY,CAAC,KAAK,sBAAuB;AAAA,IACjE;AAAA,EACF;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/arcgisFetch.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/**\r\n * Minimal ArcGIS Feature Service fetch helpers for the \"Add dataset\" URL import.\r\n *\r\n * Lifted from the connector SDK's `arcgis.ts`, trimmed to just what the URL\r\n * importer needs (`fetchWithTimeout` + `fetchArcGISLayerFeatures`). ArcGIS\r\n * supports `f=geojson` directly, so no Esri-JSON → GeoJSON conversion is needed.\r\n */\r\n\r\n/** `fetch()` with an AbortController-backed timeout, chained to an optional caller signal. */\r\nexport async function fetchWithTimeout(\r\n url: string,\r\n timeoutMs = 10_000,\r\n signal?: AbortSignal,\r\n): Promise<Response> {\r\n const controller = new AbortController()\r\n const onAbort = () => controller.abort()\r\n if (signal) {\r\n if (signal.aborted) controller.abort()\r\n else signal.addEventListener('abort', onAbort, { once: true })\r\n }\r\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n try {\r\n return await fetch(url, { signal: controller.signal })\r\n }\r\n finally {\r\n clearTimeout(timeoutId)\r\n if (signal) signal.removeEventListener('abort', onAbort)\r\n }\r\n}\r\n\r\n/**\r\n * Page through every feature of an ArcGIS Feature Service layer as GeoJSON.\r\n * Yields features one at a time. `layerUrl` is the full layer endpoint, e.g.\r\n * `https://…/FeatureServer/0`.\r\n */\r\nexport async function* fetchArcGISLayerFeatures(\r\n layerUrl: string,\r\n opts: { pageSize?: number, maxPages?: number, signal?: AbortSignal } = {},\r\n): AsyncIterable<GeoJSON.Feature> {\r\n const pageSize = opts.pageSize ?? 1000\r\n const maxPages = opts.maxPages ?? 50\r\n const base = `${layerUrl.replace(/\\/+$/, '')}/query?outFields=*&where=1%3D1&f=geojson`\r\n\r\n for (let page = 0; page < maxPages; page++) {\r\n if (opts.signal?.aborted) return\r\n const url = `${base}&resultOffset=${page * pageSize}&resultRecordCount=${pageSize}`\r\n const res = await fetchWithTimeout(url, 15_000, opts.signal)\r\n if (!res.ok) throw new Error(`ArcGIS query failed: HTTP ${res.status}`)\r\n\r\n const json = await res.json() as {\r\n features?: GeoJSON.Feature[]\r\n exceededTransferLimit?: boolean\r\n }\r\n const features = json.features ?? []\r\n for (const feature of features) yield feature\r\n\r\n // Stop once the server returns a short page or stops flagging more data.\r\n if (features.length < pageSize || !json.exceededTransferLimit) return\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAYA,eAAsB,iBACpB,KACA,YAAY,KACZ,QACmB;AACnB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,MAAM,WAAW,MAAM;AACvC,MAAI,QAAQ;AACV,QAAI,OAAO,QAAS,YAAW,MAAM;AAAA,QAChC,QAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC/D;AACA,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAChE,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAAA,EACvD,UACA;AACE,iBAAa,SAAS;AACtB,QAAI,OAAQ,QAAO,oBAAoB,SAAS,OAAO;AAAA,EACzD;AACF;AAOA,SAAuB,yBACrB,IAEgC;AAAA,sDAFhC,UACA,OAAuE,CAAC,GACxC;AAzClC;AA0CE,UAAM,YAAW,UAAK,aAAL,YAAiB;AAClC,UAAM,YAAW,UAAK,aAAL,YAAiB;AAClC,UAAM,OAAO,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAE5C,aAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,WAAI,UAAK,WAAL,mBAAa,QAAS;AAC1B,YAAM,MAAM,GAAG,IAAI,iBAAiB,OAAO,QAAQ,sBAAsB,QAAQ;AACjF,YAAM,MAAM,kBAAM,iBAAiB,KAAK,MAAQ,KAAK,MAAM;AAC3D,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,EAAE;AAEtE,YAAM,OAAO,kBAAM,IAAI,KAAK;AAI5B,YAAM,YAAW,UAAK,aAAL,YAAiB,CAAC;AACnC,iBAAW,WAAW,SAAU,OAAM;AAGtC,UAAI,SAAS,SAAS,YAAY,CAAC,KAAK,sBAAuB;AAAA,IACjE;AAAA,EACF;AAAA;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"builtinLiveDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/builtinLiveDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AA4DhE,+FAA+F;AAC/F,eAAO,MAAM,mBAAmB,EAAE,OAAO,EAAmB,CAAA"}
1
+ {"version":3,"file":"builtinLiveDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/builtinLiveDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AA4DhE,+FAA+F;AAC/F,eAAO,MAAM,mBAAmB,EAAE,OAAO,EAAmB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/builtinLiveDatasets.ts"],"sourcesContent":["import type { Dataset } from '../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport { buildWmsTileUrl } from './urlSources'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\n\r\n/**\r\n * Curated \"live\" datasets surfaced in the dataset manager's Live Data tab.\r\n *\r\n * Unlike portal-fetched datasets these are defined in code: a small, known set\r\n * of always-current federated feeds. The first is Environment and Climate Change\r\n * Canada's precipitation radar (MSC GeoMet) — a WMS raster of rain rate, the\r\n * server always serving the latest frame (refreshed ~every 6 minutes). Federated\r\n * and Canadian-governed: nothing of ours egresses, the browser fetches GeoMet\r\n * raster tiles directly.\r\n *\r\n * Each entry carries `portal.live === true` — the only thing the Live Data tab\r\n * filters on — and renders through the WMS branch of OpenDataLayer.\r\n */\r\n\r\nconst GEOMET_WMS_URL =\r\n process.env.NEXT_PUBLIC_GEOMET_WMS_URL || 'https://geo.weather.gc.ca/geomet'\r\n\r\nconst liveWeatherPortal: OpenDataPortal = {\r\n id: -1001, // synthetic — built-in, never persisted\r\n name: 'ECCC · MSC GeoMet',\r\n group: DatasetGroup.National,\r\n dataManagementSystem: 'Other',\r\n apiUrl: GEOMET_WMS_URL,\r\n country: 'Canada',\r\n live: true,\r\n}\r\n\r\nconst emptyFeatures = async (): Promise<AllGeoJSON> =>\r\n ({ type: 'FeatureCollection', features: [] } as AllGeoJSON)\r\n\r\nconst weatherRadar: Dataset = {\r\n id: 'live-weather-radar',\r\n name: 'Live Weather Radar (Canada)',\r\n publisher: 'Environment and Climate Change Canada · MSC GeoMet',\r\n description: 'Live precipitation radar (RADAR_1KM_RRAI) — rain rate, latest frame served ~every 6 minutes.',\r\n dataManagementSystem: 'other',\r\n datasetType: 'WMS',\r\n type: 'WMS',\r\n countrySubdivision: '',\r\n municipality: '',\r\n group: DatasetGroup.National,\r\n clickable: false,\r\n // MapLibre raster tile template; {bbox-epsg-3857} stays literal (substituted per tile).\r\n url: buildWmsTileUrl(GEOMET_WMS_URL, 'RADAR_1KM_RRAI'),\r\n // Time-enabled: WMSDatasetLayer animates the WMS TIME dimension via the scrub/play control.\r\n timeEnabled: true,\r\n wms: { baseUrl: GEOMET_WMS_URL, layers: 'RADAR_1KM_RRAI' },\r\n information: 'https://eccc-msc.github.io/open-data/msc-geomet/readme_en/',\r\n portal: liveWeatherPortal,\r\n layerColor: layerColorByName('Live Weather Radar'),\r\n getFields: async () => [],\r\n getFeatures: emptyFeatures,\r\n}\r\n\r\n/** Built-in live datasets, injected into the manager so the Live Data tab has real content. */\r\nexport const builtinLiveDatasets: Dataset[] = [weatherRadar]\r\n"],"mappings":"AACA,SAAS,oBAAyC;AAClD,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAiBhC,MAAM,iBACJ,QAAQ,IAAI,8BAA8B;AAE5C,MAAM,oBAAoC;AAAA,EACxC,IAAI;AAAA;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,aAAa;AAAA,EACpB,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR;AAEA,MAAM,gBAAgB,aACnB,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE;AAE7C,MAAM,eAAwB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,OAAO,aAAa;AAAA,EACpB,WAAW;AAAA;AAAA,EAEX,KAAK,gBAAgB,gBAAgB,gBAAgB;AAAA;AAAA,EAErD,aAAa;AAAA,EACb,KAAK,EAAE,SAAS,gBAAgB,QAAQ,iBAAiB;AAAA,EACzD,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY,iBAAiB,oBAAoB;AAAA,EACjD,WAAW,YAAY,CAAC;AAAA,EACxB,aAAa;AACf;AAGO,MAAM,sBAAiC,CAAC,YAAY;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/builtinLiveDatasets.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 OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport { buildWmsTileUrl } from './urlSources'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\n\r\n/**\r\n * Curated \"live\" datasets surfaced in the dataset manager's Live Data tab.\r\n *\r\n * Unlike portal-fetched datasets these are defined in code: a small, known set\r\n * of always-current federated feeds. The first is Environment and Climate Change\r\n * Canada's precipitation radar (MSC GeoMet) — a WMS raster of rain rate, the\r\n * server always serving the latest frame (refreshed ~every 6 minutes). Federated\r\n * and Canadian-governed: nothing of ours egresses, the browser fetches GeoMet\r\n * raster tiles directly.\r\n *\r\n * Each entry carries `portal.live === true` — the only thing the Live Data tab\r\n * filters on — and renders through the WMS branch of OpenDataLayer.\r\n */\r\n\r\nconst GEOMET_WMS_URL =\r\n process.env.NEXT_PUBLIC_GEOMET_WMS_URL || 'https://geo.weather.gc.ca/geomet'\r\n\r\nconst liveWeatherPortal: OpenDataPortal = {\r\n id: -1001, // synthetic — built-in, never persisted\r\n name: 'ECCC · MSC GeoMet',\r\n group: DatasetGroup.National,\r\n dataManagementSystem: 'Other',\r\n apiUrl: GEOMET_WMS_URL,\r\n country: 'Canada',\r\n live: true,\r\n}\r\n\r\nconst emptyFeatures = async (): Promise<AllGeoJSON> =>\r\n ({ type: 'FeatureCollection', features: [] } as AllGeoJSON)\r\n\r\nconst weatherRadar: Dataset = {\r\n id: 'live-weather-radar',\r\n name: 'Live Weather Radar (Canada)',\r\n publisher: 'Environment and Climate Change Canada · MSC GeoMet',\r\n description: 'Live precipitation radar (RADAR_1KM_RRAI) — rain rate, latest frame served ~every 6 minutes.',\r\n dataManagementSystem: 'other',\r\n datasetType: 'WMS',\r\n type: 'WMS',\r\n countrySubdivision: '',\r\n municipality: '',\r\n group: DatasetGroup.National,\r\n clickable: false,\r\n // MapLibre raster tile template; {bbox-epsg-3857} stays literal (substituted per tile).\r\n url: buildWmsTileUrl(GEOMET_WMS_URL, 'RADAR_1KM_RRAI'),\r\n // Time-enabled: WMSDatasetLayer animates the WMS TIME dimension via the scrub/play control.\r\n timeEnabled: true,\r\n wms: { baseUrl: GEOMET_WMS_URL, layers: 'RADAR_1KM_RRAI' },\r\n information: 'https://eccc-msc.github.io/open-data/msc-geomet/readme_en/',\r\n portal: liveWeatherPortal,\r\n layerColor: layerColorByName('Live Weather Radar'),\r\n getFields: async () => [],\r\n getFeatures: emptyFeatures,\r\n}\r\n\r\n/** Built-in live datasets, injected into the manager so the Live Data tab has real content. */\r\nexport const builtinLiveDatasets: Dataset[] = [weatherRadar]\r\n"],"mappings":"AAIA,SAAS,oBAAyC;AAClD,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAiBhC,MAAM,iBACJ,QAAQ,IAAI,8BAA8B;AAE5C,MAAM,oBAAoC;AAAA,EACxC,IAAI;AAAA;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,aAAa;AAAA,EACpB,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR;AAEA,MAAM,gBAAgB,aACnB,EAAE,MAAM,qBAAqB,UAAU,CAAC,EAAE;AAE7C,MAAM,eAAwB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,OAAO,aAAa;AAAA,EACpB,WAAW;AAAA;AAAA,EAEX,KAAK,gBAAgB,gBAAgB,gBAAgB;AAAA;AAAA,EAErD,aAAa;AAAA,EACb,KAAK,EAAE,SAAS,gBAAgB,QAAQ,iBAAiB;AAAA,EACzD,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY,iBAAiB,oBAAoB;AAAA,EACjD,WAAW,YAAY,CAAC;AAAA,EACxB,aAAa;AACf;AAGO,MAAM,sBAAiC,CAAC,YAAY;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/cache.ts"],"names":[],"mappings":"AAYA,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,UAEvE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,QAQ/D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAqBtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOzF;AAED,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0CrG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,UAEnH"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/cache.ts"],"names":[],"mappings":"AAeA,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,UAEvE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,QAQ/D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAqBtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOzF;AAED,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0CrG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,UAEnH"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/cache.ts"],"sourcesContent":["type CacheValue<T> = {\r\n v: T\r\n e: number\r\n}\r\n\r\nconst NS = 'datasetCache:'\r\nconst mem = new Map<string, CacheValue<any>>()\r\n\r\nfunction now() {\r\n return Date.now()\r\n}\r\n\r\nexport function makeKey(parts: Array<string | number | null | undefined>) {\r\n return NS + parts.map((p) => String(p ?? '')).join('|')\r\n}\r\n\r\nexport function setCache<T>(key: string, value: T, ttlMs: number) {\r\n const rec: CacheValue<T> = { v: value, e: now() + ttlMs }\r\n try {\r\n mem.set(key, rec)\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n window.localStorage.setItem(key, JSON.stringify(rec))\r\n }\r\n } catch {}\r\n}\r\n\r\nexport function getCache<T>(key: string): T | undefined {\r\n try {\r\n const inMem = mem.get(key)\r\n if (inMem) {\r\n if (inMem.e > now()) return inMem.v as T\r\n mem.delete(key)\r\n }\r\n\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n const raw = window.localStorage.getItem(key)\r\n if (!raw) return undefined\r\n const parsed = JSON.parse(raw) as CacheValue<T>\r\n if (parsed?.e && parsed.e > now()) {\r\n mem.set(key, parsed)\r\n return parsed.v\r\n }\r\n // expired\r\n window.localStorage.removeItem(key)\r\n }\r\n } catch {}\r\n return undefined\r\n}\r\n\r\nexport function withCache<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {\r\n const existing = getCache<T>(key)\r\n if (existing !== undefined) return Promise.resolve(existing)\r\n return fn().then((res) => {\r\n setCache(key, res, ttlMs)\r\n return res\r\n })\r\n}\r\n\r\nexport async function withServerCache<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {\r\n if (typeof window === 'undefined') {\r\n const ttlSeconds = Math.floor(ttlMs / 1000)\r\n try {\r\n const { getMemcache, setMemcache } = await import('../../../../../utils/memcache')\r\n \r\n const cached = await getMemcache<T>(key)\r\n if (cached !== null) {\r\n setCache(key, cached, ttlMs)\r\n return cached\r\n }\r\n \r\n const localCached = getCache<T>(key)\r\n if (localCached !== undefined) {\r\n return localCached\r\n }\r\n\r\n const result = await fn()\r\n \r\n try {\r\n await setMemcache(key, result, ttlSeconds)\r\n } catch (error) {\r\n console.warn('Memcache write failed:', error)\r\n }\r\n setCache(key, result, ttlMs)\r\n \r\n return result\r\n } catch (error) {\r\n console.warn('Memcache operations failed, falling back to local cache:', error)\r\n \r\n const localCached = getCache<T>(key)\r\n if (localCached !== undefined) {\r\n return localCached\r\n }\r\n\r\n const result = await fn()\r\n setCache(key, result, ttlMs)\r\n return result\r\n }\r\n }\r\n\r\n return withCache(key, ttlMs, fn)\r\n}\r\n\r\nexport function buildValidationKey(source: string, id: string | number | undefined, version?: string | number | null) {\r\n return makeKey(['valid', source, id ?? '', version ?? ''])\r\n}\r\n"],"mappings":"AAKA,MAAM,KAAK;AACX,MAAM,MAAM,oBAAI,IAA6B;AAE7C,SAAS,MAAM;AACb,SAAO,KAAK,IAAI;AAClB;AAEO,SAAS,QAAQ,OAAkD;AACxE,SAAO,KAAK,MAAM,IAAI,CAAC,MAAM,OAAO,gBAAK,EAAE,CAAC,EAAE,KAAK,GAAG;AACxD;AAEO,SAAS,SAAY,KAAa,OAAU,OAAe;AAChE,QAAM,MAAqB,EAAE,GAAG,OAAO,GAAG,IAAI,IAAI,MAAM;AACxD,MAAI;AACF,QAAI,IAAI,KAAK,GAAG;AAChB,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACxD,aAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACtD;AAAA,EACF,SAAQ;AAAA,EAAC;AACX;AAEO,SAAS,SAAY,KAA4B;AACtD,MAAI;AACF,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,QAAI,OAAO;AACT,UAAI,MAAM,IAAI,IAAI,EAAG,QAAO,MAAM;AAClC,UAAI,OAAO,GAAG;AAAA,IAChB;AAEA,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACxD,YAAM,MAAM,OAAO,aAAa,QAAQ,GAAG;AAC3C,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAI,iCAAQ,MAAK,OAAO,IAAI,IAAI,GAAG;AACjC,YAAI,IAAI,KAAK,MAAM;AACnB,eAAO,OAAO;AAAA,MAChB;AAEA,aAAO,aAAa,WAAW,GAAG;AAAA,IACpC;AAAA,EACF,SAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEO,SAAS,UAAa,KAAa,OAAe,IAAkC;AACzF,QAAM,WAAW,SAAY,GAAG;AAChC,MAAI,aAAa,OAAW,QAAO,QAAQ,QAAQ,QAAQ;AAC3D,SAAO,GAAG,EAAE,KAAK,CAAC,QAAQ;AACxB,aAAS,KAAK,KAAK,KAAK;AACxB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,gBAAmB,KAAa,OAAe,IAAkC;AACrG,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,aAAa,KAAK,MAAM,QAAQ,GAAI;AAC1C,QAAI;AACF,YAAM,EAAE,aAAa,YAAY,IAAI,MAAM,OAAO,+BAA+B;AAEjF,YAAM,SAAS,MAAM,YAAe,GAAG;AACvC,UAAI,WAAW,MAAM;AACnB,iBAAS,KAAK,QAAQ,KAAK;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,SAAY,GAAG;AACnC,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,GAAG;AAExB,UAAI;AACF,cAAM,YAAY,KAAK,QAAQ,UAAU;AAAA,MAC3C,SAAS,OAAO;AACd,gBAAQ,KAAK,0BAA0B,KAAK;AAAA,MAC9C;AACA,eAAS,KAAK,QAAQ,KAAK;AAE3B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,4DAA4D,KAAK;AAE9E,YAAM,cAAc,SAAY,GAAG;AACnC,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,GAAG;AACxB,eAAS,KAAK,QAAQ,KAAK;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,OAAO,EAAE;AACjC;AAEO,SAAS,mBAAmB,QAAgB,IAAiC,SAAkC;AACpH,SAAO,QAAQ,CAAC,SAAS,QAAQ,kBAAM,IAAI,4BAAW,EAAE,CAAC;AAC3D;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/cache.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\ntype CacheValue<T> = {\r\n v: T\r\n e: number\r\n}\r\n\r\nconst NS = 'datasetCache:'\r\nconst mem = new Map<string, CacheValue<any>>()\r\n\r\nfunction now() {\r\n return Date.now()\r\n}\r\n\r\nexport function makeKey(parts: Array<string | number | null | undefined>) {\r\n return NS + parts.map((p) => String(p ?? '')).join('|')\r\n}\r\n\r\nexport function setCache<T>(key: string, value: T, ttlMs: number) {\r\n const rec: CacheValue<T> = { v: value, e: now() + ttlMs }\r\n try {\r\n mem.set(key, rec)\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n window.localStorage.setItem(key, JSON.stringify(rec))\r\n }\r\n } catch {}\r\n}\r\n\r\nexport function getCache<T>(key: string): T | undefined {\r\n try {\r\n const inMem = mem.get(key)\r\n if (inMem) {\r\n if (inMem.e > now()) return inMem.v as T\r\n mem.delete(key)\r\n }\r\n\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n const raw = window.localStorage.getItem(key)\r\n if (!raw) return undefined\r\n const parsed = JSON.parse(raw) as CacheValue<T>\r\n if (parsed?.e && parsed.e > now()) {\r\n mem.set(key, parsed)\r\n return parsed.v\r\n }\r\n // expired\r\n window.localStorage.removeItem(key)\r\n }\r\n } catch {}\r\n return undefined\r\n}\r\n\r\nexport function withCache<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {\r\n const existing = getCache<T>(key)\r\n if (existing !== undefined) return Promise.resolve(existing)\r\n return fn().then((res) => {\r\n setCache(key, res, ttlMs)\r\n return res\r\n })\r\n}\r\n\r\nexport async function withServerCache<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> {\r\n if (typeof window === 'undefined') {\r\n const ttlSeconds = Math.floor(ttlMs / 1000)\r\n try {\r\n const { getMemcache, setMemcache } = await import('../../../../../utils/memcache')\r\n \r\n const cached = await getMemcache<T>(key)\r\n if (cached !== null) {\r\n setCache(key, cached, ttlMs)\r\n return cached\r\n }\r\n \r\n const localCached = getCache<T>(key)\r\n if (localCached !== undefined) {\r\n return localCached\r\n }\r\n\r\n const result = await fn()\r\n \r\n try {\r\n await setMemcache(key, result, ttlSeconds)\r\n } catch (error) {\r\n console.warn('Memcache write failed:', error)\r\n }\r\n setCache(key, result, ttlMs)\r\n \r\n return result\r\n } catch (error) {\r\n console.warn('Memcache operations failed, falling back to local cache:', error)\r\n \r\n const localCached = getCache<T>(key)\r\n if (localCached !== undefined) {\r\n return localCached\r\n }\r\n\r\n const result = await fn()\r\n setCache(key, result, ttlMs)\r\n return result\r\n }\r\n }\r\n\r\n return withCache(key, ttlMs, fn)\r\n}\r\n\r\nexport function buildValidationKey(source: string, id: string | number | undefined, version?: string | number | null) {\r\n return makeKey(['valid', source, id ?? '', version ?? ''])\r\n}\r\n"],"mappings":"AAQA,MAAM,KAAK;AACX,MAAM,MAAM,oBAAI,IAA6B;AAE7C,SAAS,MAAM;AACb,SAAO,KAAK,IAAI;AAClB;AAEO,SAAS,QAAQ,OAAkD;AACxE,SAAO,KAAK,MAAM,IAAI,CAAC,MAAM,OAAO,gBAAK,EAAE,CAAC,EAAE,KAAK,GAAG;AACxD;AAEO,SAAS,SAAY,KAAa,OAAU,OAAe;AAChE,QAAM,MAAqB,EAAE,GAAG,OAAO,GAAG,IAAI,IAAI,MAAM;AACxD,MAAI;AACF,QAAI,IAAI,KAAK,GAAG;AAChB,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACxD,aAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACtD;AAAA,EACF,SAAQ;AAAA,EAAC;AACX;AAEO,SAAS,SAAY,KAA4B;AACtD,MAAI;AACF,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,QAAI,OAAO;AACT,UAAI,MAAM,IAAI,IAAI,EAAG,QAAO,MAAM;AAClC,UAAI,OAAO,GAAG;AAAA,IAChB;AAEA,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACxD,YAAM,MAAM,OAAO,aAAa,QAAQ,GAAG;AAC3C,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAI,iCAAQ,MAAK,OAAO,IAAI,IAAI,GAAG;AACjC,YAAI,IAAI,KAAK,MAAM;AACnB,eAAO,OAAO;AAAA,MAChB;AAEA,aAAO,aAAa,WAAW,GAAG;AAAA,IACpC;AAAA,EACF,SAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEO,SAAS,UAAa,KAAa,OAAe,IAAkC;AACzF,QAAM,WAAW,SAAY,GAAG;AAChC,MAAI,aAAa,OAAW,QAAO,QAAQ,QAAQ,QAAQ;AAC3D,SAAO,GAAG,EAAE,KAAK,CAAC,QAAQ;AACxB,aAAS,KAAK,KAAK,KAAK;AACxB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,gBAAmB,KAAa,OAAe,IAAkC;AACrG,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,aAAa,KAAK,MAAM,QAAQ,GAAI;AAC1C,QAAI;AACF,YAAM,EAAE,aAAa,YAAY,IAAI,MAAM,OAAO,+BAA+B;AAEjF,YAAM,SAAS,MAAM,YAAe,GAAG;AACvC,UAAI,WAAW,MAAM;AACnB,iBAAS,KAAK,QAAQ,KAAK;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,SAAY,GAAG;AACnC,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,GAAG;AAExB,UAAI;AACF,cAAM,YAAY,KAAK,QAAQ,UAAU;AAAA,MAC3C,SAAS,OAAO;AACd,gBAAQ,KAAK,0BAA0B,KAAK;AAAA,MAC9C;AACA,eAAS,KAAK,QAAQ,KAAK;AAE3B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,4DAA4D,KAAK;AAE9E,YAAM,cAAc,SAAY,GAAG;AACnC,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,GAAG;AACxB,eAAS,KAAK,QAAQ,KAAK;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,OAAO,EAAE;AACjC;AAEO,SAAS,mBAAmB,QAAgB,IAAiC,SAAkC;AACpH,SAAO,QAAQ,CAAC,SAAS,QAAQ,kBAAM,IAAI,4BAAW,EAAE,CAAC;AAC3D;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ckanDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/ckanDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CA8QpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CACxD"}
1
+ {"version":3,"file":"ckanDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/ckanDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CA8QpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CACxD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/ckanDatasets.ts"],"sourcesContent":["import type { Dataset, FieldType } from '../../../../../types/datasetTypes'\r\nimport { formatName, stripHtml } from '../utils'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { buildValidationKey, getCache, setCache, withCache } from './cache'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport { OpenDataPortal } from '../../../../../types/dbTypes'\r\n\r\n// Fetch CKAN GeoJSON datasets and transform to Dataset array\r\nexport async function fetchCkanDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n const isServer = typeof window === 'undefined'\r\n\r\n const buildUrl = (target: string) => {\r\n if (isServer) {\r\n return target\r\n }\r\n\r\n const proxied = `/api/ckanProxy?url=${encodeURIComponent(target)}`\r\n return proxied\r\n }\r\n\r\n // https://www.donneesquebec.ca/recherche/dataset/?sort=metadata_created+desc&_organization_limit=0&res_format=GeoJSON\r\n\r\n try {\r\n // Use your local API route to proxy the CKAN request when on the client\r\n const geoJsonListTarget = `${apiUrl}/api/3/action/package_search?fq=res_format:(geojson OR GeoJSON)&rows=100000`\r\n const response = await fetch(buildUrl(geoJsonListTarget))\r\n\r\n if (!response.ok) {\r\n return []\r\n }\r\n\r\n const data = await response.json()\r\n\r\n if (!data.success || !data.result || !Array.isArray(data.result.results)) {\r\n throw new Error('Invalid CKAN response structure')\r\n }\r\n\r\n const transformedDatasets: Dataset[] = (\r\n await Promise.all(\r\n data.result.results.map(async (pkg: any) => {\r\n // Find first GeoJSON resource\r\n const geoJsonResource = pkg.resources?.find(\r\n (resource: any) => resource.format?.toLowerCase() === 'geojson',\r\n )\r\n\r\n // Exclude if no GeoJSON resource\r\n if (!geoJsonResource) return\r\n\r\n // Exclude if not active\r\n const datastore = geoJsonResource.datastore_active?.toString().toLowerCase() === 'true'\r\n const isActive = datastore || geoJsonResource.state === 'active'\r\n if (!(datastore && geoJsonResource.url && isActive)) return\r\n\r\n // Determine the correct URL based on your working method\r\n let resourceUrl: string | null = null\r\n let resourceTarget: string | null = null\r\n let fieldsUrl: string | null = null\r\n\r\n if (datastore) {\r\n resourceTarget = `${apiUrl}/api/3/action/datastore_search?resource_id=${geoJsonResource.id}&limit=1000000`\r\n resourceUrl = buildUrl(resourceTarget)\r\n fieldsUrl = buildUrl(`${apiUrl}/api/3/action/datastore_search?resource_id=${geoJsonResource.id}&limit=0`)\r\n }\r\n else {\r\n resourceTarget = geoJsonResource.url\r\n resourceUrl = resourceTarget ? buildUrl(resourceTarget) : null\r\n }\r\n\r\n try {\r\n const sampleTarget = resourceTarget?.includes('datastore_search')\r\n ? resourceTarget.replace('limit=1000000', 'limit=1')\r\n : resourceTarget\r\n const sampleUrl = sampleTarget\r\n ? (sampleTarget.includes('limit=') ? buildUrl(sampleTarget) : buildUrl(`${sampleTarget}?limit=1`))\r\n : null\r\n\r\n if (sampleUrl) {\r\n const validKey = buildValidationKey('ckan', pkg.id, pkg.metadata_modified || pkg.metadata_created || undefined)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n const sampleRes = await fetch(sampleUrl)\r\n if (sampleRes.ok) {\r\n const sample = await sampleRes.json()\r\n if (sample?.error) {\r\n const code = sample.error.code\r\n const msg = `${sample.error.message || ''} ${sample.error.messageCode || ''}`\r\n if (code === 499 || code === 504 || /token required|unauthorized|forbidden|timed out/i.test(msg)) return false\r\n }\r\n let hasGeom = true\r\n if (sample?.result?.records) {\r\n const rec = sample.result.records[0]\r\n const geom = rec?.geometry || (typeof rec?.geometry === 'string' ? JSON.parse(rec.geometry) : undefined)\r\n hasGeom = !!geom\r\n }\r\n else if (Array.isArray(sample?.features)) {\r\n hasGeom = sample.features.some((f: any) => f && f.geometry)\r\n }\r\n return !!hasGeom\r\n } else if ([401, 403, 504].includes(sampleRes.status)) {\r\n return false\r\n }\r\n return false\r\n })\r\n if (!isValid) return\r\n }\r\n }\r\n catch {\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n if (resourceUrl) {\r\n try {\r\n const response = await fetch(fieldsUrl ?? resourceUrl)\r\n if (!response.ok) {\r\n console.error('Network response was not ok:', response.status)\r\n return\r\n }\r\n return await response.json()\r\n }\r\n catch (error) {\r\n console.error('Error fetching features data:', error)\r\n return\r\n }\r\n }\r\n }\r\n\r\n const getFields = async () => {\r\n if (fieldsUrl) {\r\n try {\r\n const fieldsKey = `fields:ckan:${geoJsonResource.id}:${pkg.metadata_modified || pkg.metadata_created || ''}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n const dsRes = await fetch(fieldsUrl)\r\n if (dsRes.ok) {\r\n const dsData = await dsRes.json()\r\n const fields = (\r\n dsData.result.fields?.map((field: any) => ({\r\n name: field.id,\r\n type: ckanFieldTypes[field.type]?.type || field.type,\r\n ckanType: field.type,\r\n description: field.info || '',\r\n })) || []\r\n )\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n }\r\n catch {\r\n return []\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const getFeatures: () => Promise<AllGeoJSON> = async () => {\r\n // Check cache first\r\n const featuresKey = `features:ckan:${geoJsonResource.id}:${pkg.metadata_modified || pkg.metadata_created || ''}`\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) {\r\n const cachedCount = 'features' in cached ? cached.features?.length ?? 0 : 0\r\n console.log(`✅ CKAN getFeatures: Returning ${cachedCount} cached features for \"${pkg.name}\"`)\r\n return cached\r\n }\r\n\r\n const limit = 5_000\r\n const url2 = resourceUrl?.includes('datastore_search')\r\n ? `${resourceUrl}&limit=${limit}`\r\n : resourceUrl\r\n\r\n try {\r\n const response = await fetch(url2)\r\n if (!response.ok) {\r\n console.error('CKAN: Network response was not ok:', response.status)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n const data = await response.json()\r\n let featuresCollection: AllGeoJSON | undefined\r\n\r\n if (data.result && Array.isArray(data.result.records)) {\r\n // CKAN Datastore: build FeatureCollection from records\r\n const features = data.result.records\r\n .map((properties: any) => {\r\n try {\r\n let geometry\r\n geometry = properties.geometry?.type ? properties.geometry : JSON.parse(properties.geometry)\r\n\r\n return {\r\n type: 'Feature',\r\n geometry,\r\n properties,\r\n }\r\n }\r\n catch {\r\n return null\r\n }\r\n })\r\n .filter((f: any) => f !== null)\r\n\r\n featuresCollection = {\r\n type: 'FeatureCollection',\r\n features,\r\n }\r\n }\r\n else if (\r\n data.type === 'FeatureCollection'\r\n && Array.isArray(data.features)\r\n ) {\r\n // Already a FeatureCollection\r\n featuresCollection = data\r\n }\r\n else {\r\n console.error(\r\n 'CKAN: No features available or unexpected response:',\r\n data,\r\n )\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n\r\n // Cache the result for 1 hour\r\n if (featuresCollection) {\r\n setCache(featuresKey, featuresCollection, 60 * 60 * 1000)\r\n }\r\n\r\n return featuresCollection\r\n }\r\n catch (error) {\r\n console.error('CKAN: Error processing dataset:', error)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n }\r\n\r\n const name = formatName(pkg.title || pkg.name)\r\n\r\n return {\r\n id: pkg.id,\r\n name,\r\n url: fieldsUrl,\r\n publisher:\r\n pkg.organization?.title || pkg.organization?.name || 'Unknown',\r\n dataManagementSystem: 'ckan',\r\n license: pkg.license_title || pkg.license_id || 'Unknown',\r\n contact: pkg.author || pkg.maintainer || 'Unknown',\r\n keywords: pkg.tags?.map((tag: any) => tag.name) || [],\r\n description: pkg.notes\r\n ? stripHtml(pkg.notes)\r\n : 'No description available',\r\n dateReleased: pkg.metadata_created || '',\r\n dateUpdated: pkg.metadata_modified || '',\r\n information: pkg.information_url || '',\r\n countrySubdivision,\r\n municipality,\r\n type: pkg.type || 'GeoJSON',\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group,\r\n layerColor: layerColorByName(name),\r\n }\r\n }),\r\n )\r\n ).filter(Boolean) // Remove nulls (excluded datasets)\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error('Error fetching CKAN GeoJSON datasets:', error)\r\n return []\r\n }\r\n}\r\n\r\nexport interface CkanFieldTypes {\r\n [key: string]: { description: string, type: FieldType }\r\n}\r\n\r\nfunction ckanFieldTypes(): CkanFieldTypes {\r\n return {\r\n text: { description: 'Text', type: 'string' },\r\n int: { description: 'Integer', type: 'number' },\r\n float: { description: 'Float', type: 'number' },\r\n bool: { description: 'Boolean', type: 'boolean' },\r\n date: { description: 'Date', type: 'datetime' },\r\n timestamp: { description: 'Timestamp', type: 'datetime' },\r\n json: { description: 'JSON', type: 'object' },\r\n // Add more CKAN field types as needed\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","response","_b","data"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/ckanDatasets.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset, FieldType } from '../../../../../types/datasetTypes'\r\nimport { formatName, stripHtml } from '../utils'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { buildValidationKey, getCache, setCache, withCache } from './cache'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport { OpenDataPortal } from '../../../../../types/dbTypes'\r\n\r\n// Fetch CKAN GeoJSON datasets and transform to Dataset array\r\nexport async function fetchCkanDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n const isServer = typeof window === 'undefined'\r\n\r\n const buildUrl = (target: string) => {\r\n if (isServer) {\r\n return target\r\n }\r\n\r\n const proxied = `/api/ckanProxy?url=${encodeURIComponent(target)}`\r\n return proxied\r\n }\r\n\r\n // https://www.donneesquebec.ca/recherche/dataset/?sort=metadata_created+desc&_organization_limit=0&res_format=GeoJSON\r\n\r\n try {\r\n // Use your local API route to proxy the CKAN request when on the client\r\n const geoJsonListTarget = `${apiUrl}/api/3/action/package_search?fq=res_format:(geojson OR GeoJSON)&rows=100000`\r\n const response = await fetch(buildUrl(geoJsonListTarget))\r\n\r\n if (!response.ok) {\r\n return []\r\n }\r\n\r\n const data = await response.json()\r\n\r\n if (!data.success || !data.result || !Array.isArray(data.result.results)) {\r\n throw new Error('Invalid CKAN response structure')\r\n }\r\n\r\n const transformedDatasets: Dataset[] = (\r\n await Promise.all(\r\n data.result.results.map(async (pkg: any) => {\r\n // Find first GeoJSON resource\r\n const geoJsonResource = pkg.resources?.find(\r\n (resource: any) => resource.format?.toLowerCase() === 'geojson',\r\n )\r\n\r\n // Exclude if no GeoJSON resource\r\n if (!geoJsonResource) return\r\n\r\n // Exclude if not active\r\n const datastore = geoJsonResource.datastore_active?.toString().toLowerCase() === 'true'\r\n const isActive = datastore || geoJsonResource.state === 'active'\r\n if (!(datastore && geoJsonResource.url && isActive)) return\r\n\r\n // Determine the correct URL based on your working method\r\n let resourceUrl: string | null = null\r\n let resourceTarget: string | null = null\r\n let fieldsUrl: string | null = null\r\n\r\n if (datastore) {\r\n resourceTarget = `${apiUrl}/api/3/action/datastore_search?resource_id=${geoJsonResource.id}&limit=1000000`\r\n resourceUrl = buildUrl(resourceTarget)\r\n fieldsUrl = buildUrl(`${apiUrl}/api/3/action/datastore_search?resource_id=${geoJsonResource.id}&limit=0`)\r\n }\r\n else {\r\n resourceTarget = geoJsonResource.url\r\n resourceUrl = resourceTarget ? buildUrl(resourceTarget) : null\r\n }\r\n\r\n try {\r\n const sampleTarget = resourceTarget?.includes('datastore_search')\r\n ? resourceTarget.replace('limit=1000000', 'limit=1')\r\n : resourceTarget\r\n const sampleUrl = sampleTarget\r\n ? (sampleTarget.includes('limit=') ? buildUrl(sampleTarget) : buildUrl(`${sampleTarget}?limit=1`))\r\n : null\r\n\r\n if (sampleUrl) {\r\n const validKey = buildValidationKey('ckan', pkg.id, pkg.metadata_modified || pkg.metadata_created || undefined)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n const sampleRes = await fetch(sampleUrl)\r\n if (sampleRes.ok) {\r\n const sample = await sampleRes.json()\r\n if (sample?.error) {\r\n const code = sample.error.code\r\n const msg = `${sample.error.message || ''} ${sample.error.messageCode || ''}`\r\n if (code === 499 || code === 504 || /token required|unauthorized|forbidden|timed out/i.test(msg)) return false\r\n }\r\n let hasGeom = true\r\n if (sample?.result?.records) {\r\n const rec = sample.result.records[0]\r\n const geom = rec?.geometry || (typeof rec?.geometry === 'string' ? JSON.parse(rec.geometry) : undefined)\r\n hasGeom = !!geom\r\n }\r\n else if (Array.isArray(sample?.features)) {\r\n hasGeom = sample.features.some((f: any) => f && f.geometry)\r\n }\r\n return !!hasGeom\r\n } else if ([401, 403, 504].includes(sampleRes.status)) {\r\n return false\r\n }\r\n return false\r\n })\r\n if (!isValid) return\r\n }\r\n }\r\n catch {\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n if (resourceUrl) {\r\n try {\r\n const response = await fetch(fieldsUrl ?? resourceUrl)\r\n if (!response.ok) {\r\n console.error('Network response was not ok:', response.status)\r\n return\r\n }\r\n return await response.json()\r\n }\r\n catch (error) {\r\n console.error('Error fetching features data:', error)\r\n return\r\n }\r\n }\r\n }\r\n\r\n const getFields = async () => {\r\n if (fieldsUrl) {\r\n try {\r\n const fieldsKey = `fields:ckan:${geoJsonResource.id}:${pkg.metadata_modified || pkg.metadata_created || ''}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n const dsRes = await fetch(fieldsUrl)\r\n if (dsRes.ok) {\r\n const dsData = await dsRes.json()\r\n const fields = (\r\n dsData.result.fields?.map((field: any) => ({\r\n name: field.id,\r\n type: ckanFieldTypes[field.type]?.type || field.type,\r\n ckanType: field.type,\r\n description: field.info || '',\r\n })) || []\r\n )\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n }\r\n catch {\r\n return []\r\n }\r\n }\r\n return []\r\n }\r\n\r\n const getFeatures: () => Promise<AllGeoJSON> = async () => {\r\n // Check cache first\r\n const featuresKey = `features:ckan:${geoJsonResource.id}:${pkg.metadata_modified || pkg.metadata_created || ''}`\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) {\r\n const cachedCount = 'features' in cached ? cached.features?.length ?? 0 : 0\r\n console.log(`✅ CKAN getFeatures: Returning ${cachedCount} cached features for \"${pkg.name}\"`)\r\n return cached\r\n }\r\n\r\n const limit = 5_000\r\n const url2 = resourceUrl?.includes('datastore_search')\r\n ? `${resourceUrl}&limit=${limit}`\r\n : resourceUrl\r\n\r\n try {\r\n const response = await fetch(url2)\r\n if (!response.ok) {\r\n console.error('CKAN: Network response was not ok:', response.status)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n const data = await response.json()\r\n let featuresCollection: AllGeoJSON | undefined\r\n\r\n if (data.result && Array.isArray(data.result.records)) {\r\n // CKAN Datastore: build FeatureCollection from records\r\n const features = data.result.records\r\n .map((properties: any) => {\r\n try {\r\n let geometry\r\n geometry = properties.geometry?.type ? properties.geometry : JSON.parse(properties.geometry)\r\n\r\n return {\r\n type: 'Feature',\r\n geometry,\r\n properties,\r\n }\r\n }\r\n catch {\r\n return null\r\n }\r\n })\r\n .filter((f: any) => f !== null)\r\n\r\n featuresCollection = {\r\n type: 'FeatureCollection',\r\n features,\r\n }\r\n }\r\n else if (\r\n data.type === 'FeatureCollection'\r\n && Array.isArray(data.features)\r\n ) {\r\n // Already a FeatureCollection\r\n featuresCollection = data\r\n }\r\n else {\r\n console.error(\r\n 'CKAN: No features available or unexpected response:',\r\n data,\r\n )\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n\r\n // Cache the result for 1 hour\r\n if (featuresCollection) {\r\n setCache(featuresKey, featuresCollection, 60 * 60 * 1000)\r\n }\r\n\r\n return featuresCollection\r\n }\r\n catch (error) {\r\n console.error('CKAN: Error processing dataset:', error)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n }\r\n\r\n const name = formatName(pkg.title || pkg.name)\r\n\r\n return {\r\n id: pkg.id,\r\n name,\r\n url: fieldsUrl,\r\n publisher:\r\n pkg.organization?.title || pkg.organization?.name || 'Unknown',\r\n dataManagementSystem: 'ckan',\r\n license: pkg.license_title || pkg.license_id || 'Unknown',\r\n contact: pkg.author || pkg.maintainer || 'Unknown',\r\n keywords: pkg.tags?.map((tag: any) => tag.name) || [],\r\n description: pkg.notes\r\n ? stripHtml(pkg.notes)\r\n : 'No description available',\r\n dateReleased: pkg.metadata_created || '',\r\n dateUpdated: pkg.metadata_modified || '',\r\n information: pkg.information_url || '',\r\n countrySubdivision,\r\n municipality,\r\n type: pkg.type || 'GeoJSON',\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group,\r\n layerColor: layerColorByName(name),\r\n }\r\n }),\r\n )\r\n ).filter(Boolean) // Remove nulls (excluded datasets)\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error('Error fetching CKAN GeoJSON datasets:', error)\r\n return []\r\n }\r\n}\r\n\r\nexport interface CkanFieldTypes {\r\n [key: string]: { description: string, type: FieldType }\r\n}\r\n\r\nfunction ckanFieldTypes(): CkanFieldTypes {\r\n return {\r\n text: { description: 'Text', type: 'string' },\r\n int: { description: 'Integer', type: 'number' },\r\n float: { description: 'Float', type: 'number' },\r\n bool: { description: 'Boolean', type: 'boolean' },\r\n date: { description: 'Date', type: 'datetime' },\r\n timestamp: { description: 'Timestamp', type: 'datetime' },\r\n json: { description: 'JSON', type: 'object' },\r\n // Add more CKAN field types as needed\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","response","_b","data"]}
@@ -1 +1 @@
1
- {"version":3,"file":"geojsonFile.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/geojsonFile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,iDAAiD;IACjD,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,mFAAmF;IACnF,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAC7C,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;CACxB;AAwCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,cAAc,CAuB7E;AAED,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAMxD"}
1
+ {"version":3,"file":"geojsonFile.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/geojsonFile.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,iDAAiD;IACjD,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,mFAAmF;IACnF,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAC7C,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;CACxB;AAwCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,cAAc,CAuB7E;AAED,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAMxD"}