@collabdt/core 0.0.41 → 0.0.43

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 (265) hide show
  1. package/README.md +1 -1
  2. package/dist/core/components/Toolbar.d.ts.map +1 -1
  3. package/dist/core/components/Toolbar.js.map +1 -1
  4. package/dist/core/components/ToolbarBody.js.map +1 -1
  5. package/dist/core/components/TopNavigationBar.js.map +1 -1
  6. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  7. package/dist/core/components/authentication/Signin.js.map +1 -1
  8. package/dist/core/components/authentication/Signup.js.map +1 -1
  9. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  10. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  11. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  12. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  13. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  14. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  15. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  16. package/dist/core/components/ui/DataTable.js +7 -0
  17. package/dist/core/components/ui/DataTable.js.map +1 -1
  18. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  19. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  20. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts +5 -2
  21. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  22. package/dist/core/components/ui/FilesManager/src/FileMarker.js +84 -21
  23. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  24. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  25. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  26. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  27. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  28. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  29. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  30. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  31. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  32. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  33. package/dist/core/components/ui/Navbar.js.map +1 -1
  34. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  35. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  36. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  37. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  38. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  39. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  40. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  41. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  42. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +2 -2
  43. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  44. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +2 -2
  45. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  46. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  47. package/dist/core/components/viewers/Viewer.js +5 -1
  48. package/dist/core/components/viewers/Viewer.js.map +1 -1
  49. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  50. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  51. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  52. package/dist/core/components/viewers/bim/BimViewer.js +14 -5
  53. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  54. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  55. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +6 -0
  56. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  57. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  58. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +168 -39
  59. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  60. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  61. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  62. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  63. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
  64. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  65. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +14 -37
  66. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  67. package/dist/core/components/viewers/bim/src/DXFLoader/index.js +31 -318
  68. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  69. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +66 -7
  70. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  71. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +253 -21
  72. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  73. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  74. package/dist/core/components/viewers/bim/src/ModelManager/index.js +9 -0
  75. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  76. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  77. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  78. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts +3 -2
  79. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  80. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  81. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  82. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +3 -4
  83. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  84. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  85. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +40 -18
  86. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  87. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +2 -5
  88. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  89. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +45 -59
  90. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  91. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +1 -0
  92. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  93. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts +10 -1
  94. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  95. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js +25 -73
  96. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  97. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts +7 -3
  98. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  99. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +42 -78
  100. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  101. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  102. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +52 -75
  103. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  104. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +15 -3
  105. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  106. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +165 -105
  107. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  108. package/dist/core/components/viewers/index.d.ts.map +1 -1
  109. package/dist/core/components/viewers/index.js.map +1 -1
  110. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  111. package/dist/core/components/viewers/map/MapViewer.js +1 -0
  112. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  113. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  114. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +4 -3
  115. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  116. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  117. package/dist/core/components/viewers/map/datasets/RowActions.js +148 -0
  118. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  119. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  120. package/dist/core/components/viewers/map/datasets/index.js +32 -15
  121. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  122. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts +4 -0
  123. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -0
  124. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js +43 -0
  125. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -0
  126. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  127. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +39 -3
  128. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  129. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  130. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  131. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +2 -1
  132. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  133. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +47 -0
  134. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -0
  135. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js +114 -0
  136. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -0
  137. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +49 -0
  138. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -0
  139. package/dist/core/components/viewers/map/datasets/src/wmsTime.js +100 -0
  140. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -0
  141. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  142. package/dist/core/components/viewers/map/src/Geocoder.js +9 -9
  143. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  144. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  145. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +25 -43
  146. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  147. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  148. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  149. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  150. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +19 -2
  151. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  152. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts +9 -0
  153. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -0
  154. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js +28 -0
  155. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -0
  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 +1 -16
  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/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  160. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  162. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js +31 -2
  163. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  164. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts +21 -0
  165. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -0
  166. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js +111 -0
  167. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -0
  168. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  169. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +77 -2
  170. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +10 -3
  177. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  178. package/dist/core/components/viewers/map/utils/geocoder.d.ts +6 -2
  179. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  180. package/dist/core/components/viewers/map/utils/geocoder.js +10 -62
  181. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  182. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +5 -0
  183. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -0
  184. package/dist/core/components/viewers/map/utils/geocoding/adapters.js +192 -0
  185. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -0
  186. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +6 -0
  187. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -0
  188. package/dist/core/components/viewers/map/utils/geocoding/config.js +14 -0
  189. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -0
  190. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +8 -0
  191. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -0
  192. package/dist/core/components/viewers/map/utils/geocoding/index.js +44 -0
  193. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -0
  194. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +6 -0
  195. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -0
  196. package/dist/core/components/viewers/map/utils/geocoding/osm.js +39 -0
  197. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -0
  198. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +8 -0
  199. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -0
  200. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +35 -0
  201. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -0
  202. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  203. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  204. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +1 -3
  205. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  206. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  207. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -3
  208. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  209. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  210. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +8 -2
  211. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  212. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  213. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  214. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +9 -9
  215. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  216. package/dist/core/hooks/provider.js.map +1 -1
  217. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  218. package/dist/core/plugins/host/provider.js.map +1 -1
  219. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  220. package/dist/core/store/AppConfig/context.js.map +1 -1
  221. package/dist/core/store/BIM/context.d.ts.map +1 -1
  222. package/dist/core/store/BIM/context.js.map +1 -1
  223. package/dist/core/store/BIM/reducer.d.ts +0 -1
  224. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  225. package/dist/core/store/BIM/reducer.js +0 -4
  226. package/dist/core/store/BIM/reducer.js.map +1 -1
  227. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  228. package/dist/core/store/Buildings/context.js.map +1 -1
  229. package/dist/core/store/Content/context.d.ts.map +1 -1
  230. package/dist/core/store/Content/context.js.map +1 -1
  231. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  232. package/dist/core/store/Datasets/context.js +2 -1
  233. package/dist/core/store/Datasets/context.js.map +1 -1
  234. package/dist/core/store/Datasets/reducer.d.ts +2 -0
  235. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  236. package/dist/core/store/Datasets/reducer.js +9 -4
  237. package/dist/core/store/Datasets/reducer.js.map +1 -1
  238. package/dist/core/store/Files/context.d.ts.map +1 -1
  239. package/dist/core/store/Files/context.js.map +1 -1
  240. package/dist/core/store/Map/context.d.ts.map +1 -1
  241. package/dist/core/store/Map/context.js.map +1 -1
  242. package/dist/core/store/Menus/context.d.ts.map +1 -1
  243. package/dist/core/store/Menus/context.js.map +1 -1
  244. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  245. package/dist/core/store/Permissions/context.js.map +1 -1
  246. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  247. package/dist/core/store/PointCloud/context.js.map +1 -1
  248. package/dist/core/store/Tools/context.d.ts.map +1 -1
  249. package/dist/core/store/Tools/context.js.map +1 -1
  250. package/dist/core/types/datasetTypes.d.ts +8 -1
  251. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  252. package/dist/core/types/dbTypes.d.ts +13 -13
  253. package/dist/core/types/dbTypes.d.ts.map +1 -1
  254. package/dist/core/types/dbTypes.js +13 -13
  255. package/dist/core/types/dbTypes.js.map +1 -1
  256. package/dist/core/types/index.d.ts +1 -1
  257. package/dist/core/types/index.d.ts.map +1 -1
  258. package/dist/core/types/index.js.map +1 -1
  259. package/dist/core/utils/imageUtils.js +1 -1
  260. package/dist/core/utils/imageUtils.js.map +1 -1
  261. package/package.json +2 -1
  262. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts +0 -3
  263. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts.map +0 -1
  264. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js +0 -173
  265. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/DatasetManager/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MapContext, DatasetsContext } from '../../../../../store'\r\nimport { Command, Menubar, Badge, Button, Switch } from '../../../../../components/ui/'\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableRow,\r\n} from '../../../../../components/ui/Table'\r\nimport { FieldsTable } from './src/FieldsTable'\r\nimport * as LR from 'lucide-react'\r\nimport type { Dataset, BuildingDataset as RawBuildingDataset } from '../../../../../types/datasetTypes'\r\nimport { ClusterManager } from '../../utils/ClusterManager'\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from '@dnd-kit/core'\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n sortableKeyboardCoordinates,\r\n verticalListSortingStrategy,\r\n} from '@dnd-kit/sortable'\r\nimport {\r\n useSortable,\r\n} from '@dnd-kit/sortable'\r\nimport { CSS } from '@dnd-kit/utilities'\r\nimport { useSidebar } from '../../../../ui/Sidebar'\r\n\r\ntype BuildingDataset = RawBuildingDataset & Dataset\r\n\r\n// Type guard to check if dataset is a building dataset\r\nconst isBuildingDataset = (dataset: Dataset): dataset is BuildingDataset =>\r\n dataset.type === 'buildings' && 'data' in dataset\r\n\r\ninterface SortableTableRowProps {\r\n dataset: Dataset\r\n onToggleDataset: (dataset: Dataset) => void\r\n openDatasetDetails: (datasetName: string) => void\r\n expandedDatasets: Set<string>\r\n}\r\n\r\nconst SortableTableRow: React.FC<SortableTableRowProps> = ({\r\n dataset,\r\n onToggleDataset,\r\n openDatasetDetails,\r\n expandedDatasets,\r\n}) => {\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({ id: dataset.name })\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n opacity: isDragging ? 0.5 : 1,\r\n }\r\n\r\n return (\r\n <>\r\n <TableRow ref={setNodeRef} style={style} className=\"hover:bg-muted/50\">\r\n <TableCell>\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"cursor-grab active:cursor-grabbing\"\r\n {...attributes}\r\n {...listeners}\r\n >\r\n <LR.GripVertical className=\"h-4 w-4\" />\r\n </Button>\r\n <Switch\r\n checked={dataset.visible !== false}\r\n onCheckedChange={() => onToggleDataset(dataset)}\r\n className=\"shrink-0\"\r\n style={dataset.visible === false ? {} : { backgroundColor: dataset.layerColor.color }}\r\n />\r\n </div>\r\n </TableCell>\r\n <TableCell className=\"font-medium\">\r\n {dataset.name.replaceAll('_', ' ')}\r\n {dataset.total && (\r\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\r\n {dataset.total}\r\n </Badge>\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => openDatasetDetails(dataset.name)}\r\n className=\"shrink-0\"\r\n >\r\n <LR.ChevronDown\r\n className={`h-4 w-4 transition-transform duration-200 ${expandedDatasets.has(dataset.name) ? 'rotate-180' : ''}`}\r\n />\r\n </Button>\r\n </TableCell>\r\n </TableRow>\r\n {expandedDatasets.has(dataset.name) && (\r\n <TableRow>\r\n <TableCell colSpan={4} className=\"p-0 pb-1\">\r\n <FieldsTable\r\n dataset={dataset}\r\n />\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport default function DatasetManagerMenu() {\r\n // Translation\r\n const t = useTranslations('DatasetManagerMenu')\r\n\r\n const { state: mapState, dispatch: mapDispatch } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n\r\n const [open, setOpen] = React.useState(false)\r\n const [menuOpen, setMenuOpen] = React.useState(false)\r\n const [expandedDatasets, setExpandedDatasets] = React.useState<Set<string>>(new Set())\r\n\r\n const sensors = useSensors(\r\n useSensor(PointerSensor),\r\n useSensor(KeyboardSensor, {\r\n coordinateGetter: sortableKeyboardCoordinates,\r\n })\r\n )\r\n\r\n const sortedDatasets = React.useMemo(() => {\r\n const datasetsWithOrder = addedDatasets.map((dataset, index) => ({\r\n ...dataset,\r\n order: dataset.order !== undefined ? dataset.order : addedDatasets.length - 1 - index,\r\n }))\r\n\r\n return datasetsWithOrder.sort((a, b) => (b.order ?? 0) - (a.order ?? 0))\r\n }, [addedDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!map || !addedDatasets) return\r\n\r\n const clusterManager = new ClusterManager(map)\r\n\r\n const sortedDatasets = [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n\r\n for (const dataset of sortedDatasets) {\r\n if (isBuildingDataset(dataset)) {\r\n if (dataset.visible === false) {\r\n clusterManager.remove(dataset.name)\r\n }\r\n else {\r\n clusterManager.create(dataset)\r\n clusterManager.toggleVisibility(dataset.name, true)\r\n }\r\n }\r\n }\r\n }, [map, addedDatasets])\r\n\r\n // Remove clusters for datasets no longer present\r\n const previousNamesRef = React.useRef<Set<string>>(new Set())\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n const clusterManager = new ClusterManager(map)\r\n const currentNames = new Set(\r\n addedDatasets.filter(isBuildingDataset).map(ds => ds.name),\r\n )\r\n const removedNames = [...previousNamesRef.current].filter(\r\n name => !currentNames.has(name),\r\n )\r\n for (const datasetName of removedNames) {\r\n clusterManager.remove(datasetName)\r\n }\r\n previousNamesRef.current = currentNames\r\n }, [map, addedDatasets])\r\n\r\n const onToggle = () => setOpen(!open)\r\n\r\n const onToggleDataset = (dataset: Dataset) => {\r\n const datasetId = dataset.id;\r\n datasetDispatch({ type: 'TOGGLE_DATASET_VISIBILITY', payload: { datasetId } })\r\n }\r\n\r\n const toggleDatasetExpansion = (datasetName: string) => {\r\n setExpandedDatasets((prev) => {\r\n const newSet = new Set(prev)\r\n newSet.has(datasetName) ? newSet.delete(datasetName) : newSet.add(datasetName)\r\n return newSet\r\n })\r\n }\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event\r\n\r\n if (over && active.id !== over.id) {\r\n const displayOrder = [...sortedDatasets]\r\n\r\n const oldIndex = displayOrder.findIndex(dataset => dataset.name === active.id)\r\n const newIndex = displayOrder.findIndex(dataset => dataset.name === over.id)\r\n\r\n const reorderedDisplay = arrayMove(displayOrder, oldIndex, newIndex)\r\n const maxOrder = reorderedDisplay.length - 1\r\n const reorderedDatasets = reorderedDisplay.map((dataset, index) => ({\r\n ...dataset,\r\n order: maxOrder - index,\r\n }))\r\n\r\n datasetDispatch({\r\n type: 'REORDER_DATASETS',\r\n payload: { reorderedDatasets }\r\n })\r\n }\r\n }\r\n\r\n const openAnimation = `\r\n pointer-events-auto \r\n transform \r\n transition-all \r\n duration-200\r\n data-[state=open]:animate-in \r\n data-[state=closed]:animate-out \r\n data-[state=closed]:fade-out-0 \r\n data-[state=open]:fade-in-0 \r\n data-[state=closed]:zoom-out-95 \r\n data-[state=open]:zoom-in-95\r\n `\r\n\r\n React.useEffect(() => {\r\n setMenuOpen(addedDatasets.length > 0)\r\n }, [addedDatasets.length])\r\n\r\n const openDatasetDetails = (datasetName: string) => {\r\n toggleDatasetExpansion(datasetName)\r\n }\r\n\r\n const {openInfo} = useSidebar()\r\n\r\n return (\r\n <>\r\n {!openInfo && addedDatasets.length > 0 && (\r\n <div data-state={menuOpen ? 'open' : 'closed'} className={openAnimation}>\r\n <Menubar className=\"pointer-events-auto w-96 h-auto\">\r\n <Command>\r\n <div>\r\n <div className={`flex items-center justify-between gap-3 ${open ? 'p-3' : 'pl-1 py-0'}`}>\r\n <div className=\"flex items-center gap-2\">\r\n <Badge>{addedDatasets.length}</Badge>\r\n <div className=\"text-sm font-medium\">\r\n {t('appliedLayer')}\r\n {addedDatasets.length === 1 ? '' : 's'}\r\n </div>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={onToggle}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n >\r\n <LR.ChevronUp\r\n size={14}\r\n className={`transition-transform duration-200 ${open ? 'rotate-180' : ''}`}\r\n />\r\n </Button>\r\n </div>\r\n {open && (\r\n <div className=\"max-h-[40vh] overflow-y-auto\">\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={sortedDatasets.map(dataset => dataset.name)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n <Table>\r\n <TableBody>\r\n {sortedDatasets.map((dataset) => (\r\n <SortableTableRow\r\n key={dataset.name}\r\n dataset={dataset}\r\n onToggleDataset={onToggleDataset}\r\n openDatasetDetails={openDatasetDetails}\r\n expandedDatasets={expandedDatasets}\r\n />\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </SortableContext>\r\n </DndContext>\r\n </div>\r\n )}\r\n </div>\r\n </Command>\r\n </Menubar>\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["sortedDatasets"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/DatasetManager/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MapContext, DatasetsContext } from '../../../../../store'\r\nimport { Command, Menubar, Badge, Button, Switch } from '../../../../../components/ui/'\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableRow,\r\n} from '../../../../../components/ui/Table'\r\nimport { FieldsTable } from './src/FieldsTable'\r\nimport * as LR from 'lucide-react'\r\nimport type { Dataset, BuildingDataset as RawBuildingDataset } from '../../../../../types/datasetTypes'\r\nimport { ClusterManager } from '../../utils/ClusterManager'\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from '@dnd-kit/core'\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n sortableKeyboardCoordinates,\r\n verticalListSortingStrategy,\r\n} from '@dnd-kit/sortable'\r\nimport {\r\n useSortable,\r\n} from '@dnd-kit/sortable'\r\nimport { CSS } from '@dnd-kit/utilities'\r\nimport { useSidebar } from '../../../../ui/Sidebar'\r\n\r\ntype BuildingDataset = RawBuildingDataset & Dataset\r\n\r\n// Type guard to check if dataset is a building dataset\r\nconst isBuildingDataset = (dataset: Dataset): dataset is BuildingDataset =>\r\n dataset.type === 'buildings' && 'data' in dataset\r\n\r\ninterface SortableTableRowProps {\r\n dataset: Dataset\r\n onToggleDataset: (dataset: Dataset) => void\r\n openDatasetDetails: (datasetName: string) => void\r\n expandedDatasets: Set<string>\r\n}\r\n\r\nconst SortableTableRow: React.FC<SortableTableRowProps> = ({\r\n dataset,\r\n onToggleDataset,\r\n openDatasetDetails,\r\n expandedDatasets,\r\n}) => {\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({ id: dataset.name })\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n opacity: isDragging ? 0.5 : 1,\r\n }\r\n\r\n // Raster (WMS) layers are server-rendered images with no fields and a server-fixed\r\n // colour ramp, so the field-styling table + colour swatch are meaningless — hide them.\r\n const isRaster = dataset.datasetType === 'WMS' || dataset.type === 'WMS'\r\n\r\n return (\r\n <>\r\n <TableRow ref={setNodeRef} style={style} className=\"hover:bg-muted/50\">\r\n <TableCell>\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"cursor-grab active:cursor-grabbing\"\r\n {...attributes}\r\n {...listeners}\r\n >\r\n <LR.GripVertical className=\"h-4 w-4\" />\r\n </Button>\r\n <Switch\r\n checked={dataset.visible !== false}\r\n onCheckedChange={() => onToggleDataset(dataset)}\r\n className=\"shrink-0\"\r\n style={dataset.visible === false || isRaster ? {} : { backgroundColor: dataset.layerColor.color }}\r\n />\r\n </div>\r\n </TableCell>\r\n <TableCell className=\"font-medium\">\r\n {dataset.name.replaceAll('_', ' ')}\r\n {dataset.total && (\r\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\r\n {dataset.total}\r\n </Badge>\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {!isRaster && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={() => openDatasetDetails(dataset.name)}\r\n className=\"shrink-0\"\r\n >\r\n <LR.ChevronDown\r\n className={`h-4 w-4 transition-transform duration-200 ${expandedDatasets.has(dataset.name) ? 'rotate-180' : ''}`}\r\n />\r\n </Button>\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n {!isRaster && expandedDatasets.has(dataset.name) && (\r\n <TableRow>\r\n <TableCell colSpan={4} className=\"p-0 pb-1\">\r\n <FieldsTable\r\n dataset={dataset}\r\n />\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport default function DatasetManagerMenu() {\r\n // Translation\r\n const t = useTranslations('DatasetManagerMenu')\r\n\r\n const { state: mapState, dispatch: mapDispatch } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { addedDatasets } = datasetState.datasets\r\n\r\n const [open, setOpen] = React.useState(false)\r\n const [menuOpen, setMenuOpen] = React.useState(false)\r\n const [expandedDatasets, setExpandedDatasets] = React.useState<Set<string>>(new Set())\r\n\r\n const sensors = useSensors(\r\n useSensor(PointerSensor),\r\n useSensor(KeyboardSensor, {\r\n coordinateGetter: sortableKeyboardCoordinates,\r\n })\r\n )\r\n\r\n const sortedDatasets = React.useMemo(() => {\r\n const datasetsWithOrder = addedDatasets.map((dataset, index) => ({\r\n ...dataset,\r\n order: dataset.order !== undefined ? dataset.order : addedDatasets.length - 1 - index,\r\n }))\r\n\r\n return datasetsWithOrder.sort((a, b) => (b.order ?? 0) - (a.order ?? 0))\r\n }, [addedDatasets])\r\n\r\n React.useEffect(() => {\r\n if (!map || !addedDatasets) return\r\n\r\n const clusterManager = new ClusterManager(map)\r\n\r\n const sortedDatasets = [...addedDatasets].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n\r\n for (const dataset of sortedDatasets) {\r\n if (isBuildingDataset(dataset)) {\r\n if (dataset.visible === false) {\r\n clusterManager.remove(dataset.name)\r\n }\r\n else {\r\n clusterManager.create(dataset)\r\n clusterManager.toggleVisibility(dataset.name, true)\r\n }\r\n }\r\n }\r\n }, [map, addedDatasets])\r\n\r\n // Remove clusters for datasets no longer present\r\n const previousNamesRef = React.useRef<Set<string>>(new Set())\r\n\r\n React.useEffect(() => {\r\n if (!map) return\r\n const clusterManager = new ClusterManager(map)\r\n const currentNames = new Set(\r\n addedDatasets.filter(isBuildingDataset).map(ds => ds.name),\r\n )\r\n const removedNames = [...previousNamesRef.current].filter(\r\n name => !currentNames.has(name),\r\n )\r\n for (const datasetName of removedNames) {\r\n clusterManager.remove(datasetName)\r\n }\r\n previousNamesRef.current = currentNames\r\n }, [map, addedDatasets])\r\n\r\n const onToggle = () => setOpen(!open)\r\n\r\n const onToggleDataset = (dataset: Dataset) => {\r\n const datasetId = dataset.id;\r\n datasetDispatch({ type: 'TOGGLE_DATASET_VISIBILITY', payload: { datasetId } })\r\n }\r\n\r\n const toggleDatasetExpansion = (datasetName: string) => {\r\n setExpandedDatasets((prev) => {\r\n const newSet = new Set(prev)\r\n newSet.has(datasetName) ? newSet.delete(datasetName) : newSet.add(datasetName)\r\n return newSet\r\n })\r\n }\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event\r\n\r\n if (over && active.id !== over.id) {\r\n const displayOrder = [...sortedDatasets]\r\n\r\n const oldIndex = displayOrder.findIndex(dataset => dataset.name === active.id)\r\n const newIndex = displayOrder.findIndex(dataset => dataset.name === over.id)\r\n\r\n const reorderedDisplay = arrayMove(displayOrder, oldIndex, newIndex)\r\n const maxOrder = reorderedDisplay.length - 1\r\n const reorderedDatasets = reorderedDisplay.map((dataset, index) => ({\r\n ...dataset,\r\n order: maxOrder - index,\r\n }))\r\n\r\n datasetDispatch({\r\n type: 'REORDER_DATASETS',\r\n payload: { reorderedDatasets }\r\n })\r\n }\r\n }\r\n\r\n const openAnimation = `\r\n pointer-events-auto \r\n transform \r\n transition-all \r\n duration-200\r\n data-[state=open]:animate-in \r\n data-[state=closed]:animate-out \r\n data-[state=closed]:fade-out-0 \r\n data-[state=open]:fade-in-0 \r\n data-[state=closed]:zoom-out-95 \r\n data-[state=open]:zoom-in-95\r\n `\r\n\r\n React.useEffect(() => {\r\n setMenuOpen(addedDatasets.length > 0)\r\n }, [addedDatasets.length])\r\n\r\n const openDatasetDetails = (datasetName: string) => {\r\n toggleDatasetExpansion(datasetName)\r\n }\r\n\r\n const {openInfo} = useSidebar()\r\n\r\n return (\r\n <>\r\n {!openInfo && addedDatasets.length > 0 && (\r\n <div data-state={menuOpen ? 'open' : 'closed'} className={openAnimation}>\r\n <Menubar className=\"pointer-events-auto w-96 h-auto\">\r\n <Command>\r\n <div>\r\n <div className={`flex items-center justify-between gap-3 ${open ? 'p-3' : 'pl-1 py-0'}`}>\r\n <div className=\"flex items-center gap-2\">\r\n <Badge>{addedDatasets.length}</Badge>\r\n <div className=\"text-sm font-medium\">\r\n {t('appliedLayer')}\r\n {addedDatasets.length === 1 ? '' : 's'}\r\n </div>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={onToggle}\r\n className=\"opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n >\r\n <LR.ChevronUp\r\n size={14}\r\n className={`transition-transform duration-200 ${open ? 'rotate-180' : ''}`}\r\n />\r\n </Button>\r\n </div>\r\n {open && (\r\n <div className=\"max-h-[40vh] overflow-y-auto\">\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={sortedDatasets.map(dataset => dataset.name)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n <Table>\r\n <TableBody>\r\n {sortedDatasets.map((dataset) => (\r\n <SortableTableRow\r\n key={dataset.name}\r\n dataset={dataset}\r\n onToggleDataset={onToggleDataset}\r\n openDatasetDetails={openDatasetDetails}\r\n expandedDatasets={expandedDatasets}\r\n />\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </SortableContext>\r\n </DndContext>\r\n </div>\r\n )}\r\n </div>\r\n </Command>\r\n </Menubar>\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["sortedDatasets"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RowActions.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAYzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,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,qBA4EjB"}
