@collabdt/core 0.0.55 → 0.0.57

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 (264) hide show
  1. package/dist/core/components/AppSidebarContent.d.ts +2 -1
  2. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  3. package/dist/core/components/AppSidebarContent.js +8 -5
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/Toolbar.d.ts +7 -1
  6. package/dist/core/components/Toolbar.d.ts.map +1 -1
  7. package/dist/core/components/Toolbar.js +3 -3
  8. package/dist/core/components/Toolbar.js.map +1 -1
  9. package/dist/core/components/TopNavigationBar.d.ts +6 -1
  10. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  11. package/dist/core/components/TopNavigationBar.js +2 -2
  12. package/dist/core/components/TopNavigationBar.js.map +1 -1
  13. package/dist/core/components/authentication/AuthPage.d.ts +2 -1
  14. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  15. package/dist/core/components/authentication/AuthPage.js +2 -3
  16. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  17. package/dist/core/components/authentication/Signin.d.ts +6 -1
  18. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  19. package/dist/core/components/authentication/Signin.js +17 -6
  20. package/dist/core/components/authentication/Signin.js.map +1 -1
  21. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  22. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +109 -36
  23. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  24. package/dist/core/components/settings/index.d.ts +3 -1
  25. package/dist/core/components/settings/index.d.ts.map +1 -1
  26. package/dist/core/components/settings/index.js +2 -2
  27. package/dist/core/components/settings/index.js.map +1 -1
  28. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  29. package/dist/core/components/settings/src/AccountSettingsPanel.js +9 -2
  30. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  31. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts +5 -1
  32. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  33. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +7 -3
  34. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  35. package/dist/core/components/settings/src/SettingsContent.d.ts +2 -1
  36. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  37. package/dist/core/components/settings/src/SettingsContent.js +2 -2
  38. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  39. package/dist/core/components/support/BugReportDialog.d.ts +3 -2
  40. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
  41. package/dist/core/components/support/BugReportDialog.js +71 -25
  42. package/dist/core/components/support/BugReportDialog.js.map +1 -1
  43. package/dist/core/components/support/FeatureRequestDialog.d.ts +3 -1
  44. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
  45. package/dist/core/components/support/FeatureRequestDialog.js +7 -4
  46. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
  47. package/dist/core/components/support/SupportMenu.d.ts.map +1 -1
  48. package/dist/core/components/support/SupportMenu.js +1 -4
  49. package/dist/core/components/support/SupportMenu.js.map +1 -1
  50. package/dist/core/components/ui/AnimatedBackground.d.ts +2 -1
  51. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  52. package/dist/core/components/ui/AnimatedBackground.js +2 -3
  53. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  54. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  55. package/dist/core/components/ui/AppSidebar.js +11 -11
  56. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  57. package/dist/core/components/ui/InfoSidebar/Container.d.ts +3 -1
  58. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  59. package/dist/core/components/ui/InfoSidebar/Container.js +4 -2
  60. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  61. package/dist/core/components/ui/InfoSidebar/Header.d.ts +3 -2
  62. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  63. package/dist/core/components/ui/InfoSidebar/Header.js +5 -6
  64. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  65. package/dist/core/components/ui/InfoSidebar/index.d.ts +7 -1
  66. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  67. package/dist/core/components/ui/InfoSidebar/index.js +4 -4
  68. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  69. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +2 -1
  70. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  71. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -2
  72. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  73. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +3 -1
  74. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  75. package/dist/core/components/ui/Sensors/SensorsSection.js +3 -1
  76. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  77. package/dist/core/components/ui/Sidebar.d.ts +8 -0
  78. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  79. package/dist/core/components/ui/Sidebar.js +21 -7
  80. package/dist/core/components/ui/Sidebar.js.map +1 -1
  81. package/dist/core/components/ui/ToolbarButton.js +18 -1
  82. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  83. package/dist/core/components/viewers/Data/DataMenu.d.ts +5 -1
  84. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  85. package/dist/core/components/viewers/Data/DataMenu.js +6 -3
  86. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  87. package/dist/core/components/viewers/Data/HeaderButtons.d.ts +3 -1
  88. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  89. package/dist/core/components/viewers/Data/HeaderButtons.js +6 -2
  90. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  91. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts +3 -1
  92. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  93. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +4 -2
  94. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  95. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts +3 -1
  96. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  97. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +3 -1
  98. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  99. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts +2 -1
  100. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  101. package/dist/core/components/viewers/Data/details/DetailHeader.js +3 -5
  102. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  103. package/dist/core/components/viewers/Viewer.d.ts +7 -1
  104. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  105. package/dist/core/components/viewers/Viewer.js +6 -6
  106. package/dist/core/components/viewers/Viewer.js.map +1 -1
  107. package/dist/core/components/viewers/bim/BimToolbar.d.ts +3 -1
  108. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  109. package/dist/core/components/viewers/bim/BimToolbar.js +2 -2
  110. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  111. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +3 -1
  112. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  113. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  114. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  115. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts +5 -1
  116. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  117. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +3 -2
  118. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  119. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +3 -1
  120. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  121. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +2 -2
  122. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  123. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +1 -1
  124. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  125. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +2 -2
  126. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  127. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +3 -1
  128. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  129. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -2
  130. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  131. package/dist/core/components/viewers/map/MapViewer.d.ts +3 -1
  132. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  133. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  134. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  135. package/dist/core/components/viewers/map/datasets/RowActions.d.ts +2 -1
  136. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  137. package/dist/core/components/viewers/map/datasets/RowActions.js +5 -4
  138. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  139. package/dist/core/components/viewers/map/datasets/index.d.ts +5 -1
  140. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  141. package/dist/core/components/viewers/map/datasets/index.js +15 -16
  142. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  143. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  144. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  145. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +3 -5
  146. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  147. package/dist/core/components/viewers/map/src/Geocoder.d.ts +3 -1
  148. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  149. package/dist/core/components/viewers/map/src/Geocoder.js +5 -1
  150. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  151. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +6 -1
  152. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  153. package/dist/core/components/viewers/map/src/MapLayers/index.js +3 -3
  154. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  155. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts +5 -1
  156. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  157. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +6 -10
  158. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  159. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +3 -1
  160. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +2 -2
  162. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  163. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +6 -1
  164. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  165. package/dist/core/components/viewers/map/src/MapSidebar/index.js +5 -4
  166. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  167. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +5 -1
  168. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  169. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +5 -8
  170. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +3 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts +3 -1
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  177. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js +2 -2
  178. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  179. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts +3 -1
  180. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  181. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +4 -7
  182. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  183. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  184. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +8 -8
  185. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  186. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +8 -1
  187. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  188. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -3
  189. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  190. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +11 -1
  191. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  192. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +5 -3
  193. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  194. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +10 -1
  195. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  196. package/dist/core/components/viewers/map/src/tools/mapTools.js +5 -3
  197. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  198. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +14 -5
  199. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  200. package/dist/core/components/viewers/map/utils/geocoding/config.js +22 -11
  201. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  202. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  203. package/dist/core/components/viewers/map/utils/geocoding/index.js +2 -2
  204. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  205. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  206. package/dist/core/components/viewers/map/utils/geocoding/osm.js +5 -4
  207. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  208. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  209. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +7 -5
  210. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  211. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts +3 -1
  212. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  213. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +11 -12
  214. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  215. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts +3 -1
  216. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  217. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +37 -50
  218. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  219. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts +3 -1
  220. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  221. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js +5 -3
  222. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  223. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts +2 -1
  224. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  225. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +8 -7
  226. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  227. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts +2 -1
  228. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  229. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +22 -9
  230. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  231. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts +5 -1
  232. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  233. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +3 -2
  234. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  235. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts +3 -1
  236. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  237. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -2
  238. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  239. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
  240. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  241. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +12 -22
  242. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  243. package/dist/core/hooks/useCaptureScreenshot.d.ts +2 -0
  244. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -0
  245. package/dist/core/hooks/useCaptureScreenshot.js +63 -0
  246. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -0
  247. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +3 -0
  248. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -0
  249. package/dist/core/hooks/useGeocodingRuntimeConfig.js +17 -0
  250. package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -0
  251. package/dist/core/store/AppConfig/context.d.ts +15 -1
  252. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  253. package/dist/core/store/AppConfig/context.js +26 -5
  254. package/dist/core/store/AppConfig/context.js.map +1 -1
  255. package/dist/core/store/CombineProviders.d.ts +6 -1
  256. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  257. package/dist/core/store/CombineProviders.js +4 -3
  258. package/dist/core/store/CombineProviders.js.map +1 -1
  259. package/dist/core/types/tools.d.ts +2 -1
  260. package/dist/core/types/tools.d.ts.map +1 -1
  261. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  262. package/dist/core/utils/imageUtils.js +2 -1
  263. package/dist/core/utils/imageUtils.js.map +1 -1
  264. package/package.json +1 -1
@@ -4,7 +4,8 @@ interface RowActionsProps {
4
4
  dataset: Dataset;
5
5
  favouriteDatasets: Dataset[];
6
6
  setFavouriteDatasets: React.Dispatch<React.SetStateAction<Dataset[]>>;
7
+ martinBaseUrl?: string;
7
8
  }
8
- export default function RowActions({ dataset, favouriteDatasets, setFavouriteDatasets, }: RowActionsProps): React.JSX.Element;
9
+ export default function RowActions({ dataset, favouriteDatasets, setFavouriteDatasets, martinBaseUrl, }: RowActionsProps): React.JSX.Element;
9
10
  export {};
10
11
  //# sourceMappingURL=RowActions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RowActions.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,OAAO,CAAA;AAYzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAG7D,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,EAAE,OAAO,EAAE,CAAA;IAC5B,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;CACtE;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,OAAO,EACP,iBAAiB,EACjB,oBAAoB,GACrB,EAAE,eAAe,qBAoQjB"}
