@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
@@ -0,0 +1,47 @@
1
+ import type { Dataset } from '../../../../../types/datasetTypes';
2
+ import { type OpenDataPortal } from '../../../../../types/dbTypes';
3
+ /** Tables our publish pipeline creates; served via the cdt_tiles function source. */
4
+ export declare function isPublishedOrgTable(name: string): boolean;
5
+ /** What a published open-data dataset resolves to: its Martin table + backing File row. */
6
+ export interface PublishedCatalogEntry {
7
+ fileId: number;
8
+ table: string;
9
+ geometryType?: string;
10
+ }
11
+ interface CatalogFileRow {
12
+ id?: number | null;
13
+ assetId?: string | null;
14
+ description?: string | null;
15
+ }
16
+ /**
17
+ * Build a lookup from `/api/files` of open-data datasets that have already been
18
+ * published to Martin tiles, keyed by `"{portalId}:{datasetId}"` — the identity
19
+ * of the *original* portal dataset.
20
+ *
21
+ * Catalog publishes mint a File whose `assetId` is `odp:{portalId}:{datasetId}`
22
+ * and whose description carries `portalId`/`datasetId` + `tiledTable`. The
23
+ * original portal entry (shown on the National/Applied/All tabs) keeps its own
24
+ * id, so without this map those tabs cannot tell the dataset is already tiled.
25
+ */
26
+ export declare function buildPublishedCatalogMap(rows: CatalogFileRow[]): Map<string, PublishedCatalogEntry>;
27
+ /**
28
+ * Tag any dataset whose `portal.id:id` is in the published-catalog map with the
29
+ * `publishedTable`/`publishedFileId` it resolves to, so RowActions renders it as
30
+ * converted (and can un-publish it) wherever it appears — not only on the
31
+ * organizational tab, which is the one place that holds the tiled representation.
32
+ * Datasets that aren't published, or have no portal/id, are returned unchanged.
33
+ */
34
+ export declare function stampPublished(datasets: Dataset[], map: Map<string, PublishedCatalogEntry>): Dataset[];
35
+ export interface PublishedFileRow {
36
+ name?: string | null;
37
+ description?: string | null;
38
+ }
39
+ /**
40
+ * Build MVT Dataset entries for published tiles from File-row metadata (/api/files),
41
+ * pointing each at the cdt_tiles function source. The renderer derives source-layer from
42
+ * dataset.id (= the table name = the MVT layer name the function emits), so no serviceInfo
43
+ * is needed. layerType comes from the geometryType stamped at publish time.
44
+ */
45
+ export declare function buildPublishedTileDatasets(rows: PublishedFileRow[], tileBaseUrl: string, portal: OpenDataPortal): Dataset[];
46
+ export {};
47
+ //# sourceMappingURL=publishedTiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishedTiles.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,mCAAmC,CAAA;AACnF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAIhF,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,2FAA2F;AAC3F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2BnG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,OAAO,EAAE,CAStG;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,gBAAgB,EAAE,EACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,EAAE,CAwCX"}
@@ -0,0 +1,114 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ import { DatasetGroup } from "../../../../../types/dbTypes";
21
+ import { layerColorByName } from "../../utils/stringToColour";
22
+ function isPublishedOrgTable(name) {
23
+ return /^org_\d+_file_\d+$/.test(name);
24
+ }
25
+ function buildPublishedCatalogMap(rows) {
26
+ const map = /* @__PURE__ */ new Map();
27
+ for (const row of rows) {
28
+ if (typeof (row == null ? void 0 : row.id) !== "number" || !row.description) continue;
29
+ let desc;
30
+ try {
31
+ desc = JSON.parse(row.description);
32
+ } catch (e) {
33
+ continue;
34
+ }
35
+ if (desc.source !== "open-data-portal") continue;
36
+ const table = typeof desc.tiledTable === "string" ? desc.tiledTable : null;
37
+ if (!table) continue;
38
+ let portalId = typeof desc.portalId === "number" ? String(desc.portalId) : null;
39
+ let datasetId = typeof desc.datasetId === "string" ? desc.datasetId : null;
40
+ if ((!portalId || !datasetId) && typeof row.assetId === "string") {
41
+ const m = /^odp:([^:]+):(.+)$/.exec(row.assetId);
42
+ if (m) {
43
+ portalId = portalId != null ? portalId : m[1];
44
+ datasetId = datasetId != null ? datasetId : m[2];
45
+ }
46
+ }
47
+ if (!portalId || !datasetId) continue;
48
+ map.set(`${portalId}:${datasetId}`, {
49
+ fileId: row.id,
50
+ table,
51
+ geometryType: typeof desc.geometryType === "string" ? desc.geometryType : void 0
52
+ });
53
+ }
54
+ return map;
55
+ }
56
+ function stampPublished(datasets, map) {
57
+ if (map.size === 0) return datasets;
58
+ return datasets.map((d) => {
59
+ var _a;
60
+ const portalId = (_a = d.portal) == null ? void 0 : _a.id;
61
+ if (portalId == null || d.id == null) return d;
62
+ const entry = map.get(`${portalId}:${d.id}`);
63
+ if (!entry) return d;
64
+ return __spreadProps(__spreadValues({}, d), { publishedTable: entry.table, publishedFileId: entry.fileId });
65
+ });
66
+ }
67
+ function buildPublishedTileDatasets(rows, tileBaseUrl, portal) {
68
+ var _a, _b, _c;
69
+ const base = tileBaseUrl.replace(/\/+$/, "");
70
+ const out = [];
71
+ for (const row of rows) {
72
+ if (!(row == null ? void 0 : row.description)) continue;
73
+ let desc;
74
+ try {
75
+ desc = JSON.parse(row.description);
76
+ } catch (e) {
77
+ continue;
78
+ }
79
+ const table = typeof desc.tiledTable === "string" ? desc.tiledTable : null;
80
+ if (!table) continue;
81
+ const name = ((_a = row.name) != null ? _a : table).replace(/\.geojson$/i, "");
82
+ const layerType = typeof desc.geometryType === "string" ? desc.geometryType : void 0;
83
+ const tileUrl = `${base}/cdt_tiles/{z}/{x}/{y}?source=${table}`;
84
+ const getFields = async () => [];
85
+ const getFeatures = async () => ({ type: "FeatureCollection", features: [] });
86
+ out.push({
87
+ id: table,
88
+ name,
89
+ publisher: "Martin Server",
90
+ dataManagementSystem: "other",
91
+ description: `Published vector tile layer: ${table}`,
92
+ countrySubdivision: (_b = portal.countrySubdivision) != null ? _b : "",
93
+ municipality: (_c = portal.municipality) != null ? _c : "",
94
+ type: "MVT",
95
+ datasetType: "MVT",
96
+ url: tileUrl,
97
+ information: tileUrl,
98
+ portal,
99
+ group: DatasetGroup.Organizational,
100
+ layerColor: layerColorByName(name),
101
+ layerType,
102
+ getFields,
103
+ getFeatures
104
+ });
105
+ }
106
+ return out;
107
+ }
108
+ export {
109
+ buildPublishedCatalogMap,
110
+ buildPublishedTileDatasets,
111
+ isPublishedOrgTable,
112
+ stampPublished
113
+ };
114
+ //# sourceMappingURL=publishedTiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/publishedTiles.ts"],"sourcesContent":["import type { Dataset, LayerGeometryType } from '../../../../../types/datasetTypes'\r\nimport { DatasetGroup, type OpenDataPortal } from '../../../../../types/dbTypes'\r\nimport type { AllGeoJSON } from '@turf/turf'\r\nimport { layerColorByName } from '../../utils/stringToColour'\r\n\r\n/** Tables our publish pipeline creates; served via the cdt_tiles function source. */\r\nexport function isPublishedOrgTable(name: string): boolean {\r\n return /^org_\\d+_file_\\d+$/.test(name)\r\n}\r\n\r\n/** What a published open-data dataset resolves to: its Martin table + backing File row. */\r\nexport interface PublishedCatalogEntry {\r\n fileId: number\r\n table: string\r\n geometryType?: string\r\n}\r\n\r\ninterface CatalogFileRow {\r\n id?: number | null\r\n assetId?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build a lookup from `/api/files` of open-data datasets that have already been\r\n * published to Martin tiles, keyed by `\"{portalId}:{datasetId}\"` — the identity\r\n * of the *original* portal dataset.\r\n *\r\n * Catalog publishes mint a File whose `assetId` is `odp:{portalId}:{datasetId}`\r\n * and whose description carries `portalId`/`datasetId` + `tiledTable`. The\r\n * original portal entry (shown on the National/Applied/All tabs) keeps its own\r\n * id, so without this map those tabs cannot tell the dataset is already tiled.\r\n */\r\nexport function buildPublishedCatalogMap(rows: CatalogFileRow[]): Map<string, PublishedCatalogEntry> {\r\n const map = new Map<string, PublishedCatalogEntry>()\r\n for (const row of rows) {\r\n if (typeof row?.id !== 'number' || !row.description) continue\r\n let desc: { source?: unknown, portalId?: unknown, datasetId?: unknown, tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n if (desc.source !== 'open-data-portal') continue\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n // Prefer the structured fields; fall back to parsing the synthetic assetId.\r\n let portalId = typeof desc.portalId === 'number' ? String(desc.portalId) : null\r\n let datasetId = typeof desc.datasetId === 'string' ? desc.datasetId : null\r\n if ((!portalId || !datasetId) && typeof row.assetId === 'string') {\r\n const m = /^odp:([^:]+):(.+)$/.exec(row.assetId)\r\n if (m) { portalId = portalId ?? m[1]; datasetId = datasetId ?? m[2] }\r\n }\r\n if (!portalId || !datasetId) continue\r\n\r\n map.set(`${portalId}:${datasetId}`, {\r\n fileId: row.id,\r\n table,\r\n geometryType: typeof desc.geometryType === 'string' ? desc.geometryType : undefined,\r\n })\r\n }\r\n return map\r\n}\r\n\r\n/**\r\n * Tag any dataset whose `portal.id:id` is in the published-catalog map with the\r\n * `publishedTable`/`publishedFileId` it resolves to, so RowActions renders it as\r\n * converted (and can un-publish it) wherever it appears — not only on the\r\n * organizational tab, which is the one place that holds the tiled representation.\r\n * Datasets that aren't published, or have no portal/id, are returned unchanged.\r\n */\r\nexport function stampPublished(datasets: Dataset[], map: Map<string, PublishedCatalogEntry>): Dataset[] {\r\n if (map.size === 0) return datasets\r\n return datasets.map((d) => {\r\n const portalId = d.portal?.id\r\n if (portalId == null || d.id == null) return d\r\n const entry = map.get(`${portalId}:${d.id}`)\r\n if (!entry) return d\r\n return { ...d, publishedTable: entry.table, publishedFileId: entry.fileId }\r\n })\r\n}\r\n\r\nexport interface PublishedFileRow {\r\n name?: string | null\r\n description?: string | null\r\n}\r\n\r\n/**\r\n * Build MVT Dataset entries for published tiles from File-row metadata (/api/files),\r\n * pointing each at the cdt_tiles function source. The renderer derives source-layer from\r\n * dataset.id (= the table name = the MVT layer name the function emits), so no serviceInfo\r\n * is needed. layerType comes from the geometryType stamped at publish time.\r\n */\r\nexport function buildPublishedTileDatasets(\r\n rows: PublishedFileRow[],\r\n tileBaseUrl: string,\r\n portal: OpenDataPortal,\r\n): Dataset[] {\r\n const base = tileBaseUrl.replace(/\\/+$/, '')\r\n const out: Dataset[] = []\r\n for (const row of rows) {\r\n if (!row?.description) continue\r\n let desc: { tiledTable?: unknown, geometryType?: unknown }\r\n try { desc = JSON.parse(row.description) }\r\n catch { continue }\r\n const table = typeof desc.tiledTable === 'string' ? desc.tiledTable : null\r\n if (!table) continue\r\n\r\n const name = (row.name ?? table).replace(/\\.geojson$/i, '')\r\n const layerType = (typeof desc.geometryType === 'string' ? desc.geometryType : undefined) as LayerGeometryType | undefined\r\n const tileUrl = `${base}/cdt_tiles/{z}/{x}/{y}?source=${table}`\r\n\r\n const getFields = async () => []\r\n const getFeatures = async (): Promise<AllGeoJSON> =>\r\n ({ type: 'FeatureCollection', features: [] } as AllGeoJSON)\r\n\r\n out.push({\r\n id: table,\r\n name,\r\n publisher: 'Martin Server',\r\n dataManagementSystem: 'other',\r\n description: `Published vector tile layer: ${table}`,\r\n countrySubdivision: portal.countrySubdivision ?? '',\r\n municipality: portal.municipality ?? '',\r\n type: 'MVT',\r\n datasetType: 'MVT',\r\n url: tileUrl,\r\n information: tileUrl,\r\n portal,\r\n group: DatasetGroup.Organizational,\r\n layerColor: layerColorByName(name),\r\n layerType,\r\n getFields,\r\n getFeatures,\r\n } as Dataset)\r\n }\r\n return out\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Generic WMS-T (time dimension) helpers for animating WMS raster overlays.
3
+ *
4
+ * Generalized from the radar-specific helpers (RadarLayer/geomet.ts): any WMS
5
+ * layer with an ISO8601 TIME dimension can be expanded into frames and animated
6
+ * by swapping the GetMap TIME param. Data stays federated — the browser fetches
7
+ * raster tiles directly; nothing is ingested or stored here.
8
+ */
9
+ /** Parse an ISO8601 duration (`PT6M`, `PT1H30M`, `P1DT12H`) into ms. 0 if unparseable. */
10
+ export declare function parseIso8601DurationMs(iso: string): number;
11
+ /**
12
+ * Expand a WMS-T `start/end/interval` extent into ascending frame timestamps
13
+ * (oldest → newest). Falls back to `[start]` if the interval can't be parsed,
14
+ * `[]` if start itself is invalid. Capped at `maxFrames` (keeps the newest).
15
+ */
16
+ export declare function expandTimeRange(startIso: string, endIso: string, intervalIso: string, maxFrames?: number): string[];
17
+ export interface WmsTimeExtent {
18
+ /** Ascending frame timestamps (oldest → newest). Empty when no time dimension found. */
19
+ frames: string[];
20
+ }
21
+ /**
22
+ * Pull the `<Dimension name="time">` out of a (layer-scoped) WMS GetCapabilities
23
+ * document and expand it to frame timestamps. Handles the `start/end/interval`
24
+ * form and a bare comma-separated list as a fallback.
25
+ */
26
+ export declare function parseTimeExtent(xml: string, maxFrames?: number): WmsTimeExtent;
27
+ /** Short local-time label for a frame timestamp (e.g. "3:42 PM"). */
28
+ export declare function formatFrameTime(iso: string): string;
29
+ /** Layer-scoped GetCapabilities URL — returns a small XML payload with the live time extent. */
30
+ export declare function wmsCapabilitiesUrl(baseUrl: string, layers: string): string;
31
+ /**
32
+ * Build a WMS GetLegendGraphic URL — the server-rendered legend image (colour
33
+ * ramp + labels) for the layer's default style. No STYLE param, so it matches
34
+ * the default-style tiles `buildWmsTimeUrl` requests (STYLES='').
35
+ */
36
+ export declare function wmsLegendUrl(baseUrl: string, layers: string): string;
37
+ /**
38
+ * Build a MapLibre raster tile-URL template for a WMS GetMap request at a given
39
+ * TIME. `{bbox-epsg-3857}` must stay literal — MapLibre substitutes it per tile.
40
+ * Mirrors `buildWmsTileUrl` (WMS 1.1.1 + SRS=EPSG:3857) with TIME added.
41
+ */
42
+ export declare function buildWmsTimeUrl(baseUrl: string, layers: string, time: string): string;
43
+ /**
44
+ * Fetch a layer-scoped GetCapabilities document and return its time frames.
45
+ * Thin network wrapper — returns `[]` on any failure so callers can simply
46
+ * render no control (the static latest-frame raster keeps working).
47
+ */
48
+ export declare function fetchWmsFrames(baseUrl: string, layers: string): Promise<string[]>;
49
+ //# sourceMappingURL=wmsTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wmsTime.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/datasets/src/wmsTime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAmB,GAC7B,MAAM,EAAE,CAgBV;AAED,MAAM,WAAW,aAAa;IAC5B,wFAAwF;IACxF,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAmB,GAAG,aAAa,CAmB1F;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBrF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQvF"}
@@ -0,0 +1,100 @@
1
+ const MAX_FRAMES = 60;
2
+ function toWmsTime(ms) {
3
+ return new Date(ms).toISOString().replace(/\.\d{3}Z$/, "Z");
4
+ }
5
+ function parseIso8601DurationMs(iso) {
6
+ const m = iso.trim().match(/^P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/i);
7
+ if (!m) return 0;
8
+ const [, d, h, min, s] = m;
9
+ const seconds = Number(d || 0) * 86400 + Number(h || 0) * 3600 + Number(min || 0) * 60 + Number(s || 0);
10
+ return seconds * 1e3;
11
+ }
12
+ function expandTimeRange(startIso, endIso, intervalIso, maxFrames = MAX_FRAMES) {
13
+ const start = Date.parse(startIso);
14
+ const end = Date.parse(endIso);
15
+ const stepMs = parseIso8601DurationMs(intervalIso);
16
+ if (!Number.isFinite(start)) return [];
17
+ if (!Number.isFinite(end) || stepMs <= 0 || end < start) return [toWmsTime(start)];
18
+ const out = [];
19
+ for (let t = start; t <= end; t += stepMs) {
20
+ out.push(toWmsTime(t));
21
+ }
22
+ const endStr = toWmsTime(end);
23
+ if (out[out.length - 1] !== endStr) out.push(endStr);
24
+ return out.length > maxFrames ? out.slice(out.length - maxFrames) : out;
25
+ }
26
+ function parseTimeExtent(xml, maxFrames = MAX_FRAMES) {
27
+ const dim = xml.match(/<Dimension\b[^>]*\bname="time"[^>]*>([\s\S]*?)<\/Dimension>/i);
28
+ if (!dim) return { frames: [] };
29
+ const body = dim[1].trim();
30
+ if (!body) return { frames: [] };
31
+ let frames;
32
+ if (body.includes("/")) {
33
+ const [start, end, interval] = body.split("/");
34
+ frames = expandTimeRange(start, end, interval, maxFrames);
35
+ } else if (body.includes(",")) {
36
+ frames = body.split(",").map((s) => s.trim()).filter(Boolean);
37
+ if (frames.length > maxFrames) frames = frames.slice(frames.length - maxFrames);
38
+ } else {
39
+ frames = [body];
40
+ }
41
+ return { frames };
42
+ }
43
+ function formatFrameTime(iso) {
44
+ const d = new Date(iso);
45
+ if (Number.isNaN(d.getTime())) return iso;
46
+ return d.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
47
+ }
48
+ function wmsCapabilitiesUrl(baseUrl, layers) {
49
+ const base = baseUrl.split("?")[0];
50
+ return `${base}?service=WMS&version=1.3.0&request=GetCapabilities&layer=${encodeURIComponent(layers)}`;
51
+ }
52
+ function wmsLegendUrl(baseUrl, layers) {
53
+ const base = baseUrl.split("?")[0];
54
+ const params = new URLSearchParams({
55
+ SERVICE: "WMS",
56
+ VERSION: "1.3.0",
57
+ REQUEST: "GetLegendGraphic",
58
+ LAYER: layers,
59
+ FORMAT: "image/png",
60
+ SLD_VERSION: "1.1.0"
61
+ });
62
+ return `${base}?${params.toString()}`;
63
+ }
64
+ function buildWmsTimeUrl(baseUrl, layers, time) {
65
+ const base = baseUrl.split("?")[0];
66
+ const params = new URLSearchParams({
67
+ SERVICE: "WMS",
68
+ VERSION: "1.1.1",
69
+ REQUEST: "GetMap",
70
+ FORMAT: "image/png",
71
+ TRANSPARENT: "true",
72
+ LAYERS: layers,
73
+ STYLES: "",
74
+ SRS: "EPSG:3857",
75
+ WIDTH: "256",
76
+ HEIGHT: "256",
77
+ TIME: time
78
+ });
79
+ return `${base}?${params.toString()}&BBOX={bbox-epsg-3857}`;
80
+ }
81
+ async function fetchWmsFrames(baseUrl, layers) {
82
+ try {
83
+ const res = await fetch(wmsCapabilitiesUrl(baseUrl, layers));
84
+ if (!res.ok) return [];
85
+ return parseTimeExtent(await res.text()).frames;
86
+ } catch (e) {
87
+ return [];
88
+ }
89
+ }
90
+ export {
91
+ buildWmsTimeUrl,
92
+ expandTimeRange,
93
+ fetchWmsFrames,
94
+ formatFrameTime,
95
+ parseIso8601DurationMs,
96
+ parseTimeExtent,
97
+ wmsCapabilitiesUrl,
98
+ wmsLegendUrl
99
+ };
100
+ //# sourceMappingURL=wmsTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/datasets/src/wmsTime.ts"],"sourcesContent":["/**\r\n * Generic WMS-T (time dimension) helpers for animating WMS raster overlays.\r\n *\r\n * Generalized from the radar-specific helpers (RadarLayer/geomet.ts): any WMS\r\n * layer with an ISO8601 TIME dimension can be expanded into frames and animated\r\n * by swapping the GetMap TIME param. Data stays federated — the browser fetches\r\n * raster tiles directly; nothing is ingested or stored here.\r\n */\r\n\r\n/** Cap on expanded frames — guards against a pathological extent string. */\r\nconst MAX_FRAMES = 60\r\n\r\n/** Strip the millisecond component toISOString adds; WMS TIME wants `...:00Z`. */\r\nfunction toWmsTime(ms: number): string {\r\n return new Date(ms).toISOString().replace(/\\.\\d{3}Z$/, 'Z')\r\n}\r\n\r\n/** Parse an ISO8601 duration (`PT6M`, `PT1H30M`, `P1DT12H`) into ms. 0 if unparseable. */\r\nexport function parseIso8601DurationMs(iso: string): number {\r\n const m = iso.trim().match(/^P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/i)\r\n if (!m) return 0\r\n const [, d, h, min, s] = m\r\n const seconds =\r\n Number(d || 0) * 86400 + Number(h || 0) * 3600 + Number(min || 0) * 60 + Number(s || 0)\r\n return seconds * 1000\r\n}\r\n\r\n/**\r\n * Expand a WMS-T `start/end/interval` extent into ascending frame timestamps\r\n * (oldest → newest). Falls back to `[start]` if the interval can't be parsed,\r\n * `[]` if start itself is invalid. Capped at `maxFrames` (keeps the newest).\r\n */\r\nexport function expandTimeRange(\r\n startIso: string,\r\n endIso: string,\r\n intervalIso: string,\r\n maxFrames: number = MAX_FRAMES,\r\n): string[] {\r\n const start = Date.parse(startIso)\r\n const end = Date.parse(endIso)\r\n const stepMs = parseIso8601DurationMs(intervalIso)\r\n\r\n if (!Number.isFinite(start)) return []\r\n if (!Number.isFinite(end) || stepMs <= 0 || end < start) return [toWmsTime(start)]\r\n\r\n const out: string[] = []\r\n for (let t = start; t <= end; t += stepMs) {\r\n out.push(toWmsTime(t))\r\n }\r\n const endStr = toWmsTime(end)\r\n if (out[out.length - 1] !== endStr) out.push(endStr)\r\n\r\n return out.length > maxFrames ? out.slice(out.length - maxFrames) : out\r\n}\r\n\r\nexport interface WmsTimeExtent {\r\n /** Ascending frame timestamps (oldest → newest). Empty when no time dimension found. */\r\n frames: string[]\r\n}\r\n\r\n/**\r\n * Pull the `<Dimension name=\"time\">` out of a (layer-scoped) WMS GetCapabilities\r\n * document and expand it to frame timestamps. Handles the `start/end/interval`\r\n * form and a bare comma-separated list as a fallback.\r\n */\r\nexport function parseTimeExtent(xml: string, maxFrames: number = MAX_FRAMES): WmsTimeExtent {\r\n const dim = xml.match(/<Dimension\\b[^>]*\\bname=\"time\"[^>]*>([\\s\\S]*?)<\\/Dimension>/i)\r\n if (!dim) return { frames: [] }\r\n\r\n const body = dim[1].trim()\r\n if (!body) return { frames: [] }\r\n\r\n let frames: string[]\r\n if (body.includes('/')) {\r\n const [start, end, interval] = body.split('/')\r\n frames = expandTimeRange(start, end, interval, maxFrames)\r\n } else if (body.includes(',')) {\r\n frames = body.split(',').map(s => s.trim()).filter(Boolean)\r\n if (frames.length > maxFrames) frames = frames.slice(frames.length - maxFrames)\r\n } else {\r\n frames = [body]\r\n }\r\n\r\n return { frames }\r\n}\r\n\r\n/** Short local-time label for a frame timestamp (e.g. \"3:42 PM\"). */\r\nexport function formatFrameTime(iso: string): string {\r\n const d = new Date(iso)\r\n if (Number.isNaN(d.getTime())) return iso\r\n return d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' })\r\n}\r\n\r\n/** Layer-scoped GetCapabilities URL — returns a small XML payload with the live time extent. */\r\nexport function wmsCapabilitiesUrl(baseUrl: string, layers: string): string {\r\n const base = baseUrl.split('?')[0]\r\n return `${base}?service=WMS&version=1.3.0&request=GetCapabilities&layer=${encodeURIComponent(layers)}`\r\n}\r\n\r\n/**\r\n * Build a WMS GetLegendGraphic URL — the server-rendered legend image (colour\r\n * ramp + labels) for the layer's default style. No STYLE param, so it matches\r\n * the default-style tiles `buildWmsTimeUrl` requests (STYLES='').\r\n */\r\nexport function wmsLegendUrl(baseUrl: string, layers: string): string {\r\n const base = baseUrl.split('?')[0]\r\n const params = new URLSearchParams({\r\n SERVICE: 'WMS',\r\n VERSION: '1.3.0',\r\n REQUEST: 'GetLegendGraphic',\r\n LAYER: layers,\r\n FORMAT: 'image/png',\r\n SLD_VERSION: '1.1.0',\r\n })\r\n return `${base}?${params.toString()}`\r\n}\r\n\r\n/**\r\n * Build a MapLibre raster tile-URL template for a WMS GetMap request at a given\r\n * TIME. `{bbox-epsg-3857}` must stay literal — MapLibre substitutes it per tile.\r\n * Mirrors `buildWmsTileUrl` (WMS 1.1.1 + SRS=EPSG:3857) with TIME added.\r\n */\r\nexport function buildWmsTimeUrl(baseUrl: string, layers: string, time: string): string {\r\n const base = baseUrl.split('?')[0]\r\n const params = new URLSearchParams({\r\n SERVICE: 'WMS',\r\n VERSION: '1.1.1',\r\n REQUEST: 'GetMap',\r\n FORMAT: 'image/png',\r\n TRANSPARENT: 'true',\r\n LAYERS: layers,\r\n STYLES: '',\r\n SRS: 'EPSG:3857',\r\n WIDTH: '256',\r\n HEIGHT: '256',\r\n TIME: time,\r\n })\r\n return `${base}?${params.toString()}&BBOX={bbox-epsg-3857}`\r\n}\r\n\r\n/**\r\n * Fetch a layer-scoped GetCapabilities document and return its time frames.\r\n * Thin network wrapper — returns `[]` on any failure so callers can simply\r\n * render no control (the static latest-frame raster keeps working).\r\n */\r\nexport async function fetchWmsFrames(baseUrl: string, layers: string): Promise<string[]> {\r\n try {\r\n const res = await fetch(wmsCapabilitiesUrl(baseUrl, layers))\r\n if (!res.ok) return []\r\n return parseTimeExtent(await res.text()).frames\r\n } catch {\r\n return []\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Geocoder.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"names":[],"mappings":"AAGA,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,qBAsRf"}
1
+ {"version":3,"file":"Geocoder.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"names":[],"mappings":"AAGA,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"}
@@ -114,7 +114,7 @@ function Geocoder({
114
114
  };
115
115
  }, [alwaysExpanded]);