1
+ {"version":3,"file":"RowActions.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"names":[],"mappings":"AAGA,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"}
@@ -6,6 +6,7 @@ import { handleFavouriteDataset } from "./utils";
6
6
  import { Checkbox, Button } from "../../../ui/";
7
7
  import * as LR from "lucide-react";
8
8
  import { DatasetsContext } from "../../../../store";
9
+ import { buildPublishedTileDatasets } from "./src/publishedTiles";
9
10
  function RowActions({
10
11
  dataset,
11
12
  favouriteDatasets,
@@ -14,6 +15,7 @@ function RowActions({
14
15
  const { ability } = usePermissions();
15
16
  const { state: datasetsState, dispatch: datasetsDispatch } = React.useContext(DatasetsContext);
16
17
  const { addedDatasets } = datasetsState.datasets;
18
+ const orgDatasets = datasetsState.datasets.datasets;
17
19
  const isFavourite = favouriteDatasets.some((item) => item.name === dataset.name);
18
20
  const checked = addedDatasets.some((d) => d.name === dataset.name);
19
21
  const handleApplyDataset = () => {
@@ -35,6 +37,116 @@ function RowActions({
35
37
  }
36
38
  };
37
39
  const handleFavourite = handleFavouriteDataset(dataset, favouriteDatasets, setFavouriteDatasets);
40
+ const [publishing, setPublishing] = React.useState(false);
41
+ const [published, setPublished] = React.useState(false);
42
+ const isOrgMinio = typeof dataset.id === "string" && dataset.id.startsWith("org-minio-");
43
+ const fileId = isOrgMinio ? Number(String(dataset.id).slice("org-minio-".length)) : null;
44
+ const tiledMatch = typeof dataset.id === "string" ? /^org_(\d+)_file_(\d+)$/.exec(dataset.id) : null;
45
+ const tiledFileId = tiledMatch ? Number(tiledMatch[2]) : typeof dataset.publishedFileId === "number" ? dataset.publishedFileId : null;
46
+ const [unpublishing, setUnpublishing] = React.useState(false);
47
+ const [unpublished, setUnpublished] = React.useState(false);
48
+ const onUnpublish = async () => {
49
+ var _a;
50
+ if (tiledFileId == null) return;
51
+ if (!window.confirm(`Un-publish "${dataset.name}"? The Martin table will be dropped; the original GeoJSON in MinIO is untouched.`)) return;
52
+ setUnpublishing(true);
53
+ try {
54
+ const res = await fetch("/api/datasets/publish-tiles", {
55
+ method: "DELETE",
56
+ headers: { "Content-Type": "application/json" },
57
+ body: JSON.stringify({ fileId: tiledFileId })
58
+ });
59
+ if (!res.ok) {
60
+ const body = await res.json().catch(() => ({}));
61
+ console.error("un-publish failed", res.status, body);
62
+ window.alert(`Un-publish failed: ${(_a = body == null ? void 0 : body.error) != null ? _a : res.status}`);
63
+ return;
64
+ }
65
+ setUnpublished(true);
66
+ datasetsDispatch({ type: "REFRESH_ORG_DATASETS" });
67
+ window.alert(`Un-published. The dataset list has been refreshed.`);
68
+ } finally {
69
+ setUnpublishing(false);
70
+ }
71
+ };
72
+ const onPublish = async () => {
73
+ var _a, _b, _c, _d;
74
+ if (fileId == null || Number.isNaN(fileId)) return;
75
+ setPublishing(true);
76
+ try {
77
+ const res = await fetch("/api/datasets/publish-tiles", {
78
+ method: "POST",
79
+ headers: { "Content-Type": "application/json" },
80
+ body: JSON.stringify({ fileId })
81
+ });
82
+ if (!res.ok) {
83
+ const body = await res.json().catch(() => ({}));
84
+ console.error("publish-tiles failed", res.status, body);
85
+ window.alert(`Publish failed: ${(_a = body == null ? void 0 : body.error) != null ? _a : res.status}`);
86
+ return;
87
+ }
88
+ const result = await res.json();
89
+ setPublished(true);
90
+ const tileBaseUrl = ((_b = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL) != null ? _b : "").replace(/\/+$/, "");
91
+ const minioId = `org-minio-${fileId}`;
92
+ const [optimistic] = buildPublishedTileDatasets(
93
+ [{
94
+ name: dataset.name,
95
+ description: JSON.stringify({ tiledTable: result.table, geometryType: result.geometryType })
96
+ }],
97
+ tileBaseUrl,
98
+ { countrySubdivision: (_c = dataset.countrySubdivision) != null ? _c : "", municipality: (_d = dataset.municipality) != null ? _d : "" }
99
+ );
100
+ if (optimistic) {
101
+ const current = orgDatasets != null ? orgDatasets : [];
102
+ const swapped = current.some((d) => d.id === minioId) ? current.map((d) => d.id === minioId ? optimistic : d) : [...current, optimistic];
103
+ datasetsDispatch({ type: "SET_DATASETS", payload: { datasets: swapped } });
104
+ if (addedDatasets.some((d) => d.id === minioId)) {
105
+ datasetsDispatch({ type: "REMOVE_DATASET_FROM_MAP", payload: { datasetId: minioId } });
106
+ datasetsDispatch({ type: "ADD_DATASET_TO_MAP", payload: { dataset: optimistic } });
107
+ }
108
+ }
109
+ datasetsDispatch({ type: "REFRESH_ORG_DATASETS" });
110
+ window.alert(
111
+ `Tiled as ${result.table}. The dataset list has been refreshed.
112
+
113
+ Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`
114
+ );
115
+ } finally {
116
+ setPublishing(false);
117
+ }
118
+ };
119
+ const isCatalogGeoJson = !isOrgMinio && tiledFileId == null && dataset.datasetType === "GeoJSON" && !!dataset.portal && dataset.id != null;
120
+ const [publishingCatalog, setPublishingCatalog] = React.useState(false);
121
+ const [publishedCatalog, setPublishedCatalog] = React.useState(false);
122
+ const onPublishCatalog = async () => {
123
+ var _a;
124
+ if (!dataset.portal || dataset.id == null) return;
125
+ setPublishingCatalog(true);
126
+ try {
127
+ const res = await fetch("/api/datasets/publish-catalog-tiles", {
128
+ method: "POST",
129
+ headers: { "Content-Type": "application/json" },
130
+ body: JSON.stringify({ portal: dataset.portal, datasetId: dataset.id })
131
+ });
132
+ if (!res.ok) {
133
+ const body = await res.json().catch(() => ({}));
134
+ console.error("publish-catalog-tiles failed", res.status, body);
135
+ window.alert(`Publish failed: ${(_a = body == null ? void 0 : body.error) != null ? _a : res.status}`);
136
+ return;
137
+ }
138
+ const result = await res.json();
139
+ setPublishedCatalog(true);
140
+ datasetsDispatch({ type: "REFRESH_ORG_DATASETS" });
141
+ window.alert(
142
+ `Tiled as ${result.table}. The dataset list has been refreshed.
143
+
144
+ Features ingested: ${result.featuresIngested}, skipped: ${result.featuresSkipped}.`
145
+ );
146
+ } finally {
147
+ setPublishingCatalog(false);
148
+ }
149
+ };
38
150
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
39
151
  /* @__PURE__ */ jsx(
40
152
  Button,
@@ -71,6 +183,42 @@ function RowActions({
71
183
  }
72
184
  )
73
185
  }
186
+ ),
187
+ isOrgMinio && /* @__PURE__ */ jsx(
188
+ Button,
189
+ {
190
+ variant: "ghost",
191
+ size: "icon",
192
+ title: published ? "Tiled" : "Publish as vector tiles",
193
+ className: "opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent",
194
+ onClick: onPublish,
195
+ disabled: publishing || published || !ability.can("update", "File"),
196
+ children: /* @__PURE__ */ jsx(LR.UploadCloud, { color: published ? "hsl(var(--chart-2))" : "black" })
197
+ }
198
+ ),
199
+ isCatalogGeoJson && /* @__PURE__ */ jsx(
200
+ Button,
201
+ {
202
+ variant: "ghost",
203
+ size: "icon",
204
+ title: publishedCatalog ? "Tiled" : "Publish open-data dataset as vector tiles",
205
+ className: "opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent",
206
+ onClick: onPublishCatalog,
207
+ disabled: publishingCatalog || publishedCatalog || !ability.can("update", "File"),
208
+ children: /* @__PURE__ */ jsx(LR.CloudDownload, { color: publishedCatalog ? "hsl(var(--chart-2))" : "black" })
209
+ }
210
+ ),
211
+ tiledFileId != null && /* @__PURE__ */ jsx(
212
+ Button,
213
+ {
214
+ variant: "ghost",
215
+ size: "icon",
216
+ title: unpublished ? "Un-published" : "Un-publish vector tiles",
217
+ className: "opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent",
218
+ onClick: onUnpublish,
219
+ disabled: unpublishing || unpublished || !ability.can("update", "File"),
220
+ children: /* @__PURE__ */ jsx(LR.CloudOff, { color: unpublished ? "hsl(var(--chart-5))" : "black" })
221
+ }
74
222
  )
75
223
  ] });
76
224
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"sourcesContent":["\"use client\"\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\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\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 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 </div>\r\n )\r\n}\r\n"],"mappings":";AAwEI,SAQI,KARJ;AArEJ,OAAO,WAAW;AAClB,SAAS,sBAAsB;AAG/B,SAAS,8BAA8B;AAGvC,SAAS,UAAU,cAAc;AAGjC,YAAY,QAAQ;AACpB,SAAS,uBAAuB;AASjB,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAElB,QAAM,EAAE,QAAQ,IAAI,eAAe;AAGnC,QAAM,EAAE,OAAO,eAAe,UAAU,iBAAiB,IAAI,MAAM,WAAW,eAAe;AAC7F,QAAM,EAAE,cAAc,IAAI,cAAc;AAKxC,QAAM,cAAc,kBAAkB,KAAK,UAAQ,KAAK,SAAS,QAAQ,IAAI;AAO7E,QAAM,UAAU,cAAc,KAAK,OAAK,EAAE,SAAS,QAAQ,IAAI;AAE/D,QAAM,qBAAqB,MAAM;AAC/B,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,mCAAmC;AACjD;AAAA,IACF;AAEA,UAAM,UAAU,cAAc,KAAK,OAAK,EAAE,SAAS,QAAQ,IAAI;AAE/D,QAAI,SAAS;AACX,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,WAAW,QAAQ,GAAG;AAAA,MACnC,CAAC;AAAA,IACH,OACK;AACH,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,QAAiB;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,kBAAkB,uBAAuB,SAAS,mBAAmB,oBAAoB;AAE/F,SACE,qBAAC,SAAI,WAAU,qBACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,WAAU;AAAA,QACV,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAErC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,iBAAiB,MAAM;AACrB,iCAAmB;AAAA,YACrB;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAW,qFAAqF,cAAc,gBAAgB,EAAE;AAAA,QAChI,SAAS;AAAA,QACT,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAErC;AAAA,UAAC,GAAG;AAAA,UAAH;AAAA,YACC,OAAO,GAAG,cAAc,wBAAwB,OAAO;AAAA,YACvD,MAAM,GAAG,cAAc,wBAAwB,MAAM;AAAA;AAAA,QACvD;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/map/datasets/RowActions.tsx"],"sourcesContent":["\"use client\"\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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAM,KAAK,MAAM,OAAO,CAAA;AAoG/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,qBAmiB1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/datasets/index.tsx"],"names":[],"mappings":"AAKA,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"}
@@ -58,6 +58,8 @@ import { useDatasetsForPortals } from "./src/useDatasetsForPortals";
58
58
  import { handleFavouriteDataset } from "./utils";