1
+ {"version":3,"file":"RowActions.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,OAAO,CAAA;AAWzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAG7D,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,EAAE,OAAO,EAAE,CAAA;IAC5B,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACrE,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,OAAO,EACP,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GACd,EAAE,eAAe,qBAoQjB"}
@@ -10,7 +10,8 @@ import { buildPublishedTileDatasets } from "./src/publishedTiles";
10
10
  function RowActions({
11
11
  dataset,
12
12
  favouriteDatasets,
13
- setFavouriteDatasets
13
+ setFavouriteDatasets,
14
+ martinBaseUrl
14
15
  }) {
15
16
  const { ability } = usePermissions();
16
17
  const { state: datasetsState, dispatch: datasetsDispatch } = React.useContext(DatasetsContext);
@@ -70,7 +71,7 @@ function RowActions({
70
71
  }
71
72
  };
72
73
  const onPublish = async () => {
73
- var _a, _b, _c, _d;
74
+ var _a, _b, _c;
74
75
  if (fileId == null || Number.isNaN(fileId)) return;
75
76
  setPublishing(true);
76
77
  try {
@@ -87,7 +88,7 @@ function RowActions({
87
88
  }
88
89
  const result = await res.json();
89
90
  setPublished(true);
90
- const tileBaseUrl = ((_b = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL) != null ? _b : "").replace(/\/+$/, "");
91
+ const tileBaseUrl = (martinBaseUrl != null ? martinBaseUrl : "").replace(/\/+$/, "");
91
92
  const minioId = `org-minio-${fileId}`;
92
93
  const [optimistic] = buildPublishedTileDatasets(
93
94
  [{
@@ -95,7 +96,7 @@ function RowActions({
95
96
  description: JSON.stringify({ tiledTable: result.table, geometryType: result.geometryType })
96
97
  }],
97
98
  tileBaseUrl,
98
- { countrySubdivision: (_c = dataset.countrySubdivision) != null ? _c : "", municipality: (_d = dataset.municipality) != null ? _d : "" }
99
+ { countrySubdivision: (_b = dataset.countrySubdivision) != null ? _b : "", municipality: (_c = dataset.municipality) != null ? _c : "" }
99
100
  );
100
101
  if (optimistic) {
101
102
  const current = orgDatasets != null ? orgDatasets : [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport React from 'react'\r\nimport { usePermissions } from '../../../../store'\r\n\r\n// Utility functions\r\nimport { handleFavouriteDataset } from './utils'\r\n\r\n// Shadcn Components\r\nimport { Checkbox, Button } from '../../../ui/'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\nimport { DatasetsContext } from '../../../../store'\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { buildPublishedTileDatasets } from './src/publishedTiles'\r\n\r\ninterface RowActionsProps {\r\n dataset: Dataset\r\n favouriteDatasets: Dataset[]\r\n setFavouriteDatasets: React.Dispatch<React.SetStateAction<Dataset[]>>\r\n}\r\n\r\nexport default function RowActions({\r\n dataset,\r\n favouriteDatasets,\r\n setFavouriteDatasets,\r\n}: RowActionsProps) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n\r\n const { state: datasetsState, dispatch: datasetsDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetsState.datasets\r\n const orgDatasets = datasetsState.datasets.datasets\r\n\r\n // const [checked, setChecked] = useState(false);\r\n\r\n // Check if this specific dataset is in favourites\r\n const isFavourite = favouriteDatasets.some(item => item.name === dataset.name)\r\n\r\n // \"Checked\" means the dataset is applied to the map. All dataset types —\r\n // including Organizational (MinIO/Martin-hydrated uploads) — toggle their\r\n // membership in addedDatasets, which is the only list OpenDataLayers renders.\r\n // (Previously Organizational datasets toggled a `visible` flag on the\r\n // available list, which nothing renders from, so they never appeared.)\r\n const checked = addedDatasets.some(d => d.name === dataset.name)\r\n\r\n const handleApplyDataset = () => {\r\n if (!dataset) {\r\n console.error('No dataset provided in RowActions')\r\n return\r\n }\r\n\r\n const isAdded = addedDatasets.some(d => d.name === dataset.name)\r\n\r\n if (isAdded) {\r\n datasetsDispatch({\r\n type: 'REMOVE_DATASET_FROM_MAP',\r\n payload: { datasetId: dataset.id },\r\n })\r\n }\r\n else {\r\n datasetsDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset: dataset },\r\n })\r\n }\r\n }\r\n\r\n const handleFavourite = handleFavouriteDataset(dataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const [publishing, setPublishing] = React.useState(false)\r\n const [published, setPublished] = React.useState(false)\r\n\r\n const isOrgMinio = typeof dataset.id === 'string' && dataset.id.startsWith('org-minio-')\r\n const fileId = isOrgMinio\r\n ? Number(String(dataset.id).slice('org-minio-'.length))\r\n : null\r\n\r\n const tiledMatch = typeof dataset.id === 'string'\r\n ? /^org_(\\d+)_file_(\\d+)$/.exec(dataset.id)\r\n : null\r\n // A row is \"converted\" either because it IS the org_<orgId>_file_<fileId> tile\r\n // entry (organizational tab), or because it's the original open-data dataset\r\n // stamped with the published File it resolves to (every other tab). Either way\r\n // we show the un-publish action and drive it with this fileId.\r\n const tiledFileId = tiledMatch\r\n ? Number(tiledMatch[2])\r\n : (typeof dataset.publishedFileId === 'number' ? dataset.publishedFileId : null)\r\n\r\n const [unpublishing, setUnpublishing] = React.useState(false)\r\n const [unpublished, setUnpublished] = React.useState(false)\r\n\r\n const onUnpublish = async () => {\r\n if (tiledFileId == null) return\r\n if (!window.confirm(`Un-publish \"${dataset.name}\"? The Martin table will be dropped; the original GeoJSON in MinIO is untouched.`)) return\r\n setUnpublishing(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-tiles', {\r\n method: 'DELETE',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ fileId: tiledFileId }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('un-publish failed', res.status, body)\r\n window.alert(`Un-publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n setUnpublished(true)\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(`Un-published. The dataset list has been refreshed.`)\r\n }\r\n finally {\r\n setUnpublishing(false)\r\n }\r\n }\r\n\r\n const onPublish = async () => {\r\n if (fileId == null || Number.isNaN(fileId)) return\r\n setPublishing(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-tiles', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ fileId }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('publish-tiles failed', res.status, body)\r\n window.alert(`Publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n const result = await res.json()\r\n setPublished(true)\r\n\r\n // Optimistically swap the MinIO upload row for its published-tile form so the\r\n // un-publish (CloudOff) icon shows immediately. The full org refetch below\r\n // (REFRESH_ORG_DATASETS) re-samples a vector tile per dataset to detect geometry,\r\n // which can take several seconds; without this the row only flips after that lands\r\n // (or after the dialog is reopened). The refetch reconciles this swap when it finishes.\r\n const tileBaseUrl = (process.env.NEXT_PUBLIC_MARTIN_SERVER_URL ?? '').replace(/\\/+$/, '')\r\n const minioId = `org-minio-${fileId}`\r\n const [optimistic] = buildPublishedTileDatasets(\r\n [{\r\n name: dataset.name,\r\n description: JSON.stringify({ tiledTable: result.table, geometryType: result.geometryType }),\r\n }],\r\n tileBaseUrl,\r\n { countrySubdivision: dataset.countrySubdivision ?? '', municipality: dataset.municipality ?? '' } as any,\r\n )\r\n if (optimistic) {\r\n const current = orgDatasets ?? []\r\n const swapped = current.some(d => d.id === minioId)\r\n ? current.map(d => (d.id === minioId ? optimistic : d))\r\n : [...current, optimistic]\r\n datasetsDispatch({ type: 'SET_DATASETS', payload: { datasets: swapped } })\r\n // Keep the map layer in sync if this dataset was already applied.\r\n if (addedDatasets.some(d => d.id === minioId)) {\r\n datasetsDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: minioId } })\r\n datasetsDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: optimistic } })\r\n }\r\n }\r\n\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(\r\n `Tiled as ${result.table}. The dataset list has been refreshed.\\n\\n`\r\n + `Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`,\r\n )\r\n }\r\n finally {\r\n setPublishing(false)\r\n }\r\n }\r\n\r\n // Catalog (open-data-portal) GeoJSON datasets: not a MinIO upload, not an already-tiled\r\n // table, carry a portal + are typed GeoJSON. MVT catalog datasets are already tiles.\r\n const isCatalogGeoJson =\r\n !isOrgMinio\r\n && tiledFileId == null\r\n && dataset.datasetType === 'GeoJSON'\r\n && !!dataset.portal\r\n && dataset.id != null\r\n\r\n const [publishingCatalog, setPublishingCatalog] = React.useState(false)\r\n const [publishedCatalog, setPublishedCatalog] = React.useState(false)\r\n\r\n const onPublishCatalog = async () => {\r\n if (!dataset.portal || dataset.id == null) return\r\n setPublishingCatalog(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-catalog-tiles', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ portal: dataset.portal, datasetId: dataset.id }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('publish-catalog-tiles failed', res.status, body)\r\n window.alert(`Publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n const result = await res.json()\r\n setPublishedCatalog(true)\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(\r\n `Tiled as ${result.table}. The dataset list has been refreshed.\\n\\n`\r\n + `Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`,\r\n )\r\n }\r\n finally {\r\n setPublishingCatalog(false)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"flex items-center\">\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n // onClick={handleApplyDataset}\r\n className=\" hover:bg-transparent\"\r\n disabled={!ability.can('read', 'File')}\r\n >\r\n <Checkbox\r\n checked={checked}\r\n onCheckedChange={() => {\r\n handleApplyDataset()\r\n }}\r\n className=\"opacity-70 hover:opacity-100 data-[state=checked]:opacity-100 transition-opacity duration-200\"\r\n />\r\n </Button>\r\n\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${isFavourite ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n disabled={!ability.can('read', 'File')}\r\n >\r\n <LR.Star\r\n color={`${isFavourite ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${isFavourite ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n\r\n {isOrgMinio && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={published ? 'Tiled' : 'Publish as vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onPublish}\r\n disabled={publishing || published || !ability.can('update', 'File')}\r\n >\r\n <LR.UploadCloud color={published ? 'hsl(var(--chart-2))' : 'black'} />\r\n </Button>\r\n )}\r\n\r\n {isCatalogGeoJson && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={publishedCatalog ? 'Tiled' : 'Publish open-data dataset as vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onPublishCatalog}\r\n disabled={publishingCatalog || publishedCatalog || !ability.can('update', 'File')}\r\n >\r\n <LR.CloudDownload color={publishedCatalog ? 'hsl(var(--chart-2))' : 'black'} />\r\n </Button>\r\n )}\r\n\r\n {tiledFileId != null && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={unpublished ? 'Un-published' : 'Un-publish vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onUnpublish}\r\n disabled={unpublishing || unpublished || !ability.can('update', 'File')}\r\n >\r\n <LR.CloudOff color={unpublished ? 'hsl(var(--chart-5))' : 'black'} />\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport React from 'react'\r\nimport { usePermissions } from '../../../../store'\r\n// Utility functions\r\nimport { handleFavouriteDataset } from './utils'\r\n\r\n// Shadcn Components\r\nimport { Checkbox, Button } from '../../../ui/'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\nimport { DatasetsContext } from '../../../../store'\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { buildPublishedTileDatasets } from './src/publishedTiles'\r\n\r\ninterface RowActionsProps {\r\n dataset: Dataset\r\n favouriteDatasets: Dataset[]\r\n setFavouriteDatasets: React.Dispatch<React.SetStateAction<Dataset[]>>\r\n martinBaseUrl?: string\r\n}\r\n\r\nexport default function RowActions({\r\n dataset,\r\n favouriteDatasets,\r\n setFavouriteDatasets,\r\n martinBaseUrl,\r\n}: RowActionsProps) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n\r\n const { state: datasetsState, dispatch: datasetsDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetsState.datasets\r\n const orgDatasets = datasetsState.datasets.datasets\r\n\r\n // const [checked, setChecked] = useState(false);\r\n\r\n // Check if this specific dataset is in favourites\r\n const isFavourite = favouriteDatasets.some(item => item.name === dataset.name)\r\n\r\n // \"Checked\" means the dataset is applied to the map. All dataset types —\r\n // including Organizational (MinIO/Martin-hydrated uploads) — toggle their\r\n // membership in addedDatasets, which is the only list OpenDataLayers renders.\r\n // (Previously Organizational datasets toggled a `visible` flag on the\r\n // available list, which nothing renders from, so they never appeared.)\r\n const checked = addedDatasets.some(d => d.name === dataset.name)\r\n\r\n const handleApplyDataset = () => {\r\n if (!dataset) {\r\n console.error('No dataset provided in RowActions')\r\n return\r\n }\r\n\r\n const isAdded = addedDatasets.some(d => d.name === dataset.name)\r\n\r\n if (isAdded) {\r\n datasetsDispatch({\r\n type: 'REMOVE_DATASET_FROM_MAP',\r\n payload: { datasetId: dataset.id },\r\n })\r\n }\r\n else {\r\n datasetsDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset: dataset },\r\n })\r\n }\r\n }\r\n\r\n const handleFavourite = handleFavouriteDataset(dataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const [publishing, setPublishing] = React.useState(false)\r\n const [published, setPublished] = React.useState(false)\r\n\r\n const isOrgMinio = typeof dataset.id === 'string' && dataset.id.startsWith('org-minio-')\r\n const fileId = isOrgMinio\r\n ? Number(String(dataset.id).slice('org-minio-'.length))\r\n : null\r\n\r\n const tiledMatch = typeof dataset.id === 'string'\r\n ? /^org_(\\d+)_file_(\\d+)$/.exec(dataset.id)\r\n : null\r\n // A row is \"converted\" either because it IS the org_<orgId>_file_<fileId> tile\r\n // entry (organizational tab), or because it's the original open-data dataset\r\n // stamped with the published File it resolves to (every other tab). Either way\r\n // we show the un-publish action and drive it with this fileId.\r\n const tiledFileId = tiledMatch\r\n ? Number(tiledMatch[2])\r\n : (typeof dataset.publishedFileId === 'number' ? dataset.publishedFileId : null)\r\n\r\n const [unpublishing, setUnpublishing] = React.useState(false)\r\n const [unpublished, setUnpublished] = React.useState(false)\r\n\r\n const onUnpublish = async () => {\r\n if (tiledFileId == null) return\r\n if (!window.confirm(`Un-publish \"${dataset.name}\"? The Martin table will be dropped; the original GeoJSON in MinIO is untouched.`)) return\r\n setUnpublishing(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-tiles', {\r\n method: 'DELETE',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ fileId: tiledFileId }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('un-publish failed', res.status, body)\r\n window.alert(`Un-publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n setUnpublished(true)\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(`Un-published. The dataset list has been refreshed.`)\r\n }\r\n finally {\r\n setUnpublishing(false)\r\n }\r\n }\r\n\r\n const onPublish = async () => {\r\n if (fileId == null || Number.isNaN(fileId)) return\r\n setPublishing(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-tiles', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ fileId }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('publish-tiles failed', res.status, body)\r\n window.alert(`Publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n const result = await res.json()\r\n setPublished(true)\r\n\r\n // Optimistically swap the MinIO upload row for its published-tile form so the\r\n // un-publish (CloudOff) icon shows immediately. The full org refetch below\r\n // (REFRESH_ORG_DATASETS) re-samples a vector tile per dataset to detect geometry,\r\n // which can take several seconds; without this the row only flips after that lands\r\n // (or after the dialog is reopened). The refetch reconciles this swap when it finishes.\r\n const tileBaseUrl = (martinBaseUrl ?? '').replace(/\\/+$/, '')\r\n const minioId = `org-minio-${fileId}`\r\n const [optimistic] = buildPublishedTileDatasets(\r\n [{\r\n name: dataset.name,\r\n description: JSON.stringify({ tiledTable: result.table, geometryType: result.geometryType }),\r\n }],\r\n tileBaseUrl,\r\n { countrySubdivision: dataset.countrySubdivision ?? '', municipality: dataset.municipality ?? '' } as any,\r\n )\r\n if (optimistic) {\r\n const current = orgDatasets ?? []\r\n const swapped = current.some(d => d.id === minioId)\r\n ? current.map(d => (d.id === minioId ? optimistic : d))\r\n : [...current, optimistic]\r\n datasetsDispatch({ type: 'SET_DATASETS', payload: { datasets: swapped } })\r\n // Keep the map layer in sync if this dataset was already applied.\r\n if (addedDatasets.some(d => d.id === minioId)) {\r\n datasetsDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: minioId } })\r\n datasetsDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: optimistic } })\r\n }\r\n }\r\n\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(\r\n `Tiled as ${result.table}. The dataset list has been refreshed.\\n\\n`\r\n + `Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`,\r\n )\r\n }\r\n finally {\r\n setPublishing(false)\r\n }\r\n }\r\n\r\n // Catalog (open-data-portal) GeoJSON datasets: not a MinIO upload, not an already-tiled\r\n // table, carry a portal + are typed GeoJSON. MVT catalog datasets are already tiles.\r\n const isCatalogGeoJson =\r\n !isOrgMinio\r\n && tiledFileId == null\r\n && dataset.datasetType === 'GeoJSON'\r\n && !!dataset.portal\r\n && dataset.id != null\r\n\r\n const [publishingCatalog, setPublishingCatalog] = React.useState(false)\r\n const [publishedCatalog, setPublishedCatalog] = React.useState(false)\r\n\r\n const onPublishCatalog = async () => {\r\n if (!dataset.portal || dataset.id == null) return\r\n setPublishingCatalog(true)\r\n try {\r\n const res = await fetch('/api/datasets/publish-catalog-tiles', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ portal: dataset.portal, datasetId: dataset.id }),\r\n })\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => ({}))\r\n console.error('publish-catalog-tiles failed', res.status, body)\r\n window.alert(`Publish failed: ${body?.error ?? res.status}`)\r\n return\r\n }\r\n const result = await res.json()\r\n setPublishedCatalog(true)\r\n datasetsDispatch({ type: 'REFRESH_ORG_DATASETS' })\r\n window.alert(\r\n `Tiled as ${result.table}. The dataset list has been refreshed.\\n\\n`\r\n + `Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`,\r\n )\r\n }\r\n finally {\r\n setPublishingCatalog(false)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"flex items-center\">\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n // onClick={handleApplyDataset}\r\n className=\" hover:bg-transparent\"\r\n disabled={!ability.can('read', 'File')}\r\n >\r\n <Checkbox\r\n checked={checked}\r\n onCheckedChange={() => {\r\n handleApplyDataset()\r\n }}\r\n className=\"opacity-70 hover:opacity-100 data-[state=checked]:opacity-100 transition-opacity duration-200\"\r\n />\r\n </Button>\r\n\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${isFavourite ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n disabled={!ability.can('read', 'File')}\r\n >\r\n <LR.Star\r\n color={`${isFavourite ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${isFavourite ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n\r\n {isOrgMinio && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={published ? 'Tiled' : 'Publish as vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onPublish}\r\n disabled={publishing || published || !ability.can('update', 'File')}\r\n >\r\n <LR.UploadCloud color={published ? 'hsl(var(--chart-2))' : 'black'} />\r\n </Button>\r\n )}\r\n\r\n {isCatalogGeoJson && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={publishedCatalog ? 'Tiled' : 'Publish open-data dataset as vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onPublishCatalog}\r\n disabled={publishingCatalog || publishedCatalog || !ability.can('update', 'File')}\r\n >\r\n <LR.CloudDownload color={publishedCatalog ? 'hsl(var(--chart-2))' : 'black'} />\r\n </Button>\r\n )}\r\n\r\n {tiledFileId != null && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n title={unpublished ? 'Un-published' : 'Un-publish vector tiles'}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={onUnpublish}\r\n disabled={unpublishing || unpublished || !ability.can('update', 'File')}\r\n >\r\n <LR.CloudOff color={unpublished ? 'hsl(var(--chart-5))' : 'black'} />\r\n </Button>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,8 +1,12 @@
1
1
  import * as React from 'react';
2
+ import { Organization } from '../../../../types/dbTypes';
2
3
  type DatasetsProps = {
3
4
  isOpen: boolean;
4
5
  setIsOpenAction: (open: boolean) => void;
6
+ organization?: Organization;
7
+ minioBaseUrl?: string;
8
+ martinBaseUrl?: string;
5
9
  };
6
- export default function Datasets({ isOpen, setIsOpenAction }: DatasetsProps): React.JSX.Element;
10
+ export default function Datasets({ isOpen, setIsOpenAction, organization, minioBaseUrl, martinBaseUrl }: DatasetsProps): React.JSX.Element;
7
11
  export {};
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAM,KAAK,MAAM,OAAO,CAAA;AAsG/B,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACzC,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,aAAa,qBAkkB1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAM,KAAK,MAAM,OAAO,CAAA;AA6C/B,OAAO,EAAgB,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAyDtE,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,aAAa,qBAkkBrH"}
@@ -26,7 +26,6 @@ import { usePermissions } from "../../../../store";
26
26
  import { usePathname } from "next/navigation";
27
27
  import { useOpenDataPortalsByCountrySubdivision, useOpenDataPortalsByGroup, useOpenDataPortalsByMunicipality } from "../../../../hooks/openDataPortals/openDataPortals";
28
28
  import { DatasetsContext, MenusContext, useMapContext } from "../../../../store";
29
- import { useAppConfigContext } from "../../../../store/AppConfig/context";
30
29
  import { Badge } from "../../../../components/ui/Badge";
31
30
  import {
32
31
  Breadcrumb,
@@ -102,18 +101,17 @@ function datasetVisibleForOrg(dataset, visibility) {
102
101
  if (orgId === void 0) return false;
103
102
  return visibility.allowedOrgIds.includes(orgId);
104
103
  }
105
- function Datasets({ isOpen, setIsOpenAction }) {
106
- var _a, _b, _c, _d, _e;
104
+ function Datasets({ isOpen, setIsOpenAction, organization, minioBaseUrl, martinBaseUrl }) {
105
+ var _a, _b, _c, _d;
107
106
  const t = useTranslations("Datasets");
108
107
  const { ability } = usePermissions();
109
108
  const datasetColumns = useColumns();
110
109
  const { state: mapState } = useMapContext();
111
110
  const { currentLocation } = mapState.map;
112
- const { state: appConfigState } = useAppConfigContext();
113
- const orgCountry = (((_a = appConfigState.appConfig.organization) == null ? void 0 : _a.country) || "").toUpperCase();
114
- const org = appConfigState.appConfig.organization;
115
- const municipality = (_c = (_b = currentLocation == null ? void 0 : currentLocation.municipality) != null ? _b : org == null ? void 0 : org.municipality) != null ? _c : null;
116
- const countrySubdivision = (_e = (_d = currentLocation == null ? void 0 : currentLocation.countrySubdivision) != null ? _d : org == null ? void 0 : org.countrySubdivision) != null ? _e : null;
111
+ const orgCountry = ((organization == null ? void 0 : organization.country) || "").toUpperCase();
112
+ const org = organization;
113
+ const municipality = (_b = (_a = currentLocation == null ? void 0 : currentLocation.municipality) != null ? _a : org == null ? void 0 : org.municipality) != null ? _b : null;
114
+ const countrySubdivision = (_d = (_c = currentLocation == null ? void 0 : currentLocation.countrySubdivision) != null ? _c : org == null ? void 0 : org.countrySubdivision) != null ? _d : null;
117
115
  const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext);
118
116
  const { addedDatasets } = datasetState.datasets;
119
117
  const { state: menusState } = React.useContext(MenusContext);
@@ -159,7 +157,7 @@ function Datasets({ isOpen, setIsOpenAction }) {
159
157
  const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage });
160
158
  React.useEffect(() => {
161
159
  const loadOrganizationalDatasets = async () => {
162
- var _a2, _b2;
160
+ var _a2;
163
161
  try {
164
162
  const filesRes = await fetch("/api/files");
165
163
  if (filesRes.ok) {
@@ -170,9 +168,9 @@ function Datasets({ isOpen, setIsOpenAction }) {
170
168
  } catch (err) {
171
169
  console.warn("Failed to refresh published-catalog map:", err);
172
170
  }
173
- const martinBaseUrl = (_a2 = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL) == null ? void 0 : _a2.replace(/\/+$/, "");
174
- const martinPromise = martinBaseUrl ? (async () => {
175
- const datasetsUrl = martinBaseUrl.includes("/tiles/index.json") ? martinBaseUrl : `${martinBaseUrl}/tiles/index.json`;
171
+ const martinBaseUrlClean = (martinBaseUrl != null ? martinBaseUrl : "").replace(/\/+$/, "");
172
+ const martinPromise = martinBaseUrlClean ? (async () => {
173
+ const datasetsUrl = martinBaseUrlClean.includes("/tiles/index.json") ? martinBaseUrlClean : `${martinBaseUrlClean}/tiles/index.json`;
176
174
  const localPortal = {
177
175
  id: -1,
178
176
  name: "Organizational Datasets",
@@ -189,15 +187,15 @@ function Datasets({ isOpen, setIsOpenAction }) {
189
187
  return [];
190
188
  }
191
189
  })() : Promise.resolve([]);
192
- if (!martinBaseUrl) {
190
+ if (!martinBaseUrlClean) {
193
191
  console.warn("NEXT_PUBLIC_MARTIN_SERVER_URL not configured \u2014 skipping Martin pre-load");
194
192
  }
195
- const sessionOrgId = typeof (org == null ? void 0 : org.id) === "number" ? org.id : Number.parseInt(String((_b2 = org == null ? void 0 : org.id) != null ? _b2 : ""), 10);
193
+ const sessionOrgId = typeof (org == null ? void 0 : org.id) === "number" ? org.id : Number.parseInt(String((_a2 = org == null ? void 0 : org.id) != null ? _a2 : ""), 10);
196
194
  const martinDatasets = await martinPromise;
197
195
  const publishedTilesInCatalog = new Set(
198
196
  martinDatasets.map((d) => typeof d.id === "string" ? d.id : "").filter(Boolean)
199
197
  );
200
- const minioDatasets = Number.isFinite(sessionOrgId) ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog).catch((err) => {
198
+ const minioDatasets = Number.isFinite(sessionOrgId) ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog, minioBaseUrl).catch((err) => {
201
199
  console.error("Failed to load MinIO organizational datasets:", err);
202
200
  return [];
203
201
  }) : [];
@@ -460,7 +458,8 @@ function Datasets({ isOpen, setIsOpenAction }) {
460
458
  RowActions,
461
459
  __spreadProps(__spreadValues({}, props), {
462
460
  favouriteDatasets,
463
- setFavouriteDatasets
461
+ setFavouriteDatasets,
462
+ martinBaseUrl
464
463
  })
465
464
  ),
466
465
  trailingCell: ({ row, index }) => /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../store'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { useOpenDataPortalsByCountrySubdivision, useOpenDataPortalsByGroup, useOpenDataPortalsByMunicipality } from '../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../store'\r\nimport { useAppConfigContext } from '../../../../store/AppConfig/context'\r\nimport { Badge } from '../../../../components/ui/Badge'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../../../components/ui/Breadcrumb'\r\nimport { Button } from '../../../../components/ui/Button'\r\nimport { DataTable } from '../../../../components/ui/DataTable'\r\nimport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../../../components/ui/Dialog'\r\nimport { Input } from '../../../../components/ui/Input'\r\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../../components/ui/Tabs'\r\n// Data\r\nimport { useColumns } from './data'\r\nimport DatasetDetails from './DatasetDetails'\r\n// Custom components\r\nimport { AddPortalDialog } from './AddPortalDialog'\r\nimport DatasetSkeleton from './DatasetSkeleton'\r\nimport Filters from './Filters'\r\nimport RowActions from './RowActions'\r\nimport { useDatasetsForPortals } from './src/useDatasetsForPortals'\r\nimport { handleFavouriteDataset } from './utils'\r\nimport { fetchLocalDatasets } from './src/localDatasets'\r\nimport { fetchOrganizationalMinioDatasets } from './src/minioDatasets'\r\nimport { buildPublishedCatalogMap, stampPublished, type PublishedCatalogEntry } from './src/publishedTiles'\r\nimport { builtinLiveDatasets } from './src/builtinLiveDatasets'\r\nimport { useFastDatasetCache } from './src/useFastDatasetCache'\r\nimport { DatasetGroup } from '../../../../types/dbTypes'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return {\r\n isAdmin: true,\r\n currentOrgId: 1,\r\n allowedOrgIds: ADMIN_ALLOWED_ORGS,\r\n }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n const allowedOrgIds = Array.from(new Set([2, currentOrgId]))\r\n\r\n return {\r\n isAdmin: false,\r\n currentOrgId,\r\n allowedOrgIds,\r\n }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\n\r\ntype DatasetsProps = {\r\n isOpen: boolean\r\n setIsOpenAction: (open: boolean) => void\r\n}\r\n\r\nexport default function Datasets({ isOpen, setIsOpenAction }: DatasetsProps) {\r\n // Translation\r\n const t = useTranslations('Datasets')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const datasetColumns = useColumns()\r\n\r\n // Contexts\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const { state: appConfigState } = useAppConfigContext()\r\n const orgCountry = (appConfigState.appConfig.organization?.country || '').toUpperCase()\r\n const org = appConfigState.appConfig.organization\r\n // Fall back to org fixed location when currentLocation hasn't been set yet (e.g. before map hover)\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n // UI State\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedDataset, setSelectedDataset] = React.useState<Dataset | null>(null)\r\n const [favouriteDatasets, setFavouriteDatasets] = React.useState<Dataset[]>([])\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [appliedFilters, setAppliedFilters] = React.useState<{ countrySubdivisions: string[], municipalities: string[], types: string[], sources: string[] }>({ countrySubdivisions: [], municipalities: [], types: [], sources: [] })\r\n const [currentTab, setCurrentTab] = React.useState('all')\r\n const [isAddPortalOpen, setIsAddPortalOpen] = React.useState(false)\r\n // Open-data datasets already published to Martin tiles, keyed by\r\n // \"{portalId}:{datasetId}\". Lets the original portal entry (National/Applied/\r\n // All tabs) show as converted, not just the organizational-list copy.\r\n const [publishedCatalog, setPublishedCatalog] = React.useState<Map<string, PublishedCatalogEntry>>(new Map())\r\n const showMunicipalTab = React.useMemo(() => Boolean(municipality), [municipality])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n // Belt-and-suspenders country guard: portal.country must match org, or be unset (legacy/global)\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true // org country unknown — show everything\r\n if (!portalCountry) return true // portal has no country set — treat as global\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(() => {\r\n if (!Array.isArray(municipalPortals)) return []\r\n const filtered = municipalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [municipalPortals, matchesOrgCountry, municipality])\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(() => {\r\n if (!Array.isArray(nationalPortals)) return []\r\n const filtered = nationalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [nationalPortals, orgCountry, matchesOrgCountry])\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n // First, refresh the published-catalog lookup (a fast /api/files read) so\r\n // converted open-data datasets flip promptly across every tab — ahead of\r\n // the slower Martin tile-sampling below. Non-fatal on failure.\r\n try {\r\n const filesRes = await fetch('/api/files')\r\n if (filesRes.ok) {\r\n const body = await filesRes.json()\r\n const rows = Array.isArray(body?.files) ? body.files : []\r\n setPublishedCatalog(buildPublishedCatalogMap(rows))\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to refresh published-catalog map:', err)\r\n }\r\n\r\n // Two parallel sources: Martin vector tiles (if configured) and MinIO-\r\n // backed GeoJSON uploads (the \"Add Dataset\" path). Errors from either\r\n // are isolated so a failure on one side does not block the other.\r\n const martinBaseUrl = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL?.replace(/\\/+$/, '')\r\n\r\n const martinPromise: Promise<Dataset[]> = martinBaseUrl\r\n ? (async () => {\r\n const datasetsUrl = martinBaseUrl.includes('/tiles/index.json')\r\n ? martinBaseUrl\r\n : `${martinBaseUrl}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n try {\r\n return await fetchLocalDatasets(localPortal as any)\r\n }\r\n catch (err) {\r\n console.error('Failed to load Martin organizational datasets:', err)\r\n return []\r\n }\r\n })()\r\n : Promise.resolve([])\r\n\r\n if (!martinBaseUrl) {\r\n console.warn('NEXT_PUBLIC_MARTIN_SERVER_URL not configured — skipping Martin pre-load')\r\n }\r\n\r\n // The MinIO key prefix is the *session* organization (set server-side\r\n // by the upload route), not orgVisibility.currentOrgId (which is\r\n // path-derived and hardcoded for admin routes like /cdt).\r\n const sessionOrgId = typeof org?.id === 'number'\r\n ? org.id\r\n : Number.parseInt(String(org?.id ?? ''), 10)\r\n\r\n // Martin must resolve first so MinIO suppression can check live catalog\r\n // membership — prevents \"file disappeared\" during the publish→restart gap.\r\n const martinDatasets = await martinPromise\r\n const publishedTilesInCatalog = new Set<string>(\r\n martinDatasets.map(d => typeof d.id === 'string' ? d.id : '').filter(Boolean),\r\n )\r\n\r\n const minioDatasets: Dataset[] = Number.isFinite(sessionOrgId)\r\n ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog).catch((err) => {\r\n console.error('Failed to load MinIO organizational datasets:', err)\r\n return []\r\n })\r\n : []\r\n\r\n const combined = [...martinDatasets, ...minioDatasets]\r\n const visibleOrgDatasets = combined.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n if (visibleOrgDatasets.length === 0) {\r\n console.warn('No organizational datasets found')\r\n }\r\n datasetDispatch({\r\n type: 'SET_DATASETS',\r\n payload: { datasets: visibleOrgDatasets },\r\n })\r\n }\r\n\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility, org?.id, datasetState.datasets.orgRefreshNonce])\r\n\r\n // Stamp each portal list with published-tile identity so a converted open-data\r\n // dataset shows as converted on its own tab (National/Subdivision/Municipal),\r\n // not only on the organizational tab. No-op for unpublished datasets.\r\n const nationalDatasets = React.useMemo(() => stampPublished(national.datasets, publishedCatalog), [national.datasets, publishedCatalog])\r\n const subdivisionDatasets = React.useMemo(() => stampPublished(subdivision.datasets, publishedCatalog), [subdivision.datasets, publishedCatalog])\r\n const municipalDatasets = React.useMemo(() => stampPublished(municipal.datasets, publishedCatalog), [municipal.datasets, publishedCatalog])\r\n\r\n const isLoadingNational = national.isLoading && nationalDatasets.length === 0\r\n const isLoadingSubdivision = subdivision.isLoading && subdivisionDatasets.length === 0\r\n const isLoadingMunicipal = municipal.isLoading && municipalDatasets.length === 0\r\n\r\n const datasetsError = React.useMemo(() => {\r\n if (currentTab === 'municipal' && municipal.isError && municipalDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'countrySubdivision' && subdivision.isError && subdivisionDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'national' && national.isError && nationalDatasets.length === 0) return t('failedFetchError')\r\n return null\r\n }, [currentTab, municipal.isError, municipalDatasets.length, subdivision.isError, subdivisionDatasets.length, national.isError, nationalDatasets.length, t])\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const unfiltered = [\r\n ...builtinLiveDatasets, // curated live feeds (e.g. GeoMet weather radar) → Live Data tab\r\n ...nationalDatasets,\r\n ...subdivisionDatasets,\r\n ...municipalDatasets,\r\n ...addedDatasets,\r\n ...(datasetState.datasets.datasets || []),\r\n ]\r\n\r\n const filtered = unfiltered.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n // Also stamp here so the addedDatasets snapshot (applied at add-time, before\r\n // conversion) and any org-list entries pick up published identity on the\r\n // Applied/All tabs. Already-stamped portal entries are unchanged.\r\n return stampPublished(filtered, publishedCatalog)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility, publishedCatalog])\r\n\r\n const currentTabLoading = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'national':\r\n return isLoadingNational\r\n case 'countrySubdivision':\r\n return isLoadingSubdivision\r\n case 'municipal':\r\n return isLoadingMunicipal\r\n case 'all':\r\n // Show loading for \"all\" if any datasets are loading and we have no data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.length === 0\r\n case 'organizational':\r\n // Show loading for \"organizational\" if any datasets are loading and we have no organizational data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.filter(ds => ds.group === 'Organizational').length === 0\r\n default:\r\n return false\r\n }\r\n }, [currentTab, isLoadingNational, isLoadingSubdivision, isLoadingMunicipal, allDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!showMunicipalTab && currentTab === 'municipal') {\r\n setCurrentTab('all')\r\n }\r\n }, [showMunicipalTab, currentTab])\r\n\r\n // Memoized datasets for current tab\r\n const currentTabDatasets = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'applied':\r\n return allDatasets.filter(ds => addedDatasets.some(d => d.name === ds.name))\r\n case 'favourites':\r\n return allDatasets.filter(ds => favouriteDatasets.some(fav => fav.name === ds.name))\r\n case 'organizational':\r\n return allDatasets.filter(ds => ds.group === 'Organizational')\r\n case 'liveData':\r\n return allDatasets.filter(ds => ds.portal?.live === true)\r\n case 'national':\r\n return nationalDatasets\r\n case 'countrySubdivision':\r\n return subdivisionDatasets\r\n case 'municipal':\r\n return municipalDatasets\r\n case 'all':\r\n default:\r\n return allDatasets\r\n }\r\n }, [currentTab, allDatasets, addedDatasets, favouriteDatasets, nationalDatasets, subdivisionDatasets, municipalDatasets])\r\n\r\n // Memoized filtered data\r\n const filteredData = React.useMemo(() => {\r\n return currentTabDatasets.filter((dataset) => {\r\n // Search filter\r\n const matchesSearch = Object.values(dataset).some(value =>\r\n String(value).toLowerCase().includes(searchTerm.toLowerCase()),\r\n )\r\n if (!matchesSearch)\r\n return false\r\n\r\n // Country subdivision filter\r\n const matchesSubdivision\r\n = appliedFilters.countrySubdivisions.length === 0\r\n || !dataset.countrySubdivision\r\n || appliedFilters.countrySubdivisions.includes(dataset.countrySubdivision)\r\n\r\n // Municipality filter\r\n const matchesMunicipality\r\n = appliedFilters.municipalities.length === 0\r\n || !dataset.municipality\r\n || appliedFilters.municipalities.includes(dataset.municipality)\r\n\r\n // Type filter\r\n const matchesType\r\n = appliedFilters.types.length === 0\r\n || appliedFilters.types.includes(dataset.type)\r\n\r\n // Source filter (dataset.portal?.name, falling back to publisher)\r\n const datasetSource = dataset.portal?.name ?? dataset.publisher\r\n const matchesSource\r\n = appliedFilters.sources.length === 0\r\n || (datasetSource ? appliedFilters.sources.includes(datasetSource) : false)\r\n\r\n return matchesSubdivision && matchesMunicipality && matchesType && matchesSource\r\n })\r\n }, [currentTabDatasets, searchTerm, appliedFilters])\r\n\r\n const sortedFilteredData = React.useMemo(() => {\r\n // Remove duplicates by name\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of filteredData) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) {\r\n uniqueByName.set(name, ds)\r\n }\r\n }\r\n\r\n // Filter out unwanted names/types\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding')\r\n })\r\n\r\n // HARD CODE BLOCK LIST\r\n const blocklisted = (ds: Dataset) => {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return (\r\n url.includes('/2021_statistics_canada_boundaries/featureserver')\r\n || name.includes('2021 statistics canada boundaries')\r\n || url.includes('/limites_du_recensement_de_statistique_canada_(2021)/featureserver')\r\n || name.includes('limites du recensement de statistique canada (2021)')\r\n )\r\n }\r\n\r\n const safe = filtered.filter(ds => !blocklisted(ds))\r\n\r\n // Sort by name\r\n return safe.sort((a, b) =>\r\n (a.name || '').localeCompare(b.name || ''),\r\n )\r\n }, [filteredData])\r\n\r\n const { prefetch } = useFastDatasetCache()\r\n\r\n React.useEffect(() => {\r\n if (isOpen && sortedFilteredData.length > 0) {\r\n const datasetsToPreload = sortedFilteredData.slice(0, 10)\r\n datasetsToPreload.forEach((dataset, index) => {\r\n setTimeout(() => {\r\n prefetch(dataset)\r\n }, index * 200)\r\n })\r\n }\r\n }, [isOpen, sortedFilteredData, prefetch])\r\n\r\n // Handlers\r\n const handleTabChange = React.useCallback((value: string) => setCurrentTab(value), [])\r\n const handleRowClick = React.useCallback((dataset: Dataset) => {\r\n setSelectedDataset(dataset)\r\n setView('detail')\r\n }, [])\r\n const handleRowHover = React.useCallback((dataset: Dataset) => {\r\n prefetch(dataset)\r\n \r\n const currentIndex = sortedFilteredData.indexOf(dataset)\r\n if (currentIndex >= 0 && currentIndex < sortedFilteredData.length - 2) {\r\n setTimeout(() => {\r\n if (sortedFilteredData[currentIndex + 1]) {\r\n prefetch(sortedFilteredData[currentIndex + 1])\r\n }\r\n }, 100)\r\n }\r\n }, [prefetch, sortedFilteredData])\r\n const handleBackToTable = React.useCallback(() => {\r\n setView('table')\r\n setSelectedDataset(null)\r\n }, [])\r\n const handleAddDatasetToMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: selectedDataset } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleRemoveDatasetFromMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: selectedDataset.id } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleFavourite = handleFavouriteDataset(selectedDataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const handleAddDataset = () => {\r\n // Logic to add a new dataset\r\n }\r\n\r\n // UI\r\n return (\r\n <Dialog open={isOpen} onOpenChange={setIsOpenAction}>\r\n <DialogContent className=\"h-screen sm:h-[90vh] sm:max-h-[90vh] w-full max-w-full sm:w-[88vw] sm:max-w-[88vw] p-0 gap-0 overflow-hidden flex flex-col\">\r\n {view === 'table' ? (\r\n <>\r\n <DialogHeader className=\"bg-background z-50 sticky top-0 p-6 flex flex-row flex-wrap justify-between items-end gap-2 text-left\">\r\n <div className=\"flex flex-col justify-end p-0\">\r\n <DialogTitle className=\"text-2xl\">{t('dialogTitle')}</DialogTitle>\r\n <DialogDescription className=\"text-sm\">\r\n {t('dialogDescription')}\r\n </DialogDescription>\r\n </div>\r\n <div className=\"flex flex-row flex-wrap justify-between items-center\">\r\n <div className=\"flex flex-wrap gap-2 font-medium\">\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"Search\"\r\n className=\"pl-8 w-[250px]\"\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Filters\r\n datasets={currentTabDatasets}\r\n appliedFilters={appliedFilters}\r\n onFiltersChange={setAppliedFilters}\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setIsAddPortalOpen(true)}\r\n title=\"Register a new open data portal\"\r\n >\r\n <LR.Plus className=\"h-4 w-4 mr-1\" />\r\n Add Portal\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n <DialogClose className=\"absolute right-2 top-2 h-5 w-5 rounded-xl text-muted-foreground hover:bg-transparent focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-background focus:ring-primary\">\r\n <LR.X className=\"!h-4 !w-4\" />\r\n </DialogClose>\r\n </DialogHeader>\r\n <div className=\"relative flex flex-col flex-1 min-h-0\">\r\n <Tabs value={currentTab} className=\"flex flex-col gap-0 h-full\" onValueChange={handleTabChange}>\r\n <div className=\"hidden md:!flex justify-between px-3 flex-shrink-0\">\r\n {' '}\r\n {/* Prevent tabs from shrinking */}\r\n <TabsList className=\"pointer-events-auto sticky flex z-40 top-[100px] bg-transparent\">\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"applied\">\r\n <Badge variant=\"outline\">{addedDatasets.length}</Badge>\r\n {t('appliedTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"favourites\">\r\n {t('favoritesTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"organizational\">{t('organizationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"all\">{t('allDataTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"national\">{t('nationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"countrySubdivision\">{t('countrySubdivisionTab')}</TabsTrigger>\r\n {showMunicipalTab && (\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"municipal\">{t('municipalTab')}</TabsTrigger>\r\n )}\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"liveData\">{t('liveDataTab')}</TabsTrigger>\r\n </TabsList>\r\n </div>\r\n <TabsContent\r\n value={currentTab}\r\n className=\"flex-1 pointer-events-auto mt-0 min-h-0\" // min-h-0 is crucial for flex children\r\n >\r\n {currentTabLoading ? (\r\n <DatasetSkeleton />\r\n ) : (datasetsError ? (\r\n <div className=\"flex flex-col justify-center items-center h-32 text-muted-foreground\">\r\n <LR.AlertCircle className=\"h-6 w-6 mb-2\" />\r\n <span>{datasetsError}</span>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.location.reload()} className=\"mt-2\">\r\n <LR.RefreshCw className=\"h-4 w-4 mr-2\" />\r\n {t('refreshButton')}\r\n </Button>\r\n </div>\r\n ) : (\r\n <DataTable\r\n showPagination={true}\r\n columns={datasetColumns}\r\n data={sortedFilteredData}\r\n tab={currentTab}\r\n onRowClick={handleRowClick}\r\n onRowHover={handleRowHover}\r\n className=\"rounded-none w-auto h-full\" \r\n paginationClasses=\"bg-background z-20 w-full border-t\" \r\n isLoading={currentTabLoading}\r\n leadingCell={props => (\r\n <RowActions\r\n {...props}\r\n favouriteDatasets={favouriteDatasets}\r\n setFavouriteDatasets={setFavouriteDatasets}\r\n />\r\n )}\r\n trailingCell={({ row, index }) => (\r\n <div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"pointer-events-none\"\r\n >\r\n <LR.ChevronRight />\r\n </Button>\r\n </div>\r\n )}\r\n />\r\n ))}\r\n </TabsContent>\r\n </Tabs>\r\n </div>\r\n </>\r\n ) : (\r\n // Detail View Content\r\n <>\r\n <DialogHeader className=\"px-6 pt-6\">\r\n <div>\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n handleBackToTable()\r\n setCurrentTab('all')\r\n }}\r\n >\r\n {t('breadcrumbTitle')}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n setCurrentTab(currentTab)\r\n handleBackToTable()\r\n }}\r\n >\r\n {currentTab.charAt(0).toUpperCase() + currentTab.slice(1)}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{selectedDataset?.name}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n <div className=\"flex flex-row justify-between\">\r\n <div className=\"flex items-center\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n >\r\n <LR.Star\r\n className=\"!h-5 !w-5\"\r\n size={24}\r\n color={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n <DialogTitle>{selectedDataset?.name}</DialogTitle>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handleBackToTable}\r\n >\r\n <LR.ArrowLeft />\r\n {t('backToDataButton')}\r\n </Button>\r\n {selectedDataset && addedDatasets.some(d => d.name === selectedDataset.name)\r\n ? (\r\n <Button onClick={handleRemoveDatasetFromMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Minus />\r\n {t('removeButton')}\r\n </Button>\r\n )\r\n : (\r\n <Button onClick={handleAddDatasetToMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Plus />\r\n {t('applyButton')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </DialogHeader>\r\n <DatasetDetails selectedDataset={selectedDataset} />\r\n </>\r\n )}\r\n </DialogContent>\r\n <AddPortalDialog open={isAddPortalOpen} onOpenChange={setIsAddPortalOpen} />\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../store'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport type { Dataset } from '../../../../types/datasetTypes'\r\nimport { useOpenDataPortalsByCountrySubdivision, useOpenDataPortalsByGroup, useOpenDataPortalsByMunicipality } from '../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../store'\r\n// import { useAppConfigContext } from '../../../../store/AppConfig/context'\r\nimport { Badge } from '../../../../components/ui/Badge'\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from '../../../../components/ui/Breadcrumb'\r\nimport { Button } from '../../../../components/ui/Button'\r\nimport { DataTable } from '../../../../components/ui/DataTable'\r\nimport {\r\n Dialog,\r\n DialogClose,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../../../../components/ui/Dialog'\r\nimport { Input } from '../../../../components/ui/Input'\r\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../../components/ui/Tabs'\r\n// Data\r\nimport { useColumns } from './data'\r\nimport DatasetDetails from './DatasetDetails'\r\n// Custom components\r\nimport { AddPortalDialog } from './AddPortalDialog'\r\nimport DatasetSkeleton from './DatasetSkeleton'\r\nimport Filters from './Filters'\r\nimport RowActions from './RowActions'\r\nimport { useDatasetsForPortals } from './src/useDatasetsForPortals'\r\nimport { handleFavouriteDataset } from './utils'\r\nimport { fetchLocalDatasets } from './src/localDatasets'\r\nimport { fetchOrganizationalMinioDatasets } from './src/minioDatasets'\r\nimport { buildPublishedCatalogMap, stampPublished, type PublishedCatalogEntry } from './src/publishedTiles'\r\nimport { builtinLiveDatasets } from './src/builtinLiveDatasets'\r\nimport { useFastDatasetCache } from './src/useFastDatasetCache'\r\nimport { DatasetGroup, Organization } from '../../../../types/dbTypes'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return {\r\n isAdmin: true,\r\n currentOrgId: 1,\r\n allowedOrgIds: ADMIN_ALLOWED_ORGS,\r\n }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n const allowedOrgIds = Array.from(new Set([2, currentOrgId]))\r\n\r\n return {\r\n isAdmin: false,\r\n currentOrgId,\r\n allowedOrgIds,\r\n }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\n\r\ntype DatasetsProps = {\r\n isOpen: boolean\r\n setIsOpenAction: (open: boolean) => void\r\n organization?: Organization\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n}\r\n\r\nexport default function Datasets({ isOpen, setIsOpenAction, organization, minioBaseUrl, martinBaseUrl }: DatasetsProps) {\r\n // Translation\r\n const t = useTranslations('Datasets')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const datasetColumns = useColumns()\r\n\r\n // Contexts\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const orgCountry = (organization?.country || '').toUpperCase()\r\n const org = organization\r\n // Fall back to org fixed location when currentLocation hasn't been set yet (e.g. before map hover)\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n // UI State\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedDataset, setSelectedDataset] = React.useState<Dataset | null>(null)\r\n const [favouriteDatasets, setFavouriteDatasets] = React.useState<Dataset[]>([])\r\n const [searchTerm, setSearchTerm] = React.useState('')\r\n const [appliedFilters, setAppliedFilters] = React.useState<{ countrySubdivisions: string[], municipalities: string[], types: string[], sources: string[] }>({ countrySubdivisions: [], municipalities: [], types: [], sources: [] })\r\n const [currentTab, setCurrentTab] = React.useState('all')\r\n const [isAddPortalOpen, setIsAddPortalOpen] = React.useState(false)\r\n // Open-data datasets already published to Martin tiles, keyed by\r\n // \"{portalId}:{datasetId}\". Lets the original portal entry (National/Applied/\r\n // All tabs) show as converted, not just the organizational-list copy.\r\n const [publishedCatalog, setPublishedCatalog] = React.useState<Map<string, PublishedCatalogEntry>>(new Map())\r\n const showMunicipalTab = React.useMemo(() => Boolean(municipality), [municipality])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n // Belt-and-suspenders country guard: portal.country must match org, or be unset (legacy/global)\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true // org country unknown — show everything\r\n if (!portalCountry) return true // portal has no country set — treat as global\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(() => {\r\n if (!Array.isArray(municipalPortals)) return []\r\n const filtered = municipalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [municipalPortals, matchesOrgCountry, municipality])\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(() => {\r\n if (!Array.isArray(nationalPortals)) return []\r\n const filtered = nationalPortals.filter(p => matchesOrgCountry(p.country))\r\n return filtered\r\n }, [nationalPortals, orgCountry, matchesOrgCountry])\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n // First, refresh the published-catalog lookup (a fast /api/files read) so\r\n // converted open-data datasets flip promptly across every tab — ahead of\r\n // the slower Martin tile-sampling below. Non-fatal on failure.\r\n try {\r\n const filesRes = await fetch('/api/files')\r\n if (filesRes.ok) {\r\n const body = await filesRes.json()\r\n const rows = Array.isArray(body?.files) ? body.files : []\r\n setPublishedCatalog(buildPublishedCatalogMap(rows))\r\n }\r\n }\r\n catch (err) {\r\n console.warn('Failed to refresh published-catalog map:', err)\r\n }\r\n\r\n // Two parallel sources: Martin vector tiles (if configured) and MinIO-\r\n // backed GeoJSON uploads (the \"Add Dataset\" path). Errors from either\r\n // are isolated so a failure on one side does not block the other.\r\n const martinBaseUrlClean = (martinBaseUrl ?? '').replace(/\\/+$/, '')\r\n\r\n const martinPromise: Promise<Dataset[]> = martinBaseUrlClean\r\n ? (async () => {\r\n const datasetsUrl = martinBaseUrlClean.includes('/tiles/index.json')\r\n ? martinBaseUrlClean\r\n : `${martinBaseUrlClean}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n try {\r\n return await fetchLocalDatasets(localPortal as any)\r\n }\r\n catch (err) {\r\n console.error('Failed to load Martin organizational datasets:', err)\r\n return []\r\n }\r\n })()\r\n : Promise.resolve([])\r\n\r\n if (!martinBaseUrlClean) {\r\n console.warn('NEXT_PUBLIC_MARTIN_SERVER_URL not configured — skipping Martin pre-load')\r\n }\r\n\r\n // The MinIO key prefix is the *session* organization (set server-side\r\n // by the upload route), not orgVisibility.currentOrgId (which is\r\n // path-derived and hardcoded for admin routes like /cdt).\r\n const sessionOrgId = typeof org?.id === 'number'\r\n ? org.id\r\n : Number.parseInt(String(org?.id ?? ''), 10)\r\n\r\n // Martin must resolve first so MinIO suppression can check live catalog\r\n // membership — prevents \"file disappeared\" during the publish→restart gap.\r\n const martinDatasets = await martinPromise\r\n const publishedTilesInCatalog = new Set<string>(\r\n martinDatasets.map(d => typeof d.id === 'string' ? d.id : '').filter(Boolean),\r\n )\r\n\r\n const minioDatasets: Dataset[] = Number.isFinite(sessionOrgId)\r\n ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog, minioBaseUrl).catch((err) => {\r\n console.error('Failed to load MinIO organizational datasets:', err)\r\n return []\r\n })\r\n : []\r\n\r\n const combined = [...martinDatasets, ...minioDatasets]\r\n const visibleOrgDatasets = combined.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n if (visibleOrgDatasets.length === 0) {\r\n console.warn('No organizational datasets found')\r\n }\r\n datasetDispatch({\r\n type: 'SET_DATASETS',\r\n payload: { datasets: visibleOrgDatasets },\r\n })\r\n }\r\n\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility, org?.id, datasetState.datasets.orgRefreshNonce])\r\n\r\n // Stamp each portal list with published-tile identity so a converted open-data\r\n // dataset shows as converted on its own tab (National/Subdivision/Municipal),\r\n // not only on the organizational tab. No-op for unpublished datasets.\r\n const nationalDatasets = React.useMemo(() => stampPublished(national.datasets, publishedCatalog), [national.datasets, publishedCatalog])\r\n const subdivisionDatasets = React.useMemo(() => stampPublished(subdivision.datasets, publishedCatalog), [subdivision.datasets, publishedCatalog])\r\n const municipalDatasets = React.useMemo(() => stampPublished(municipal.datasets, publishedCatalog), [municipal.datasets, publishedCatalog])\r\n\r\n const isLoadingNational = national.isLoading && nationalDatasets.length === 0\r\n const isLoadingSubdivision = subdivision.isLoading && subdivisionDatasets.length === 0\r\n const isLoadingMunicipal = municipal.isLoading && municipalDatasets.length === 0\r\n\r\n const datasetsError = React.useMemo(() => {\r\n if (currentTab === 'municipal' && municipal.isError && municipalDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'countrySubdivision' && subdivision.isError && subdivisionDatasets.length === 0) return t('failedFetchError')\r\n if (currentTab === 'national' && national.isError && nationalDatasets.length === 0) return t('failedFetchError')\r\n return null\r\n }, [currentTab, municipal.isError, municipalDatasets.length, subdivision.isError, subdivisionDatasets.length, national.isError, nationalDatasets.length, t])\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const unfiltered = [\r\n ...builtinLiveDatasets, // curated live feeds (e.g. GeoMet weather radar) → Live Data tab\r\n ...nationalDatasets,\r\n ...subdivisionDatasets,\r\n ...municipalDatasets,\r\n ...addedDatasets,\r\n ...(datasetState.datasets.datasets || []),\r\n ]\r\n\r\n const filtered = unfiltered.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n\r\n // Also stamp here so the addedDatasets snapshot (applied at add-time, before\r\n // conversion) and any org-list entries pick up published identity on the\r\n // Applied/All tabs. Already-stamped portal entries are unchanged.\r\n return stampPublished(filtered, publishedCatalog)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility, publishedCatalog])\r\n\r\n const currentTabLoading = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'national':\r\n return isLoadingNational\r\n case 'countrySubdivision':\r\n return isLoadingSubdivision\r\n case 'municipal':\r\n return isLoadingMunicipal\r\n case 'all':\r\n // Show loading for \"all\" if any datasets are loading and we have no data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.length === 0\r\n case 'organizational':\r\n // Show loading for \"organizational\" if any datasets are loading and we have no organizational data yet\r\n return (isLoadingNational || isLoadingSubdivision || isLoadingMunicipal) && \r\n allDatasets.filter(ds => ds.group === 'Organizational').length === 0\r\n default:\r\n return false\r\n }\r\n }, [currentTab, isLoadingNational, isLoadingSubdivision, isLoadingMunicipal, allDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!showMunicipalTab && currentTab === 'municipal') {\r\n setCurrentTab('all')\r\n }\r\n }, [showMunicipalTab, currentTab])\r\n\r\n // Memoized datasets for current tab\r\n const currentTabDatasets = React.useMemo(() => {\r\n switch (currentTab) {\r\n case 'applied':\r\n return allDatasets.filter(ds => addedDatasets.some(d => d.name === ds.name))\r\n case 'favourites':\r\n return allDatasets.filter(ds => favouriteDatasets.some(fav => fav.name === ds.name))\r\n case 'organizational':\r\n return allDatasets.filter(ds => ds.group === 'Organizational')\r\n case 'liveData':\r\n return allDatasets.filter(ds => ds.portal?.live === true)\r\n case 'national':\r\n return nationalDatasets\r\n case 'countrySubdivision':\r\n return subdivisionDatasets\r\n case 'municipal':\r\n return municipalDatasets\r\n case 'all':\r\n default:\r\n return allDatasets\r\n }\r\n }, [currentTab, allDatasets, addedDatasets, favouriteDatasets, nationalDatasets, subdivisionDatasets, municipalDatasets])\r\n\r\n // Memoized filtered data\r\n const filteredData = React.useMemo(() => {\r\n return currentTabDatasets.filter((dataset) => {\r\n // Search filter\r\n const matchesSearch = Object.values(dataset).some(value =>\r\n String(value).toLowerCase().includes(searchTerm.toLowerCase()),\r\n )\r\n if (!matchesSearch)\r\n return false\r\n\r\n // Country subdivision filter\r\n const matchesSubdivision\r\n = appliedFilters.countrySubdivisions.length === 0\r\n || !dataset.countrySubdivision\r\n || appliedFilters.countrySubdivisions.includes(dataset.countrySubdivision)\r\n\r\n // Municipality filter\r\n const matchesMunicipality\r\n = appliedFilters.municipalities.length === 0\r\n || !dataset.municipality\r\n || appliedFilters.municipalities.includes(dataset.municipality)\r\n\r\n // Type filter\r\n const matchesType\r\n = appliedFilters.types.length === 0\r\n || appliedFilters.types.includes(dataset.type)\r\n\r\n // Source filter (dataset.portal?.name, falling back to publisher)\r\n const datasetSource = dataset.portal?.name ?? dataset.publisher\r\n const matchesSource\r\n = appliedFilters.sources.length === 0\r\n || (datasetSource ? appliedFilters.sources.includes(datasetSource) : false)\r\n\r\n return matchesSubdivision && matchesMunicipality && matchesType && matchesSource\r\n })\r\n }, [currentTabDatasets, searchTerm, appliedFilters])\r\n\r\n const sortedFilteredData = React.useMemo(() => {\r\n // Remove duplicates by name\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of filteredData) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) {\r\n uniqueByName.set(name, ds)\r\n }\r\n }\r\n\r\n // Filter out unwanted names/types\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding')\r\n })\r\n\r\n // HARD CODE BLOCK LIST\r\n const blocklisted = (ds: Dataset) => {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return (\r\n url.includes('/2021_statistics_canada_boundaries/featureserver')\r\n || name.includes('2021 statistics canada boundaries')\r\n || url.includes('/limites_du_recensement_de_statistique_canada_(2021)/featureserver')\r\n || name.includes('limites du recensement de statistique canada (2021)')\r\n )\r\n }\r\n\r\n const safe = filtered.filter(ds => !blocklisted(ds))\r\n\r\n // Sort by name\r\n return safe.sort((a, b) =>\r\n (a.name || '').localeCompare(b.name || ''),\r\n )\r\n }, [filteredData])\r\n\r\n const { prefetch } = useFastDatasetCache()\r\n\r\n React.useEffect(() => {\r\n if (isOpen && sortedFilteredData.length > 0) {\r\n const datasetsToPreload = sortedFilteredData.slice(0, 10)\r\n datasetsToPreload.forEach((dataset, index) => {\r\n setTimeout(() => {\r\n prefetch(dataset)\r\n }, index * 200)\r\n })\r\n }\r\n }, [isOpen, sortedFilteredData, prefetch])\r\n\r\n // Handlers\r\n const handleTabChange = React.useCallback((value: string) => setCurrentTab(value), [])\r\n const handleRowClick = React.useCallback((dataset: Dataset) => {\r\n setSelectedDataset(dataset)\r\n setView('detail')\r\n }, [])\r\n const handleRowHover = React.useCallback((dataset: Dataset) => {\r\n prefetch(dataset)\r\n \r\n const currentIndex = sortedFilteredData.indexOf(dataset)\r\n if (currentIndex >= 0 && currentIndex < sortedFilteredData.length - 2) {\r\n setTimeout(() => {\r\n if (sortedFilteredData[currentIndex + 1]) {\r\n prefetch(sortedFilteredData[currentIndex + 1])\r\n }\r\n }, 100)\r\n }\r\n }, [prefetch, sortedFilteredData])\r\n const handleBackToTable = React.useCallback(() => {\r\n setView('table')\r\n setSelectedDataset(null)\r\n }, [])\r\n const handleAddDatasetToMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset: selectedDataset } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleRemoveDatasetFromMap = React.useCallback(() => {\r\n if (selectedDataset) {\r\n datasetDispatch({ type: 'REMOVE_DATASET_FROM_MAP', payload: { datasetId: selectedDataset.id } })\r\n }\r\n }, [selectedDataset, datasetDispatch])\r\n const handleFavourite = handleFavouriteDataset(selectedDataset, favouriteDatasets, setFavouriteDatasets)\r\n\r\n const handleAddDataset = () => {\r\n // Logic to add a new dataset\r\n }\r\n\r\n // UI\r\n return (\r\n <Dialog open={isOpen} onOpenChange={setIsOpenAction}>\r\n <DialogContent className=\"h-screen sm:h-[90vh] sm:max-h-[90vh] w-full max-w-full sm:w-[88vw] sm:max-w-[88vw] p-0 gap-0 overflow-hidden flex flex-col\">\r\n {view === 'table' ? (\r\n <>\r\n <DialogHeader className=\"bg-background z-50 sticky top-0 p-6 flex flex-row flex-wrap justify-between items-end gap-2 text-left\">\r\n <div className=\"flex flex-col justify-end p-0\">\r\n <DialogTitle className=\"text-2xl\">{t('dialogTitle')}</DialogTitle>\r\n <DialogDescription className=\"text-sm\">\r\n {t('dialogDescription')}\r\n </DialogDescription>\r\n </div>\r\n <div className=\"flex flex-row flex-wrap justify-between items-center\">\r\n <div className=\"flex flex-wrap gap-2 font-medium\">\r\n <div className=\"relative\">\r\n <LR.Search className=\"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"Search\"\r\n className=\"pl-8 w-[250px]\"\r\n value={searchTerm}\r\n onChange={e => setSearchTerm(e.target.value)}\r\n disabled={!ability.can('read', 'File')}\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Filters\r\n datasets={currentTabDatasets}\r\n appliedFilters={appliedFilters}\r\n onFiltersChange={setAppliedFilters}\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setIsAddPortalOpen(true)}\r\n title=\"Register a new open data portal\"\r\n >\r\n <LR.Plus className=\"h-4 w-4 mr-1\" />\r\n Add Portal\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n <DialogClose className=\"absolute right-2 top-2 h-5 w-5 rounded-xl text-muted-foreground hover:bg-transparent focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-background focus:ring-primary\">\r\n <LR.X className=\"!h-4 !w-4\" />\r\n </DialogClose>\r\n </DialogHeader>\r\n <div className=\"relative flex flex-col flex-1 min-h-0\">\r\n <Tabs value={currentTab} className=\"flex flex-col gap-0 h-full\" onValueChange={handleTabChange}>\r\n <div className=\"hidden md:!flex justify-between px-3 flex-shrink-0\">\r\n {' '}\r\n {/* Prevent tabs from shrinking */}\r\n <TabsList className=\"pointer-events-auto sticky flex z-40 top-[100px] bg-transparent\">\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"applied\">\r\n <Badge variant=\"outline\">{addedDatasets.length}</Badge>\r\n {t('appliedTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground gap-2\" value=\"favourites\">\r\n {t('favoritesTab')}\r\n </TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"organizational\">{t('organizationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"all\">{t('allDataTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"national\">{t('nationalTab')}</TabsTrigger>\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"countrySubdivision\">{t('countrySubdivisionTab')}</TabsTrigger>\r\n {showMunicipalTab && (\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"municipal\">{t('municipalTab')}</TabsTrigger>\r\n )}\r\n <TabsTrigger className=\"hover:text-foreground\" value=\"liveData\">{t('liveDataTab')}</TabsTrigger>\r\n </TabsList>\r\n </div>\r\n <TabsContent\r\n value={currentTab}\r\n className=\"flex-1 pointer-events-auto mt-0 min-h-0\" // min-h-0 is crucial for flex children\r\n >\r\n {currentTabLoading ? (\r\n <DatasetSkeleton />\r\n ) : (datasetsError ? (\r\n <div className=\"flex flex-col justify-center items-center h-32 text-muted-foreground\">\r\n <LR.AlertCircle className=\"h-6 w-6 mb-2\" />\r\n <span>{datasetsError}</span>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.location.reload()} className=\"mt-2\">\r\n <LR.RefreshCw className=\"h-4 w-4 mr-2\" />\r\n {t('refreshButton')}\r\n </Button>\r\n </div>\r\n ) : (\r\n <DataTable\r\n showPagination={true}\r\n columns={datasetColumns}\r\n data={sortedFilteredData}\r\n tab={currentTab}\r\n onRowClick={handleRowClick}\r\n onRowHover={handleRowHover}\r\n className=\"rounded-none w-auto h-full\" \r\n paginationClasses=\"bg-background z-20 w-full border-t\" \r\n isLoading={currentTabLoading}\r\n leadingCell={props => (\r\n <RowActions\r\n {...props}\r\n favouriteDatasets={favouriteDatasets}\r\n setFavouriteDatasets={setFavouriteDatasets}\r\n martinBaseUrl={martinBaseUrl}\r\n />\r\n )}\r\n trailingCell={({ row, index }) => (\r\n <div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"pointer-events-none\"\r\n >\r\n <LR.ChevronRight />\r\n </Button>\r\n </div>\r\n )}\r\n />\r\n ))}\r\n </TabsContent>\r\n </Tabs>\r\n </div>\r\n </>\r\n ) : (\r\n // Detail View Content\r\n <>\r\n <DialogHeader className=\"px-6 pt-6\">\r\n <div>\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n handleBackToTable()\r\n setCurrentTab('all')\r\n }}\r\n >\r\n {t('breadcrumbTitle')}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbLink\r\n href=\"#\"\r\n onClick={() => {\r\n setCurrentTab(currentTab)\r\n handleBackToTable()\r\n }}\r\n >\r\n {currentTab.charAt(0).toUpperCase() + currentTab.slice(1)}\r\n </BreadcrumbLink>\r\n </BreadcrumbItem>\r\n <BreadcrumbSeparator />\r\n <BreadcrumbItem>\r\n <BreadcrumbPage>{selectedDataset?.name}</BreadcrumbPage>\r\n </BreadcrumbItem>\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n <div className=\"flex flex-row justify-between\">\r\n <div className=\"flex items-center\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={`opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent ${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'opacity-100' : ''}`}\r\n onClick={handleFavourite}\r\n >\r\n <LR.Star\r\n className=\"!h-5 !w-5\"\r\n size={24}\r\n color={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'black'} `}\r\n fill={`${selectedDataset && favouriteDatasets.includes(selectedDataset) ? 'hsl(var(--chart-5))' : 'none'} `}\r\n />\r\n </Button>\r\n <DialogTitle>{selectedDataset?.name}</DialogTitle>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handleBackToTable}\r\n >\r\n <LR.ArrowLeft />\r\n {t('backToDataButton')}\r\n </Button>\r\n {selectedDataset && addedDatasets.some(d => d.name === selectedDataset.name)\r\n ? (\r\n <Button onClick={handleRemoveDatasetFromMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Minus />\r\n {t('removeButton')}\r\n </Button>\r\n )\r\n : (\r\n <Button onClick={handleAddDatasetToMap} disabled={!ability.can('read', 'File')}>\r\n <LR.Plus />\r\n {t('applyButton')}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </DialogHeader>\r\n <DatasetDetails selectedDataset={selectedDataset} />\r\n </>\r\n )}\r\n </DialogContent>\r\n <AddPortalDialog open={isAddPortalOpen} onOpenChange={setIsAddPortalOpen} />\r\n </Dialog>\r\n )\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+eU,mBAGM,KADF,YAFJ;AAzeV,YAAY,QAAQ;AAEpB,YAAa,WAAW;AACxB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAG5B,SAAS,wCAAwC,2BAA2B,wCAAwC;AACpH,SAAS,iBAAiB,cAAc,qBAAqB;AAE7D,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa;AACtB,SAAS,MAAM,aAAa,UAAU,mBAAmB;AAEzD,SAAS,kBAAkB;AAC3B,OAAO,oBAAoB;AAE3B,SAAS,uBAAuB;AAChC,OAAO,qBAAqB;AAC5B,OAAO,aAAa;AACpB,OAAO,gBAAgB;AACvB,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,wCAAwC;AACjD,SAAS,0BAA0B,sBAAkD;AACrF,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AACpC,SAAS,oBAAkC;AAQ3C,MAAM,qBAAqB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,MAAM,qBAA6C;AAAA,EACjD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,SAAS,eAAe,KAA8B;AACpD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,QAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,OAAO,SAAS,OAAO,GAAG,GAAG,EAAE;AAC9E,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,yBAAyB,UAAyC;AA5E3E;AA6EE,QAAM,kBAAkB,YAAY,IAAI,YAAY;AACpD,QAAM,eAAe,eAAe,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAChE,QAAM,SAAS,eAAe,IAAI,YAAY,KAAK;AAEnD,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,gBAAe,wBAAmB,MAAM,MAAzB,YAA8B;AACnD,QAAM,gBAAgB,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;AAE3D,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,SAAkB,YAA2B;AACzE,MAAI,WAAW,QAAS,QAAO;AAC/B,MAAI,QAAQ,UAAU,aAAa,eAAgB,QAAO;AAE1D,QAAM,QAAQ,eAAe,QAAQ,YAAY;AACjD,MAAI,UAAU,OAAW,QAAO;AAEhC,SAAO,WAAW,cAAc,SAAS,KAAK;AAChD;AAWe,SAAR,SAA0B,EAAE,QAAQ,iBAAiB,cAAc,cAAc,cAAc,GAAkB;AAtHxH;AAwHE,QAAM,IAAI,gBAAgB,UAAU;AAGpC,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,iBAAiB,WAAW;AAGlC,QAAM,EAAE,OAAO,SAAS,IAAI,cAAc;AAC1C,QAAM,EAAE,gBAAgB,IAAI,SAAS;AACrC,QAAM,eAAc,6CAAc,YAAW,IAAI,YAAY;AAC7D,QAAM,MAAM;AAEZ,QAAM,gBAAe,8DAAiB,iBAAjB,YAAiC,2BAAK,iBAAtC,YAAsD;AAC3E,QAAM,sBAAqB,8DAAiB,uBAAjB,YAAuC,2BAAK,uBAA5C,YAAkE;AAC7F,QAAM,EAAE,OAAO,cAAc,UAAU,gBAAgB,IAAI,MAAM,WAAW,eAAe;AAC3F,QAAM,EAAE,cAAc,IAAI,aAAa;AACvC,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,WAAW,YAAY;AAC7B,QAAM,gBAAgB,MAAM,QAAQ,MAAM,yBAAyB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAGxF,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA6B,OAAO;AAClE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAyB,IAAI;AACjF,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAoB,CAAC,CAAC;AAC9E,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,EAAE;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,MAAM,SAA0G,EAAE,qBAAqB,CAAC,GAAG,gBAAgB,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;AACnO,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AACxD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,KAAK;AAIlE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAA6C,oBAAI,IAAI,CAAC;AAC5G,QAAM,mBAAmB,MAAM,QAAQ,MAAM,QAAQ,YAAY,GAAG,CAAC,YAAY,CAAC;AAElF,QAAM,EAAE,iBAAiB,iBAAiB,IAAI,iCAAiC,YAAY;AAC3F,QAAM,EAAE,iBAAiB,mBAAmB,IAAI,uCAAuC,kBAAkB;AACzG,QAAM,EAAE,iBAAiB,gBAAgB,IAAI,0BAA0B,aAAa,QAAQ;AAG5F,QAAM,oBAAoB,MAAM;AAAA,IAC9B,CAAC,kBAA6C;AAC5C,UAAI,CAAC,WAAY,QAAO;AACxB,UAAI,CAAC,cAAe,QAAO;AAC3B,aAAO,cAAc,YAAY,MAAM;AAAA,IACzC;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,2BAA2B,MAAM,QAAQ,MAAM;AACnD,QAAI,CAAC,MAAM,QAAQ,gBAAgB,EAAG,QAAO,CAAC;AAC9C,UAAM,WAAW,iBAAiB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC;AAC1E,WAAO;AAAA,EACT,GAAG,CAAC,kBAAkB,mBAAmB,YAAY,CAAC;AACtD,QAAM,6BAA6B,MAAM;AAAA,IACvC,MAAO,MAAM,QAAQ,kBAAkB,IACnC,mBAAmB,OAAO,OAAK,EAAE,gBAAgB,QAAQ,kBAAkB,EAAE,OAAO,CAAC,IACrF,CAAC;AAAA,IACL,CAAC,oBAAoB,iBAAiB;AAAA,EACxC;AACA,QAAM,0BAA0B,MAAM,QAAQ,MAAM;AAClD,QAAI,CAAC,MAAM,QAAQ,eAAe,EAAG,QAAO,CAAC;AAC7C,UAAM,WAAW,gBAAgB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC;AACzE,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,YAAY,iBAAiB,CAAC;AAEnD,QAAM,YAAY,sBAAsB,0BAA0B,EAAE,YAAY,CAAC;AACjF,QAAM,cAAc,sBAAsB,4BAA4B,EAAE,YAAY,CAAC;AACrF,QAAM,WAAW,sBAAsB,yBAAyB,EAAE,YAAY,CAAC;AAC/E,QAAM,UAAU,MAAM;AACpB,UAAM,6BAA6B,YAAY;AAhMnD,UAAAA;AAoMM,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,YAAY;AACzC,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,OAAO,MAAM,QAAQ,6BAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,8BAAoB,yBAAyB,IAAI,CAAC;AAAA,QACpD;AAAA,MACF,SACO,KAAK;AACV,gBAAQ,KAAK,4CAA4C,GAAG;AAAA,MAC9D;AAKA,YAAM,sBAAsB,wCAAiB,IAAI,QAAQ,QAAQ,EAAE;AAEnE,YAAM,gBAAoC,sBACrC,YAAY;AACX,cAAM,cAAc,mBAAmB,SAAS,mBAAmB,IAC/D,qBACA,GAAG,kBAAkB;AAEzB,cAAM,cAAc;AAAA,UAClB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,sBAAsB;AAAA,UACtB,oBAAoB;AAAA,UACpB,cAAc;AAAA,UACd,OAAO;AAAA,QACT;AAEA,YAAI;AACF,iBAAO,MAAM,mBAAmB,WAAkB;AAAA,QACpD,SACO,KAAK;AACV,kBAAQ,MAAM,kDAAkD,GAAG;AACnE,iBAAO,CAAC;AAAA,QACV;AAAA,MACF,GAAG,IACH,QAAQ,QAAQ,CAAC,CAAC;AAEtB,UAAI,CAAC,oBAAoB;AACvB,gBAAQ,KAAK,8EAAyE;AAAA,MACxF;AAKA,YAAM,eAAe,QAAO,2BAAK,QAAO,WACpC,IAAI,KACJ,OAAO,SAAS,QAAOA,MAAA,2BAAK,OAAL,OAAAA,MAAW,EAAE,GAAG,EAAE;AAI7C,YAAM,iBAAiB,MAAM;AAC7B,YAAM,0BAA0B,IAAI;AAAA,QAClC,eAAe,IAAI,OAAK,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK,EAAE,EAAE,OAAO,OAAO;AAAA,MAC9E;AAEA,YAAM,gBAA2B,OAAO,SAAS,YAAY,IACzD,MAAM,iCAAiC,cAAc,yBAAyB,YAAY,EAAE,MAAM,CAAC,QAAQ;AACzG,gBAAQ,MAAM,iDAAiD,GAAG;AAClE,eAAO,CAAC;AAAA,MACV,CAAC,IACD,CAAC;AAEL,YAAM,WAAW,CAAC,GAAG,gBAAgB,GAAG,aAAa;AACrD,YAAM,qBAAqB,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC;AAExF,UAAI,mBAAmB,WAAW,GAAG;AACnC,gBAAQ,KAAK,kCAAkC;AAAA,MACjD;AACA,sBAAgB;AAAA,QACd,MAAM;AAAA,QACN,SAAS,EAAE,UAAU,mBAAmB;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,+BAA2B;AAAA,EAC7B,GAAG,CAAC,iBAAiB,eAAe,2BAAK,IAAI,aAAa,SAAS,eAAe,CAAC;AAKnF,QAAM,mBAAmB,MAAM,QAAQ,MAAM,eAAe,SAAS,UAAU,gBAAgB,GAAG,CAAC,SAAS,UAAU,gBAAgB,CAAC;AACvI,QAAM,sBAAsB,MAAM,QAAQ,MAAM,eAAe,YAAY,UAAU,gBAAgB,GAAG,CAAC,YAAY,UAAU,gBAAgB,CAAC;AAChJ,QAAM,oBAAoB,MAAM,QAAQ,MAAM,eAAe,UAAU,UAAU,gBAAgB,GAAG,CAAC,UAAU,UAAU,gBAAgB,CAAC;AAE1I,QAAM,oBAAoB,SAAS,aAAa,iBAAiB,WAAW;AAC5E,QAAM,uBAAuB,YAAY,aAAa,oBAAoB,WAAW;AACrF,QAAM,qBAAqB,UAAU,aAAa,kBAAkB,WAAW;AAE/E,QAAM,gBAAgB,MAAM,QAAQ,MAAM;AACxC,QAAI,eAAe,eAAe,UAAU,WAAW,kBAAkB,WAAW,EAAG,QAAO,EAAE,kBAAkB;AAClH,QAAI,eAAe,wBAAwB,YAAY,WAAW,oBAAoB,WAAW,EAAG,QAAO,EAAE,kBAAkB;AAC/H,QAAI,eAAe,cAAc,SAAS,WAAW,iBAAiB,WAAW,EAAG,QAAO,EAAE,kBAAkB;AAC/G,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,UAAU,SAAS,kBAAkB,QAAQ,YAAY,SAAS,oBAAoB,QAAQ,SAAS,SAAS,iBAAiB,QAAQ,CAAC,CAAC;AAE3J,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,aAAa;AAAA,MACjB,GAAG;AAAA;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAI,aAAa,SAAS,YAAY,CAAC;AAAA,IACzC;AAEA,UAAM,WAAW,WAAW,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC;AAKhF,WAAO,eAAe,UAAU,gBAAgB;AAAA,EAClD,GAAG,CAAC,kBAAkB,qBAAqB,mBAAmB,aAAa,SAAS,UAAU,eAAe,eAAe,gBAAgB,CAAC;AAE7I,QAAM,oBAAoB,MAAM,QAAQ,MAAM;AAC5C,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAEH,gBAAQ,qBAAqB,wBAAwB,uBAC9C,YAAY,WAAW;AAAA,MAChC,KAAK;AAEH,gBAAQ,qBAAqB,wBAAwB,uBAC9C,YAAY,OAAO,QAAM,GAAG,UAAU,gBAAgB,EAAE,WAAW;AAAA,MAC5E;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,YAAY,mBAAmB,sBAAsB,oBAAoB,WAAW,CAAC;AAEzF,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,oBAAoB,eAAe,aAAa;AACnD,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,kBAAkB,UAAU,CAAC;AAGjC,QAAM,qBAAqB,MAAM,QAAQ,MAAM;AAC7C,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,eAAO,YAAY,OAAO,QAAM,cAAc,KAAK,OAAK,EAAE,SAAS,GAAG,IAAI,CAAC;AAAA,MAC7E,KAAK;AACH,eAAO,YAAY,OAAO,QAAM,kBAAkB,KAAK,SAAO,IAAI,SAAS,GAAG,IAAI,CAAC;AAAA,MACrF,KAAK;AACH,eAAO,YAAY,OAAO,QAAM,GAAG,UAAU,gBAAgB;AAAA,MAC/D,KAAK;AACH,eAAO,YAAY,OAAO,QAAG;AAhWrC,cAAAA;AAgWwC,mBAAAA,MAAA,GAAG,WAAH,gBAAAA,IAAW,UAAS;AAAA,SAAI;AAAA,MAC1D,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,eAAe,mBAAmB,kBAAkB,qBAAqB,iBAAiB,CAAC;AAGxH,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,WAAO,mBAAmB,OAAO,CAAC,YAAY;AA/WlD,UAAAA,KAAAC;AAiXM,YAAM,gBAAgB,OAAO,OAAO,OAAO,EAAE;AAAA,QAAK,WAChD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC;AAAA,MAC/D;AACA,UAAI,CAAC;AACH,eAAO;AAGT,YAAM,qBACF,eAAe,oBAAoB,WAAW,KAC3C,CAAC,QAAQ,sBACT,eAAe,oBAAoB,SAAS,QAAQ,kBAAkB;AAG7E,YAAM,sBACF,eAAe,eAAe,WAAW,KACtC,CAAC,QAAQ,gBACT,eAAe,eAAe,SAAS,QAAQ,YAAY;AAGlE,YAAM,cACF,eAAe,MAAM,WAAW,KAC7B,eAAe,MAAM,SAAS,QAAQ,IAAI;AAGjD,YAAM,iBAAgBA,OAAAD,MAAA,QAAQ,WAAR,gBAAAA,IAAgB,SAAhB,OAAAC,MAAwB,QAAQ;AACtD,YAAM,gBACF,eAAe,QAAQ,WAAW,MAC9B,gBAAgB,eAAe,QAAQ,SAAS,aAAa,IAAI;AAEzE,aAAO,sBAAsB,uBAAuB,eAAe;AAAA,IACrE,CAAC;AAAA,EACH,GAAG,CAAC,oBAAoB,YAAY,cAAc,CAAC;AAEnD,QAAM,qBAAqB,MAAM,QAAQ,MAAM;AAlZjD,QAAAD;AAoZI,UAAM,eAAe,oBAAI,IAAqB;AAC9C,eAAW,MAAM,cAAc;AAC7B,YAAM,SAAOA,MAAA,GAAG,SAAH,gBAAAA,IAAS,kBAAiB;AACvC,UAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAC3B,qBAAa,IAAI,MAAM,EAAE;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,WAAW,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO;AA7Z/D,UAAAA,KAAAC;AA8ZM,YAAM,SAAOD,MAAA,GAAG,SAAH,gBAAAA,IAAS,kBAAiB;AACvC,YAAM,SAAOC,MAAA,GAAG,SAAH,gBAAAA,IAAS,kBAAiB;AACvC,aAAO,CAAC,KAAK,SAAS,SAAS,KAAK,CAAC,KAAK,SAAS,WAAW;AAAA,IAChE,CAAC;AAGD,UAAM,cAAc,CAAC,OAAgB;AACnC,YAAM,OAAO,GAAG,OAAO,IAAI,YAAY;AACvC,YAAM,QAAQ,GAAG,QAAQ,IAAI,YAAY;AACzC,aACE,IAAI,SAAS,kDAAkD,KAC5D,KAAK,SAAS,mCAAmC,KACjD,IAAI,SAAS,oEAAoE,KACjF,KAAK,SAAS,qDAAqD;AAAA,IAE1E;AAEA,UAAM,OAAO,SAAS,OAAO,QAAM,CAAC,YAAY,EAAE,CAAC;AAGnD,WAAO,KAAK;AAAA,MAAK,CAAC,GAAG,OAClB,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,EAAE,SAAS,IAAI,oBAAoB;AAEzC,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,mBAAmB,SAAS,GAAG;AAC3C,YAAM,oBAAoB,mBAAmB,MAAM,GAAG,EAAE;AACxD,wBAAkB,QAAQ,CAAC,SAAS,UAAU;AAC5C,mBAAW,MAAM;AACf,mBAAS,OAAO;AAAA,QAClB,GAAG,QAAQ,GAAG;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,oBAAoB,QAAQ,CAAC;AAGzC,QAAM,kBAAkB,MAAM,YAAY,CAAC,UAAkB,cAAc,KAAK,GAAG,CAAC,CAAC;AACrF,QAAM,iBAAiB,MAAM,YAAY,CAAC,YAAqB;AAC7D,uBAAmB,OAAO;AAC1B,YAAQ,QAAQ;AAAA,EAClB,GAAG,CAAC,CAAC;AACL,QAAM,iBAAiB,MAAM,YAAY,CAAC,YAAqB;AAC7D,aAAS,OAAO;AAEhB,UAAM,eAAe,mBAAmB,QAAQ,OAAO;AACvD,QAAI,gBAAgB,KAAK,eAAe,mBAAmB,SAAS,GAAG;AACrE,iBAAW,MAAM;AACf,YAAI,mBAAmB,eAAe,CAAC,GAAG;AACxC,mBAAS,mBAAmB,eAAe,CAAC,CAAC;AAAA,QAC/C;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAAA,EACF,GAAG,CAAC,UAAU,kBAAkB,CAAC;AACjC,QAAM,oBAAoB,MAAM,YAAY,MAAM;AAChD,YAAQ,OAAO;AACf,uBAAmB,IAAI;AAAA,EACzB,GAAG,CAAC,CAAC;AACL,QAAM,wBAAwB,MAAM,YAAY,MAAM;AACpD,QAAI,iBAAiB;AACnB,sBAAgB,EAAE,MAAM,sBAAsB,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;AAAA,IACvF;AAAA,EACF,GAAG,CAAC,iBAAiB,eAAe,CAAC;AACrC,QAAM,6BAA6B,MAAM,YAAY,MAAM;AACzD,QAAI,iBAAiB;AACnB,sBAAgB,EAAE,MAAM,2BAA2B,SAAS,EAAE,WAAW,gBAAgB,GAAG,EAAE,CAAC;AAAA,IACjG;AAAA,EACF,GAAG,CAAC,iBAAiB,eAAe,CAAC;AACrC,QAAM,kBAAkB,uBAAuB,iBAAiB,mBAAmB,oBAAoB;AAEvG,QAAM,mBAAmB,MAAM;AAAA,EAE/B;AAGA,SACE,qBAAC,UAAO,MAAM,QAAQ,cAAc,iBAClC;AAAA,wBAAC,iBAAc,WAAU,8HACtB,mBAAS,UACR,iCACE;AAAA,2BAAC,gBAAa,WAAU,yGACtB;AAAA,6BAAC,SAAI,WAAU,iCACb;AAAA,8BAAC,eAAY,WAAU,YAAY,YAAE,aAAa,GAAE;AAAA,UACpD,oBAAC,qBAAkB,WAAU,WAC1B,YAAE,mBAAmB,GACxB;AAAA,WACF;AAAA,QACA,oBAAC,SAAI,WAAU,wDACb,+BAAC,SAAI,WAAU,oCACb;AAAA,+BAAC,SAAI,WAAU,YACb;AAAA,gCAAC,GAAG,QAAH,EAAU,WAAU,yDAAwD;AAAA,YAC7E;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP,UAAU,OAAK,cAAc,EAAE,OAAO,KAAK;AAAA,gBAC3C,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA;AAAA,YACvC;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU;AAAA,gBACV;AAAA,gBACA,iBAAiB;AAAA;AAAA,YACnB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM,mBAAmB,IAAI;AAAA,gBACtC,OAAM;AAAA,gBAEN;AAAA,sCAAC,GAAG,MAAH,EAAQ,WAAU,gBAAe;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEtC;AAAA,aACF;AAAA,WACF,GACF;AAAA,QACA,oBAAC,eAAY,WAAU,4LACrB,8BAAC,GAAG,GAAH,EAAK,WAAU,aAAY,GAC9B;AAAA,SACF;AAAA,MACA,oBAAC,SAAI,WAAU,yCACb,+BAAC,QAAK,OAAO,YAAY,WAAU,8BAA6B,eAAe,iBAC7E;AAAA,6BAAC,SAAI,WAAU,sDACZ;AAAA;AAAA,UAED,qBAAC,YAAS,WAAU,mEAClB;AAAA,iCAAC,eAAY,WAAU,+BAA8B,OAAM,WACzD;AAAA,kCAAC,SAAM,SAAQ,WAAW,wBAAc,QAAO;AAAA,cAC9C,EAAE,YAAY;AAAA,eACjB;AAAA,YACA,oBAAC,eAAY,WAAU,+BAA8B,OAAM,cACxD,YAAE,cAAc,GACnB;AAAA,YACA,oBAAC,eAAY,WAAU,yBAAwB,OAAM,kBAAkB,YAAE,mBAAmB,GAAE;AAAA,YAC9F,oBAAC,eAAY,WAAU,yBAAwB,OAAM,OAAO,YAAE,YAAY,GAAE;AAAA,YAC5E,oBAAC,eAAY,WAAU,yBAAwB,OAAM,YAAY,YAAE,aAAa,GAAE;AAAA,YAClF,oBAAC,eAAY,WAAU,yBAAwB,OAAM,sBAAsB,YAAE,uBAAuB,GAAE;AAAA,YACrG,oBACC,oBAAC,eAAY,WAAU,yBAAwB,OAAM,aAAa,YAAE,cAAc,GAAE;AAAA,YAEtF,oBAAC,eAAY,WAAU,yBAAwB,OAAM,YAAY,YAAE,aAAa,GAAE;AAAA,aACpF;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,WAAU;AAAA,YAET,8BACC,oBAAC,mBAAgB,IACd,gBACH,qBAAC,SAAI,WAAU,wEACb;AAAA,kCAAC,GAAG,aAAH,EAAe,WAAU,gBAAe;AAAA,cACzC,oBAAC,UAAM,yBAAc;AAAA,cACrB,qBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,OAAO,SAAS,OAAO,GAAG,WAAU,QACrF;AAAA,oCAAC,GAAG,WAAH,EAAa,WAAU,gBAAe;AAAA,gBACtC,EAAE,eAAe;AAAA,iBACpB;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAgB;AAAA,gBAChB,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,mBAAkB;AAAA,gBAClB,WAAW;AAAA,gBACX,aAAa,WACX;AAAA,kBAAC;AAAA,mDACK,QADL;AAAA,oBAEC;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,gBAEF,cAAc,CAAC,EAAE,KAAK,MAAM,MAC1B,oBAAC,SACC;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBAEV,8BAAC,GAAG,cAAH,EAAgB;AAAA;AAAA,gBACnB,GACF;AAAA;AAAA,YAEJ;AAAA;AAAA,QAEJ;AAAA,SACF,GACF;AAAA,OACF;AAAA;AAAA,MAGA,iCACE;AAAA,6BAAC,gBAAa,WAAU,aACtB;AAAA,8BAAC,SACC,8BAAC,cACC,+BAAC,kBACC;AAAA,gCAAC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,oCAAkB;AAClB,gCAAc,KAAK;AAAA,gBACrB;AAAA,gBAEC,YAAE,iBAAiB;AAAA;AAAA,YACtB,GACF;AAAA,YACA,oBAAC,uBAAoB;AAAA,YACrB,oBAAC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,gCAAc,UAAU;AACxB,oCAAkB;AAAA,gBACpB;AAAA,gBAEC,qBAAW,OAAO,CAAC,EAAE,YAAY,IAAI,WAAW,MAAM,CAAC;AAAA;AAAA,YAC1D,GACF;AAAA,YACA,oBAAC,uBAAoB;AAAA,YACrB,oBAAC,kBACC,8BAAC,kBAAgB,6DAAiB,MAAK,GACzC;AAAA,aACF,GACF,GACF;AAAA,UACA,qBAAC,SAAI,WAAU,iCACb;AAAA,iCAAC,SAAI,WAAU,qBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAW,qFAAqF,mBAAmB,kBAAkB,SAAS,eAAe,IAAI,gBAAgB,EAAE;AAAA,kBACnL,SAAS;AAAA,kBAET;AAAA,oBAAC,GAAG;AAAA,oBAAH;AAAA,sBACC,WAAU;AAAA,sBACV,MAAM;AAAA,sBACN,OAAO,GAAG,mBAAmB,kBAAkB,SAAS,eAAe,IAAI,wBAAwB,OAAO;AAAA,sBAC1G,MAAM,GAAG,mBAAmB,kBAAkB,SAAS,eAAe,IAAI,wBAAwB,MAAM;AAAA;AAAA,kBAC1G;AAAA;AAAA,cACF;AAAA,cACA,oBAAC,eAAa,6DAAiB,MAAK;AAAA,eACtC;AAAA,YACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS;AAAA,kBAET;AAAA,wCAAC,GAAG,WAAH,EAAa;AAAA,oBACb,EAAE,kBAAkB;AAAA;AAAA;AAAA,cACvB;AAAA,cACC,mBAAmB,cAAc,KAAK,OAAK,EAAE,SAAS,gBAAgB,IAAI,IAErE,qBAAC,UAAO,SAAS,4BAA4B,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM,GAChF;AAAA,oCAAC,GAAG,OAAH,EAAS;AAAA,gBACT,EAAE,cAAc;AAAA,iBACnB,IAGA,qBAAC,UAAO,SAAS,uBAAuB,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM,GAC3E;AAAA,oCAAC,GAAG,MAAH,EAAQ;AAAA,gBACR,EAAE,aAAa;AAAA,iBAClB;AAAA,eAER;AAAA,aACF;AAAA,WACF;AAAA,QACA,oBAAC,kBAAe,iBAAkC;AAAA,SACpD;AAAA,OAEJ;AAAA,IACA,oBAAC,mBAAgB,MAAM,iBAAiB,cAAc,oBAAoB;AAAA,KAC5E;AAEJ;","names":["_a","_b"]}
@@ -1,3 +1,3 @@
1
1
  import type { Dataset } from '../../../../../types/datasetTypes';
2
- export declare function fetchOrganizationalMinioDatasets(organizationId: number, publishedTilesInCatalog?: ReadonlySet<string>): Promise<Dataset[]>;
2
+ export declare function fetchOrganizationalMinioDatasets(organizationId: number, publishedTilesInCatalog?: ReadonlySet<string>, minioUrl?: string): Promise<Dataset[]>;
3
3
  //# sourceMappingURL=minioDatasets.d.ts.map
@@ -1 +1 @@
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
+ {"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;AAiDhE,wBAAsB,gCAAgC,CACpD,cAAc,EAAE,MAAM,EACtB,uBAAuB,GAAE,WAAW,CAAC,MAAM,CAAa,EACxD,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,EAAE,CAAC,CAmFpB"}
@@ -10,12 +10,10 @@ function parseDescription(value) {
10
10
  return null;
11
11
  }
12
12
  }
13
- function buildMinioUrl(bucket, organizationId, assetId) {
14
- const base = process.env.NEXT_PUBLIC_MINIO_BUCKET_URL;
15
- if (!base) return null;
13
+ function buildMinioUrl(base, bucket, organizationId, assetId) {
16
14
  return `${base.replace(/\/+$/, "")}/${bucket}/${organizationId}/${assetId}`;
17
15
  }
18
- async function fetchOrganizationalMinioDatasets(organizationId, publishedTilesInCatalog = /* @__PURE__ */ new Set()) {
16
+ async function fetchOrganizationalMinioDatasets(organizationId, publishedTilesInCatalog = /* @__PURE__ */ new Set(), minioUrl) {
19
17
  var _a, _b;
20
18
  let rows = [];
21
19
  try {
@@ -39,7 +37,7 @@ async function fetchOrganizationalMinioDatasets(organizationId, publishedTilesIn
39
37
  if ((meta == null ? void 0 : meta.tiledTable) && publishedTilesInCatalog.has(meta.tiledTable)) continue;
40
38
  const bucket = meta == null ? void 0 : meta.bucket;
41
39
  if (!bucket) continue;
42
- const sourceUrl = buildMinioUrl(bucket, organizationId, row.assetId);
40
+ const sourceUrl = minioUrl ? buildMinioUrl(minioUrl, bucket, organizationId, row.assetId) : null;
43
41
  if (!sourceUrl) continue;
44
42
  const name = ((_a = row.name) == null ? void 0 : _a.replace(/\.geojson$/i, "")) || `Dataset ${row.id}`;
45
43
  const id = `org-minio-${row.id}`;
@@ -1 +1 @@
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
+ {"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(base: string, bucket: string, organizationId: number, assetId: string): string {\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 minioUrl?: string,\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 = minioUrl ? buildMinioUrl(minioUrl, bucket, organizationId, row.assetId) : null\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,MAAc,QAAgB,gBAAwB,SAAyB;AACpG,SAAO,GAAG,KAAK,QAAQ,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,cAAc,IAAI,OAAO;AAC3E;AAEA,eAAsB,iCACpB,gBACA,0BAA+C,oBAAI,IAAI,GACvD,UACoB;AAxDtB;AAyDE,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,WAAW,cAAc,UAAU,QAAQ,gBAAgB,IAAI,OAAO,IAAI;AAC5F,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":[]}
@@ -3,7 +3,9 @@ interface GeocoderProps {
3
3
  onSelect?: (addressData: any) => void;
4
4
  showDatabaseBuildings?: boolean;
5
5
  alwaysExpanded?: boolean;
6
+ geocodeEarthApiKey?: string;
7
+ geocoderUrl?: string;
6
8
  }
7
- export default function Geocoder({ onSelect, showDatabaseBuildings, alwaysExpanded, }: GeocoderProps): React.JSX.Element;
9
+ export default function Geocoder({ onSelect, showDatabaseBuildings, alwaysExpanded, geocodeEarthApiKey, geocoderUrl, }: GeocoderProps): React.JSX.Element;
8
10
  export {};
9
11
  //# sourceMappingURL=Geocoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Geocoder.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAyB9B,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,IAAI,CAAA;IACrC,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,QAAQ,EACR,qBAA4B,EAC5B,cAAsB,GACvB,EAAE,aAAa,qBA0Rf"}
1
+ {"version":3,"file":"Geocoder.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0B9B,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,IAAI,CAAA;IACrC,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,QAAQ,EACR,qBAA4B,EAC5B,cAAsB,EACtB,kBAAkB,EAClB,WAAW,GACZ,EAAE,aAAa,qBA4Rf"}