116
116
  const handleSelectSuggestion = (feature, type = "") => {
117
- var _a, _b;
117
+ var _a;
118
118
  setQuery("");
119
119
  setSuggestions([]);
120
120
  setBuildingResults([]);
@@ -128,18 +128,18 @@ function Geocoder({
128
128
  if (onSelect) onSelect(addressData);
129
129
  if (mapDispatch && currentLocation) {
130
130
  const [lng, lat] = addressData.coordinates;
131
- const countrySubdivision = (_b = addressData.properties) == null ? void 0 : _b.region_a;
131
+ const props = addressData.properties || {};
132
132
  const parts = address2.split(",").map((p) => p.trim());
133
- const partsReverse = [...parts].reverse();
134
- console.log("parts", parts, "partsReverse", partsReverse);
135
- let municipality = "";
136
- if (partsReverse[1] === countrySubdivision) municipality = partsReverse[2] || "";
133
+ const countrySubdivision = props.region_a || props.region || "";
134
+ const municipality = props.locality || props.neighbourhood || props.county || "";
137
135
  const newCurrentLocation = __spreadProps(__spreadValues({}, currentLocation), { municipality, countrySubdivision, longitude: lng, latitude: lat, address: parts[0] });
138
136
  mapDispatch({ type: "UPDATE_LOCATION", payload: { currentLocation: newCurrentLocation } });
139
- if (municipality && countrySubdivision) {
137
+ if (municipality || countrySubdivision) {
140
138
  const url = new URL(window.location.href);
141
- url.searchParams.set("municipality", municipality);
142
- url.searchParams.set("countrySubdivision", countrySubdivision);
139
+ if (municipality) url.searchParams.set("municipality", municipality);
140
+ else url.searchParams.delete("municipality");
141
+ if (countrySubdivision) url.searchParams.set("countrySubdivision", countrySubdivision);
142
+ else url.searchParams.delete("countrySubdivision");
143
143
  url.searchParams.set("address", parts[0]);
144
144
  url.searchParams.set("lng", lng.toString());
145
145
  url.searchParams.set("lat", lat.toString());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"sourcesContent":["'use client'\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Context\r\nimport { MapContext } from '../../../../store'\r\n\r\n// Utility functions\r\nimport { fetchSuggestions, parseLocation, handleLocationSelect, buildingToFeature } from '../utils/geocoder'\r\n\r\n// Import the shadcn components\r\nimport { Command, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator } from '../../../ui/Command'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Separator } from '../../../ui/Separator'\r\n\r\n// Icons\r\nimport { Search } from 'lucide-react'\r\n\r\n// Building data hook\r\nimport { useBuildings } from '../../../../hooks/buildings/buildings'\r\n\r\nimport { usePathname } from 'next/navigation'\r\nimport type { CurrentLocation } from '../../../../types/map'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\ninterface GeocoderProps {\r\n onSelect?: (addressData: any) => void\r\n showDatabaseBuildings?: boolean\r\n alwaysExpanded?: boolean\r\n}\r\n\r\nexport default function Geocoder({\r\n onSelect,\r\n showDatabaseBuildings = true,\r\n alwaysExpanded = false,\r\n}: GeocoderProps) {\r\n // Translation\r\n const t = useTranslations('Geocoder')\r\n\r\n const [address, setAddress] = React.useState<string>('')\r\n const [query, setQuery] = React.useState('')\r\n const [suggestions, setSuggestions] = React.useState([])\r\n const [buildingResults, setBuildingResults] = React.useState([])\r\n const [focused, setFocused] = React.useState(alwaysExpanded)\r\n const [selectedAddress, setSelectedAddress] = React.useState(null)\r\n const [isExpanded, setIsExpanded] = React.useState(alwaysExpanded)\r\n const [loading, setLoading] = React.useState(false)\r\n\r\n const pathname = usePathname()\r\n\r\n const suggestionsRef = React.useRef(null)\r\n const inputRef = React.useRef(null)\r\n const debounceRef = React.useRef(null)\r\n\r\n const { dispatch: mapDispatch, state: mapState } = React.useContext(MapContext)\r\n const { map, currentLocation, organizationCountry } = mapState.map\r\n\r\n // Fetch buildings data from API only if showDatabaseBuildings is true\r\n const { buildings, isLoading: isBuildingsLoading } = useBuildings()\r\n\r\n // Filter buildings based on search query\r\n const filterBuildings = React.useCallback((searchQuery) => {\r\n if (!showDatabaseBuildings || !buildings || !searchQuery || searchQuery.length < 3) return []\r\n\r\n const lowerQuery = searchQuery.toLowerCase()\r\n\r\n if (Array.isArray(buildings) && buildings.length > 0) {\r\n return buildings.filter((building) => {\r\n return (\r\n (building.buildingName && building.buildingName.toLowerCase().includes(lowerQuery))\r\n || (building.buildingAddress && building.buildingAddress.toLowerCase().includes(lowerQuery))\r\n || (building.buildingMunicipality && building.buildingMunicipality.toLowerCase().includes(lowerQuery))\r\n || (building.buildingCountrySubdivision && building.buildingCountrySubdivision.toLowerCase().includes(lowerQuery))\r\n )\r\n }).slice(0, 3) // Limit to 3 results\r\n }\r\n return []\r\n }, [buildings, showDatabaseBuildings])\r\n\r\n // Debounce the API request to avoid rate limiting and excessive requests\r\n React.useEffect(() => {\r\n if (debounceRef.current) {\r\n clearTimeout(debounceRef.current)\r\n }\r\n\r\n debounceRef.current = setTimeout(async () => {\r\n if (!query || query.length < 3) {\r\n setSuggestions([])\r\n setBuildingResults([])\r\n setLoading(false)\r\n return\r\n }\r\n\r\n setLoading(true)\r\n try {\r\n // Filter buildings from our database only if enabled\r\n if (showDatabaseBuildings) {\r\n const filteredBuildings = filterBuildings(query)\r\n setBuildingResults(filteredBuildings)\r\n }\r\n\r\n // Fetch geocoding suggestions\r\n const geocodeResults = await fetchSuggestions(query, organizationCountry)\r\n \r\n // Deduplicate geocode results based on name and region\r\n const deduplicatedResults = geocodeResults.reduce((acc, feature) => {\r\n const location = parseLocation(feature)\r\n // Create a unique key based on name and region (case-insensitive)\r\n const key = `${location.name?.toLowerCase() || ''}_${location.region?.toLowerCase() || ''}`\r\n \r\n // Only add if we haven't seen this combination before\r\n if (!acc.seen.has(key)) {\r\n acc.seen.add(key)\r\n acc.features.push(feature)\r\n }\r\n \r\n return acc\r\n }, { seen: new Set(), features: [] })\r\n \r\n setSuggestions(deduplicatedResults.features)\r\n }\r\n catch (error) {\r\n console.error('Error fetching suggestions:', error)\r\n setSuggestions([])\r\n }\r\n finally {\r\n setLoading(false)\r\n }\r\n }, 300) // Increased debounce time for better API rate limiting\r\n\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current)\r\n }\r\n }, [query, filterBuildings, showDatabaseBuildings])\r\n\r\n // Handle click outside to close suggestions\r\n React.useEffect(() => {\r\n const handleClickOutside = (event) => {\r\n if (suggestionsRef.current && !suggestionsRef.current.contains(event.target)\r\n && inputRef.current && !inputRef.current.contains(event.target) // Don't close if alwaysExpanded is true\r\n && !alwaysExpanded) {\r\n setFocused(false)\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }, [alwaysExpanded])\r\n\r\n // Handle suggestion selection\r\n const handleSelectSuggestion = (feature, type = '') => {\r\n setQuery('') // Clear the input field\r\n setSuggestions([])\r\n setBuildingResults([])\r\n if (!alwaysExpanded) {\r\n setFocused(false)\r\n }\r\n\r\n // handleLocationSelect will automatically remove any existing marker and add a new one\r\n const addressData = handleLocationSelect(feature, map, type)\r\n\r\n const address = addressData.formatted_address || feature.properties?.label || ''\r\n setAddress(address)\r\n setSelectedAddress(addressData)\r\n\r\n if (onSelect) onSelect(addressData)\r\n\r\n if (mapDispatch && currentLocation) {\r\n const [lng, lat] = addressData.coordinates\r\n const countrySubdivision: string = addressData.properties?.region_a\r\n // Extract municipality (3rd from the right)\r\n const parts = address.split(',').map(p => p.trim())\r\n const partsReverse = [...parts].reverse()\r\n console.log('parts', parts, 'partsReverse', partsReverse)\r\n let municipality = ''\r\n if (partsReverse[1] === countrySubdivision) municipality = partsReverse[2] || ''\r\n\r\n const newCurrentLocation: CurrentLocation = { ...currentLocation, municipality, countrySubdivision, longitude: lng, latitude: lat, address: parts[0] }\r\n mapDispatch({ type: 'UPDATE_LOCATION', payload: { currentLocation: newCurrentLocation } })\r\n if (municipality && countrySubdivision) {\r\n const url = new URL(window.location.href)\r\n url.searchParams.set('municipality', municipality)\r\n url.searchParams.set('countrySubdivision', countrySubdivision)\r\n url.searchParams.set('address', parts[0])\r\n url.searchParams.set('lng', lng.toString())\r\n url.searchParams.set('lat', lat.toString())\r\n url.searchParams.set('zoom', '18')\r\n window.history.replaceState({}, '', url.toString())\r\n }\r\n }\r\n }\r\n\r\n // Handle expand of menubar to display search input\r\n const handleExpand = () => {\r\n if (alwaysExpanded) return // Don't allow toggling if always expanded\r\n\r\n setIsExpanded(!isExpanded)\r\n if (isExpanded) {\r\n setFocused(false)\r\n setQuery('') // clear input and suggestions when collapsed\r\n setSuggestions([])\r\n setBuildingResults([])\r\n }\r\n else {\r\n setFocused(true)\r\n setTimeout(() => {\r\n inputRef.current?.focus()\r\n }, 100) // Small delay to ensure the input is rendered\r\n }\r\n }\r\n\r\n return (\r\n <Command>\r\n {/* Search input + button */}\r\n <div className={`flex flex-row justify-start items-center w-full h-auto `}>\r\n {!alwaysExpanded && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleExpand}\r\n className=\"opacity-70 w-6 justify-end hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n >\r\n <Search />\r\n </Button>\r\n )}\r\n {alwaysExpanded && (\r\n <Search className=\"h-4 w-4 opacity-50\" />\r\n )}\r\n <Input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={query}\r\n onChange={e => setQuery(e.target.value)}\r\n onFocus={() => setFocused(true)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n inputRef.current?.blur()\r\n }\r\n }}\r\n placeholder={alwaysExpanded ? t('placeholder1') : t('placeholder2')}\r\n className={`border-none focus-visible:ring-transparent text-sm transition-all ease-in-out duration-200 ${\r\n alwaysExpanded || isExpanded ? 'w-full' : 'w-0 p-0'\r\n }`}\r\n />\r\n </div>\r\n\r\n {focused && (loading || buildingResults.length > 0 || suggestions.length > 0) && (\r\n <div ref={suggestionsRef}>\r\n <Separator />\r\n <CommandList>\r\n {!loading && buildingResults.length === 0 && suggestions.length === 0 && query.length >= 3 && (\r\n <CommandEmpty>{showDatabaseBuildings ? t('noResults') : t('noAddresses')}</CommandEmpty>\r\n )}\r\n\r\n {loading && (\r\n <CommandEmpty><LoadingSpinner /></CommandEmpty>\r\n )}\r\n\r\n {/* Database Buildings section - only show if enabled */}\r\n {showDatabaseBuildings && !loading && buildingResults.length > 0 && (\r\n <CommandGroup heading={t('buildingHeader')}>\r\n {buildingResults.map((building) => {\r\n const buildingFeature = buildingToFeature(building)\r\n\r\n return (\r\n <CommandItem\r\n key={`building-${building.id}`}\r\n onSelect={() => handleSelectSuggestion(buildingFeature, 'dbBuilding')}\r\n className=\"cursor-pointer\"\r\n >\r\n <div className=\"font-medium\">{building.buildingName}</div>\r\n <div className=\"text-sm text-muted-foreground\">\r\n {building.buildingAddress}\r\n </div>\r\n </CommandItem>\r\n )\r\n })}\r\n </CommandGroup>\r\n )}\r\n\r\n {/* Separator between sections if both have results */}\r\n {showDatabaseBuildings && buildingResults.length > 0 && suggestions.length > 0 && (\r\n <CommandSeparator />\r\n )}\r\n\r\n {/* Geocoder suggestions section */}\r\n {!loading && suggestions.length > 0 && (\r\n <CommandGroup heading={showDatabaseBuildings ? t('suggestionsHeader') : undefined}>\r\n {suggestions.map((feature) => {\r\n const location = parseLocation(feature)\r\n const uniqueKey = feature.properties?.gid\r\n || `${feature.properties?.name}-${feature.geometry?.coordinates?.[0]}-${feature.geometry?.coordinates?.[1]}`\r\n\r\n return (\r\n <CommandItem\r\n key={uniqueKey}\r\n onSelect={() => handleSelectSuggestion(feature)}\r\n className=\"cursor-pointer\"\r\n >\r\n <div className=\"font-medium\">{location.name}</div>\r\n <div className=\"text-sm text-muted-foreground\">{location.region}</div>\r\n </CommandItem>\r\n )\r\n })}\r\n </CommandGroup>\r\n )}\r\n </CommandList>\r\n </div>\r\n )}\r\n </Command>\r\n )\r\n}"],"mappings":"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","names":["address"]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/map/src/Geocoder.tsx"],"sourcesContent":["'use client'\r\n\r\n// Dependencies\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Context\r\nimport { MapContext } from '../../../../store'\r\n\r\n// Utility functions\r\nimport { fetchSuggestions, parseLocation, handleLocationSelect, buildingToFeature } from '../utils/geocoder'\r\n\r\n// Import the shadcn components\r\nimport { Command, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator } from '../../../ui/Command'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Separator } from '../../../ui/Separator'\r\n\r\n// Icons\r\nimport { Search } from 'lucide-react'\r\n\r\n// Building data hook\r\nimport { useBuildings } from '../../../../hooks/buildings/buildings'\r\n\r\nimport { usePathname } from 'next/navigation'\r\nimport type { CurrentLocation } from '../../../../types/map'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\ninterface GeocoderProps {\r\n onSelect?: (addressData: any) => void\r\n showDatabaseBuildings?: boolean\r\n alwaysExpanded?: boolean\r\n}\r\n\r\nexport default function Geocoder({\r\n onSelect,\r\n showDatabaseBuildings = true,\r\n alwaysExpanded = false,\r\n}: GeocoderProps) {\r\n // Translation\r\n const t = useTranslations('Geocoder')\r\n\r\n const [address, setAddress] = React.useState<string>('')\r\n const [query, setQuery] = React.useState('')\r\n const [suggestions, setSuggestions] = React.useState([])\r\n const [buildingResults, setBuildingResults] = React.useState([])\r\n const [focused, setFocused] = React.useState(alwaysExpanded)\r\n const [selectedAddress, setSelectedAddress] = React.useState(null)\r\n const [isExpanded, setIsExpanded] = React.useState(alwaysExpanded)\r\n const [loading, setLoading] = React.useState(false)\r\n\r\n const pathname = usePathname()\r\n\r\n const suggestionsRef = React.useRef(null)\r\n const inputRef = React.useRef(null)\r\n const debounceRef = React.useRef(null)\r\n\r\n const { dispatch: mapDispatch, state: mapState } = React.useContext(MapContext)\r\n const { map, currentLocation, organizationCountry } = mapState.map\r\n\r\n // Fetch buildings data from API only if showDatabaseBuildings is true\r\n const { buildings, isLoading: isBuildingsLoading } = useBuildings()\r\n\r\n // Filter buildings based on search query\r\n const filterBuildings = React.useCallback((searchQuery) => {\r\n if (!showDatabaseBuildings || !buildings || !searchQuery || searchQuery.length < 3) return []\r\n\r\n const lowerQuery = searchQuery.toLowerCase()\r\n\r\n if (Array.isArray(buildings) && buildings.length > 0) {\r\n return buildings.filter((building) => {\r\n return (\r\n (building.buildingName && building.buildingName.toLowerCase().includes(lowerQuery))\r\n || (building.buildingAddress && building.buildingAddress.toLowerCase().includes(lowerQuery))\r\n || (building.buildingMunicipality && building.buildingMunicipality.toLowerCase().includes(lowerQuery))\r\n || (building.buildingCountrySubdivision && building.buildingCountrySubdivision.toLowerCase().includes(lowerQuery))\r\n )\r\n }).slice(0, 3) // Limit to 3 results\r\n }\r\n return []\r\n }, [buildings, showDatabaseBuildings])\r\n\r\n // Debounce the API request to avoid rate limiting and excessive requests\r\n React.useEffect(() => {\r\n if (debounceRef.current) {\r\n clearTimeout(debounceRef.current)\r\n }\r\n\r\n debounceRef.current = setTimeout(async () => {\r\n if (!query || query.length < 3) {\r\n setSuggestions([])\r\n setBuildingResults([])\r\n setLoading(false)\r\n return\r\n }\r\n\r\n setLoading(true)\r\n try {\r\n // Filter buildings from our database only if enabled\r\n if (showDatabaseBuildings) {\r\n const filteredBuildings = filterBuildings(query)\r\n setBuildingResults(filteredBuildings)\r\n }\r\n\r\n // Fetch geocoding suggestions\r\n const geocodeResults = await fetchSuggestions(query, organizationCountry)\r\n \r\n // Deduplicate geocode results based on name and region\r\n const deduplicatedResults = geocodeResults.reduce((acc, feature) => {\r\n const location = parseLocation(feature)\r\n // Create a unique key based on name and region (case-insensitive)\r\n const key = `${location.name?.toLowerCase() || ''}_${location.region?.toLowerCase() || ''}`\r\n \r\n // Only add if we haven't seen this combination before\r\n if (!acc.seen.has(key)) {\r\n acc.seen.add(key)\r\n acc.features.push(feature)\r\n }\r\n \r\n return acc\r\n }, { seen: new Set(), features: [] })\r\n \r\n setSuggestions(deduplicatedResults.features)\r\n }\r\n catch (error) {\r\n console.error('Error fetching suggestions:', error)\r\n setSuggestions([])\r\n }\r\n finally {\r\n setLoading(false)\r\n }\r\n }, 300) // Increased debounce time for better API rate limiting\r\n\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current)\r\n }\r\n }, [query, filterBuildings, showDatabaseBuildings])\r\n\r\n // Handle click outside to close suggestions\r\n React.useEffect(() => {\r\n const handleClickOutside = (event) => {\r\n if (suggestionsRef.current && !suggestionsRef.current.contains(event.target)\r\n && inputRef.current && !inputRef.current.contains(event.target) // Don't close if alwaysExpanded is true\r\n && !alwaysExpanded) {\r\n setFocused(false)\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }, [alwaysExpanded])\r\n\r\n // Handle suggestion selection\r\n const handleSelectSuggestion = (feature, type = '') => {\r\n setQuery('') // Clear the input field\r\n setSuggestions([])\r\n setBuildingResults([])\r\n if (!alwaysExpanded) {\r\n setFocused(false)\r\n }\r\n\r\n // handleLocationSelect will automatically remove any existing marker and add a new one\r\n const addressData = handleLocationSelect(feature, map, type)\r\n\r\n const address = addressData.formatted_address || feature.properties?.label || ''\r\n setAddress(address)\r\n setSelectedAddress(addressData)\r\n\r\n if (onSelect) onSelect(addressData)\r\n\r\n if (mapDispatch && currentLocation) {\r\n const [lng, lat] = addressData.coordinates\r\n const props = addressData.properties || {}\r\n const parts = address.split(',').map(p => p.trim())\r\n // Read structured properties (provider-agnostic) instead of parsing label tokens,\r\n // which only matched Geocode Earth's \"…, ON, Canada\" abbreviation format and broke\r\n // on the Photon/Nominatim fallback.\r\n const countrySubdivision: string = props.region_a || props.region || ''\r\n const municipality: string = props.locality || props.neighbourhood || props.county || ''\r\n\r\n const newCurrentLocation: CurrentLocation = { ...currentLocation, municipality, countrySubdivision, longitude: lng, latitude: lat, address: parts[0] }\r\n mapDispatch({ type: 'UPDATE_LOCATION', payload: { currentLocation: newCurrentLocation } })\r\n if (municipality || countrySubdivision) {\r\n const url = new URL(window.location.href)\r\n // Write each field only when present, so an empty param doesn't shadow the\r\n // organization fallback MapViewer applies on reload.\r\n if (municipality) url.searchParams.set('municipality', municipality)\r\n else url.searchParams.delete('municipality')\r\n if (countrySubdivision) url.searchParams.set('countrySubdivision', countrySubdivision)\r\n else url.searchParams.delete('countrySubdivision')\r\n url.searchParams.set('address', parts[0])\r\n url.searchParams.set('lng', lng.toString())\r\n url.searchParams.set('lat', lat.toString())\r\n url.searchParams.set('zoom', '18')\r\n window.history.replaceState({}, '', url.toString())\r\n }\r\n }\r\n }\r\n\r\n // Handle expand of menubar to display search input\r\n const handleExpand = () => {\r\n if (alwaysExpanded) return // Don't allow toggling if always expanded\r\n\r\n setIsExpanded(!isExpanded)\r\n if (isExpanded) {\r\n setFocused(false)\r\n setQuery('') // clear input and suggestions when collapsed\r\n setSuggestions([])\r\n setBuildingResults([])\r\n }\r\n else {\r\n setFocused(true)\r\n setTimeout(() => {\r\n inputRef.current?.focus()\r\n }, 100) // Small delay to ensure the input is rendered\r\n }\r\n }\r\n\r\n return (\r\n <Command>\r\n {/* Search input + button */}\r\n <div className={`flex flex-row justify-start items-center w-full h-auto `}>\r\n {!alwaysExpanded && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleExpand}\r\n className=\"opacity-70 w-6 justify-end hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n >\r\n <Search />\r\n </Button>\r\n )}\r\n {alwaysExpanded && (\r\n <Search className=\"h-4 w-4 opacity-50\" />\r\n )}\r\n <Input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={query}\r\n onChange={e => setQuery(e.target.value)}\r\n onFocus={() => setFocused(true)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n inputRef.current?.blur()\r\n }\r\n }}\r\n placeholder={alwaysExpanded ? t('placeholder1') : t('placeholder2')}\r\n className={`border-none focus-visible:ring-transparent text-sm transition-all ease-in-out duration-200 ${\r\n alwaysExpanded || isExpanded ? 'w-full' : 'w-0 p-0'\r\n }`}\r\n />\r\n </div>\r\n\r\n {focused && (loading || buildingResults.length > 0 || suggestions.length > 0) && (\r\n <div ref={suggestionsRef}>\r\n <Separator />\r\n <CommandList>\r\n {!loading && buildingResults.length === 0 && suggestions.length === 0 && query.length >= 3 && (\r\n <CommandEmpty>{showDatabaseBuildings ? t('noResults') : t('noAddresses')}</CommandEmpty>\r\n )}\r\n\r\n {loading && (\r\n <CommandEmpty><LoadingSpinner /></CommandEmpty>\r\n )}\r\n\r\n {/* Database Buildings section - only show if enabled */}\r\n {showDatabaseBuildings && !loading && buildingResults.length > 0 && (\r\n <CommandGroup heading={t('buildingHeader')}>\r\n {buildingResults.map((building) => {\r\n const buildingFeature = buildingToFeature(building)\r\n\r\n return (\r\n <CommandItem\r\n key={`building-${building.id}`}\r\n onSelect={() => handleSelectSuggestion(buildingFeature, 'dbBuilding')}\r\n className=\"cursor-pointer\"\r\n >\r\n <div className=\"font-medium\">{building.buildingName}</div>\r\n <div className=\"text-sm text-muted-foreground\">\r\n {building.buildingAddress}\r\n </div>\r\n </CommandItem>\r\n )\r\n })}\r\n </CommandGroup>\r\n )}\r\n\r\n {/* Separator between sections if both have results */}\r\n {showDatabaseBuildings && buildingResults.length > 0 && suggestions.length > 0 && (\r\n <CommandSeparator />\r\n )}\r\n\r\n {/* Geocoder suggestions section */}\r\n {!loading && suggestions.length > 0 && (\r\n <CommandGroup heading={showDatabaseBuildings ? t('suggestionsHeader') : undefined}>\r\n {suggestions.map((feature) => {\r\n const location = parseLocation(feature)\r\n const uniqueKey = feature.properties?.gid\r\n || `${feature.properties?.name}-${feature.geometry?.coordinates?.[0]}-${feature.geometry?.coordinates?.[1]}`\r\n\r\n return (\r\n <CommandItem\r\n key={uniqueKey}\r\n onSelect={() => handleSelectSuggestion(feature)}\r\n className=\"cursor-pointer\"\r\n >\r\n <div className=\"font-medium\">{location.name}</div>\r\n <div className=\"text-sm text-muted-foreground\">{location.region}</div>\r\n </CommandItem>\r\n )\r\n })}\r\n </CommandGroup>\r\n )}\r\n </CommandList>\r\n </div>\r\n )}\r\n </Command>\r\n )\r\n}"],"mappings":"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","names":["address"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NonDatabaseBuildingPopover.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAUpD,UAAU,+BAA+B;IACvC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,EACjD,OAAO,EACP,aAAa,GACd,EAAE,+BAA+B,qBAgejC"}
1
+ {"version":3,"file":"NonDatabaseBuildingPopover.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAWpD,UAAU,+BAA+B;IACvC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,EACjD,OAAO,EACP,aAAa,GACd,EAAE,+BAA+B,qBA4cjC"}
@@ -34,6 +34,7 @@ import * as LR from "lucide-react";
34
34
  import { MapContext } from "../../../../../../store";
35
35
  import { useMenusContext } from "../../../../../../store";
36
36
  import { MarkerManager } from "../../../utils/MarkerManager";
37
+ import { getDetailedAddress } from "../../../utils/geocoder";
37
38
  import { useCreateBuilding, useBuildings, useBuilding } from "../../../../../../hooks/buildings/buildings";
38
39
  import { LoadingSpinner } from "../../../../../ui/LoadingSpinner";
39
40
  function NonDatabaseBuildingPopover({
@@ -45,7 +46,7 @@ function NonDatabaseBuildingPopover({
45
46
  const { data: session } = useSession();
46
47
  const user = session == null ? void 0 : session.user;
47
48
  const { state: mapState } = React.useContext(MapContext);
48
- const { currentLocation, map } = mapState.map;
49
+ const { currentLocation, map, organizationCountry } = mapState.map;
49
50
  const { setSelectedItem } = useMenusContext();
50
51
  const { createBuilding, isMutating, createError, createdData } = useCreateBuilding();
51
52
  const { buildings } = useBuildings();
@@ -82,49 +83,30 @@ function NonDatabaseBuildingPopover({
82
83
  }, [setSelectedItem]);
83
84
  React.useEffect(() => {
84
85
  var _a;
85
- const getAddress = async (latitude, longitude) => {
86
- const params = new URLSearchParams({
87
- "api_key": process.env.NEXT_PUBLIC_GEOCODE_EARTH_API_KEY,
88
- "point.lat": latitude,
89
- "point.lon": longitude,
90
- "boundary.country": "CA",
91
- "layers": "address",
92
- "size": "1"
93
- // Limit to 1 result
94
- });
95
- const reverseGeocoderUrl = `https://api.geocode.earth/v1/reverse?${params}`;
86
+ const getAddress = async (longitude, latitude) => {
87
+ var _a2;
96
88
  try {
97
- const response = await fetch(reverseGeocoderUrl, {
98
- headers: {
99
- "User-Agent": "CDT/1.0 (cdt@email.com)"
100
- }
101
- });
102
- if (!response.ok) {
103
- throw new Error(`HTTP error! status: ${response.status}`);
89
+ const result = await getDetailedAddress([longitude, latitude], organizationCountry);
90
+ const geocodedAddress = (_a2 = result == null ? void 0 : result.properties) == null ? void 0 : _a2.name;
91
+ if (!geocodedAddress) {
92
+ clearExistingBuildingMatches();
93
+ return;
104
94
  }
105
- const data = await response.json();
106
- if (data.features && data.features.length > 0) {
107
- const feature2 = data.features[0];
108
- const properties = feature2.properties;
109
- const geocodedAddress = properties.name;
110
- setAddress(geocodedAddress);
111
- if (geocodedAddress && buildings && buildings.length > 0) {
112
- const normalizedGeocodedAddress = normalizeAddress(geocodedAddress);
113
- const matches = buildings.filter((building) => {
114
- if (!building.buildingAddress) return false;
115
- const normalizedBuildingAddress = normalizeAddress(building.buildingAddress);
116
- return normalizedBuildingAddress === normalizedGeocodedAddress || normalizedBuildingAddress.includes(normalizedGeocodedAddress) || normalizedGeocodedAddress.includes(normalizedBuildingAddress);
117
- });
118
- if (matches.length > 0) {
119
- setMatchingBuildings(matches);
120
- setSelectedMatchingBuildingId(matches[0].id.toString());
121
- setShowExistingBuildings(true);
122
- if (setSelectedItem) {
123
- setSelectedItem(matches[0]);
124
- didSetSelectedItemRef.current = true;
125
- }
126
- } else {
127
- clearExistingBuildingMatches();
95
+ setAddress(geocodedAddress);
96
+ if (buildings && buildings.length > 0) {
97
+ const normalizedGeocodedAddress = normalizeAddress(geocodedAddress);
98
+ const matches = buildings.filter((building) => {
99
+ if (!building.buildingAddress) return false;
100
+ const normalizedBuildingAddress = normalizeAddress(building.buildingAddress);
101
+ return normalizedBuildingAddress === normalizedGeocodedAddress || normalizedBuildingAddress.includes(normalizedGeocodedAddress) || normalizedGeocodedAddress.includes(normalizedBuildingAddress);
102
+ });
103
+ if (matches.length > 0) {
104
+ setMatchingBuildings(matches);
105
+ setSelectedMatchingBuildingId(matches[0].id.toString());
106
+ setShowExistingBuildings(true);
107
+ if (setSelectedItem) {
108
+ setSelectedItem(matches[0]);
109
+ didSetSelectedItemRef.current = true;
128
110
  }
129
111
  } else {
130
112
  clearExistingBuildingMatches();
@@ -139,7 +121,7 @@ function NonDatabaseBuildingPopover({
139
121
  if ((_a = feature.properties) == null ? void 0 : _a.coordinates) {
140
122
  const longitude = feature.properties.coordinates[0];
141
123
  const latitude = feature.properties.coordinates[1];
142
- getAddress(latitude, longitude);
124
+ getAddress(longitude, latitude);
143
125
  }
144
126
  }, [feature, buildings, setSelectedItem, normalizeAddress, clearExistingBuildingMatches]);
145
127
  React.useEffect(() => {