@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/src/geojsonFile.ts"],"sourcesContent":["/**\r\n * Pure GeoJSON file parsing + summarising.\r\n *\r\n * Used by the \"Add dataset\" tool to turn a dropped/picked .geojson file into a\r\n * normalised FeatureCollection plus a quick summary. No IO, no dependencies —\r\n * safe to unit-test directly.\r\n */\r\n\r\nexport interface GeoJSONSummary {\r\n featureCount: number\r\n /** Geometry type → count, e.g. { Point: 12, Polygon: 3 }. */\r\n geometryTypes: Record<string, number>\r\n /** Sorted union of all feature property keys. */\r\n propertyKeys: string[]\r\n /** [west, south, east, north], or null if no positional coordinates were found. */\r\n bbox: [number, number, number, number] | null\r\n /** The first feature, for a raw peek. */\r\n sample: unknown\r\n}\r\n\r\nexport interface ParsedGeoJSON {\r\n /** Normalised — any valid GeoJSON input becomes a FeatureCollection. */\r\n featureCollection: GeoJSON.FeatureCollection\r\n summary: GeoJSONSummary\r\n}\r\n\r\nconst GEOMETRY_TYPES = [\r\n 'Point', 'MultiPoint', 'LineString', 'MultiLineString',\r\n 'Polygon', 'MultiPolygon', 'GeometryCollection',\r\n]\r\n\r\n/** Normalise any GeoJSON object to a flat list of Features. */\r\nfunction extractFeatures(parsed: unknown): GeoJSON.Feature[] {\r\n if (!parsed || typeof parsed !== 'object') throw new Error('File is not a JSON object')\r\n const obj = parsed as GeoJSON.GeoJSON\r\n\r\n if (obj.type === 'FeatureCollection') {\r\n return Array.isArray(obj.features) ? obj.features : []\r\n }\r\n if (obj.type === 'Feature') return [obj]\r\n if (GEOMETRY_TYPES.includes(obj.type)) {\r\n return [{ type: 'Feature', geometry: obj as GeoJSON.Geometry, properties: {} }]\r\n }\r\n throw new Error(`Unrecognised GeoJSON type: \"${(obj as { type?: string }).type ?? 'none'}\"`)\r\n}\r\n\r\n/** Recursively widen `bbox` to include every [x, y] position inside `coords`. */\r\nfunction extendBbox(bbox: [number, number, number, number], coords: unknown): void {\r\n if (!Array.isArray(coords)) return\r\n if (\r\n coords.length >= 2\r\n && typeof coords[0] === 'number'\r\n && typeof coords[1] === 'number'\r\n ) {\r\n const [x, y] = coords as [number, number]\r\n bbox[0] = Math.min(bbox[0], x)\r\n bbox[1] = Math.min(bbox[1], y)\r\n bbox[2] = Math.max(bbox[2], x)\r\n bbox[3] = Math.max(bbox[3], y)\r\n return\r\n }\r\n for (const c of coords) extendBbox(bbox, c)\r\n}\r\n\r\nexport function summarizeFeatures(features: GeoJSON.Feature[]): GeoJSONSummary {\r\n const geometryTypes: Record<string, number> = {}\r\n const propertyKeys = new Set<string>()\r\n const bbox: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity]\r\n\r\n for (const feature of features) {\r\n const geometry = feature?.geometry\r\n if (geometry && typeof geometry.type === 'string') {\r\n geometryTypes[geometry.type] = (geometryTypes[geometry.type] ?? 0) + 1\r\n if ('coordinates' in geometry) extendBbox(bbox, geometry.coordinates)\r\n }\r\n if (feature?.properties && typeof feature.properties === 'object') {\r\n for (const key of Object.keys(feature.properties)) propertyKeys.add(key)\r\n }\r\n }\r\n\r\n return {\r\n featureCount: features.length,\r\n geometryTypes,\r\n propertyKeys: [...propertyKeys].sort(),\r\n bbox: bbox[0] === Infinity ? null : bbox,\r\n sample: features[0] ?? null,\r\n }\r\n}\r\n\r\n/** Parse GeoJSON text into a normalised FeatureCollection + a summary. Throws on invalid input. */\r\nexport function parseGeoJSON(text: string): ParsedGeoJSON {\r\n const features = extractFeatures(JSON.parse(text))\r\n return {\r\n featureCollection: { type: 'FeatureCollection', features },\r\n summary: summarizeFeatures(features),\r\n }\r\n}\r\n"],"mappings":"AA0BA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EAAS;AAAA,EAAc;AAAA,EAAc;AAAA,EACrC;AAAA,EAAW;AAAA,EAAgB;AAC7B;AAGA,SAAS,gBAAgB,QAAoC;AAhC7D;AAiCE,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,OAAM,IAAI,MAAM,2BAA2B;AACtF,QAAM,MAAM;AAEZ,MAAI,IAAI,SAAS,qBAAqB;AACpC,WAAO,MAAM,QAAQ,IAAI,QAAQ,IAAI,IAAI,WAAW,CAAC;AAAA,EACvD;AACA,MAAI,IAAI,SAAS,UAAW,QAAO,CAAC,GAAG;AACvC,MAAI,eAAe,SAAS,IAAI,IAAI,GAAG;AACrC,WAAO,CAAC,EAAE,MAAM,WAAW,UAAU,KAAyB,YAAY,CAAC,EAAE,CAAC;AAAA,EAChF;AACA,QAAM,IAAI,MAAM,gCAAgC,SAA0B,SAA1B,YAAkC,MAAM,GAAG;AAC7F;AAGA,SAAS,WAAW,MAAwC,QAAuB;AACjF,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG;AAC5B,MACE,OAAO,UAAU,KACd,OAAO,OAAO,CAAC,MAAM,YACrB,OAAO,OAAO,CAAC,MAAM,UACxB;AACA,UAAM,CAAC,GAAG,CAAC,IAAI;AACf,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B;AAAA,EACF;AACA,aAAW,KAAK,OAAQ,YAAW,MAAM,CAAC;AAC5C;AAEO,SAAS,kBAAkB,UAA6C;AAhE/E;AAiEE,QAAM,gBAAwC,CAAC;AAC/C,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,OAAyC,CAAC,UAAU,UAAU,WAAW,SAAS;AAExF,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,mCAAS;AAC1B,QAAI,YAAY,OAAO,SAAS,SAAS,UAAU;AACjD,oBAAc,SAAS,IAAI,MAAK,mBAAc,SAAS,IAAI,MAA3B,YAAgC,KAAK;AACrE,UAAI,iBAAiB,SAAU,YAAW,MAAM,SAAS,WAAW;AAAA,IACtE;AACA,SAAI,mCAAS,eAAc,OAAO,QAAQ,eAAe,UAAU;AACjE,iBAAW,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAG,cAAa,IAAI,GAAG;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,SAAS;AAAA,IACvB;AAAA,IACA,cAAc,CAAC,GAAG,YAAY,EAAE,KAAK;AAAA,IACrC,MAAM,KAAK,CAAC,MAAM,WAAW,OAAO;AAAA,IACpC,SAAQ,cAAS,CAAC,MAAV,YAAe;AAAA,EACzB;AACF;AAGO,SAAS,aAAa,MAA6B;AACxD,QAAM,WAAW,gBAAgB,KAAK,MAAM,IAAI,CAAC;AACjD,SAAO;AAAA,IACL,mBAAmB,EAAE,MAAM,qBAAqB,SAAS;AAAA,IACzD,SAAS,kBAAkB,QAAQ;AAAA,EACrC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/geojsonFile.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/**\r\n * Pure GeoJSON file parsing + summarising.\r\n *\r\n * Used by the \"Add dataset\" tool to turn a dropped/picked .geojson file into a\r\n * normalised FeatureCollection plus a quick summary. No IO, no dependencies —\r\n * safe to unit-test directly.\r\n */\r\n\r\nexport interface GeoJSONSummary {\r\n featureCount: number\r\n /** Geometry type → count, e.g. { Point: 12, Polygon: 3 }. */\r\n geometryTypes: Record<string, number>\r\n /** Sorted union of all feature property keys. */\r\n propertyKeys: string[]\r\n /** [west, south, east, north], or null if no positional coordinates were found. */\r\n bbox: [number, number, number, number] | null\r\n /** The first feature, for a raw peek. */\r\n sample: unknown\r\n}\r\n\r\nexport interface ParsedGeoJSON {\r\n /** Normalised — any valid GeoJSON input becomes a FeatureCollection. */\r\n featureCollection: GeoJSON.FeatureCollection\r\n summary: GeoJSONSummary\r\n}\r\n\r\nconst GEOMETRY_TYPES = [\r\n 'Point', 'MultiPoint', 'LineString', 'MultiLineString',\r\n 'Polygon', 'MultiPolygon', 'GeometryCollection',\r\n]\r\n\r\n/** Normalise any GeoJSON object to a flat list of Features. */\r\nfunction extractFeatures(parsed: unknown): GeoJSON.Feature[] {\r\n if (!parsed || typeof parsed !== 'object') throw new Error('File is not a JSON object')\r\n const obj = parsed as GeoJSON.GeoJSON\r\n\r\n if (obj.type === 'FeatureCollection') {\r\n return Array.isArray(obj.features) ? obj.features : []\r\n }\r\n if (obj.type === 'Feature') return [obj]\r\n if (GEOMETRY_TYPES.includes(obj.type)) {\r\n return [{ type: 'Feature', geometry: obj as GeoJSON.Geometry, properties: {} }]\r\n }\r\n throw new Error(`Unrecognised GeoJSON type: \"${(obj as { type?: string }).type ?? 'none'}\"`)\r\n}\r\n\r\n/** Recursively widen `bbox` to include every [x, y] position inside `coords`. */\r\nfunction extendBbox(bbox: [number, number, number, number], coords: unknown): void {\r\n if (!Array.isArray(coords)) return\r\n if (\r\n coords.length >= 2\r\n && typeof coords[0] === 'number'\r\n && typeof coords[1] === 'number'\r\n ) {\r\n const [x, y] = coords as [number, number]\r\n bbox[0] = Math.min(bbox[0], x)\r\n bbox[1] = Math.min(bbox[1], y)\r\n bbox[2] = Math.max(bbox[2], x)\r\n bbox[3] = Math.max(bbox[3], y)\r\n return\r\n }\r\n for (const c of coords) extendBbox(bbox, c)\r\n}\r\n\r\nexport function summarizeFeatures(features: GeoJSON.Feature[]): GeoJSONSummary {\r\n const geometryTypes: Record<string, number> = {}\r\n const propertyKeys = new Set<string>()\r\n const bbox: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity]\r\n\r\n for (const feature of features) {\r\n const geometry = feature?.geometry\r\n if (geometry && typeof geometry.type === 'string') {\r\n geometryTypes[geometry.type] = (geometryTypes[geometry.type] ?? 0) + 1\r\n if ('coordinates' in geometry) extendBbox(bbox, geometry.coordinates)\r\n }\r\n if (feature?.properties && typeof feature.properties === 'object') {\r\n for (const key of Object.keys(feature.properties)) propertyKeys.add(key)\r\n }\r\n }\r\n\r\n return {\r\n featureCount: features.length,\r\n geometryTypes,\r\n propertyKeys: [...propertyKeys].sort(),\r\n bbox: bbox[0] === Infinity ? null : bbox,\r\n sample: features[0] ?? null,\r\n }\r\n}\r\n\r\n/** Parse GeoJSON text into a normalised FeatureCollection + a summary. Throws on invalid input. */\r\nexport function parseGeoJSON(text: string): ParsedGeoJSON {\r\n const features = extractFeatures(JSON.parse(text))\r\n return {\r\n featureCollection: { type: 'FeatureCollection', features },\r\n summary: summarizeFeatures(features),\r\n }\r\n}\r\n"],"mappings":"AA6BA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EAAS;AAAA,EAAc;AAAA,EAAc;AAAA,EACrC;AAAA,EAAW;AAAA,EAAgB;AAC7B;AAGA,SAAS,gBAAgB,QAAoC;AAnC7D;AAoCE,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,OAAM,IAAI,MAAM,2BAA2B;AACtF,QAAM,MAAM;AAEZ,MAAI,IAAI,SAAS,qBAAqB;AACpC,WAAO,MAAM,QAAQ,IAAI,QAAQ,IAAI,IAAI,WAAW,CAAC;AAAA,EACvD;AACA,MAAI,IAAI,SAAS,UAAW,QAAO,CAAC,GAAG;AACvC,MAAI,eAAe,SAAS,IAAI,IAAI,GAAG;AACrC,WAAO,CAAC,EAAE,MAAM,WAAW,UAAU,KAAyB,YAAY,CAAC,EAAE,CAAC;AAAA,EAChF;AACA,QAAM,IAAI,MAAM,gCAAgC,SAA0B,SAA1B,YAAkC,MAAM,GAAG;AAC7F;AAGA,SAAS,WAAW,MAAwC,QAAuB;AACjF,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG;AAC5B,MACE,OAAO,UAAU,KACd,OAAO,OAAO,CAAC,MAAM,YACrB,OAAO,OAAO,CAAC,MAAM,UACxB;AACA,UAAM,CAAC,GAAG,CAAC,IAAI;AACf,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;AAC7B;AAAA,EACF;AACA,aAAW,KAAK,OAAQ,YAAW,MAAM,CAAC;AAC5C;AAEO,SAAS,kBAAkB,UAA6C;AAnE/E;AAoEE,QAAM,gBAAwC,CAAC;AAC/C,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,OAAyC,CAAC,UAAU,UAAU,WAAW,SAAS;AAExF,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,mCAAS;AAC1B,QAAI,YAAY,OAAO,SAAS,SAAS,UAAU;AACjD,oBAAc,SAAS,IAAI,MAAK,mBAAc,SAAS,IAAI,MAA3B,YAAgC,KAAK;AACrE,UAAI,iBAAiB,SAAU,YAAW,MAAM,SAAS,WAAW;AAAA,IACtE;AACA,SAAI,mCAAS,eAAc,OAAO,QAAQ,eAAe,UAAU;AACjE,iBAAW,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAG,cAAa,IAAI,GAAG;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,SAAS;AAAA,IACvB;AAAA,IACA,cAAc,CAAC,GAAG,YAAY,EAAE,KAAK;AAAA,IACrC,MAAM,KAAK,CAAC,MAAM,WAAW,OAAO;AAAA,IACpC,SAAQ,cAAS,CAAC,MAAV,YAAe;AAAA,EACzB;AACF;AAGO,SAAS,aAAa,MAA6B;AACxD,QAAM,WAAW,gBAAgB,KAAK,MAAM,IAAI,CAAC;AACjD,SAAO;AAAA,IACL,mBAAmB,EAAE,MAAM,qBAAqB,SAAS;AAAA,IACzD,SAAS,kBAAkB,QAAQ;AAAA,EACrC;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"localDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/localDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,mCAAmC,CAAA;AAE9F,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAkahF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CA+LpB"}
1
+ {"version":3,"file":"localDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/localDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,mCAAmC,CAAA;AAE9F,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAkahF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CA+LpB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/localDatasets.ts"],"sourcesContent":["import type { Dataset, FieldType, LayerGeometryType } from '../../../../../types/datasetTypes'\r\nimport { formatName } from '../utils'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport Pbf from 'pbf'\r\nimport { VectorTile } from '@mapbox/vector-tile'\r\nimport { getCache, setCache } from './cache'\r\nimport { isPublishedOrgTable, buildPublishedTileDatasets, type PublishedFileRow } from './publishedTiles'\r\n\r\n\r\n// Define the structure of local dataset items\r\ninterface LocalDatasetItem {\r\n name: string\r\n organization: number\r\n featuresUrl: string\r\n tileName: string\r\n sourceLayer: string\r\n layer: {\r\n type: string\r\n properties: Record<string, string>\r\n }\r\n visible: boolean\r\n clickable: boolean\r\n url: string\r\n description: string\r\n publisher: string\r\n countrySubdivision?: string\r\n municipality?: string\r\n}\r\n\r\ninterface MartinCatalogTile {\r\n content_type: string\r\n description: string\r\n}\r\n\r\ninterface MartinCatalog {\r\n tiles: Record<string, MartinCatalogTile>\r\n}\r\n\r\ninterface MartinTileStatsAttribute {\r\n attribute: string\r\n values?: Array<string | number>\r\n min?: number | string\r\n max?: number | string\r\n}\r\n\r\ninterface MartinTileStatsLayer {\r\n layer: string\r\n attributes?: MartinTileStatsAttribute[]\r\n}\r\n\r\ninterface MartinTileStats {\r\n layers?: MartinTileStatsLayer[]\r\n}\r\n\r\ninterface MartinTileJson {\r\n id?: string\r\n name?: string\r\n description?: string\r\n tiles?: string[]\r\n vector_layers?: Array<{\r\n id: string\r\n description?: string\r\n minzoom?: number\r\n maxzoom?: number\r\n fields?: Record<string, string>\r\n }>\r\n tilestats?: MartinTileStats\r\n minzoom?: number\r\n maxzoom?: number\r\n}\r\n\r\ntype MartinIndexResponse =\r\n | MartinCatalog\r\n | MartinTileJson[]\r\n | { tiles: Record<string, MartinTileJson> }\r\n | { tilesets: MartinTileJson[] }\r\n\r\ninterface NormalizedMartinTile {\r\n tileName: string\r\n tileUrl: string\r\n description?: string\r\n vectorLayerId: string\r\n tilestats?: MartinTileStats\r\n minzoom?: number\r\n}\r\n\r\nconst ORGANIZATION_FIELD = 'organization'\r\n\r\nfunction normalizeMartinBaseUrl(apiUrl: string) {\r\n return apiUrl.replace(/\\/+$/, '')\r\n}\r\n\r\nfunction resolveMartinUrls(apiUrl: string) {\r\n const trimmed = normalizeMartinBaseUrl(apiUrl)\r\n\r\n if (trimmed.endsWith('/tiles/index.json')) {\r\n const tileBaseUrl = trimmed.replace(/\\/tiles\\/index\\.json$/, '')\r\n return {\r\n indexUrl: trimmed,\r\n tileBaseUrl,\r\n fallbackCatalogUrl: `${tileBaseUrl}/catalog`,\r\n }\r\n }\r\n\r\n if (trimmed.endsWith('/catalog')) {\r\n const tileBaseUrl = trimmed.replace(/\\/catalog$/, '')\r\n return {\r\n indexUrl: `${tileBaseUrl}/tiles/index.json`,\r\n tileBaseUrl,\r\n fallbackCatalogUrl: trimmed,\r\n }\r\n }\r\n\r\n return {\r\n indexUrl: `${trimmed}/tiles/index.json`,\r\n tileBaseUrl: trimmed,\r\n fallbackCatalogUrl: `${trimmed}/catalog`,\r\n }\r\n}\r\n\r\nfunction ensureAbsoluteTileUrl(tileUrl: string, tileBaseUrl: string) {\r\n if (/^https?:\\/\\//i.test(tileUrl)) {\r\n return tileUrl\r\n }\r\n\r\n const cleanedBase = tileBaseUrl.replace(/\\/+$/, '')\r\n const cleanedPath = tileUrl.replace(/^\\/+/, '')\r\n return `${cleanedBase}/${cleanedPath}`\r\n}\r\n\r\nfunction normalizeTileInfo(tileInfo: MartinTileJson, fallbackName: string | null, tileBaseUrl: string): NormalizedMartinTile | null {\r\n const tileName = tileInfo.id || tileInfo.name || fallbackName\r\n if (!tileName) return null\r\n\r\n const vectorLayerId = tileInfo.vector_layers?.[0]?.id || tileName\r\n const tileUrlFromInfo = Array.isArray(tileInfo.tiles) && tileInfo.tiles.length > 0\r\n ? tileInfo.tiles[0]\r\n : `${tileBaseUrl}/${tileName}/{z}/{x}/{y}`\r\n\r\n return {\r\n tileName,\r\n tileUrl: ensureAbsoluteTileUrl(tileUrlFromInfo, tileBaseUrl),\r\n description: tileInfo.description || tileInfo.vector_layers?.[0]?.description,\r\n vectorLayerId,\r\n tilestats: tileInfo.tilestats,\r\n minzoom: tileInfo.minzoom || tileInfo.vector_layers?.[0]?.minzoom,\r\n }\r\n}\r\n\r\nfunction normalizeMartinCatalog(response: MartinIndexResponse, tileBaseUrl: string): NormalizedMartinTile[] {\r\n if (Array.isArray(response)) {\r\n return response\r\n .map(tile => normalizeTileInfo(tile, null, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n if ('tilesets' in response && Array.isArray(response.tilesets)) {\r\n return response.tilesets\r\n .map(tile => normalizeTileInfo(tile, null, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n if ('tiles' in response && response.tiles) {\r\n return Object.entries(response.tiles)\r\n .map(([tileName, tileInfo]) => normalizeTileInfo(tileInfo as MartinTileJson, tileName, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n return []\r\n}\r\n\r\nfunction parseOrganizationValue(value: unknown): number | undefined {\r\n if (value == null) return undefined\r\n if (typeof value === 'number' && Number.isFinite(value)) return value\r\n\r\n const parsed = Number.parseInt(String(value), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction extractOrganizationFromTilestats(tilestats?: MartinTileStats): number | undefined {\r\n if (!tilestats?.layers) return undefined\r\n\r\n for (const layer of tilestats.layers) {\r\n const orgAttribute = layer.attributes?.find(attr =>\r\n attr.attribute?.toLowerCase() === ORGANIZATION_FIELD,\r\n )\r\n\r\n if (!orgAttribute) continue\r\n\r\n if (orgAttribute.values && orgAttribute.values.length > 0) {\r\n const value = parseOrganizationValue(orgAttribute.values[0])\r\n if (value !== undefined) return value\r\n }\r\n\r\n if (orgAttribute.min !== undefined && orgAttribute.max !== undefined) {\r\n const min = parseOrganizationValue(orgAttribute.min)\r\n const max = parseOrganizationValue(orgAttribute.max)\r\n if (min !== undefined && max !== undefined && min === max) {\r\n return min\r\n }\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nasync function fetchOrganizationFromTile(tileUrlTemplate: string, vectorLayerId: string, preferredZoom?: number) {\r\n try {\r\n const z = typeof preferredZoom === 'number' ? Math.max(0, Math.round(preferredZoom)) : 0\r\n const sampleUrl = tileUrlTemplate\r\n .replace('{z}', String(z))\r\n .replace('{x}', '0')\r\n .replace('{y}', '0')\r\n .replace('{Z}', String(z))\r\n .replace('{X}', '0')\r\n .replace('{Y}', '0')\r\n\r\n const response = await fetch(sampleUrl)\r\n if (!response.ok) return undefined\r\n\r\n const buffer = await response.arrayBuffer()\r\n const vectorTile = new VectorTile(new Pbf(buffer))\r\n const layer = vectorTile.layers[vectorLayerId] || Object.values(vectorTile.layers)[0]\r\n\r\n if (!layer || layer.length === 0) return undefined\r\n\r\n const feature = layer.feature(0)\r\n const { properties } = feature.toGeoJSON(0, 0, z)\r\n \r\n // Determine geometry type\r\n let geometryType: LayerGeometryType | undefined\r\n if (feature.type === 1) { // Point\r\n geometryType = 'circle'\r\n } else if (feature.type === 2) { // LineString\r\n geometryType = 'line'\r\n } else if (feature.type === 3) { // Polygon\r\n geometryType = 'fill'\r\n }\r\n\r\n return {\r\n organization: parseOrganizationValue(properties?.[ORGANIZATION_FIELD]),\r\n geometryType\r\n }\r\n } catch (error) {\r\n console.warn('Failed to read organization from tile', error)\r\n return undefined\r\n }\r\n}\r\n\r\nasync function resolveDatasetOrganization(tile: NormalizedMartinTile) {\r\n const fromTilestats = extractOrganizationFromTilestats(tile.tilestats)\r\n \r\n // Always fetch from tile to get geometry type, even if we have organization from tilestats\r\n const fromTile = await fetchOrganizationFromTile(tile.tileUrl, tile.vectorLayerId, tile.minzoom)\r\n \r\n return {\r\n organization: fromTilestats !== undefined ? fromTilestats : fromTile?.organization,\r\n geometryType: fromTile?.geometryType\r\n }\r\n}\r\n\r\nasync function fetchPublishedTileLabels(): Promise<Map<string, string>> {\r\n try {\r\n const res = await fetch('/api/files')\r\n if (!res.ok) return new Map()\r\n const body = await res.json()\r\n const rows: Array<{ name?: string | null, description?: string | null }> =\r\n Array.isArray(body?.files) ? body.files : []\r\n const map = new Map<string, string>()\r\n for (const row of rows) {\r\n if (!row?.description || !row?.name) continue\r\n try {\r\n const desc = JSON.parse(row.description) as { tiledTable?: unknown }\r\n if (typeof desc?.tiledTable === 'string') {\r\n map.set(desc.tiledTable, row.name.replace(/\\.geojson$/i, ''))\r\n }\r\n }\r\n catch { /* skip malformed */ }\r\n }\r\n return map\r\n }\r\n catch {\r\n return new Map()\r\n }\r\n}\r\n\r\nasync function fetchMartinServerDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { countrySubdivision, municipality } = portal\r\n const martinServerUrl = portal.apiUrl\r\n\r\n if (!martinServerUrl) {\r\n console.warn('No Martin server URL configured for portal', portal.name)\r\n return []\r\n }\r\n\r\n try {\r\n console.log('Fetching Martin server catalog from:', martinServerUrl)\r\n\r\n const { indexUrl, tileBaseUrl, fallbackCatalogUrl } = resolveMartinUrls(martinServerUrl)\r\n\r\n const publishedLabels = await fetchPublishedTileLabels()\r\n\r\n let response = await fetch(indexUrl)\r\n if (!response.ok && fallbackCatalogUrl && fallbackCatalogUrl !== indexUrl) {\r\n console.warn(`Failed to fetch Martin index (${indexUrl}), falling back to catalog...`)\r\n response = await fetch(fallbackCatalogUrl)\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch Martin catalog: ${response.status}`)\r\n }\r\n\r\n const catalog: MartinIndexResponse = await response.json()\r\n const tiles = normalizeMartinCatalog(catalog, tileBaseUrl)\r\n // Drop our published org tables (served via the cdt_tiles function + discovered\r\n // from File metadata) and the cdt_tiles function source itself (no ?source= → empty).\r\n .filter(t => !isPublishedOrgTable(t.tileName) && t.tileName !== 'cdt_tiles')\r\n\r\n console.log('Martin catalog received:', tiles.length, 'tiles')\r\n\r\n const datasets: Dataset[] = await Promise.all(tiles.map(async (tileInfo) => {\r\n const publishedLabel = publishedLabels.get(tileInfo.tileName)\r\n const cleanName = publishedLabel ?? formatName(\r\n tileInfo.tileName\r\n .replace(/_\\d{8}$/, '')\r\n .replace(/__\\d+_\\d+$/, ''),\r\n )\r\n\r\n const { organization, geometryType } = await resolveDatasetOrganization(tileInfo)\r\n\r\n const getFields = async () => {\r\n return []\r\n }\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n return {\r\n id: tileInfo.tileName,\r\n name: cleanName,\r\n type: 'MVT',\r\n visible: true,\r\n clickable: true,\r\n fields: [],\r\n source: {\r\n url: tileInfo.tileUrl,\r\n description: tileInfo.description,\r\n publisher: 'Martin Server',\r\n },\r\n serviceInfo: {\r\n tileName: tileInfo.tileName,\r\n sourceLayer: tileInfo.vectorLayerId,\r\n type: 'Martin',\r\n tileUrl: tileInfo.tileUrl,\r\n },\r\n }\r\n }\r\n\r\n const dataset: Dataset = {\r\n id: tileInfo.tileName,\r\n name: cleanName,\r\n organization,\r\n publisher: 'Martin Server',\r\n dataManagementSystem: 'other',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n keywords: [],\r\n description: tileInfo.description || `Vector tile layer from Martin server: ${tileInfo.tileName}`,\r\n dateReleased: '',\r\n dateUpdated: '',\r\n information: tileInfo.tileUrl,\r\n url: tileInfo.tileUrl,\r\n countrySubdivision: countrySubdivision,\r\n municipality: municipality,\r\n type: 'MVT',\r\n datasetType: 'MVT' as any,\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(cleanName),\r\n layerType: geometryType,\r\n }\r\n\r\n return dataset\r\n }))\r\n\r\n console.log(`Transformed ${datasets.length} Martin datasets`)\r\n\r\n let publishedDatasets: Dataset[] = []\r\n try {\r\n const fileRes = await fetch('/api/files')\r\n if (fileRes.ok) {\r\n const fileBody = await fileRes.json()\r\n const fileRows: PublishedFileRow[] = Array.isArray(fileBody?.files) ? fileBody.files : []\r\n publishedDatasets = buildPublishedTileDatasets(fileRows, tileBaseUrl, portal)\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to build published-tile datasets from /api/files', err)\r\n }\r\n\r\n return [...datasets, ...publishedDatasets]\r\n } catch (error) {\r\n console.error('Error fetching Martin server datasets:', error)\r\n return []\r\n }\r\n}\r\n\r\n// Fetch Local datasets from localDatasetsJson array and transform to Dataset array\r\nexport async function fetchLocalDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { countrySubdivision, municipality } = portal\r\n const apiUrl = portal.apiUrl || ''\r\n const trimmedApiUrl = apiUrl.replace(/\\/+$/, '')\r\n\r\n if (!apiUrl) {\r\n console.warn('No apiUrl provided for portal', portal.name)\r\n return []\r\n }\r\n\r\n // Skip legacy portals with non-absolute URLs (e.g. ./localDatasets/index.json)\r\n if (!apiUrl.startsWith('http://') && !apiUrl.startsWith('https://')) {\r\n return []\r\n }\r\n\r\n if (trimmedApiUrl.includes('/catalog') || trimmedApiUrl.includes('/tiles/index')) {\r\n return fetchMartinServerDatasets(portal)\r\n }\r\n\r\n try {\r\n // Fetch the localDatasets.json file\r\n const response = await fetch(apiUrl)\r\n if (!response.ok) {\r\n const shouldTryMartinFallback =\r\n !trimmedApiUrl.endsWith('.json')\r\n && !trimmedApiUrl.includes('/catalog')\r\n && !trimmedApiUrl.includes('/tiles/index')\r\n\r\n if (response.status === 404 && shouldTryMartinFallback) {\r\n console.warn(\r\n `Local dataset URL returned 404 (${apiUrl}); retrying as a Martin server base URL`,\r\n )\r\n return fetchMartinServerDatasets({\r\n ...portal,\r\n apiUrl: trimmedApiUrl,\r\n })\r\n }\r\n\r\n throw new Error(`Failed to fetch local datasets from ${apiUrl}: ${response.status}`)\r\n }\r\n\r\n const localDatasetsJson: LocalDatasetItem[] = await response.json()\r\n\r\n const transformedDatasets: Dataset[] = localDatasetsJson.map((datasetItem: LocalDatasetItem) => {\r\n // Simple getFields function that returns fields from layer properties\r\n const getFields = async () => {\r\n if (datasetItem.layer?.properties) {\r\n return Object.entries(datasetItem.layer.properties).map(([name, type]) => ({\r\n name,\r\n label: formatName(name),\r\n type: type as string,\r\n description: `${formatName(name)} field`,\r\n }))\r\n }\r\n return []\r\n }\r\n\r\n // Fetch GeoJSON data from the featuresUrl\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n // Create a cache key based on the dataset name and features URL\r\n const featuresKey = `features:local:${datasetItem.name}:${datasetItem.featuresUrl}`\r\n \r\n // Check cache first\r\n const cachedFeatures = getCache<AllGeoJSON>(featuresKey)\r\n if (cachedFeatures) {\r\n return cachedFeatures\r\n }\r\n \r\n try {\r\n // Use the featuresUrl from the dataset item\r\n let geojsonUrl: string\r\n if (datasetItem.featuresUrl.startsWith('http://') || datasetItem.featuresUrl.startsWith('https://')) {\r\n geojsonUrl = datasetItem.featuresUrl\r\n } else {\r\n const baseUrl = apiUrl.endsWith('.json') \r\n ? apiUrl.substring(0, apiUrl.lastIndexOf('/'))\r\n : apiUrl\r\n geojsonUrl = `${baseUrl}/${datasetItem.featuresUrl}`\r\n }\r\n\r\n const response = await fetch(geojsonUrl)\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch GeoJSON: ${response.status}`)\r\n }\r\n\r\n const geojsonData = await response.json() as AllGeoJSON\r\n \r\n // Cache for 1 hour\r\n setCache(featuresKey, geojsonData, 60 * 60 * 1000)\r\n \r\n return geojsonData\r\n } catch (error) {\r\n console.error(`Error loading GeoJSON for ${datasetItem.name}:`, 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(datasetItem.name)\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n return {\r\n // Basic layer information\r\n id: datasetItem.tileName || datasetItem.name.toLowerCase().replace(/\\s+/g, '-'),\r\n name: datasetItem.name,\r\n type: datasetItem.layer?.type || 'GeoJSON',\r\n\r\n // Layer configuration\r\n visible: datasetItem.visible,\r\n clickable: datasetItem.clickable,\r\n\r\n // Field information (similar to ArcGIS fields structure)\r\n fields: datasetItem.layer?.properties\r\n ? Object.entries(datasetItem.layer.properties).map(([name, type]) => ({\r\n name,\r\n type: type as FieldType,\r\n alias: formatName(name),\r\n description: `${formatName(name)} field`,\r\n }))\r\n : [],\r\n\r\n // Source information\r\n source: {\r\n url: datasetItem.url,\r\n description: datasetItem.description,\r\n publisher: datasetItem.publisher,\r\n featuresUrl: datasetItem.featuresUrl,\r\n },\r\n\r\n // Additional metadata that DatasetDetails.tsx might use\r\n editingInfo: {\r\n lastEditDate: new Date().toISOString(), // Current date as placeholder\r\n dataLastEditDate: new Date().toISOString(),\r\n },\r\n\r\n // Layer properties summary\r\n properties: datasetItem.layer?.properties || {},\r\n fieldCount: datasetItem.layer?.properties ? Object.keys(datasetItem.layer.properties).length : 0,\r\n\r\n // Geometry information\r\n geometryType: 'Unknown', // You could infer this from the actual GeoJSON if needed\r\n\r\n // Service information (for compatibility)\r\n serviceInfo: {\r\n tileName: datasetItem.tileName,\r\n sourceLayer: datasetItem.sourceLayer,\r\n type: 'Local',\r\n },\r\n }\r\n } catch (error) {\r\n console.error('Error getting features data for dataset:', datasetItem.name, error)\r\n return null\r\n }\r\n }\r\n\r\n return {\r\n id: datasetItem.tileName || datasetItem.name.toLowerCase().replace(/\\s+/g, '-'),\r\n name,\r\n organization: datasetItem.organization || 0,\r\n publisher: datasetItem.publisher || 'Unknown',\r\n dataManagementSystem: 'other',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n keywords: [],\r\n description: datasetItem.description || 'No description available',\r\n dateReleased: '',\r\n dateUpdated: '',\r\n information: datasetItem.url || '',\r\n url: datasetItem.url || '#', // Ensure there's always a valid URL for the Link component\r\n countrySubdivision: datasetItem.countrySubdivision || countrySubdivision,\r\n municipality: datasetItem.municipality || municipality,\r\n type: datasetItem.layer?.type || 'GeoJSON',\r\n datasetType: 'GeoJSON' as const,\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group: 'Organizational',\r\n layerColor: layerColorByName(name),\r\n }\r\n })\r\n\r\n return transformedDatasets\r\n } catch (error) {\r\n console.error('Error fetching local datasets:', error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","name","response"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/localDatasets.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, LayerGeometryType } from '../../../../../types/datasetTypes'\r\nimport { formatName } from '../utils'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport Pbf from 'pbf'\r\nimport { VectorTile } from '@mapbox/vector-tile'\r\nimport { getCache, setCache } from './cache'\r\nimport { isPublishedOrgTable, buildPublishedTileDatasets, type PublishedFileRow } from './publishedTiles'\r\n\r\n\r\n// Define the structure of local dataset items\r\ninterface LocalDatasetItem {\r\n name: string\r\n organization: number\r\n featuresUrl: string\r\n tileName: string\r\n sourceLayer: string\r\n layer: {\r\n type: string\r\n properties: Record<string, string>\r\n }\r\n visible: boolean\r\n clickable: boolean\r\n url: string\r\n description: string\r\n publisher: string\r\n countrySubdivision?: string\r\n municipality?: string\r\n}\r\n\r\ninterface MartinCatalogTile {\r\n content_type: string\r\n description: string\r\n}\r\n\r\ninterface MartinCatalog {\r\n tiles: Record<string, MartinCatalogTile>\r\n}\r\n\r\ninterface MartinTileStatsAttribute {\r\n attribute: string\r\n values?: Array<string | number>\r\n min?: number | string\r\n max?: number | string\r\n}\r\n\r\ninterface MartinTileStatsLayer {\r\n layer: string\r\n attributes?: MartinTileStatsAttribute[]\r\n}\r\n\r\ninterface MartinTileStats {\r\n layers?: MartinTileStatsLayer[]\r\n}\r\n\r\ninterface MartinTileJson {\r\n id?: string\r\n name?: string\r\n description?: string\r\n tiles?: string[]\r\n vector_layers?: Array<{\r\n id: string\r\n description?: string\r\n minzoom?: number\r\n maxzoom?: number\r\n fields?: Record<string, string>\r\n }>\r\n tilestats?: MartinTileStats\r\n minzoom?: number\r\n maxzoom?: number\r\n}\r\n\r\ntype MartinIndexResponse =\r\n | MartinCatalog\r\n | MartinTileJson[]\r\n | { tiles: Record<string, MartinTileJson> }\r\n | { tilesets: MartinTileJson[] }\r\n\r\ninterface NormalizedMartinTile {\r\n tileName: string\r\n tileUrl: string\r\n description?: string\r\n vectorLayerId: string\r\n tilestats?: MartinTileStats\r\n minzoom?: number\r\n}\r\n\r\nconst ORGANIZATION_FIELD = 'organization'\r\n\r\nfunction normalizeMartinBaseUrl(apiUrl: string) {\r\n return apiUrl.replace(/\\/+$/, '')\r\n}\r\n\r\nfunction resolveMartinUrls(apiUrl: string) {\r\n const trimmed = normalizeMartinBaseUrl(apiUrl)\r\n\r\n if (trimmed.endsWith('/tiles/index.json')) {\r\n const tileBaseUrl = trimmed.replace(/\\/tiles\\/index\\.json$/, '')\r\n return {\r\n indexUrl: trimmed,\r\n tileBaseUrl,\r\n fallbackCatalogUrl: `${tileBaseUrl}/catalog`,\r\n }\r\n }\r\n\r\n if (trimmed.endsWith('/catalog')) {\r\n const tileBaseUrl = trimmed.replace(/\\/catalog$/, '')\r\n return {\r\n indexUrl: `${tileBaseUrl}/tiles/index.json`,\r\n tileBaseUrl,\r\n fallbackCatalogUrl: trimmed,\r\n }\r\n }\r\n\r\n return {\r\n indexUrl: `${trimmed}/tiles/index.json`,\r\n tileBaseUrl: trimmed,\r\n fallbackCatalogUrl: `${trimmed}/catalog`,\r\n }\r\n}\r\n\r\nfunction ensureAbsoluteTileUrl(tileUrl: string, tileBaseUrl: string) {\r\n if (/^https?:\\/\\//i.test(tileUrl)) {\r\n return tileUrl\r\n }\r\n\r\n const cleanedBase = tileBaseUrl.replace(/\\/+$/, '')\r\n const cleanedPath = tileUrl.replace(/^\\/+/, '')\r\n return `${cleanedBase}/${cleanedPath}`\r\n}\r\n\r\nfunction normalizeTileInfo(tileInfo: MartinTileJson, fallbackName: string | null, tileBaseUrl: string): NormalizedMartinTile | null {\r\n const tileName = tileInfo.id || tileInfo.name || fallbackName\r\n if (!tileName) return null\r\n\r\n const vectorLayerId = tileInfo.vector_layers?.[0]?.id || tileName\r\n const tileUrlFromInfo = Array.isArray(tileInfo.tiles) && tileInfo.tiles.length > 0\r\n ? tileInfo.tiles[0]\r\n : `${tileBaseUrl}/${tileName}/{z}/{x}/{y}`\r\n\r\n return {\r\n tileName,\r\n tileUrl: ensureAbsoluteTileUrl(tileUrlFromInfo, tileBaseUrl),\r\n description: tileInfo.description || tileInfo.vector_layers?.[0]?.description,\r\n vectorLayerId,\r\n tilestats: tileInfo.tilestats,\r\n minzoom: tileInfo.minzoom || tileInfo.vector_layers?.[0]?.minzoom,\r\n }\r\n}\r\n\r\nfunction normalizeMartinCatalog(response: MartinIndexResponse, tileBaseUrl: string): NormalizedMartinTile[] {\r\n if (Array.isArray(response)) {\r\n return response\r\n .map(tile => normalizeTileInfo(tile, null, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n if ('tilesets' in response && Array.isArray(response.tilesets)) {\r\n return response.tilesets\r\n .map(tile => normalizeTileInfo(tile, null, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n if ('tiles' in response && response.tiles) {\r\n return Object.entries(response.tiles)\r\n .map(([tileName, tileInfo]) => normalizeTileInfo(tileInfo as MartinTileJson, tileName, tileBaseUrl))\r\n .filter((t): t is NormalizedMartinTile => Boolean(t))\r\n }\r\n\r\n return []\r\n}\r\n\r\nfunction parseOrganizationValue(value: unknown): number | undefined {\r\n if (value == null) return undefined\r\n if (typeof value === 'number' && Number.isFinite(value)) return value\r\n\r\n const parsed = Number.parseInt(String(value), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction extractOrganizationFromTilestats(tilestats?: MartinTileStats): number | undefined {\r\n if (!tilestats?.layers) return undefined\r\n\r\n for (const layer of tilestats.layers) {\r\n const orgAttribute = layer.attributes?.find(attr =>\r\n attr.attribute?.toLowerCase() === ORGANIZATION_FIELD,\r\n )\r\n\r\n if (!orgAttribute) continue\r\n\r\n if (orgAttribute.values && orgAttribute.values.length > 0) {\r\n const value = parseOrganizationValue(orgAttribute.values[0])\r\n if (value !== undefined) return value\r\n }\r\n\r\n if (orgAttribute.min !== undefined && orgAttribute.max !== undefined) {\r\n const min = parseOrganizationValue(orgAttribute.min)\r\n const max = parseOrganizationValue(orgAttribute.max)\r\n if (min !== undefined && max !== undefined && min === max) {\r\n return min\r\n }\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nasync function fetchOrganizationFromTile(tileUrlTemplate: string, vectorLayerId: string, preferredZoom?: number) {\r\n try {\r\n const z = typeof preferredZoom === 'number' ? Math.max(0, Math.round(preferredZoom)) : 0\r\n const sampleUrl = tileUrlTemplate\r\n .replace('{z}', String(z))\r\n .replace('{x}', '0')\r\n .replace('{y}', '0')\r\n .replace('{Z}', String(z))\r\n .replace('{X}', '0')\r\n .replace('{Y}', '0')\r\n\r\n const response = await fetch(sampleUrl)\r\n if (!response.ok) return undefined\r\n\r\n const buffer = await response.arrayBuffer()\r\n const vectorTile = new VectorTile(new Pbf(buffer))\r\n const layer = vectorTile.layers[vectorLayerId] || Object.values(vectorTile.layers)[0]\r\n\r\n if (!layer || layer.length === 0) return undefined\r\n\r\n const feature = layer.feature(0)\r\n const { properties } = feature.toGeoJSON(0, 0, z)\r\n \r\n // Determine geometry type\r\n let geometryType: LayerGeometryType | undefined\r\n if (feature.type === 1) { // Point\r\n geometryType = 'circle'\r\n } else if (feature.type === 2) { // LineString\r\n geometryType = 'line'\r\n } else if (feature.type === 3) { // Polygon\r\n geometryType = 'fill'\r\n }\r\n\r\n return {\r\n organization: parseOrganizationValue(properties?.[ORGANIZATION_FIELD]),\r\n geometryType\r\n }\r\n } catch (error) {\r\n console.warn('Failed to read organization from tile', error)\r\n return undefined\r\n }\r\n}\r\n\r\nasync function resolveDatasetOrganization(tile: NormalizedMartinTile) {\r\n const fromTilestats = extractOrganizationFromTilestats(tile.tilestats)\r\n \r\n // Always fetch from tile to get geometry type, even if we have organization from tilestats\r\n const fromTile = await fetchOrganizationFromTile(tile.tileUrl, tile.vectorLayerId, tile.minzoom)\r\n \r\n return {\r\n organization: fromTilestats !== undefined ? fromTilestats : fromTile?.organization,\r\n geometryType: fromTile?.geometryType\r\n }\r\n}\r\n\r\nasync function fetchPublishedTileLabels(): Promise<Map<string, string>> {\r\n try {\r\n const res = await fetch('/api/files')\r\n if (!res.ok) return new Map()\r\n const body = await res.json()\r\n const rows: Array<{ name?: string | null, description?: string | null }> =\r\n Array.isArray(body?.files) ? body.files : []\r\n const map = new Map<string, string>()\r\n for (const row of rows) {\r\n if (!row?.description || !row?.name) continue\r\n try {\r\n const desc = JSON.parse(row.description) as { tiledTable?: unknown }\r\n if (typeof desc?.tiledTable === 'string') {\r\n map.set(desc.tiledTable, row.name.replace(/\\.geojson$/i, ''))\r\n }\r\n }\r\n catch { /* skip malformed */ }\r\n }\r\n return map\r\n }\r\n catch {\r\n return new Map()\r\n }\r\n}\r\n\r\nasync function fetchMartinServerDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { countrySubdivision, municipality } = portal\r\n const martinServerUrl = portal.apiUrl\r\n\r\n if (!martinServerUrl) {\r\n console.warn('No Martin server URL configured for portal', portal.name)\r\n return []\r\n }\r\n\r\n try {\r\n console.log('Fetching Martin server catalog from:', martinServerUrl)\r\n\r\n const { indexUrl, tileBaseUrl, fallbackCatalogUrl } = resolveMartinUrls(martinServerUrl)\r\n\r\n const publishedLabels = await fetchPublishedTileLabels()\r\n\r\n let response = await fetch(indexUrl)\r\n if (!response.ok && fallbackCatalogUrl && fallbackCatalogUrl !== indexUrl) {\r\n console.warn(`Failed to fetch Martin index (${indexUrl}), falling back to catalog...`)\r\n response = await fetch(fallbackCatalogUrl)\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch Martin catalog: ${response.status}`)\r\n }\r\n\r\n const catalog: MartinIndexResponse = await response.json()\r\n const tiles = normalizeMartinCatalog(catalog, tileBaseUrl)\r\n // Drop our published org tables (served via the cdt_tiles function + discovered\r\n // from File metadata) and the cdt_tiles function source itself (no ?source= → empty).\r\n .filter(t => !isPublishedOrgTable(t.tileName) && t.tileName !== 'cdt_tiles')\r\n\r\n console.log('Martin catalog received:', tiles.length, 'tiles')\r\n\r\n const datasets: Dataset[] = await Promise.all(tiles.map(async (tileInfo) => {\r\n const publishedLabel = publishedLabels.get(tileInfo.tileName)\r\n const cleanName = publishedLabel ?? formatName(\r\n tileInfo.tileName\r\n .replace(/_\\d{8}$/, '')\r\n .replace(/__\\d+_\\d+$/, ''),\r\n )\r\n\r\n const { organization, geometryType } = await resolveDatasetOrganization(tileInfo)\r\n\r\n const getFields = async () => {\r\n return []\r\n }\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n return {\r\n id: tileInfo.tileName,\r\n name: cleanName,\r\n type: 'MVT',\r\n visible: true,\r\n clickable: true,\r\n fields: [],\r\n source: {\r\n url: tileInfo.tileUrl,\r\n description: tileInfo.description,\r\n publisher: 'Martin Server',\r\n },\r\n serviceInfo: {\r\n tileName: tileInfo.tileName,\r\n sourceLayer: tileInfo.vectorLayerId,\r\n type: 'Martin',\r\n tileUrl: tileInfo.tileUrl,\r\n },\r\n }\r\n }\r\n\r\n const dataset: Dataset = {\r\n id: tileInfo.tileName,\r\n name: cleanName,\r\n organization,\r\n publisher: 'Martin Server',\r\n dataManagementSystem: 'other',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n keywords: [],\r\n description: tileInfo.description || `Vector tile layer from Martin server: ${tileInfo.tileName}`,\r\n dateReleased: '',\r\n dateUpdated: '',\r\n information: tileInfo.tileUrl,\r\n url: tileInfo.tileUrl,\r\n countrySubdivision: countrySubdivision,\r\n municipality: municipality,\r\n type: 'MVT',\r\n datasetType: 'MVT' as any,\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(cleanName),\r\n layerType: geometryType,\r\n }\r\n\r\n return dataset\r\n }))\r\n\r\n console.log(`Transformed ${datasets.length} Martin datasets`)\r\n\r\n let publishedDatasets: Dataset[] = []\r\n try {\r\n const fileRes = await fetch('/api/files')\r\n if (fileRes.ok) {\r\n const fileBody = await fileRes.json()\r\n const fileRows: PublishedFileRow[] = Array.isArray(fileBody?.files) ? fileBody.files : []\r\n publishedDatasets = buildPublishedTileDatasets(fileRows, tileBaseUrl, portal)\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to build published-tile datasets from /api/files', err)\r\n }\r\n\r\n return [...datasets, ...publishedDatasets]\r\n } catch (error) {\r\n console.error('Error fetching Martin server datasets:', error)\r\n return []\r\n }\r\n}\r\n\r\n// Fetch Local datasets from localDatasetsJson array and transform to Dataset array\r\nexport async function fetchLocalDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { countrySubdivision, municipality } = portal\r\n const apiUrl = portal.apiUrl || ''\r\n const trimmedApiUrl = apiUrl.replace(/\\/+$/, '')\r\n\r\n if (!apiUrl) {\r\n console.warn('No apiUrl provided for portal', portal.name)\r\n return []\r\n }\r\n\r\n // Skip legacy portals with non-absolute URLs (e.g. ./localDatasets/index.json)\r\n if (!apiUrl.startsWith('http://') && !apiUrl.startsWith('https://')) {\r\n return []\r\n }\r\n\r\n if (trimmedApiUrl.includes('/catalog') || trimmedApiUrl.includes('/tiles/index')) {\r\n return fetchMartinServerDatasets(portal)\r\n }\r\n\r\n try {\r\n // Fetch the localDatasets.json file\r\n const response = await fetch(apiUrl)\r\n if (!response.ok) {\r\n const shouldTryMartinFallback =\r\n !trimmedApiUrl.endsWith('.json')\r\n && !trimmedApiUrl.includes('/catalog')\r\n && !trimmedApiUrl.includes('/tiles/index')\r\n\r\n if (response.status === 404 && shouldTryMartinFallback) {\r\n console.warn(\r\n `Local dataset URL returned 404 (${apiUrl}); retrying as a Martin server base URL`,\r\n )\r\n return fetchMartinServerDatasets({\r\n ...portal,\r\n apiUrl: trimmedApiUrl,\r\n })\r\n }\r\n\r\n throw new Error(`Failed to fetch local datasets from ${apiUrl}: ${response.status}`)\r\n }\r\n\r\n const localDatasetsJson: LocalDatasetItem[] = await response.json()\r\n\r\n const transformedDatasets: Dataset[] = localDatasetsJson.map((datasetItem: LocalDatasetItem) => {\r\n // Simple getFields function that returns fields from layer properties\r\n const getFields = async () => {\r\n if (datasetItem.layer?.properties) {\r\n return Object.entries(datasetItem.layer.properties).map(([name, type]) => ({\r\n name,\r\n label: formatName(name),\r\n type: type as string,\r\n description: `${formatName(name)} field`,\r\n }))\r\n }\r\n return []\r\n }\r\n\r\n // Fetch GeoJSON data from the featuresUrl\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n // Create a cache key based on the dataset name and features URL\r\n const featuresKey = `features:local:${datasetItem.name}:${datasetItem.featuresUrl}`\r\n \r\n // Check cache first\r\n const cachedFeatures = getCache<AllGeoJSON>(featuresKey)\r\n if (cachedFeatures) {\r\n return cachedFeatures\r\n }\r\n \r\n try {\r\n // Use the featuresUrl from the dataset item\r\n let geojsonUrl: string\r\n if (datasetItem.featuresUrl.startsWith('http://') || datasetItem.featuresUrl.startsWith('https://')) {\r\n geojsonUrl = datasetItem.featuresUrl\r\n } else {\r\n const baseUrl = apiUrl.endsWith('.json') \r\n ? apiUrl.substring(0, apiUrl.lastIndexOf('/'))\r\n : apiUrl\r\n geojsonUrl = `${baseUrl}/${datasetItem.featuresUrl}`\r\n }\r\n\r\n const response = await fetch(geojsonUrl)\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch GeoJSON: ${response.status}`)\r\n }\r\n\r\n const geojsonData = await response.json() as AllGeoJSON\r\n \r\n // Cache for 1 hour\r\n setCache(featuresKey, geojsonData, 60 * 60 * 1000)\r\n \r\n return geojsonData\r\n } catch (error) {\r\n console.error(`Error loading GeoJSON for ${datasetItem.name}:`, 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(datasetItem.name)\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n return {\r\n // Basic layer information\r\n id: datasetItem.tileName || datasetItem.name.toLowerCase().replace(/\\s+/g, '-'),\r\n name: datasetItem.name,\r\n type: datasetItem.layer?.type || 'GeoJSON',\r\n\r\n // Layer configuration\r\n visible: datasetItem.visible,\r\n clickable: datasetItem.clickable,\r\n\r\n // Field information (similar to ArcGIS fields structure)\r\n fields: datasetItem.layer?.properties\r\n ? Object.entries(datasetItem.layer.properties).map(([name, type]) => ({\r\n name,\r\n type: type as FieldType,\r\n alias: formatName(name),\r\n description: `${formatName(name)} field`,\r\n }))\r\n : [],\r\n\r\n // Source information\r\n source: {\r\n url: datasetItem.url,\r\n description: datasetItem.description,\r\n publisher: datasetItem.publisher,\r\n featuresUrl: datasetItem.featuresUrl,\r\n },\r\n\r\n // Additional metadata that DatasetDetails.tsx might use\r\n editingInfo: {\r\n lastEditDate: new Date().toISOString(), // Current date as placeholder\r\n dataLastEditDate: new Date().toISOString(),\r\n },\r\n\r\n // Layer properties summary\r\n properties: datasetItem.layer?.properties || {},\r\n fieldCount: datasetItem.layer?.properties ? Object.keys(datasetItem.layer.properties).length : 0,\r\n\r\n // Geometry information\r\n geometryType: 'Unknown', // You could infer this from the actual GeoJSON if needed\r\n\r\n // Service information (for compatibility)\r\n serviceInfo: {\r\n tileName: datasetItem.tileName,\r\n sourceLayer: datasetItem.sourceLayer,\r\n type: 'Local',\r\n },\r\n }\r\n } catch (error) {\r\n console.error('Error getting features data for dataset:', datasetItem.name, error)\r\n return null\r\n }\r\n }\r\n\r\n return {\r\n id: datasetItem.tileName || datasetItem.name.toLowerCase().replace(/\\s+/g, '-'),\r\n name,\r\n organization: datasetItem.organization || 0,\r\n publisher: datasetItem.publisher || 'Unknown',\r\n dataManagementSystem: 'other',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n keywords: [],\r\n description: datasetItem.description || 'No description available',\r\n dateReleased: '',\r\n dateUpdated: '',\r\n information: datasetItem.url || '',\r\n url: datasetItem.url || '#', // Ensure there's always a valid URL for the Link component\r\n countrySubdivision: datasetItem.countrySubdivision || countrySubdivision,\r\n municipality: datasetItem.municipality || municipality,\r\n type: datasetItem.layer?.type || 'GeoJSON',\r\n datasetType: 'GeoJSON' as const,\r\n portal,\r\n getFields,\r\n getFeatures,\r\n getFeaturesData,\r\n group: 'Organizational',\r\n layerColor: layerColorByName(name),\r\n }\r\n })\r\n\r\n return transformedDatasets\r\n } catch (error) {\r\n console.error('Error fetching local datasets:', error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","name","response"]}
@@ -1 +1 @@
1
- {"version":3,"file":"minioDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/minioDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAmDhE,wBAAsB,gCAAgC,CACpD,cAAc,EAAE,MAAM,EACtB,uBAAuB,GAAE,WAAW,CAAC,MAAM,CAAa,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC,CAmFpB"}
1
+ {"version":3,"file":"minioDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/minioDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAmDhE,wBAAsB,gCAAgC,CACpD,cAAc,EAAE,MAAM,EACtB,uBAAuB,GAAE,WAAW,CAAC,MAAM,CAAa,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC,CAmFpB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/minioDatasets.ts"],"sourcesContent":["import type { Dataset } from '../../../../../types/datasetTypes'\r\nimport { DatasetGroup } from '../../../../../types/dbTypes'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\n\r\n/**\r\n * Hydrates uploaded GeoJSON datasets persisted via \"Add Dataset\". Looks up\r\n * File rows tagged `organizational-dataset`, reads the bucket from each row's\r\n * description JSON, and builds Dataset entries whose `getFeatures` lazy-loads\r\n * the GeoJSON from MinIO on first render.\r\n */\r\n\r\ninterface OrgDatasetDescription {\r\n bucket?: string\r\n geometryType?: 'points' | 'lines' | 'polygons'\r\n layerStyles?: Record<string, Record<string, string | number>>\r\n tiledTable?: string\r\n tiledAt?: string\r\n featuresIngested?: number\r\n featuresSkipped?: number\r\n}\r\n\r\ninterface RawFileRow {\r\n id: number\r\n type?: string | null\r\n tag?: string | null\r\n name?: string | null\r\n assetId?: string | null\r\n description?: string | null\r\n uploadedAt?: string | Date | null\r\n}\r\n\r\nconst TAG = 'organizational-dataset'\r\n\r\nfunction parseDescription(value: string | null | undefined): OrgDatasetDescription | null {\r\n if (!value) return null\r\n try {\r\n const parsed = JSON.parse(value)\r\n return typeof parsed === 'object' && parsed !== null ? parsed as OrgDatasetDescription : null\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction buildMinioUrl(bucket: string, organizationId: number, assetId: string): string | null {\r\n const base = process.env.NEXT_PUBLIC_MINIO_BUCKET_URL\r\n if (!base) return null\r\n return `${base.replace(/\\/+$/, '')}/${bucket}/${organizationId}/${assetId}`\r\n}\r\n\r\nexport async function fetchOrganizationalMinioDatasets(\r\n organizationId: number,\r\n publishedTilesInCatalog: ReadonlySet<string> = new Set(),\r\n): Promise<Dataset[]> {\r\n let rows: RawFileRow[] = []\r\n try {\r\n const res = await fetch('/api/files')\r\n if (!res.ok) {\r\n console.warn(`fetchOrganizationalMinioDatasets: /api/files returned ${res.status}`)\r\n return []\r\n }\r\n const body = await res.json()\r\n rows = Array.isArray(body?.files) ? body.files : []\r\n }\r\n catch (err) {\r\n console.warn('fetchOrganizationalMinioDatasets: /api/files request failed', err)\r\n return []\r\n }\r\n\r\n const datasets: Dataset[] = []\r\n for (const row of rows) {\r\n if (row.type !== 'map-file') continue\r\n if (row.tag !== TAG) continue\r\n if (!row.assetId) continue\r\n\r\n const meta = parseDescription(row.description)\r\n // Suppress the MinIO entry only once Martin actually serves the published\r\n // table — otherwise the file appears to vanish during the publish→restart\r\n // gap. Un-publish drops the table immediately, so the MinIO row reappears\r\n // on next reload with no extra plumbing.\r\n if (meta?.tiledTable && publishedTilesInCatalog.has(meta.tiledTable)) continue\r\n const bucket = meta?.bucket\r\n if (!bucket) continue\r\n\r\n const sourceUrl = buildMinioUrl(bucket, organizationId, row.assetId)\r\n if (!sourceUrl) continue\r\n\r\n const name = row.name?.replace(/\\.geojson$/i, '') || `Dataset ${row.id}`\r\n const id = `org-minio-${row.id}`\r\n let cached: AllGeoJSON | null = null\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n if (cached) return cached\r\n const response = await fetch(sourceUrl)\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch GeoJSON from ${sourceUrl}: ${response.status}`)\r\n }\r\n cached = await response.json() as AllGeoJSON\r\n return cached\r\n }\r\n\r\n const getFields = async () => []\r\n\r\n datasets.push({\r\n id,\r\n name,\r\n type: 'Organizational',\r\n publisher: 'Organizational',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n description: `Uploaded ${row.uploadedAt ?? ''}`.trim(),\r\n dateReleased: typeof row.uploadedAt === 'string' ? row.uploadedAt : '',\r\n dateUpdated: typeof row.uploadedAt === 'string' ? row.uploadedAt : '',\r\n countrySubdivision: '',\r\n municipality: '',\r\n sourceUrl,\r\n url: sourceUrl,\r\n clickable: true,\r\n properties: {},\r\n getFeatures,\r\n getFields,\r\n dataManagementSystem: 'other',\r\n datasetType: 'GeoJSON',\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(id),\r\n layerType: meta?.geometryType === 'lines'\r\n ? 'line'\r\n : meta?.geometryType === 'points'\r\n ? 'circle'\r\n : meta?.geometryType === 'polygons'\r\n ? 'fill'\r\n : undefined,\r\n })\r\n }\r\n\r\n return datasets\r\n}\r\n"],"mappings":"AACA,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AA8BjC,MAAM,MAAM;AAEZ,SAAS,iBAAiB,OAAgE;AACxF,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,OAAO,WAAW,YAAY,WAAW,OAAO,SAAkC;AAAA,EAC3F,SACM;AACJ,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,QAAgB,gBAAwB,SAAgC;AAC7F,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,GAAG,KAAK,QAAQ,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,cAAc,IAAI,OAAO;AAC3E;AAEA,eAAsB,iCACpB,gBACA,0BAA+C,oBAAI,IAAI,GACnC;AAtDtB;AAuDE,MAAI,OAAqB,CAAC;AAC1B,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,YAAY;AACpC,QAAI,CAAC,IAAI,IAAI;AACX,cAAQ,KAAK,yDAAyD,IAAI,MAAM,EAAE;AAClF,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO,MAAM,QAAQ,6BAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,EACpD,SACO,KAAK;AACV,YAAQ,KAAK,+DAA+D,GAAG;AAC/E,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAsB,CAAC;AAC7B,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,WAAY;AAC7B,QAAI,IAAI,QAAQ,IAAK;AACrB,QAAI,CAAC,IAAI,QAAS;AAElB,UAAM,OAAO,iBAAiB,IAAI,WAAW;AAK7C,SAAI,6BAAM,eAAc,wBAAwB,IAAI,KAAK,UAAU,EAAG;AACtE,UAAM,SAAS,6BAAM;AACrB,QAAI,CAAC,OAAQ;AAEb,UAAM,YAAY,cAAc,QAAQ,gBAAgB,IAAI,OAAO;AACnE,QAAI,CAAC,UAAW;AAEhB,UAAM,SAAO,SAAI,SAAJ,mBAAU,QAAQ,eAAe,QAAO,WAAW,IAAI,EAAE;AACtE,UAAM,KAAK,aAAa,IAAI,EAAE;AAC9B,QAAI,SAA4B;AAEhC,UAAM,cAAc,YAAiC;AACnD,UAAI,OAAQ,QAAO;AACnB,YAAM,WAAW,MAAM,MAAM,SAAS;AACtC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,gCAAgC,SAAS,KAAK,SAAS,MAAM,EAAE;AAAA,MACjF;AACA,eAAS,MAAM,SAAS,KAAK;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,YAAY,CAAC;AAE/B,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa,aAAY,SAAI,eAAJ,YAAkB,EAAE,GAAG,KAAK;AAAA,MACrD,cAAc,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,MACpE,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,MACnE,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd;AAAA,MACA,KAAK;AAAA,MACL,WAAW;AAAA,MACX,YAAY,CAAC;AAAA,MACb;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,OAAO,aAAa;AAAA,MACpB,YAAY,iBAAiB,EAAE;AAAA,MAC/B,YAAW,6BAAM,kBAAiB,UAC9B,UACA,6BAAM,kBAAiB,WACrB,YACA,6BAAM,kBAAiB,aACrB,SACA;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/minioDatasets.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 } from '../../../../../types/dbTypes'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\n\r\n/**\r\n * Hydrates uploaded GeoJSON datasets persisted via \"Add Dataset\". Looks up\r\n * File rows tagged `organizational-dataset`, reads the bucket from each row's\r\n * description JSON, and builds Dataset entries whose `getFeatures` lazy-loads\r\n * the GeoJSON from MinIO on first render.\r\n */\r\n\r\ninterface OrgDatasetDescription {\r\n bucket?: string\r\n geometryType?: 'points' | 'lines' | 'polygons'\r\n layerStyles?: Record<string, Record<string, string | number>>\r\n tiledTable?: string\r\n tiledAt?: string\r\n featuresIngested?: number\r\n featuresSkipped?: number\r\n}\r\n\r\ninterface RawFileRow {\r\n id: number\r\n type?: string | null\r\n tag?: string | null\r\n name?: string | null\r\n assetId?: string | null\r\n description?: string | null\r\n uploadedAt?: string | Date | null\r\n}\r\n\r\nconst TAG = 'organizational-dataset'\r\n\r\nfunction parseDescription(value: string | null | undefined): OrgDatasetDescription | null {\r\n if (!value) return null\r\n try {\r\n const parsed = JSON.parse(value)\r\n return typeof parsed === 'object' && parsed !== null ? parsed as OrgDatasetDescription : null\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction buildMinioUrl(bucket: string, organizationId: number, assetId: string): string | null {\r\n const base = process.env.NEXT_PUBLIC_MINIO_BUCKET_URL\r\n if (!base) return null\r\n return `${base.replace(/\\/+$/, '')}/${bucket}/${organizationId}/${assetId}`\r\n}\r\n\r\nexport async function fetchOrganizationalMinioDatasets(\r\n organizationId: number,\r\n publishedTilesInCatalog: ReadonlySet<string> = new Set(),\r\n): Promise<Dataset[]> {\r\n let rows: RawFileRow[] = []\r\n try {\r\n const res = await fetch('/api/files')\r\n if (!res.ok) {\r\n console.warn(`fetchOrganizationalMinioDatasets: /api/files returned ${res.status}`)\r\n return []\r\n }\r\n const body = await res.json()\r\n rows = Array.isArray(body?.files) ? body.files : []\r\n }\r\n catch (err) {\r\n console.warn('fetchOrganizationalMinioDatasets: /api/files request failed', err)\r\n return []\r\n }\r\n\r\n const datasets: Dataset[] = []\r\n for (const row of rows) {\r\n if (row.type !== 'map-file') continue\r\n if (row.tag !== TAG) continue\r\n if (!row.assetId) continue\r\n\r\n const meta = parseDescription(row.description)\r\n // Suppress the MinIO entry only once Martin actually serves the published\r\n // table — otherwise the file appears to vanish during the publish→restart\r\n // gap. Un-publish drops the table immediately, so the MinIO row reappears\r\n // on next reload with no extra plumbing.\r\n if (meta?.tiledTable && publishedTilesInCatalog.has(meta.tiledTable)) continue\r\n const bucket = meta?.bucket\r\n if (!bucket) continue\r\n\r\n const sourceUrl = buildMinioUrl(bucket, organizationId, row.assetId)\r\n if (!sourceUrl) continue\r\n\r\n const name = row.name?.replace(/\\.geojson$/i, '') || `Dataset ${row.id}`\r\n const id = `org-minio-${row.id}`\r\n let cached: AllGeoJSON | null = null\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n if (cached) return cached\r\n const response = await fetch(sourceUrl)\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch GeoJSON from ${sourceUrl}: ${response.status}`)\r\n }\r\n cached = await response.json() as AllGeoJSON\r\n return cached\r\n }\r\n\r\n const getFields = async () => []\r\n\r\n datasets.push({\r\n id,\r\n name,\r\n type: 'Organizational',\r\n publisher: 'Organizational',\r\n license: 'Unknown',\r\n contact: 'Unknown',\r\n description: `Uploaded ${row.uploadedAt ?? ''}`.trim(),\r\n dateReleased: typeof row.uploadedAt === 'string' ? row.uploadedAt : '',\r\n dateUpdated: typeof row.uploadedAt === 'string' ? row.uploadedAt : '',\r\n countrySubdivision: '',\r\n municipality: '',\r\n sourceUrl,\r\n url: sourceUrl,\r\n clickable: true,\r\n properties: {},\r\n getFeatures,\r\n getFields,\r\n dataManagementSystem: 'other',\r\n datasetType: 'GeoJSON',\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(id),\r\n layerType: meta?.geometryType === 'lines'\r\n ? 'line'\r\n : meta?.geometryType === 'points'\r\n ? 'circle'\r\n : meta?.geometryType === 'polygons'\r\n ? 'fill'\r\n : undefined,\r\n })\r\n }\r\n\r\n return datasets\r\n}\r\n"],"mappings":"AAIA,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AA8BjC,MAAM,MAAM;AAEZ,SAAS,iBAAiB,OAAgE;AACxF,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,OAAO,WAAW,YAAY,WAAW,OAAO,SAAkC;AAAA,EAC3F,SACM;AACJ,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,QAAgB,gBAAwB,SAAgC;AAC7F,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,GAAG,KAAK,QAAQ,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,cAAc,IAAI,OAAO;AAC3E;AAEA,eAAsB,iCACpB,gBACA,0BAA+C,oBAAI,IAAI,GACnC;AAzDtB;AA0DE,MAAI,OAAqB,CAAC;AAC1B,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,YAAY;AACpC,QAAI,CAAC,IAAI,IAAI;AACX,cAAQ,KAAK,yDAAyD,IAAI,MAAM,EAAE;AAClF,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO,MAAM,QAAQ,6BAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,EACpD,SACO,KAAK;AACV,YAAQ,KAAK,+DAA+D,GAAG;AAC/E,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAsB,CAAC;AAC7B,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,WAAY;AAC7B,QAAI,IAAI,QAAQ,IAAK;AACrB,QAAI,CAAC,IAAI,QAAS;AAElB,UAAM,OAAO,iBAAiB,IAAI,WAAW;AAK7C,SAAI,6BAAM,eAAc,wBAAwB,IAAI,KAAK,UAAU,EAAG;AACtE,UAAM,SAAS,6BAAM;AACrB,QAAI,CAAC,OAAQ;AAEb,UAAM,YAAY,cAAc,QAAQ,gBAAgB,IAAI,OAAO;AACnE,QAAI,CAAC,UAAW;AAEhB,UAAM,SAAO,SAAI,SAAJ,mBAAU,QAAQ,eAAe,QAAO,WAAW,IAAI,EAAE;AACtE,UAAM,KAAK,aAAa,IAAI,EAAE;AAC9B,QAAI,SAA4B;AAEhC,UAAM,cAAc,YAAiC;AACnD,UAAI,OAAQ,QAAO;AACnB,YAAM,WAAW,MAAM,MAAM,SAAS;AACtC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,gCAAgC,SAAS,KAAK,SAAS,MAAM,EAAE;AAAA,MACjF;AACA,eAAS,MAAM,SAAS,KAAK;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,YAAY,CAAC;AAE/B,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa,aAAY,SAAI,eAAJ,YAAkB,EAAE,GAAG,KAAK;AAAA,MACrD,cAAc,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,MACpE,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,MACnE,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd;AAAA,MACA,KAAK;AAAA,MACL,WAAW;AAAA,MACX,YAAY,CAAC;AAAA,MACb;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,OAAO,aAAa;AAAA,MACpB,YAAY,iBAAiB,EAAE;AAAA,MAC/B,YAAW,6BAAM,kBAAiB,UAC9B,UACA,6BAAM,kBAAiB,WACrB,YACA,6BAAM,kBAAiB,aACrB,SACA;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"opendatasoftDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/opendatasoftDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAMhE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CAsSpB"}
1
+ {"version":3,"file":"opendatasoftDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/opendatasoftDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAMhE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CAsSpB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/opendatasoftDatasets.ts"],"sourcesContent":["import type { Dataset } from '../../../../../types/datasetTypes'\r\nimport { formatDate, formatName, stripHtml } from '../utils'\r\n\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 OpenDataSoft datasets and transform to Dataset array\r\nexport async function fetchOpenDataSoftDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n const baseUrl = apiUrl.replace(/\\/$/, '')\r\n const catalogBase = `${baseUrl}/catalog`\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 return `/api/opendatasoftProxy?url=${encodeURIComponent(target)}`\r\n }\r\n\r\n try {\r\n let allDatasets: any[] = []\r\n let offset = 0\r\n let totalCount = 0\r\n\r\n do {\r\n const catalogUrl = `${catalogBase}/datasets?limit=100&offset=${offset}`\r\n const response = await fetch(buildUrl(catalogUrl))\r\n\r\n if (!response.ok) {\r\n console.error(`OpenDataSoft API error for ${portal.name}:`, response.status, response.statusText)\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data = await response.json()\r\n\r\n // More flexible response structure handling\r\n if (!data) {\r\n throw new Error('Empty response from OpenDataSoft API')\r\n }\r\n\r\n // Handle different possible response structures\r\n let results: any[] = []\r\n let total = 0\r\n\r\n if (data.results && Array.isArray(data.results)) {\r\n // Standard OpenDataSoft v2 API response\r\n results = data.results\r\n total = data.total_count || data.nhits || 0\r\n }\r\n else if (data.datasets && Array.isArray(data.datasets)) {\r\n // Alternative response structure\r\n results = data.datasets\r\n total = data.total || data.count || 0\r\n }\r\n else if (Array.isArray(data)) {\r\n // Direct array response\r\n results = data\r\n total = data.length\r\n }\r\n else {\r\n // Log the actual structure for debugging\r\n console.error('Unexpected response structure:', Object.keys(data))\r\n throw new Error(\r\n `Invalid OpenDataSoft response structure. Expected 'results' array, got: ${Object.keys(\r\n data,\r\n ).join(', ')}`,\r\n )\r\n }\r\n allDatasets = allDatasets.concat(results)\r\n totalCount = total\r\n offset += 100\r\n\r\n // Safety check to prevent infinite loops\r\n if (results.length === 0) {\r\n break\r\n }\r\n } while (offset < totalCount)\r\n\r\n const transformedDatasets: Dataset[] = (await Promise.all(allDatasets.map(async (dataset: any) => {\r\n const metas = dataset.metas?.default || {}\r\n const custom = dataset.metas?.custom || {}\r\n const datasetId = dataset.dataset_id || dataset.id || ''\r\n const datasetModified = metas.modified || dataset.modified || undefined\r\n\r\n const datasetBaseUrl = `${catalogBase}/datasets/${datasetId}`\r\n const recordsBaseUrl = `${datasetBaseUrl}/records`\r\n\r\n const validKey = buildValidationKey('opendatasoft', datasetId, datasetModified)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const sampleUrl = `${recordsBaseUrl}?limit=1`\r\n const sampleRes = await fetch(buildUrl(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 || ''}`\r\n console.warn(`⚠️ OpenDataSoft validation: Dataset \"${datasetId}\" returned error:`, { code, msg })\r\n if ([401, 403, 499, 504].includes(code) || /unauthorized|forbidden|token required|timed out/i.test(msg)) return false\r\n // Even if there's an error, allow the dataset through - getFeatures will handle it\r\n return true\r\n }\r\n // If response is OK, check if it has geometry\r\n const recs = sample.records || sample.results || [];\r\n const hasGeom = Array.isArray(recs)\r\n ? recs.some((r: any) => !!r?.geometry || !!r?.geom || !!r?.geo_shape || !!r?.geo_point_2d)\r\n : false\r\n console.log(`ℹ️ OpenDataSoft validation: Dataset \"${datasetId}\" has geometry: ${hasGeom}, records: ${recs.length}`)\r\n // Allow through even if no geometry - user might want to see the dataset\r\n return true\r\n }\r\n else if ([401, 403, 504].includes(sampleRes.status)) {\r\n console.error(`❌ OpenDataSoft validation: Dataset \"${datasetId}\" auth/timeout error: ${sampleRes.status}`)\r\n return false\r\n }\r\n else {\r\n console.warn(`⚠️ OpenDataSoft validation: Dataset \"${datasetId}\" validation request failed: ${sampleRes.status}`)\r\n // Allow through on other errors\r\n return true\r\n }\r\n }\r\n catch (error) {\r\n console.error(`❌ OpenDataSoft validation: Dataset \"${datasetId}\" validation failed:`, error)\r\n // Allow through on network errors - getFeatures will handle it\r\n return true\r\n }\r\n })\r\n\r\n if (!isValid) {\r\n console.log(`🗑️ OpenDataSoft: Filtering out dataset \"${datasetId}\" - validation failed`)\r\n return null\r\n }\r\n\r\n // Self-contained getFields\r\n const getFields = async () => {\r\n const fieldsKey = `fields:opendatasoft:${datasetId}:${datasetModified ?? ''}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n const fieldsUrl = `${datasetBaseUrl}`\r\n const response = await fetch(buildUrl(fieldsUrl))\r\n if (!response.ok) return []\r\n const data = await response.json()\r\n const fields = (data.metas?.default?.fields || data.fields || []).map((field: any) => ({\r\n name: field.name,\r\n label: field.label || field.name,\r\n type: field.type,\r\n description: field.description || '',\r\n }))\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n\r\n // Self-contained getFeatures with caching\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n const featuresKey = `features:opendatasoft:${datasetId}:${datasetModified ?? ''}`\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(`✅ OpenDataSoft getFeatures: Returning ${cachedCount} cached features for dataset \"${datasetId}\"`)\r\n return cached\r\n }\r\n\r\n try {\r\n const features: any[] = []\r\n let offset = 0\r\n let totalCount = 0\r\n const maxFeatures = 5_000\r\n\r\n console.log(`🔍 OpenDataSoft getFeatures: Starting fetch for dataset \"${datasetId}\"`)\r\n\r\n do {\r\n const recordsUrl = `${recordsBaseUrl}?limit=100&offset=${offset}`\r\n console.log(`📡 OpenDataSoft: Fetching ${recordsUrl}`)\r\n const response = await fetch(buildUrl(recordsUrl))\r\n if (!response.ok) {\r\n console.error(`❌ OpenDataSoft: Failed to fetch records - status ${response.status}`, {\r\n url: recordsUrl,\r\n statusText: response.statusText,\r\n })\r\n break\r\n }\r\n let data;\r\n try {\r\n data = await response.json()\r\n } catch (parseError) {\r\n console.error(`❌ OpenDataSoft: Failed to parse JSON response:`, parseError)\r\n break\r\n }\r\n console.log(`📦 OpenDataSoft: Received data, records count: ${data.records?.length || 0}, data keys:`, Object.keys(data || {}))\r\n\r\n if (offset === 0) {\r\n totalCount = Math.min(data.total_count || data.nhits || 0, maxFeatures)\r\n }\r\n\r\n const recArray: any[] = data.records || data.results || [];\r\n if (Array.isArray(recArray)) {\r\n recArray.forEach((record: any) => {\r\n if (features.length >= maxFeatures) return;\r\n\r\n // Extract geometry from possible fields\r\n let geom: any = null;\r\n if (record.geometry) {\r\n geom = record.geometry;\r\n } else if (record.geom) {\r\n geom = record.geom.type === 'Feature' && record.geom.geometry ? record.geom.geometry : record.geom;\r\n } else if (record.geo_shape) {\r\n geom = record.geo_shape;\r\n } else if (record.geo_point_2d && typeof record.geo_point_2d.lat === 'number' && typeof record.geo_point_2d.lon === 'number') {\r\n geom = { type: 'Point', coordinates: [record.geo_point_2d.lon, record.geo_point_2d.lat] };\r\n }\r\n\r\n if (geom) {\r\n const props: any = { ...record };\r\n delete props.geometry;\r\n delete props.geom;\r\n delete props.geo_shape;\r\n delete props.geo_point_2d;\r\n\r\n features.push({\r\n type: 'Feature',\r\n geometry: geom,\r\n properties: props,\r\n });\r\n }\r\n });\r\n }\r\n\r\n offset += 100\r\n const fetchedCount = recArray.length;\r\n if (fetchedCount === 0 || features.length >= maxFeatures) break\r\n } while (offset < totalCount)\r\n\r\n console.log(`✅ OpenDataSoft getFeatures: Returning ${features.length} features for dataset \"${datasetId}\"`)\r\n\r\n const result = {\r\n type: 'FeatureCollection',\r\n features,\r\n } as AllGeoJSON\r\n\r\n // Cache the result for 1 hour\r\n setCache(featuresKey, result, 60 * 60 * 1000)\r\n\r\n return result\r\n } catch (error) {\r\n console.error(`❌ OpenDataSoft getFeatures: Error fetching features for dataset \"${datasetId}\":`, error)\r\n // Return empty feature collection on error instead of throwing\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(metas.title || dataset.title || datasetId)\r\n\r\n return {\r\n id: datasetId,\r\n name,\r\n publisher:\r\n metas.publisher\r\n || custom['data-owner']?.[0]\r\n || dataset.publisher\r\n || 'Unknown',\r\n dataManagementSystem: 'Opendatasoft',\r\n license: metas.license || dataset.license || 'Unknown',\r\n contact: custom['data-team']?.[0] || dataset.contact || 'Unknown',\r\n keywords: metas.keyword || dataset.keywords || [],\r\n description: stripHtml(\r\n metas.description || dataset.description || 'No description available',\r\n ),\r\n dateReleased: metas.created\r\n ? formatDate(metas.created)\r\n : (dataset.created\r\n ? formatDate(dataset.created)\r\n : ''),\r\n dateUpdated: metas.modified\r\n ? formatDate(metas.modified)\r\n : (dataset.modified\r\n ? formatDate(dataset.modified)\r\n : ''),\r\n information: `${apiUrl}/explore/dataset/${datasetId}/`,\r\n countrySubdivision,\r\n municipality,\r\n type: portal.name,\r\n datasetType: dataset.type || 'GeoJSON',\r\n portal,\r\n getFields,\r\n getFeatures,\r\n group,\r\n layerColor: layerColorByName(name),\r\n }\r\n })))\r\n .filter(Boolean) as Dataset[]\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error(`Error fetching OpenDataSoft datasets for ${portal.name}:`, error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c","offset","totalCount"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/opendatasoftDatasets.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 { formatDate, formatName, stripHtml } from '../utils'\r\n\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 OpenDataSoft datasets and transform to Dataset array\r\nexport async function fetchOpenDataSoftDatasets(\r\n portal: OpenDataPortal,\r\n): Promise<Dataset[]> {\r\n const { apiUrl, countrySubdivision, municipality, group } = portal\r\n const baseUrl = apiUrl.replace(/\\/$/, '')\r\n const catalogBase = `${baseUrl}/catalog`\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 return `/api/opendatasoftProxy?url=${encodeURIComponent(target)}`\r\n }\r\n\r\n try {\r\n let allDatasets: any[] = []\r\n let offset = 0\r\n let totalCount = 0\r\n\r\n do {\r\n const catalogUrl = `${catalogBase}/datasets?limit=100&offset=${offset}`\r\n const response = await fetch(buildUrl(catalogUrl))\r\n\r\n if (!response.ok) {\r\n console.error(`OpenDataSoft API error for ${portal.name}:`, response.status, response.statusText)\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data = await response.json()\r\n\r\n // More flexible response structure handling\r\n if (!data) {\r\n throw new Error('Empty response from OpenDataSoft API')\r\n }\r\n\r\n // Handle different possible response structures\r\n let results: any[] = []\r\n let total = 0\r\n\r\n if (data.results && Array.isArray(data.results)) {\r\n // Standard OpenDataSoft v2 API response\r\n results = data.results\r\n total = data.total_count || data.nhits || 0\r\n }\r\n else if (data.datasets && Array.isArray(data.datasets)) {\r\n // Alternative response structure\r\n results = data.datasets\r\n total = data.total || data.count || 0\r\n }\r\n else if (Array.isArray(data)) {\r\n // Direct array response\r\n results = data\r\n total = data.length\r\n }\r\n else {\r\n // Log the actual structure for debugging\r\n console.error('Unexpected response structure:', Object.keys(data))\r\n throw new Error(\r\n `Invalid OpenDataSoft response structure. Expected 'results' array, got: ${Object.keys(\r\n data,\r\n ).join(', ')}`,\r\n )\r\n }\r\n allDatasets = allDatasets.concat(results)\r\n totalCount = total\r\n offset += 100\r\n\r\n // Safety check to prevent infinite loops\r\n if (results.length === 0) {\r\n break\r\n }\r\n } while (offset < totalCount)\r\n\r\n const transformedDatasets: Dataset[] = (await Promise.all(allDatasets.map(async (dataset: any) => {\r\n const metas = dataset.metas?.default || {}\r\n const custom = dataset.metas?.custom || {}\r\n const datasetId = dataset.dataset_id || dataset.id || ''\r\n const datasetModified = metas.modified || dataset.modified || undefined\r\n\r\n const datasetBaseUrl = `${catalogBase}/datasets/${datasetId}`\r\n const recordsBaseUrl = `${datasetBaseUrl}/records`\r\n\r\n const validKey = buildValidationKey('opendatasoft', datasetId, datasetModified)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const sampleUrl = `${recordsBaseUrl}?limit=1`\r\n const sampleRes = await fetch(buildUrl(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 || ''}`\r\n console.warn(`⚠️ OpenDataSoft validation: Dataset \"${datasetId}\" returned error:`, { code, msg })\r\n if ([401, 403, 499, 504].includes(code) || /unauthorized|forbidden|token required|timed out/i.test(msg)) return false\r\n // Even if there's an error, allow the dataset through - getFeatures will handle it\r\n return true\r\n }\r\n // If response is OK, check if it has geometry\r\n const recs = sample.records || sample.results || [];\r\n const hasGeom = Array.isArray(recs)\r\n ? recs.some((r: any) => !!r?.geometry || !!r?.geom || !!r?.geo_shape || !!r?.geo_point_2d)\r\n : false\r\n console.log(`ℹ️ OpenDataSoft validation: Dataset \"${datasetId}\" has geometry: ${hasGeom}, records: ${recs.length}`)\r\n // Allow through even if no geometry - user might want to see the dataset\r\n return true\r\n }\r\n else if ([401, 403, 504].includes(sampleRes.status)) {\r\n console.error(`❌ OpenDataSoft validation: Dataset \"${datasetId}\" auth/timeout error: ${sampleRes.status}`)\r\n return false\r\n }\r\n else {\r\n console.warn(`⚠️ OpenDataSoft validation: Dataset \"${datasetId}\" validation request failed: ${sampleRes.status}`)\r\n // Allow through on other errors\r\n return true\r\n }\r\n }\r\n catch (error) {\r\n console.error(`❌ OpenDataSoft validation: Dataset \"${datasetId}\" validation failed:`, error)\r\n // Allow through on network errors - getFeatures will handle it\r\n return true\r\n }\r\n })\r\n\r\n if (!isValid) {\r\n console.log(`🗑️ OpenDataSoft: Filtering out dataset \"${datasetId}\" - validation failed`)\r\n return null\r\n }\r\n\r\n // Self-contained getFields\r\n const getFields = async () => {\r\n const fieldsKey = `fields:opendatasoft:${datasetId}:${datasetModified ?? ''}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n const fieldsUrl = `${datasetBaseUrl}`\r\n const response = await fetch(buildUrl(fieldsUrl))\r\n if (!response.ok) return []\r\n const data = await response.json()\r\n const fields = (data.metas?.default?.fields || data.fields || []).map((field: any) => ({\r\n name: field.name,\r\n label: field.label || field.name,\r\n type: field.type,\r\n description: field.description || '',\r\n }))\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n\r\n // Self-contained getFeatures with caching\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n const featuresKey = `features:opendatasoft:${datasetId}:${datasetModified ?? ''}`\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(`✅ OpenDataSoft getFeatures: Returning ${cachedCount} cached features for dataset \"${datasetId}\"`)\r\n return cached\r\n }\r\n\r\n try {\r\n const features: any[] = []\r\n let offset = 0\r\n let totalCount = 0\r\n const maxFeatures = 5_000\r\n\r\n console.log(`🔍 OpenDataSoft getFeatures: Starting fetch for dataset \"${datasetId}\"`)\r\n\r\n do {\r\n const recordsUrl = `${recordsBaseUrl}?limit=100&offset=${offset}`\r\n console.log(`📡 OpenDataSoft: Fetching ${recordsUrl}`)\r\n const response = await fetch(buildUrl(recordsUrl))\r\n if (!response.ok) {\r\n console.error(`❌ OpenDataSoft: Failed to fetch records - status ${response.status}`, {\r\n url: recordsUrl,\r\n statusText: response.statusText,\r\n })\r\n break\r\n }\r\n let data;\r\n try {\r\n data = await response.json()\r\n } catch (parseError) {\r\n console.error(`❌ OpenDataSoft: Failed to parse JSON response:`, parseError)\r\n break\r\n }\r\n console.log(`📦 OpenDataSoft: Received data, records count: ${data.records?.length || 0}, data keys:`, Object.keys(data || {}))\r\n\r\n if (offset === 0) {\r\n totalCount = Math.min(data.total_count || data.nhits || 0, maxFeatures)\r\n }\r\n\r\n const recArray: any[] = data.records || data.results || [];\r\n if (Array.isArray(recArray)) {\r\n recArray.forEach((record: any) => {\r\n if (features.length >= maxFeatures) return;\r\n\r\n // Extract geometry from possible fields\r\n let geom: any = null;\r\n if (record.geometry) {\r\n geom = record.geometry;\r\n } else if (record.geom) {\r\n geom = record.geom.type === 'Feature' && record.geom.geometry ? record.geom.geometry : record.geom;\r\n } else if (record.geo_shape) {\r\n geom = record.geo_shape;\r\n } else if (record.geo_point_2d && typeof record.geo_point_2d.lat === 'number' && typeof record.geo_point_2d.lon === 'number') {\r\n geom = { type: 'Point', coordinates: [record.geo_point_2d.lon, record.geo_point_2d.lat] };\r\n }\r\n\r\n if (geom) {\r\n const props: any = { ...record };\r\n delete props.geometry;\r\n delete props.geom;\r\n delete props.geo_shape;\r\n delete props.geo_point_2d;\r\n\r\n features.push({\r\n type: 'Feature',\r\n geometry: geom,\r\n properties: props,\r\n });\r\n }\r\n });\r\n }\r\n\r\n offset += 100\r\n const fetchedCount = recArray.length;\r\n if (fetchedCount === 0 || features.length >= maxFeatures) break\r\n } while (offset < totalCount)\r\n\r\n console.log(`✅ OpenDataSoft getFeatures: Returning ${features.length} features for dataset \"${datasetId}\"`)\r\n\r\n const result = {\r\n type: 'FeatureCollection',\r\n features,\r\n } as AllGeoJSON\r\n\r\n // Cache the result for 1 hour\r\n setCache(featuresKey, result, 60 * 60 * 1000)\r\n\r\n return result\r\n } catch (error) {\r\n console.error(`❌ OpenDataSoft getFeatures: Error fetching features for dataset \"${datasetId}\":`, error)\r\n // Return empty feature collection on error instead of throwing\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(metas.title || dataset.title || datasetId)\r\n\r\n return {\r\n id: datasetId,\r\n name,\r\n publisher:\r\n metas.publisher\r\n || custom['data-owner']?.[0]\r\n || dataset.publisher\r\n || 'Unknown',\r\n dataManagementSystem: 'Opendatasoft',\r\n license: metas.license || dataset.license || 'Unknown',\r\n contact: custom['data-team']?.[0] || dataset.contact || 'Unknown',\r\n keywords: metas.keyword || dataset.keywords || [],\r\n description: stripHtml(\r\n metas.description || dataset.description || 'No description available',\r\n ),\r\n dateReleased: metas.created\r\n ? formatDate(metas.created)\r\n : (dataset.created\r\n ? formatDate(dataset.created)\r\n : ''),\r\n dateUpdated: metas.modified\r\n ? formatDate(metas.modified)\r\n : (dataset.modified\r\n ? formatDate(dataset.modified)\r\n : ''),\r\n information: `${apiUrl}/explore/dataset/${datasetId}/`,\r\n countrySubdivision,\r\n municipality,\r\n type: portal.name,\r\n datasetType: dataset.type || 'GeoJSON',\r\n portal,\r\n getFields,\r\n getFeatures,\r\n group,\r\n layerColor: layerColorByName(name),\r\n }\r\n })))\r\n .filter(Boolean) as Dataset[]\r\n\r\n return transformedDatasets\r\n }\r\n catch (error) {\r\n console.error(`Error fetching OpenDataSoft datasets for ${portal.name}:`, error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c","offset","totalCount"]}
@@ -1 +1 @@
1
- {"version":3,"file":"publishedTiles.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,mCAAmC,CAAA;AACnF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAIhF,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,2FAA2F;AAC3F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2BnG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,OAAO,EAAE,CAStG;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,gBAAgB,EAAE,EACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,EAAE,CAwCX"}
1
+ {"version":3,"file":"publishedTiles.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,mCAAmC,CAAA;AACnF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAIhF,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,2FAA2F;AAC3F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2BnG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,OAAO,EAAE,CAStG;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,gBAAgB,EAAE,EACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,EAAE,CAwCX"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"sourcesContent":["import type { Dataset, LayerGeometryType } from '../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\n\r\n/** Tables our publish pipeline creates; served via the cdt_tiles function source. */\r\nexport function isPublishedOrgTable(name: string): boolean {\r\n return /^org_\\d+_file_\\d+$/.test(name)\r\n}\r\n\r\n/** What a published open-data dataset resolves to: its Martin table + backing File row. */\r\nexport interface PublishedCatalogEntry {\r\n fileId: number\r\n table: string\r\n geometryType?: string\r\n}\r\n\r\ninterface CatalogFileRow {\r\n id?: number | null\r\n assetId?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build a lookup from `/api/files` of open-data datasets that have already been\r\n * published to Martin tiles, keyed by `\"{portalId}:{datasetId}\"` — the identity\r\n * of the *original* portal dataset.\r\n *\r\n * Catalog publishes mint a File whose `assetId` is `odp:{portalId}:{datasetId}`\r\n * and whose description carries `portalId`/`datasetId` + `tiledTable`. The\r\n * original portal entry (shown on the National/Applied/All tabs) keeps its own\r\n * id, so without this map those tabs cannot tell the dataset is already tiled.\r\n */\r\nexport function buildPublishedCatalogMap(rows: CatalogFileRow[]): Map<string, PublishedCatalogEntry> {\r\n const map = new Map<string, PublishedCatalogEntry>()\r\n for (const row of rows) {\r\n if (typeof row?.id !== 'number' || !row.description) continue\r\n let desc: { source?: unknown, portalId?: unknown, datasetId?: unknown, tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n if (desc.source !== 'open-data-portal') continue\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n // Prefer the structured fields; fall back to parsing the synthetic assetId.\r\n let portalId = typeof desc.portalId === 'number' ? String(desc.portalId) : null\r\n let datasetId = typeof desc.datasetId === 'string' ? desc.datasetId : null\r\n if ((!portalId || !datasetId) && typeof row.assetId === 'string') {\r\n const m = /^odp:([^:]+):(.+)$/.exec(row.assetId)\r\n if (m) { portalId = portalId ?? m[1]; datasetId = datasetId ?? m[2] }\r\n }\r\n if (!portalId || !datasetId) continue\r\n\r\n map.set(`${portalId}:${datasetId}`, {\r\n fileId: row.id,\r\n table,\r\n geometryType: typeof desc.geometryType === 'string' ? desc.geometryType : undefined,\r\n })\r\n }\r\n return map\r\n}\r\n\r\n/**\r\n * Tag any dataset whose `portal.id:id` is in the published-catalog map with the\r\n * `publishedTable`/`publishedFileId` it resolves to, so RowActions renders it as\r\n * converted (and can un-publish it) wherever it appears — not only on the\r\n * organizational tab, which is the one place that holds the tiled representation.\r\n * Datasets that aren't published, or have no portal/id, are returned unchanged.\r\n */\r\nexport function stampPublished(datasets: Dataset[], map: Map<string, PublishedCatalogEntry>): Dataset[] {\r\n if (map.size === 0) return datasets\r\n return datasets.map((d) => {\r\n const portalId = d.portal?.id\r\n if (portalId == null || d.id == null) return d\r\n const entry = map.get(`${portalId}:${d.id}`)\r\n if (!entry) return d\r\n return { ...d, publishedTable: entry.table, publishedFileId: entry.fileId }\r\n })\r\n}\r\n\r\nexport interface PublishedFileRow {\r\n name?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build MVT Dataset entries for published tiles from File-row metadata (/api/files),\r\n * pointing each at the cdt_tiles function source. The renderer derives source-layer from\r\n * dataset.id (= the table name = the MVT layer name the function emits), so no serviceInfo\r\n * is needed. layerType comes from the geometryType stamped at publish time.\r\n */\r\nexport function buildPublishedTileDatasets(\r\n rows: PublishedFileRow[],\r\n tileBaseUrl: string,\r\n portal: OpenDataPortal,\r\n): Dataset[] {\r\n const base = tileBaseUrl.replace(/\\/+$/, '')\r\n const out: Dataset[] = []\r\n for (const row of rows) {\r\n if (!row?.description) continue\r\n let desc: { tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n const name = (row.name ?? table).replace(/\\.geojson$/i, '')\r\n const layerType = (typeof desc.geometryType === 'string' ? desc.geometryType : undefined) as LayerGeometryType | undefined\r\n const tileUrl = `${base}/cdt_tiles/{z}/{x}/{y}?source=${table}`\r\n\r\n const getFields = async () => []\r\n const getFeatures = async (): Promise<AllGeoJSON> =>\r\n ({ type: 'FeatureCollection', features: [] } as AllGeoJSON)\r\n\r\n out.push({\r\n id: table,\r\n name,\r\n publisher: 'Martin Server',\r\n dataManagementSystem: 'other',\r\n description: `Published vector tile layer: ${table}`,\r\n countrySubdivision: portal.countrySubdivision ?? '',\r\n municipality: portal.municipality ?? '',\r\n type: 'MVT',\r\n datasetType: 'MVT',\r\n url: tileUrl,\r\n information: tileUrl,\r\n portal,\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(name),\r\n layerType,\r\n getFields,\r\n getFeatures,\r\n } as Dataset)\r\n }\r\n return out\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset, LayerGeometryType } from '../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\n\r\n/** Tables our publish pipeline creates; served via the cdt_tiles function source. */\r\nexport function isPublishedOrgTable(name: string): boolean {\r\n return /^org_\\d+_file_\\d+$/.test(name)\r\n}\r\n\r\n/** What a published open-data dataset resolves to: its Martin table + backing File row. */\r\nexport interface PublishedCatalogEntry {\r\n fileId: number\r\n table: string\r\n geometryType?: string\r\n}\r\n\r\ninterface CatalogFileRow {\r\n id?: number | null\r\n assetId?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build a lookup from `/api/files` of open-data datasets that have already been\r\n * published to Martin tiles, keyed by `\"{portalId}:{datasetId}\"` — the identity\r\n * of the *original* portal dataset.\r\n *\r\n * Catalog publishes mint a File whose `assetId` is `odp:{portalId}:{datasetId}`\r\n * and whose description carries `portalId`/`datasetId` + `tiledTable`. The\r\n * original portal entry (shown on the National/Applied/All tabs) keeps its own\r\n * id, so without this map those tabs cannot tell the dataset is already tiled.\r\n */\r\nexport function buildPublishedCatalogMap(rows: CatalogFileRow[]): Map<string, PublishedCatalogEntry> {\r\n const map = new Map<string, PublishedCatalogEntry>()\r\n for (const row of rows) {\r\n if (typeof row?.id !== 'number' || !row.description) continue\r\n let desc: { source?: unknown, portalId?: unknown, datasetId?: unknown, tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n if (desc.source !== 'open-data-portal') continue\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n // Prefer the structured fields; fall back to parsing the synthetic assetId.\r\n let portalId = typeof desc.portalId === 'number' ? String(desc.portalId) : null\r\n let datasetId = typeof desc.datasetId === 'string' ? desc.datasetId : null\r\n if ((!portalId || !datasetId) && typeof row.assetId === 'string') {\r\n const m = /^odp:([^:]+):(.+)$/.exec(row.assetId)\r\n if (m) { portalId = portalId ?? m[1]; datasetId = datasetId ?? m[2] }\r\n }\r\n if (!portalId || !datasetId) continue\r\n\r\n map.set(`${portalId}:${datasetId}`, {\r\n fileId: row.id,\r\n table,\r\n geometryType: typeof desc.geometryType === 'string' ? desc.geometryType : undefined,\r\n })\r\n }\r\n return map\r\n}\r\n\r\n/**\r\n * Tag any dataset whose `portal.id:id` is in the published-catalog map with the\r\n * `publishedTable`/`publishedFileId` it resolves to, so RowActions renders it as\r\n * converted (and can un-publish it) wherever it appears — not only on the\r\n * organizational tab, which is the one place that holds the tiled representation.\r\n * Datasets that aren't published, or have no portal/id, are returned unchanged.\r\n */\r\nexport function stampPublished(datasets: Dataset[], map: Map<string, PublishedCatalogEntry>): Dataset[] {\r\n if (map.size === 0) return datasets\r\n return datasets.map((d) => {\r\n const portalId = d.portal?.id\r\n if (portalId == null || d.id == null) return d\r\n const entry = map.get(`${portalId}:${d.id}`)\r\n if (!entry) return d\r\n return { ...d, publishedTable: entry.table, publishedFileId: entry.fileId }\r\n })\r\n}\r\n\r\nexport interface PublishedFileRow {\r\n name?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build MVT Dataset entries for published tiles from File-row metadata (/api/files),\r\n * pointing each at the cdt_tiles function source. The renderer derives source-layer from\r\n * dataset.id (= the table name = the MVT layer name the function emits), so no serviceInfo\r\n * is needed. layerType comes from the geometryType stamped at publish time.\r\n */\r\nexport function buildPublishedTileDatasets(\r\n rows: PublishedFileRow[],\r\n tileBaseUrl: string,\r\n portal: OpenDataPortal,\r\n): Dataset[] {\r\n const base = tileBaseUrl.replace(/\\/+$/, '')\r\n const out: Dataset[] = []\r\n for (const row of rows) {\r\n if (!row?.description) continue\r\n let desc: { tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n const name = (row.name ?? table).replace(/\\.geojson$/i, '')\r\n const layerType = (typeof desc.geometryType === 'string' ? desc.geometryType : undefined) as LayerGeometryType | undefined\r\n const tileUrl = `${base}/cdt_tiles/{z}/{x}/{y}?source=${table}`\r\n\r\n const getFields = async () => []\r\n const getFeatures = async (): Promise<AllGeoJSON> =>\r\n ({ type: 'FeatureCollection', features: [] } as AllGeoJSON)\r\n\r\n out.push({\r\n id: table,\r\n name,\r\n publisher: 'Martin Server',\r\n dataManagementSystem: 'other',\r\n description: `Published vector tile layer: ${table}`,\r\n countrySubdivision: portal.countrySubdivision ?? '',\r\n municipality: portal.municipality ?? '',\r\n type: 'MVT',\r\n datasetType: 'MVT',\r\n url: tileUrl,\r\n information: tileUrl,\r\n portal,\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(name),\r\n layerType,\r\n getFields,\r\n getFeatures,\r\n } as Dataset)\r\n }\r\n return out\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"socrataDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/socrataDatasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,mCAAmC,CAAA;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AA0YlE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CAkSpB"}
1
+ {"version":3,"file":"socrataDatasets.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/socrataDatasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,mCAAmC,CAAA;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AA0YlE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CAkSpB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/socrataDatasets.ts"],"sourcesContent":["import type { Dataset, FieldType } from '../../../../../types/datasetTypes'\r\nimport type { OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { DataManagementSystem } from '../../../../../types/dbTypes'\r\nimport { formatDate, 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\n\r\nconst DISCOVERY_PAGE_SIZE = 100\r\nconst MAX_DISCOVERED_DATASETS = 400\r\nconst FEATURE_PAGE_SIZE = 500\r\nconst MAX_FEATURES = 5_000\r\nconst RETRY_BASE_MS = 500\r\nconst MAX_RETRIES = 2\r\n\r\nconst socrataGeoTypes = new Set([\r\n 'point',\r\n 'multipoint',\r\n 'line',\r\n 'multiline',\r\n 'polygon',\r\n 'multipolygon',\r\n 'location',\r\n 'geometry',\r\n])\r\n\r\nfunction delay(ms: number) {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\nfunction parseRetryAfterMs(value: string | null): number | null {\r\n if (!value) return null\r\n\r\n const numeric = Number(value)\r\n if (Number.isFinite(numeric) && numeric >= 0) {\r\n return Math.min(Math.floor(numeric * 1000), 15_000)\r\n }\r\n\r\n const asDate = Date.parse(value)\r\n if (Number.isNaN(asDate)) return null\r\n\r\n const deltaMs = asDate - Date.now()\r\n if (deltaMs <= 0) return 0\r\n return Math.min(deltaMs, 15_000)\r\n}\r\n\r\nfunction toIsoDate(value: unknown): string {\r\n if (value == null) return ''\r\n\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n const ms = value > 9_999_999_999 ? value : value * 1000\r\n return formatDate(new Date(ms).toISOString())\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (!trimmed) return ''\r\n\r\n const asNumber = Number(trimmed)\r\n if (Number.isFinite(asNumber)) {\r\n const ms = asNumber > 9_999_999_999 ? asNumber : asNumber * 1000\r\n return formatDate(new Date(ms).toISOString())\r\n }\r\n\r\n return formatDate(trimmed)\r\n }\r\n\r\n return ''\r\n}\r\n\r\nfunction normalizeSocrataOrigin(apiUrl?: string | null): string | null {\r\n if (!apiUrl) return null\r\n\r\n const trimmed = apiUrl.trim()\r\n if (!trimmed) return null\r\n\r\n const withScheme = /^https?:\\/\\//i.test(trimmed)\r\n ? trimmed\r\n : `https://${trimmed}`\r\n\r\n try {\r\n const parsed = new URL(withScheme)\r\n return parsed.origin\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction extractViewIdFromUrl(apiUrl?: string | null): string | null {\r\n if (!apiUrl) return null\r\n\r\n const viewMatch = apiUrl.match(/\\/api\\/v3\\/views\\/([a-z0-9-]{9})\\//i)\r\n if (viewMatch?.[1]) return viewMatch[1]\r\n\r\n const discoverMatch = apiUrl.match(/\\/d\\/([a-z0-9-]{9})/i)\r\n if (discoverMatch?.[1]) return discoverMatch[1]\r\n\r\n return null\r\n}\r\n\r\nfunction buildServerHeaders() {\r\n const headers: HeadersInit = {\r\n 'User-Agent': 'Mozilla/5.0 (compatible; CDT-OP/1.0)',\r\n }\r\n\r\n const appToken = process.env.SOCRATA_APP_TOKEN || process.env.NEXT_PUBLIC_SOCRATA_APP_TOKEN\r\n if (appToken) {\r\n headers['X-App-Token'] = appToken\r\n }\r\n\r\n return headers\r\n}\r\n\r\nasync function fetchWithRetry(target: string, isServer: boolean): Promise<Response> {\r\n const requestTarget = isServer\r\n ? target\r\n : `/api/socrataProxy?url=${encodeURIComponent(target)}`\r\n\r\n const requestInit: RequestInit = isServer\r\n ? { headers: buildServerHeaders() }\r\n : {}\r\n\r\n let attempt = 0\r\n let lastError: unknown = null\r\n\r\n while (attempt <= MAX_RETRIES) {\r\n try {\r\n const response = await fetch(requestTarget, requestInit)\r\n\r\n // Retry on throttling and transient server errors.\r\n if ((response.status === 429 || response.status >= 500) && attempt < MAX_RETRIES) {\r\n const retryAfterMs = parseRetryAfterMs(response.headers.get('retry-after'))\r\n const backoffMs = retryAfterMs ?? Math.min(RETRY_BASE_MS * (2 ** attempt), 5_000)\r\n await delay(backoffMs)\r\n attempt += 1\r\n continue\r\n }\r\n\r\n return response\r\n }\r\n catch (error) {\r\n lastError = error\r\n if (attempt >= MAX_RETRIES) break\r\n\r\n await delay(Math.min(RETRY_BASE_MS * (2 ** attempt), 5_000))\r\n attempt += 1\r\n }\r\n }\r\n\r\n throw lastError instanceof Error\r\n ? lastError\r\n : new Error('Socrata request failed')\r\n}\r\n\r\nfunction mapSocrataFieldType(rawType: unknown): FieldType {\r\n const type = String(rawType || '').toLowerCase()\r\n\r\n if (\r\n [\r\n 'number',\r\n 'money',\r\n 'double',\r\n 'float',\r\n 'percent',\r\n 'smallint',\r\n 'bigint',\r\n 'meta_data',\r\n ].includes(type)\r\n ) {\r\n return 'number'\r\n }\r\n\r\n if (['checkbox', 'boolean'].includes(type)) {\r\n return 'boolean'\r\n }\r\n\r\n if (\r\n [\r\n 'calendar date',\r\n 'date',\r\n 'fixed_timestamp',\r\n 'floating_timestamp',\r\n 'timestamp',\r\n ].includes(type)\r\n ) {\r\n return 'datetime'\r\n }\r\n\r\n if (\r\n [\r\n 'point',\r\n 'multipoint',\r\n 'line',\r\n 'multiline',\r\n 'polygon',\r\n 'multipolygon',\r\n 'location',\r\n 'geometry',\r\n 'json',\r\n 'object',\r\n ].includes(type)\r\n ) {\r\n return 'object'\r\n }\r\n\r\n if (type.includes('id')) {\r\n return 'id'\r\n }\r\n\r\n return 'string'\r\n}\r\n\r\nfunction hasGeoColumns(view: any): boolean {\r\n const columns = Array.isArray(view?.columns) ? view.columns : []\r\n\r\n if (columns.length === 0) {\r\n return false\r\n }\r\n\r\n return columns.some((column: any) => {\r\n const dataTypeName = String(column?.dataTypeName || column?.datatype || column?.type || '').toLowerCase()\r\n return socrataGeoTypes.has(dataTypeName)\r\n })\r\n}\r\n\r\nfunction hasGeospatialMetadataFlag(view: any): boolean | null {\r\n const flag = view?.metadata?.custom_fields?.['Geospatial Information']?.['Dataset contains geospatial information']\r\n if (typeof flag !== 'string') {\r\n return null\r\n }\r\n\r\n if (/^\\s*(yes|true)\\s*$/i.test(flag)) {\r\n return true\r\n }\r\n\r\n if (/^\\s*(no|false)\\s*$/i.test(flag)) {\r\n return false\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction isLikelyGeospatialView(view: any): boolean {\r\n const geoColumns = hasGeoColumns(view)\r\n if (geoColumns) {\r\n return true\r\n }\r\n\r\n const metadataFlag = hasGeospatialMetadataFlag(view)\r\n if (metadataFlag === true) {\r\n return true\r\n }\r\n\r\n if (metadataFlag === false) {\r\n return false\r\n }\r\n\r\n const columns = Array.isArray(view?.columns) ? view.columns : []\r\n return columns.length === 0\r\n}\r\n\r\nfunction normalizeDiscoveryViews(raw: any): { total: number | null, views: any[] } {\r\n if (Array.isArray(raw?.results)) {\r\n const views = raw.results\r\n .map((item: any) => item?.view || item)\r\n .filter(Boolean)\r\n\r\n return {\r\n total: typeof raw.count === 'number' ? raw.count : null,\r\n views,\r\n }\r\n }\r\n\r\n if (Array.isArray(raw)) {\r\n return {\r\n total: null,\r\n views: raw,\r\n }\r\n }\r\n\r\n return {\r\n total: null,\r\n views: [],\r\n }\r\n}\r\n\r\nasync function discoverSocrataViews(origin: string, isServer: boolean): Promise<any[]> {\r\n const collected: any[] = []\r\n const seenIds = new Set<string>()\r\n\r\n let offset = 0\r\n let totalCount: number | null = null\r\n\r\n while (collected.length < MAX_DISCOVERED_DATASETS) {\r\n const searchUrl = `${origin}/api/search/views.json?limit=${DISCOVERY_PAGE_SIZE}&offset=${offset}`\r\n\r\n let payload: any = null\r\n\r\n try {\r\n const searchResponse = await fetchWithRetry(searchUrl, isServer)\r\n if (searchResponse.ok) {\r\n payload = await searchResponse.json()\r\n }\r\n }\r\n catch (error) {\r\n console.warn('[Socrata] Search discovery request failed, trying fallback endpoint:', error)\r\n }\r\n\r\n if (!payload) {\r\n const fallbackUrl = `${origin}/api/views.json?limit=${DISCOVERY_PAGE_SIZE}&offset=${offset}`\r\n try {\r\n const fallbackResponse = await fetchWithRetry(fallbackUrl, isServer)\r\n if (!fallbackResponse.ok) {\r\n console.warn(`[Socrata] Fallback discovery request failed with status ${fallbackResponse.status}`)\r\n break\r\n }\r\n payload = await fallbackResponse.json()\r\n }\r\n catch (fallbackError) {\r\n console.error('[Socrata] Fallback discovery request failed:', fallbackError)\r\n break\r\n }\r\n }\r\n\r\n const normalized = normalizeDiscoveryViews(payload)\r\n if (typeof normalized.total === 'number') {\r\n totalCount = normalized.total\r\n }\r\n\r\n if (normalized.views.length === 0) {\r\n break\r\n }\r\n\r\n for (const view of normalized.views) {\r\n const id = String(view?.id || '')\r\n if (!id || seenIds.has(id)) continue\r\n\r\n const assetType = String(view?.assetType || view?.type || '').toLowerCase()\r\n if (assetType && !['dataset', 'map'].includes(assetType)) continue\r\n\r\n if (!isLikelyGeospatialView(view)) continue\r\n\r\n seenIds.add(id)\r\n collected.push(view)\r\n\r\n if (collected.length >= MAX_DISCOVERED_DATASETS) {\r\n break\r\n }\r\n }\r\n\r\n offset += DISCOVERY_PAGE_SIZE\r\n\r\n if (totalCount !== null && offset >= totalCount) {\r\n break\r\n }\r\n\r\n if (normalized.views.length < DISCOVERY_PAGE_SIZE) {\r\n break\r\n }\r\n }\r\n\r\n return collected\r\n}\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 index = next++\r\n try {\r\n results[index] = {\r\n status: 'fulfilled',\r\n value: await fn(items[index]),\r\n }\r\n }\r\n catch (reason) {\r\n results[index] = {\r\n status: 'rejected',\r\n reason,\r\n }\r\n }\r\n }\r\n }\r\n\r\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker))\r\n return results\r\n}\r\n\r\nexport async function fetchSocrataDatasets(\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 origin = normalizeSocrataOrigin(apiUrl)\r\n if (!origin) {\r\n return []\r\n }\r\n\r\n try {\r\n const hintedViewId = extractViewIdFromUrl(apiUrl)\r\n const discoveredViews = await discoverSocrataViews(origin, isServer)\r\n\r\n if (discoveredViews.length === 0 && hintedViewId) {\r\n try {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${hintedViewId}.json`, isServer)\r\n if (metadataRes.ok) {\r\n const metadata = await metadataRes.json()\r\n discoveredViews.push(metadata)\r\n }\r\n }\r\n catch {\r\n discoveredViews.push({ id: hintedViewId, name: hintedViewId })\r\n }\r\n }\r\n\r\n if (hintedViewId) {\r\n discoveredViews.sort((a, b) => {\r\n if (a?.id === hintedViewId) return -1\r\n if (b?.id === hintedViewId) return 1\r\n return 0\r\n })\r\n }\r\n\r\n const settled = await withConcurrencyLimit(discoveredViews, 6, async (view: any): Promise<Dataset | null> => {\r\n const viewId = String(view?.id || '')\r\n if (!viewId) return null\r\n\r\n const modifiedVersion =\r\n view?.rowsUpdatedAt\r\n || view?.data_updated_at\r\n || view?.updatedAt\r\n || view?.viewLastModified\r\n || view?.metadata_updated_at\r\n || ''\r\n\r\n const v3QueryBase = `${origin}/api/v3/views/${viewId}/query.geojson`\r\n const legacyQueryBase = `${origin}/resource/${viewId}.geojson`\r\n\r\n const validKey = buildValidationKey('socrata-v2', viewId, modifiedVersion)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const sampleUrl = `${v3QueryBase}?pageNumber=1&pageSize=1`\r\n const sampleRes = await fetchWithRetry(sampleUrl, isServer)\r\n\r\n if (sampleRes.ok) {\r\n const sample = await sampleRes.json()\r\n if (sample?.type !== 'FeatureCollection' || !Array.isArray(sample?.features)) {\r\n return true\r\n }\r\n\r\n if (sample.features.length === 0) {\r\n return true\r\n }\r\n\r\n return sample.features.some((feature: any) => !!feature?.geometry)\r\n }\r\n\r\n if ([400, 401, 403, 404, 405].includes(sampleRes.status)) {\r\n const legacySampleRes = await fetchWithRetry(`${legacyQueryBase}?$limit=1`, isServer)\r\n\r\n if ([401, 403, 404].includes(legacySampleRes.status)) {\r\n return false\r\n }\r\n\r\n if (!legacySampleRes.ok) {\r\n return true\r\n }\r\n\r\n const legacySample = await legacySampleRes.json()\r\n if (legacySample?.type !== 'FeatureCollection' || !Array.isArray(legacySample?.features)) {\r\n return true\r\n }\r\n\r\n if (legacySample.features.length === 0) {\r\n return true\r\n }\r\n\r\n return legacySample.features.some((feature: any) => !!feature?.geometry)\r\n }\r\n\r\n return true\r\n }\r\n catch {\r\n return true\r\n }\r\n })\r\n\r\n if (!isValid) {\r\n return null\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${viewId}.json`, isServer)\r\n if (!metadataRes.ok) return undefined\r\n return await metadataRes.json()\r\n }\r\n catch {\r\n return undefined\r\n }\r\n }\r\n\r\n const getFields = async () => {\r\n const fieldsKey = `fields:socrata:${viewId}:${modifiedVersion}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n\r\n try {\r\n let columns = Array.isArray(view?.columns) ? view.columns : []\r\n\r\n if (columns.length === 0) {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${viewId}.json`, isServer)\r\n if (metadataRes.ok) {\r\n const metadata = await metadataRes.json()\r\n if (Array.isArray(metadata?.columns)) {\r\n columns = metadata.columns\r\n }\r\n }\r\n }\r\n\r\n const fields = columns.map((column: any) => {\r\n const rawType = column?.dataTypeName || column?.datatype || column?.type\r\n return {\r\n name: column?.fieldName || column?.name || '',\r\n label: column?.name || column?.fieldName || '',\r\n type: mapSocrataFieldType(rawType),\r\n socrataType: rawType,\r\n description: column?.description || '',\r\n }\r\n })\r\n\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n catch {\r\n return []\r\n }\r\n }\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n const featuresKey = `features:socrata:${viewId}:${modifiedVersion}`\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) return cached\r\n\r\n try {\r\n const features: any[] = []\r\n let pageNumber = 1\r\n let offset = 0\r\n let mode: 'v3' | 'legacy' = 'v3'\r\n\r\n while (features.length < MAX_FEATURES) {\r\n const pageUrl = mode === 'v3'\r\n ? `${v3QueryBase}?pageNumber=${pageNumber}&pageSize=${FEATURE_PAGE_SIZE}`\r\n : `${legacyQueryBase}?$limit=${FEATURE_PAGE_SIZE}&$offset=${offset}`\r\n\r\n const pageRes = await fetchWithRetry(pageUrl, isServer)\r\n\r\n if (!pageRes.ok) {\r\n if (mode === 'v3' && pageNumber === 1 && [400, 401, 403, 404, 405].includes(pageRes.status)) {\r\n mode = 'legacy'\r\n continue\r\n }\r\n break\r\n }\r\n\r\n const pageJson = await pageRes.json()\r\n if (pageJson?.type !== 'FeatureCollection' || !Array.isArray(pageJson?.features)) {\r\n break\r\n }\r\n\r\n const validFeatures = pageJson.features.filter((feature: any) => !!feature?.geometry)\r\n if (validFeatures.length > 0) {\r\n features.push(...validFeatures.slice(0, MAX_FEATURES - features.length))\r\n }\r\n\r\n const fetchedCount = pageJson.features.length\r\n if (fetchedCount < FEATURE_PAGE_SIZE || fetchedCount === 0) {\r\n break\r\n }\r\n\r\n if (mode === 'v3') {\r\n pageNumber += 1\r\n }\r\n else {\r\n offset += FEATURE_PAGE_SIZE\r\n }\r\n }\r\n\r\n const result = {\r\n type: 'FeatureCollection',\r\n features,\r\n } as AllGeoJSON\r\n\r\n setCache(featuresKey, result, 60 * 60 * 1000)\r\n return result\r\n }\r\n catch (error) {\r\n console.error(`Socrata: Error fetching features for dataset ${viewId}:`, error)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n }\r\n\r\n const rawName = String(view?.name || viewId)\r\n const name = formatName(rawName)\r\n\r\n const keywords = [\r\n ...(Array.isArray(view?.tags) ? view.tags : []),\r\n ...(Array.isArray(view?.classification?.domain_tags) ? view.classification.domain_tags : []),\r\n ]\r\n .map((tag: unknown) => String(tag || '').trim())\r\n .filter(Boolean)\r\n\r\n const publisher =\r\n view?.attribution\r\n || view?.owner?.displayName\r\n || view?.creator?.display_name\r\n || 'Unknown'\r\n\r\n const license =\r\n view?.license?.name\r\n || view?.metadata?.license\r\n || 'Unknown'\r\n\r\n const dateReleased = toIsoDate(view?.createdAt || view?.created_at || view?.publicationDate)\r\n const dateUpdated = toIsoDate(\r\n view?.rowsUpdatedAt\r\n || view?.data_updated_at\r\n || view?.updatedAt\r\n || view?.viewLastModified,\r\n )\r\n\r\n const information =\r\n view?.permalink\r\n || view?.link\r\n || `${origin}/d/${viewId}`\r\n\r\n return {\r\n id: viewId,\r\n name,\r\n url: information,\r\n sourceUrl: `${legacyQueryBase}`,\r\n publisher,\r\n dataManagementSystem: DataManagementSystem.Socrata,\r\n license,\r\n contact: view?.contact_email || view?.owner?.displayName || 'Unknown',\r\n keywords,\r\n description: stripHtml(view?.description || 'No description available'),\r\n dateReleased,\r\n dateUpdated,\r\n information,\r\n countrySubdivision,\r\n municipality,\r\n type: view?.viewType || 'GeoJSON',\r\n datasetType: '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 const datasets: Dataset[] = []\r\n for (const result of settled) {\r\n if (result.status === 'fulfilled' && result.value) {\r\n datasets.push(result.value)\r\n }\r\n }\r\n\r\n return datasets\r\n }\r\n catch (error) {\r\n console.error(`Error fetching Socrata datasets for ${portal.name}:`, error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"AAEA,SAAS,4BAA4B;AACrC,SAAS,YAAY,YAAY,iBAAiB;AAElD,SAAS,oBAAoB,UAAU,UAAU,iBAAiB;AAClE,SAAS,wBAAwB;AAEjC,MAAM,sBAAsB;AAC5B,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAC1B,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,cAAc;AAEpB,MAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,MAAM,IAAY;AACzB,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;AAEA,SAAS,kBAAkB,OAAqC;AAC9D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC5C,WAAO,KAAK,IAAI,KAAK,MAAM,UAAU,GAAI,GAAG,IAAM;AAAA,EACpD;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AAEjC,QAAM,UAAU,SAAS,KAAK,IAAI;AAClC,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO,KAAK,IAAI,SAAS,IAAM;AACjC;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,UAAM,KAAK,QAAQ,aAAgB,QAAQ,QAAQ;AACnD,WAAO,WAAW,IAAI,KAAK,EAAE,EAAE,YAAY,CAAC;AAAA,EAC9C;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,WAAW,OAAO,OAAO;AAC/B,QAAI,OAAO,SAAS,QAAQ,GAAG;AAC7B,YAAM,KAAK,WAAW,aAAgB,WAAW,WAAW;AAC5D,aAAO,WAAW,IAAI,KAAK,EAAE,EAAE,YAAY,CAAC;AAAA,IAC9C;AAEA,WAAO,WAAW,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAuC;AACrE,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,aAAa,gBAAgB,KAAK,OAAO,IAC3C,UACA,WAAW,OAAO;AAEtB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,UAAU;AACjC,WAAO,OAAO;AAAA,EAChB,SACM;AACJ,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,QAAuC;AACnE,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,YAAY,OAAO,MAAM,qCAAqC;AACpE,MAAI,uCAAY,GAAI,QAAO,UAAU,CAAC;AAEtC,QAAM,gBAAgB,OAAO,MAAM,sBAAsB;AACzD,MAAI,+CAAgB,GAAI,QAAO,cAAc,CAAC;AAE9C,SAAO;AACT;AAEA,SAAS,qBAAqB;AAC5B,QAAM,UAAuB;AAAA,IAC3B,cAAc;AAAA,EAChB;AAEA,QAAM,WAAW,QAAQ,IAAI,qBAAqB,QAAQ,IAAI;AAC9D,MAAI,UAAU;AACZ,YAAQ,aAAa,IAAI;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,QAAgB,UAAsC;AAClF,QAAM,gBAAgB,WAClB,SACA,yBAAyB,mBAAmB,MAAM,CAAC;AAEvD,QAAM,cAA2B,WAC7B,EAAE,SAAS,mBAAmB,EAAE,IAChC,CAAC;AAEL,MAAI,UAAU;AACd,MAAI,YAAqB;AAEzB,SAAO,WAAW,aAAa;AAC7B,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,eAAe,WAAW;AAGvD,WAAK,SAAS,WAAW,OAAO,SAAS,UAAU,QAAQ,UAAU,aAAa;AAChF,cAAM,eAAe,kBAAkB,SAAS,QAAQ,IAAI,aAAa,CAAC;AAC1E,cAAM,YAAY,sCAAgB,KAAK,IAAI,gBAAiB,KAAK,SAAU,GAAK;AAChF,cAAM,MAAM,SAAS;AACrB,mBAAW;AACX;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SACO,OAAO;AACZ,kBAAY;AACZ,UAAI,WAAW,YAAa;AAE5B,YAAM,MAAM,KAAK,IAAI,gBAAiB,KAAK,SAAU,GAAK,CAAC;AAC3D,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,qBAAqB,QACvB,YACA,IAAI,MAAM,wBAAwB;AACxC;AAEA,SAAS,oBAAoB,SAA6B;AACxD,QAAM,OAAO,OAAO,WAAW,EAAE,EAAE,YAAY;AAE/C,MACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,IAAI,GACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,SAAS,EAAE,SAAS,IAAI,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,MACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,IAAI,GACf;AACA,WAAO;AAAA,EACT;AAEA,MACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,IAAI,GACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAoB;AACzC,QAAM,UAAU,MAAM,QAAQ,6BAAM,OAAO,IAAI,KAAK,UAAU,CAAC;AAE/D,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,KAAK,CAAC,WAAgB;AACnC,UAAM,eAAe,QAAO,iCAAQ,kBAAgB,iCAAQ,cAAY,iCAAQ,SAAQ,EAAE,EAAE,YAAY;AACxG,WAAO,gBAAgB,IAAI,YAAY;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,0BAA0B,MAA2B;AAlO9D;AAmOE,QAAM,QAAO,8CAAM,aAAN,mBAAgB,kBAAhB,mBAAgC,8BAAhC,mBAA4D;AACzE,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,KAAK,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,KAAK,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAoB;AAClD,QAAM,aAAa,cAAc,IAAI;AACrC,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,0BAA0B,IAAI;AACnD,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,QAAQ,6BAAM,OAAO,IAAI,KAAK,UAAU,CAAC;AAC/D,SAAO,QAAQ,WAAW;AAC5B;AAEA,SAAS,wBAAwB,KAAkD;AACjF,MAAI,MAAM,QAAQ,2BAAK,OAAO,GAAG;AAC/B,UAAM,QAAQ,IAAI,QACf,IAAI,CAAC,UAAc,6BAAM,SAAQ,IAAI,EACrC,OAAO,OAAO;AAEjB,WAAO;AAAA,MACL,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,qBAAqB,QAAgB,UAAmC;AACrF,QAAM,YAAmB,CAAC;AAC1B,QAAM,UAAU,oBAAI,IAAY;AAEhC,MAAI,SAAS;AACb,MAAI,aAA4B;AAEhC,SAAO,UAAU,SAAS,yBAAyB;AACjD,UAAM,YAAY,GAAG,MAAM,gCAAgC,mBAAmB,WAAW,MAAM;AAE/F,QAAI,UAAe;AAEnB,QAAI;AACF,YAAM,iBAAiB,MAAM,eAAe,WAAW,QAAQ;AAC/D,UAAI,eAAe,IAAI;AACrB,kBAAU,MAAM,eAAe,KAAK;AAAA,MACtC;AAAA,IACF,SACO,OAAO;AACZ,cAAQ,KAAK,wEAAwE,KAAK;AAAA,IAC5F;AAEA,QAAI,CAAC,SAAS;AACZ,YAAM,cAAc,GAAG,MAAM,yBAAyB,mBAAmB,WAAW,MAAM;AAC1F,UAAI;AACF,cAAM,mBAAmB,MAAM,eAAe,aAAa,QAAQ;AACnE,YAAI,CAAC,iBAAiB,IAAI;AACxB,kBAAQ,KAAK,2DAA2D,iBAAiB,MAAM,EAAE;AACjG;AAAA,QACF;AACA,kBAAU,MAAM,iBAAiB,KAAK;AAAA,MACxC,SACO,eAAe;AACpB,gBAAQ,MAAM,gDAAgD,aAAa;AAC3E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,wBAAwB,OAAO;AAClD,QAAI,OAAO,WAAW,UAAU,UAAU;AACxC,mBAAa,WAAW;AAAA,IAC1B;AAEA,QAAI,WAAW,MAAM,WAAW,GAAG;AACjC;AAAA,IACF;AAEA,eAAW,QAAQ,WAAW,OAAO;AACnC,YAAM,KAAK,QAAO,6BAAM,OAAM,EAAE;AAChC,UAAI,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAG;AAE5B,YAAM,YAAY,QAAO,6BAAM,eAAa,6BAAM,SAAQ,EAAE,EAAE,YAAY;AAC1E,UAAI,aAAa,CAAC,CAAC,WAAW,KAAK,EAAE,SAAS,SAAS,EAAG;AAE1D,UAAI,CAAC,uBAAuB,IAAI,EAAG;AAEnC,cAAQ,IAAI,EAAE;AACd,gBAAU,KAAK,IAAI;AAEnB,UAAI,UAAU,UAAU,yBAAyB;AAC/C;AAAA,MACF;AAAA,IACF;AAEA,cAAU;AAEV,QAAI,eAAe,QAAQ,UAAU,YAAY;AAC/C;AAAA,IACF;AAEA,QAAI,WAAW,MAAM,SAAS,qBAAqB;AACjD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,qBACb,OACA,OACA,IACoC;AACpC,QAAM,UAAqC,IAAI,MAAM,MAAM,MAAM;AACjE,MAAI,OAAO;AAEX,iBAAe,SAAS;AACtB,WAAO,OAAO,MAAM,QAAQ;AAC1B,YAAM,QAAQ;AACd,UAAI;AACF,gBAAQ,KAAK,IAAI;AAAA,UACf,QAAQ;AAAA,UACR,OAAO,MAAM,GAAG,MAAM,KAAK,CAAC;AAAA,QAC9B;AAAA,MACF,SACO,QAAQ;AACb,gBAAQ,KAAK,IAAI;AAAA,UACf,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,MAAM,MAAM,EAAE,GAAG,MAAM,CAAC;AAC/E,SAAO;AACT;AAEA,eAAsB,qBACpB,QACoB;AACpB,QAAM,EAAE,QAAQ,oBAAoB,cAAc,MAAM,IAAI;AAC5D,QAAM,WAAW,OAAO,WAAW;AAEnC,QAAM,SAAS,uBAAuB,MAAM;AAC5C,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,eAAe,qBAAqB,MAAM;AAChD,UAAM,kBAAkB,MAAM,qBAAqB,QAAQ,QAAQ;AAEnE,QAAI,gBAAgB,WAAW,KAAK,cAAc;AAChD,UAAI;AACF,cAAM,cAAc,MAAM,eAAe,GAAG,MAAM,cAAc,YAAY,SAAS,QAAQ;AAC7F,YAAI,YAAY,IAAI;AAClB,gBAAM,WAAW,MAAM,YAAY,KAAK;AACxC,0BAAgB,KAAK,QAAQ;AAAA,QAC/B;AAAA,MACF,SACM;AACJ,wBAAgB,KAAK,EAAE,IAAI,cAAc,MAAM,aAAa,CAAC;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,sBAAgB,KAAK,CAAC,GAAG,MAAM;AAC7B,aAAI,uBAAG,QAAO,aAAc,QAAO;AACnC,aAAI,uBAAG,QAAO,aAAc,QAAO;AACnC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,MAAM,qBAAqB,iBAAiB,GAAG,OAAO,SAAuC;AA/ajH;AAgbM,YAAM,SAAS,QAAO,6BAAM,OAAM,EAAE;AACpC,UAAI,CAAC,OAAQ,QAAO;AAEpB,YAAM,mBACJ,6BAAM,mBACH,6BAAM,qBACN,6BAAM,eACN,6BAAM,sBACN,6BAAM,wBACN;AAEL,YAAM,cAAc,GAAG,MAAM,iBAAiB,MAAM;AACpD,YAAM,kBAAkB,GAAG,MAAM,aAAa,MAAM;AAEpD,YAAM,WAAW,mBAAmB,cAAc,QAAQ,eAAe;AACzE,YAAM,UAAU,MAAM,UAAmB,UAAU,KAAK,KAAK,KAAK,KAAM,YAAY;AAClF,YAAI;AACF,gBAAM,YAAY,GAAG,WAAW;AAChC,gBAAM,YAAY,MAAM,eAAe,WAAW,QAAQ;AAE1D,cAAI,UAAU,IAAI;AAChB,kBAAM,SAAS,MAAM,UAAU,KAAK;AACpC,iBAAI,iCAAQ,UAAS,uBAAuB,CAAC,MAAM,QAAQ,iCAAQ,QAAQ,GAAG;AAC5E,qBAAO;AAAA,YACT;AAEA,gBAAI,OAAO,SAAS,WAAW,GAAG;AAChC,qBAAO;AAAA,YACT;AAEA,mBAAO,OAAO,SAAS,KAAK,CAAC,YAAiB,CAAC,EAAC,mCAAS,SAAQ;AAAA,UACnE;AAEA,cAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,UAAU,MAAM,GAAG;AACxD,kBAAM,kBAAkB,MAAM,eAAe,GAAG,eAAe,aAAa,QAAQ;AAEpF,gBAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,gBAAgB,MAAM,GAAG;AACpD,qBAAO;AAAA,YACT;AAEA,gBAAI,CAAC,gBAAgB,IAAI;AACvB,qBAAO;AAAA,YACT;AAEA,kBAAM,eAAe,MAAM,gBAAgB,KAAK;AAChD,iBAAI,6CAAc,UAAS,uBAAuB,CAAC,MAAM,QAAQ,6CAAc,QAAQ,GAAG;AACxF,qBAAO;AAAA,YACT;AAEA,gBAAI,aAAa,SAAS,WAAW,GAAG;AACtC,qBAAO;AAAA,YACT;AAEA,mBAAO,aAAa,SAAS,KAAK,CAAC,YAAiB,CAAC,EAAC,mCAAS,SAAQ;AAAA,UACzE;AAEA,iBAAO;AAAA,QACT,SACM;AACJ,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,YAAY;AAClC,YAAI;AACF,gBAAM,cAAc,MAAM,eAAe,GAAG,MAAM,cAAc,MAAM,SAAS,QAAQ;AACvF,cAAI,CAAC,YAAY,GAAI,QAAO;AAC5B,iBAAO,MAAM,YAAY,KAAK;AAAA,QAChC,SACM;AACJ,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,YAAY,YAAY;AAC5B,cAAM,YAAY,kBAAkB,MAAM,IAAI,eAAe;AAC7D,cAAM,SAAS,SAAgB,SAAS;AACxC,YAAI,OAAQ,QAAO;AAEnB,YAAI;AACF,cAAI,UAAU,MAAM,QAAQ,6BAAM,OAAO,IAAI,KAAK,UAAU,CAAC;AAE7D,cAAI,QAAQ,WAAW,GAAG;AACxB,kBAAM,cAAc,MAAM,eAAe,GAAG,MAAM,cAAc,MAAM,SAAS,QAAQ;AACvF,gBAAI,YAAY,IAAI;AAClB,oBAAM,WAAW,MAAM,YAAY,KAAK;AACxC,kBAAI,MAAM,QAAQ,qCAAU,OAAO,GAAG;AACpC,0BAAU,SAAS;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,SAAS,QAAQ,IAAI,CAAC,WAAgB;AAC1C,kBAAM,WAAU,iCAAQ,kBAAgB,iCAAQ,cAAY,iCAAQ;AACpE,mBAAO;AAAA,cACL,OAAM,iCAAQ,eAAa,iCAAQ,SAAQ;AAAA,cAC3C,QAAO,iCAAQ,UAAQ,iCAAQ,cAAa;AAAA,cAC5C,MAAM,oBAAoB,OAAO;AAAA,cACjC,aAAa;AAAA,cACb,cAAa,iCAAQ,gBAAe;AAAA,YACtC;AAAA,UACF,CAAC;AAED,mBAAS,WAAW,QAAQ,KAAK,KAAK,KAAK,GAAI;AAC/C,iBAAO;AAAA,QACT,SACM;AACJ,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAEA,YAAM,cAAc,YAAiC;AACnD,cAAM,cAAc,oBAAoB,MAAM,IAAI,eAAe;AACjE,cAAM,SAAS,SAAqB,WAAW;AAC/C,YAAI,OAAQ,QAAO;AAEnB,YAAI;AACF,gBAAM,WAAkB,CAAC;AACzB,cAAI,aAAa;AACjB,cAAI,SAAS;AACb,cAAI,OAAwB;AAE5B,iBAAO,SAAS,SAAS,cAAc;AACrC,kBAAM,UAAU,SAAS,OACrB,GAAG,WAAW,eAAe,UAAU,aAAa,iBAAiB,KACrE,GAAG,eAAe,WAAW,iBAAiB,YAAY,MAAM;AAEpE,kBAAM,UAAU,MAAM,eAAe,SAAS,QAAQ;AAEtD,gBAAI,CAAC,QAAQ,IAAI;AACf,kBAAI,SAAS,QAAQ,eAAe,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,QAAQ,MAAM,GAAG;AAC3F,uBAAO;AACP;AAAA,cACF;AACA;AAAA,YACF;AAEA,kBAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,iBAAI,qCAAU,UAAS,uBAAuB,CAAC,MAAM,QAAQ,qCAAU,QAAQ,GAAG;AAChF;AAAA,YACF;AAEA,kBAAM,gBAAgB,SAAS,SAAS,OAAO,CAAC,YAAiB,CAAC,EAAC,mCAAS,SAAQ;AACpF,gBAAI,cAAc,SAAS,GAAG;AAC5B,uBAAS,KAAK,GAAG,cAAc,MAAM,GAAG,eAAe,SAAS,MAAM,CAAC;AAAA,YACzE;AAEA,kBAAM,eAAe,SAAS,SAAS;AACvC,gBAAI,eAAe,qBAAqB,iBAAiB,GAAG;AAC1D;AAAA,YACF;AAEA,gBAAI,SAAS,MAAM;AACjB,4BAAc;AAAA,YAChB,OACK;AACH,wBAAU;AAAA,YACZ;AAAA,UACF;AAEA,gBAAM,SAAS;AAAA,YACb,MAAM;AAAA,YACN;AAAA,UACF;AAEA,mBAAS,aAAa,QAAQ,KAAK,KAAK,GAAI;AAC5C,iBAAO;AAAA,QACT,SACO,OAAO;AACZ,kBAAQ,MAAM,gDAAgD,MAAM,KAAK,KAAK;AAC9E,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,QAAO,6BAAM,SAAQ,MAAM;AAC3C,YAAM,OAAO,WAAW,OAAO;AAE/B,YAAM,WAAW;AAAA,QACf,GAAI,MAAM,QAAQ,6BAAM,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,QAC7C,GAAI,MAAM,SAAQ,kCAAM,mBAAN,mBAAsB,WAAW,IAAI,KAAK,eAAe,cAAc,CAAC;AAAA,MAC5F,EACG,IAAI,CAAC,QAAiB,OAAO,OAAO,EAAE,EAAE,KAAK,CAAC,EAC9C,OAAO,OAAO;AAEjB,YAAM,aACJ,6BAAM,kBACH,kCAAM,UAAN,mBAAa,kBACb,kCAAM,YAAN,mBAAe,iBACf;AAEL,YAAM,YACJ,kCAAM,YAAN,mBAAe,WACZ,kCAAM,aAAN,mBAAgB,YAChB;AAEL,YAAM,eAAe,WAAU,6BAAM,eAAa,6BAAM,gBAAc,6BAAM,gBAAe;AAC3F,YAAM,cAAc;AAAA,SAClB,6BAAM,mBACH,6BAAM,qBACN,6BAAM,eACN,6BAAM;AAAA,MACX;AAEA,YAAM,eACJ,6BAAM,eACH,6BAAM,SACN,GAAG,MAAM,MAAM,MAAM;AAE1B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,KAAK;AAAA,QACL,WAAW,GAAG,eAAe;AAAA,QAC7B;AAAA,QACA,sBAAsB,qBAAqB;AAAA,QAC3C;AAAA,QACA,UAAS,6BAAM,oBAAiB,kCAAM,UAAN,mBAAa,gBAAe;AAAA,QAC5D;AAAA,QACA,aAAa,WAAU,6BAAM,gBAAe,0BAA0B;AAAA,QACtE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAM,6BAAM,aAAY;AAAA,QACxB,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,iBAAiB,IAAI;AAAA,MACnC;AAAA,IACF,CAAC;AAED,UAAM,WAAsB,CAAC;AAC7B,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,eAAe,OAAO,OAAO;AACjD,iBAAS,KAAK,OAAO,KAAK;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SACO,OAAO;AACZ,YAAQ,MAAM,uCAAuC,OAAO,IAAI,KAAK,KAAK;AAC1E,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/socrataDatasets.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 type { OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport { DataManagementSystem } from '../../../../../types/dbTypes'\r\nimport { formatDate, 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\n\r\nconst DISCOVERY_PAGE_SIZE = 100\r\nconst MAX_DISCOVERED_DATASETS = 400\r\nconst FEATURE_PAGE_SIZE = 500\r\nconst MAX_FEATURES = 5_000\r\nconst RETRY_BASE_MS = 500\r\nconst MAX_RETRIES = 2\r\n\r\nconst socrataGeoTypes = new Set([\r\n 'point',\r\n 'multipoint',\r\n 'line',\r\n 'multiline',\r\n 'polygon',\r\n 'multipolygon',\r\n 'location',\r\n 'geometry',\r\n])\r\n\r\nfunction delay(ms: number) {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\nfunction parseRetryAfterMs(value: string | null): number | null {\r\n if (!value) return null\r\n\r\n const numeric = Number(value)\r\n if (Number.isFinite(numeric) && numeric >= 0) {\r\n return Math.min(Math.floor(numeric * 1000), 15_000)\r\n }\r\n\r\n const asDate = Date.parse(value)\r\n if (Number.isNaN(asDate)) return null\r\n\r\n const deltaMs = asDate - Date.now()\r\n if (deltaMs <= 0) return 0\r\n return Math.min(deltaMs, 15_000)\r\n}\r\n\r\nfunction toIsoDate(value: unknown): string {\r\n if (value == null) return ''\r\n\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n const ms = value > 9_999_999_999 ? value : value * 1000\r\n return formatDate(new Date(ms).toISOString())\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (!trimmed) return ''\r\n\r\n const asNumber = Number(trimmed)\r\n if (Number.isFinite(asNumber)) {\r\n const ms = asNumber > 9_999_999_999 ? asNumber : asNumber * 1000\r\n return formatDate(new Date(ms).toISOString())\r\n }\r\n\r\n return formatDate(trimmed)\r\n }\r\n\r\n return ''\r\n}\r\n\r\nfunction normalizeSocrataOrigin(apiUrl?: string | null): string | null {\r\n if (!apiUrl) return null\r\n\r\n const trimmed = apiUrl.trim()\r\n if (!trimmed) return null\r\n\r\n const withScheme = /^https?:\\/\\//i.test(trimmed)\r\n ? trimmed\r\n : `https://${trimmed}`\r\n\r\n try {\r\n const parsed = new URL(withScheme)\r\n return parsed.origin\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction extractViewIdFromUrl(apiUrl?: string | null): string | null {\r\n if (!apiUrl) return null\r\n\r\n const viewMatch = apiUrl.match(/\\/api\\/v3\\/views\\/([a-z0-9-]{9})\\//i)\r\n if (viewMatch?.[1]) return viewMatch[1]\r\n\r\n const discoverMatch = apiUrl.match(/\\/d\\/([a-z0-9-]{9})/i)\r\n if (discoverMatch?.[1]) return discoverMatch[1]\r\n\r\n return null\r\n}\r\n\r\nfunction buildServerHeaders() {\r\n const headers: HeadersInit = {\r\n 'User-Agent': 'Mozilla/5.0 (compatible; CDT-OP/1.0)',\r\n }\r\n\r\n const appToken = process.env.SOCRATA_APP_TOKEN || process.env.NEXT_PUBLIC_SOCRATA_APP_TOKEN\r\n if (appToken) {\r\n headers['X-App-Token'] = appToken\r\n }\r\n\r\n return headers\r\n}\r\n\r\nasync function fetchWithRetry(target: string, isServer: boolean): Promise<Response> {\r\n const requestTarget = isServer\r\n ? target\r\n : `/api/socrataProxy?url=${encodeURIComponent(target)}`\r\n\r\n const requestInit: RequestInit = isServer\r\n ? { headers: buildServerHeaders() }\r\n : {}\r\n\r\n let attempt = 0\r\n let lastError: unknown = null\r\n\r\n while (attempt <= MAX_RETRIES) {\r\n try {\r\n const response = await fetch(requestTarget, requestInit)\r\n\r\n // Retry on throttling and transient server errors.\r\n if ((response.status === 429 || response.status >= 500) && attempt < MAX_RETRIES) {\r\n const retryAfterMs = parseRetryAfterMs(response.headers.get('retry-after'))\r\n const backoffMs = retryAfterMs ?? Math.min(RETRY_BASE_MS * (2 ** attempt), 5_000)\r\n await delay(backoffMs)\r\n attempt += 1\r\n continue\r\n }\r\n\r\n return response\r\n }\r\n catch (error) {\r\n lastError = error\r\n if (attempt >= MAX_RETRIES) break\r\n\r\n await delay(Math.min(RETRY_BASE_MS * (2 ** attempt), 5_000))\r\n attempt += 1\r\n }\r\n }\r\n\r\n throw lastError instanceof Error\r\n ? lastError\r\n : new Error('Socrata request failed')\r\n}\r\n\r\nfunction mapSocrataFieldType(rawType: unknown): FieldType {\r\n const type = String(rawType || '').toLowerCase()\r\n\r\n if (\r\n [\r\n 'number',\r\n 'money',\r\n 'double',\r\n 'float',\r\n 'percent',\r\n 'smallint',\r\n 'bigint',\r\n 'meta_data',\r\n ].includes(type)\r\n ) {\r\n return 'number'\r\n }\r\n\r\n if (['checkbox', 'boolean'].includes(type)) {\r\n return 'boolean'\r\n }\r\n\r\n if (\r\n [\r\n 'calendar date',\r\n 'date',\r\n 'fixed_timestamp',\r\n 'floating_timestamp',\r\n 'timestamp',\r\n ].includes(type)\r\n ) {\r\n return 'datetime'\r\n }\r\n\r\n if (\r\n [\r\n 'point',\r\n 'multipoint',\r\n 'line',\r\n 'multiline',\r\n 'polygon',\r\n 'multipolygon',\r\n 'location',\r\n 'geometry',\r\n 'json',\r\n 'object',\r\n ].includes(type)\r\n ) {\r\n return 'object'\r\n }\r\n\r\n if (type.includes('id')) {\r\n return 'id'\r\n }\r\n\r\n return 'string'\r\n}\r\n\r\nfunction hasGeoColumns(view: any): boolean {\r\n const columns = Array.isArray(view?.columns) ? view.columns : []\r\n\r\n if (columns.length === 0) {\r\n return false\r\n }\r\n\r\n return columns.some((column: any) => {\r\n const dataTypeName = String(column?.dataTypeName || column?.datatype || column?.type || '').toLowerCase()\r\n return socrataGeoTypes.has(dataTypeName)\r\n })\r\n}\r\n\r\nfunction hasGeospatialMetadataFlag(view: any): boolean | null {\r\n const flag = view?.metadata?.custom_fields?.['Geospatial Information']?.['Dataset contains geospatial information']\r\n if (typeof flag !== 'string') {\r\n return null\r\n }\r\n\r\n if (/^\\s*(yes|true)\\s*$/i.test(flag)) {\r\n return true\r\n }\r\n\r\n if (/^\\s*(no|false)\\s*$/i.test(flag)) {\r\n return false\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction isLikelyGeospatialView(view: any): boolean {\r\n const geoColumns = hasGeoColumns(view)\r\n if (geoColumns) {\r\n return true\r\n }\r\n\r\n const metadataFlag = hasGeospatialMetadataFlag(view)\r\n if (metadataFlag === true) {\r\n return true\r\n }\r\n\r\n if (metadataFlag === false) {\r\n return false\r\n }\r\n\r\n const columns = Array.isArray(view?.columns) ? view.columns : []\r\n return columns.length === 0\r\n}\r\n\r\nfunction normalizeDiscoveryViews(raw: any): { total: number | null, views: any[] } {\r\n if (Array.isArray(raw?.results)) {\r\n const views = raw.results\r\n .map((item: any) => item?.view || item)\r\n .filter(Boolean)\r\n\r\n return {\r\n total: typeof raw.count === 'number' ? raw.count : null,\r\n views,\r\n }\r\n }\r\n\r\n if (Array.isArray(raw)) {\r\n return {\r\n total: null,\r\n views: raw,\r\n }\r\n }\r\n\r\n return {\r\n total: null,\r\n views: [],\r\n }\r\n}\r\n\r\nasync function discoverSocrataViews(origin: string, isServer: boolean): Promise<any[]> {\r\n const collected: any[] = []\r\n const seenIds = new Set<string>()\r\n\r\n let offset = 0\r\n let totalCount: number | null = null\r\n\r\n while (collected.length < MAX_DISCOVERED_DATASETS) {\r\n const searchUrl = `${origin}/api/search/views.json?limit=${DISCOVERY_PAGE_SIZE}&offset=${offset}`\r\n\r\n let payload: any = null\r\n\r\n try {\r\n const searchResponse = await fetchWithRetry(searchUrl, isServer)\r\n if (searchResponse.ok) {\r\n payload = await searchResponse.json()\r\n }\r\n }\r\n catch (error) {\r\n console.warn('[Socrata] Search discovery request failed, trying fallback endpoint:', error)\r\n }\r\n\r\n if (!payload) {\r\n const fallbackUrl = `${origin}/api/views.json?limit=${DISCOVERY_PAGE_SIZE}&offset=${offset}`\r\n try {\r\n const fallbackResponse = await fetchWithRetry(fallbackUrl, isServer)\r\n if (!fallbackResponse.ok) {\r\n console.warn(`[Socrata] Fallback discovery request failed with status ${fallbackResponse.status}`)\r\n break\r\n }\r\n payload = await fallbackResponse.json()\r\n }\r\n catch (fallbackError) {\r\n console.error('[Socrata] Fallback discovery request failed:', fallbackError)\r\n break\r\n }\r\n }\r\n\r\n const normalized = normalizeDiscoveryViews(payload)\r\n if (typeof normalized.total === 'number') {\r\n totalCount = normalized.total\r\n }\r\n\r\n if (normalized.views.length === 0) {\r\n break\r\n }\r\n\r\n for (const view of normalized.views) {\r\n const id = String(view?.id || '')\r\n if (!id || seenIds.has(id)) continue\r\n\r\n const assetType = String(view?.assetType || view?.type || '').toLowerCase()\r\n if (assetType && !['dataset', 'map'].includes(assetType)) continue\r\n\r\n if (!isLikelyGeospatialView(view)) continue\r\n\r\n seenIds.add(id)\r\n collected.push(view)\r\n\r\n if (collected.length >= MAX_DISCOVERED_DATASETS) {\r\n break\r\n }\r\n }\r\n\r\n offset += DISCOVERY_PAGE_SIZE\r\n\r\n if (totalCount !== null && offset >= totalCount) {\r\n break\r\n }\r\n\r\n if (normalized.views.length < DISCOVERY_PAGE_SIZE) {\r\n break\r\n }\r\n }\r\n\r\n return collected\r\n}\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 index = next++\r\n try {\r\n results[index] = {\r\n status: 'fulfilled',\r\n value: await fn(items[index]),\r\n }\r\n }\r\n catch (reason) {\r\n results[index] = {\r\n status: 'rejected',\r\n reason,\r\n }\r\n }\r\n }\r\n }\r\n\r\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker))\r\n return results\r\n}\r\n\r\nexport async function fetchSocrataDatasets(\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 origin = normalizeSocrataOrigin(apiUrl)\r\n if (!origin) {\r\n return []\r\n }\r\n\r\n try {\r\n const hintedViewId = extractViewIdFromUrl(apiUrl)\r\n const discoveredViews = await discoverSocrataViews(origin, isServer)\r\n\r\n if (discoveredViews.length === 0 && hintedViewId) {\r\n try {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${hintedViewId}.json`, isServer)\r\n if (metadataRes.ok) {\r\n const metadata = await metadataRes.json()\r\n discoveredViews.push(metadata)\r\n }\r\n }\r\n catch {\r\n discoveredViews.push({ id: hintedViewId, name: hintedViewId })\r\n }\r\n }\r\n\r\n if (hintedViewId) {\r\n discoveredViews.sort((a, b) => {\r\n if (a?.id === hintedViewId) return -1\r\n if (b?.id === hintedViewId) return 1\r\n return 0\r\n })\r\n }\r\n\r\n const settled = await withConcurrencyLimit(discoveredViews, 6, async (view: any): Promise<Dataset | null> => {\r\n const viewId = String(view?.id || '')\r\n if (!viewId) return null\r\n\r\n const modifiedVersion =\r\n view?.rowsUpdatedAt\r\n || view?.data_updated_at\r\n || view?.updatedAt\r\n || view?.viewLastModified\r\n || view?.metadata_updated_at\r\n || ''\r\n\r\n const v3QueryBase = `${origin}/api/v3/views/${viewId}/query.geojson`\r\n const legacyQueryBase = `${origin}/resource/${viewId}.geojson`\r\n\r\n const validKey = buildValidationKey('socrata-v2', viewId, modifiedVersion)\r\n const isValid = await withCache<boolean>(validKey, 24 * 60 * 60 * 1000, async () => {\r\n try {\r\n const sampleUrl = `${v3QueryBase}?pageNumber=1&pageSize=1`\r\n const sampleRes = await fetchWithRetry(sampleUrl, isServer)\r\n\r\n if (sampleRes.ok) {\r\n const sample = await sampleRes.json()\r\n if (sample?.type !== 'FeatureCollection' || !Array.isArray(sample?.features)) {\r\n return true\r\n }\r\n\r\n if (sample.features.length === 0) {\r\n return true\r\n }\r\n\r\n return sample.features.some((feature: any) => !!feature?.geometry)\r\n }\r\n\r\n if ([400, 401, 403, 404, 405].includes(sampleRes.status)) {\r\n const legacySampleRes = await fetchWithRetry(`${legacyQueryBase}?$limit=1`, isServer)\r\n\r\n if ([401, 403, 404].includes(legacySampleRes.status)) {\r\n return false\r\n }\r\n\r\n if (!legacySampleRes.ok) {\r\n return true\r\n }\r\n\r\n const legacySample = await legacySampleRes.json()\r\n if (legacySample?.type !== 'FeatureCollection' || !Array.isArray(legacySample?.features)) {\r\n return true\r\n }\r\n\r\n if (legacySample.features.length === 0) {\r\n return true\r\n }\r\n\r\n return legacySample.features.some((feature: any) => !!feature?.geometry)\r\n }\r\n\r\n return true\r\n }\r\n catch {\r\n return true\r\n }\r\n })\r\n\r\n if (!isValid) {\r\n return null\r\n }\r\n\r\n const getFeaturesData = async () => {\r\n try {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${viewId}.json`, isServer)\r\n if (!metadataRes.ok) return undefined\r\n return await metadataRes.json()\r\n }\r\n catch {\r\n return undefined\r\n }\r\n }\r\n\r\n const getFields = async () => {\r\n const fieldsKey = `fields:socrata:${viewId}:${modifiedVersion}`\r\n const cached = getCache<any[]>(fieldsKey)\r\n if (cached) return cached\r\n\r\n try {\r\n let columns = Array.isArray(view?.columns) ? view.columns : []\r\n\r\n if (columns.length === 0) {\r\n const metadataRes = await fetchWithRetry(`${origin}/api/views/${viewId}.json`, isServer)\r\n if (metadataRes.ok) {\r\n const metadata = await metadataRes.json()\r\n if (Array.isArray(metadata?.columns)) {\r\n columns = metadata.columns\r\n }\r\n }\r\n }\r\n\r\n const fields = columns.map((column: any) => {\r\n const rawType = column?.dataTypeName || column?.datatype || column?.type\r\n return {\r\n name: column?.fieldName || column?.name || '',\r\n label: column?.name || column?.fieldName || '',\r\n type: mapSocrataFieldType(rawType),\r\n socrataType: rawType,\r\n description: column?.description || '',\r\n }\r\n })\r\n\r\n setCache(fieldsKey, fields, 24 * 60 * 60 * 1000)\r\n return fields\r\n }\r\n catch {\r\n return []\r\n }\r\n }\r\n\r\n const getFeatures = async (): Promise<AllGeoJSON> => {\r\n const featuresKey = `features:socrata:${viewId}:${modifiedVersion}`\r\n const cached = getCache<AllGeoJSON>(featuresKey)\r\n if (cached) return cached\r\n\r\n try {\r\n const features: any[] = []\r\n let pageNumber = 1\r\n let offset = 0\r\n let mode: 'v3' | 'legacy' = 'v3'\r\n\r\n while (features.length < MAX_FEATURES) {\r\n const pageUrl = mode === 'v3'\r\n ? `${v3QueryBase}?pageNumber=${pageNumber}&pageSize=${FEATURE_PAGE_SIZE}`\r\n : `${legacyQueryBase}?$limit=${FEATURE_PAGE_SIZE}&$offset=${offset}`\r\n\r\n const pageRes = await fetchWithRetry(pageUrl, isServer)\r\n\r\n if (!pageRes.ok) {\r\n if (mode === 'v3' && pageNumber === 1 && [400, 401, 403, 404, 405].includes(pageRes.status)) {\r\n mode = 'legacy'\r\n continue\r\n }\r\n break\r\n }\r\n\r\n const pageJson = await pageRes.json()\r\n if (pageJson?.type !== 'FeatureCollection' || !Array.isArray(pageJson?.features)) {\r\n break\r\n }\r\n\r\n const validFeatures = pageJson.features.filter((feature: any) => !!feature?.geometry)\r\n if (validFeatures.length > 0) {\r\n features.push(...validFeatures.slice(0, MAX_FEATURES - features.length))\r\n }\r\n\r\n const fetchedCount = pageJson.features.length\r\n if (fetchedCount < FEATURE_PAGE_SIZE || fetchedCount === 0) {\r\n break\r\n }\r\n\r\n if (mode === 'v3') {\r\n pageNumber += 1\r\n }\r\n else {\r\n offset += FEATURE_PAGE_SIZE\r\n }\r\n }\r\n\r\n const result = {\r\n type: 'FeatureCollection',\r\n features,\r\n } as AllGeoJSON\r\n\r\n setCache(featuresKey, result, 60 * 60 * 1000)\r\n return result\r\n }\r\n catch (error) {\r\n console.error(`Socrata: Error fetching features for dataset ${viewId}:`, error)\r\n return {\r\n type: 'FeatureCollection',\r\n features: [],\r\n } as AllGeoJSON\r\n }\r\n }\r\n\r\n const rawName = String(view?.name || viewId)\r\n const name = formatName(rawName)\r\n\r\n const keywords = [\r\n ...(Array.isArray(view?.tags) ? view.tags : []),\r\n ...(Array.isArray(view?.classification?.domain_tags) ? view.classification.domain_tags : []),\r\n ]\r\n .map((tag: unknown) => String(tag || '').trim())\r\n .filter(Boolean)\r\n\r\n const publisher =\r\n view?.attribution\r\n || view?.owner?.displayName\r\n || view?.creator?.display_name\r\n || 'Unknown'\r\n\r\n const license =\r\n view?.license?.name\r\n || view?.metadata?.license\r\n || 'Unknown'\r\n\r\n const dateReleased = toIsoDate(view?.createdAt || view?.created_at || view?.publicationDate)\r\n const dateUpdated = toIsoDate(\r\n view?.rowsUpdatedAt\r\n || view?.data_updated_at\r\n || view?.updatedAt\r\n || view?.viewLastModified,\r\n )\r\n\r\n const information =\r\n view?.permalink\r\n || view?.link\r\n || `${origin}/d/${viewId}`\r\n\r\n return {\r\n id: viewId,\r\n name,\r\n url: information,\r\n sourceUrl: `${legacyQueryBase}`,\r\n publisher,\r\n dataManagementSystem: DataManagementSystem.Socrata,\r\n license,\r\n contact: view?.contact_email || view?.owner?.displayName || 'Unknown',\r\n keywords,\r\n description: stripHtml(view?.description || 'No description available'),\r\n dateReleased,\r\n dateUpdated,\r\n information,\r\n countrySubdivision,\r\n municipality,\r\n type: view?.viewType || 'GeoJSON',\r\n datasetType: '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 const datasets: Dataset[] = []\r\n for (const result of settled) {\r\n if (result.status === 'fulfilled' && result.value) {\r\n datasets.push(result.value)\r\n }\r\n }\r\n\r\n return datasets\r\n }\r\n catch (error) {\r\n console.error(`Error fetching Socrata datasets for ${portal.name}:`, error)\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"urlSources.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/urlSources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAGnF,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAA;AAExD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAK3D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASpD;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GAAG,QAAQ,GACzB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAevE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASrF"}
1
+ {"version":3,"file":"urlSources.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/urlSources.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAGnF,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAA;AAExD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAK3D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASpD;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GAAG,QAAQ,GACzB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAevE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASrF"}