59
59
  import { fetchLocalDatasets } from "./src/localDatasets";
60
60
  import { fetchOrganizationalMinioDatasets } from "./src/minioDatasets";
61
+ import { buildPublishedCatalogMap, stampPublished } from "./src/publishedTiles";
62
+ import { builtinLiveDatasets } from "./src/builtinLiveDatasets";
61
63
  import { useFastDatasetCache } from "./src/useFastDatasetCache";
62
64
  import { DatasetGroup } from "../../../../types/dbTypes";
63
65
  const ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6];
@@ -125,6 +127,7 @@ function Datasets({ isOpen, setIsOpenAction }) {
125
127
  const [appliedFilters, setAppliedFilters] = React.useState({ countrySubdivisions: [], municipalities: [], types: [], sources: [] });
126
128
  const [currentTab, setCurrentTab] = React.useState("all");
127
129
  const [isAddPortalOpen, setIsAddPortalOpen] = React.useState(false);
130
+ const [publishedCatalog, setPublishedCatalog] = React.useState(/* @__PURE__ */ new Map());
128
131
  const showMunicipalTab = React.useMemo(() => Boolean(municipality), [municipality]);
129
132
  const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality);
130
133
  const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision);
@@ -157,6 +160,16 @@ function Datasets({ isOpen, setIsOpenAction }) {
157
160
  React.useEffect(() => {
158
161
  const loadOrganizationalDatasets = async () => {
159
162
  var _a2, _b2;
163
+ try {
164
+ const filesRes = await fetch("/api/files");
165
+ if (filesRes.ok) {
166
+ const body = await filesRes.json();
167
+ const rows = Array.isArray(body == null ? void 0 : body.files) ? body.files : [];
168
+ setPublishedCatalog(buildPublishedCatalogMap(rows));
169
+ }
170
+ } catch (err) {
171
+ console.warn("Failed to refresh published-catalog map:", err);
172
+ }
160
173
  const martinBaseUrl = (_a2 = process.env.NEXT_PUBLIC_MARTIN_SERVER_URL) == null ? void 0 : _a2.replace(/\/+$/, "");
161
174
  const martinPromise = martinBaseUrl ? (async () => {
162
175
  const datasetsUrl = martinBaseUrl.includes("/tiles/index.json") ? martinBaseUrl : `${martinBaseUrl}/tiles/index.json`;
@@ -180,27 +193,29 @@ function Datasets({ isOpen, setIsOpenAction }) {
180
193
  console.warn("NEXT_PUBLIC_MARTIN_SERVER_URL not configured \u2014 skipping Martin pre-load");
181
194
  }
182
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);
183
- const minioPromise = Number.isFinite(sessionOrgId) ? fetchOrganizationalMinioDatasets(sessionOrgId).catch((err) => {
196
+ const martinDatasets = await martinPromise;
197
+ const publishedTilesInCatalog = new Set(
198
+ martinDatasets.map((d) => typeof d.id === "string" ? d.id : "").filter(Boolean)
199
+ );
200
+ const minioDatasets = Number.isFinite(sessionOrgId) ? await fetchOrganizationalMinioDatasets(sessionOrgId, publishedTilesInCatalog).catch((err) => {
184
201
  console.error("Failed to load MinIO organizational datasets:", err);
185
202
  return [];
186
- }) : Promise.resolve([]);
187
- const [martinDatasets, minioDatasets] = await Promise.all([martinPromise, minioPromise]);
203
+ }) : [];
188
204
  const combined = [...martinDatasets, ...minioDatasets];
189
205
  const visibleOrgDatasets = combined.filter((ds) => datasetVisibleForOrg(ds, orgVisibility));
190
- if (visibleOrgDatasets.length > 0) {
191
- datasetDispatch({
192
- type: "SET_DATASETS",
193
- payload: { datasets: visibleOrgDatasets }
194
- });
195
- } else {
206
+ if (visibleOrgDatasets.length === 0) {
196
207
  console.warn("No organizational datasets found");
197
208
  }
209
+ datasetDispatch({
210
+ type: "SET_DATASETS",
211
+ payload: { datasets: visibleOrgDatasets }
212
+ });
198
213
  };
199
214
  loadOrganizationalDatasets();
200
- }, [datasetDispatch, orgVisibility, org == null ? void 0 : org.id]);
201
- const nationalDatasets = national.datasets;
202
- const subdivisionDatasets = subdivision.datasets;
203
- const municipalDatasets = municipal.datasets;
215
+ }, [datasetDispatch, orgVisibility, org == null ? void 0 : org.id, datasetState.datasets.orgRefreshNonce]);
216
+ const nationalDatasets = React.useMemo(() => stampPublished(national.datasets, publishedCatalog), [national.datasets, publishedCatalog]);
217
+ const subdivisionDatasets = React.useMemo(() => stampPublished(subdivision.datasets, publishedCatalog), [subdivision.datasets, publishedCatalog]);
218
+ const municipalDatasets = React.useMemo(() => stampPublished(municipal.datasets, publishedCatalog), [municipal.datasets, publishedCatalog]);
204
219
  const isLoadingNational = national.isLoading && nationalDatasets.length === 0;
205
220
  const isLoadingSubdivision = subdivision.isLoading && subdivisionDatasets.length === 0;
206
221
  const isLoadingMunicipal = municipal.isLoading && municipalDatasets.length === 0;
@@ -212,6 +227,8 @@ function Datasets({ isOpen, setIsOpenAction }) {
212
227
  }, [currentTab, municipal.isError, municipalDatasets.length, subdivision.isError, subdivisionDatasets.length, national.isError, nationalDatasets.length, t]);
213
228
  const allDatasets = React.useMemo(() => {
214
229
  const unfiltered = [
230
+ ...builtinLiveDatasets,
231
+ // curated live feeds (e.g. GeoMet weather radar) → Live Data tab
215
232
  ...nationalDatasets,
216
233
  ...subdivisionDatasets,
217
234
  ...municipalDatasets,
@@ -219,8 +236,8 @@ function Datasets({ isOpen, setIsOpenAction }) {
219
236
  ...datasetState.datasets.datasets || []
220
237
  ];
221
238
  const filtered = unfiltered.filter((ds) => datasetVisibleForOrg(ds, orgVisibility));
222
- return filtered;
223
- }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility]);
239
+ return stampPublished(filtered, publishedCatalog);
240
+ }, [nationalDatasets, subdivisionDatasets, municipalDatasets, datasetState.datasets.datasets, addedDatasets, orgVisibility, publishedCatalog]);
224
241
  const currentTabLoading = React.useMemo(() => {
225
242
  switch (currentTab) {
226
243
  case "national":