@collabdt/core 0.0.56 → 0.2.0

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 (319) hide show
  1. package/README.md +4 -26
  2. package/dist/core/components/AppSidebarContent.d.ts +2 -1
  3. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  4. package/dist/core/components/AppSidebarContent.js +10 -7
  5. package/dist/core/components/AppSidebarContent.js.map +1 -1
  6. package/dist/core/components/Toolbar.d.ts +7 -1
  7. package/dist/core/components/Toolbar.d.ts.map +1 -1
  8. package/dist/core/components/Toolbar.js +3 -3
  9. package/dist/core/components/Toolbar.js.map +1 -1
  10. package/dist/core/components/TopNavigationBar.d.ts +6 -1
  11. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  12. package/dist/core/components/TopNavigationBar.js +2 -2
  13. package/dist/core/components/TopNavigationBar.js.map +1 -1
  14. package/dist/core/components/authentication/AuthPage.d.ts +2 -1
  15. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  16. package/dist/core/components/authentication/AuthPage.js +3 -5
  17. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  18. package/dist/core/components/authentication/Signin.d.ts +2 -1
  19. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  20. package/dist/core/components/authentication/Signin.js +2 -2
  21. package/dist/core/components/authentication/Signin.js.map +1 -1
  22. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  23. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +109 -36
  24. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  25. package/dist/core/components/settings/index.d.ts +3 -1
  26. package/dist/core/components/settings/index.d.ts.map +1 -1
  27. package/dist/core/components/settings/index.js +2 -2
  28. package/dist/core/components/settings/index.js.map +1 -1
  29. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  30. package/dist/core/components/settings/src/AccountSettingsPanel.js +9 -2
  31. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  32. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts +5 -1
  33. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  34. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +7 -5
  35. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  36. package/dist/core/components/settings/src/SettingsContent.d.ts +2 -1
  37. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  38. package/dist/core/components/settings/src/SettingsContent.js +2 -2
  39. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  40. package/dist/core/components/support/BugReportDialog.d.ts +3 -2
  41. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
  42. package/dist/core/components/support/BugReportDialog.js +103 -25
  43. package/dist/core/components/support/BugReportDialog.js.map +1 -1
  44. package/dist/core/components/support/FeatureRequestDialog.d.ts +3 -1
  45. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
  46. package/dist/core/components/support/FeatureRequestDialog.js +39 -4
  47. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
  48. package/dist/core/components/support/SupportMenu.d.ts.map +1 -1
  49. package/dist/core/components/support/SupportMenu.js +1 -4
  50. package/dist/core/components/support/SupportMenu.js.map +1 -1
  51. package/dist/core/components/ui/AnimatedBackground.d.ts +2 -1
  52. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  53. package/dist/core/components/ui/AnimatedBackground.js +2 -5
  54. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  55. package/dist/core/components/ui/InfoSidebar/Container.d.ts +3 -1
  56. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  57. package/dist/core/components/ui/InfoSidebar/Container.js +4 -2
  58. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  59. package/dist/core/components/ui/InfoSidebar/Header.d.ts +3 -2
  60. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  61. package/dist/core/components/ui/InfoSidebar/Header.js +5 -6
  62. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  63. package/dist/core/components/ui/InfoSidebar/index.d.ts +7 -1
  64. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  65. package/dist/core/components/ui/InfoSidebar/index.js +4 -4
  66. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  67. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +2 -1
  68. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  69. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -4
  70. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  71. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +3 -1
  72. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  73. package/dist/core/components/ui/Sensors/SensorsSection.js +3 -1
  74. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  75. package/dist/core/components/ui/Sidebar.d.ts +8 -0
  76. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  77. package/dist/core/components/ui/Sidebar.js +21 -7
  78. package/dist/core/components/ui/Sidebar.js.map +1 -1
  79. package/dist/core/components/ui/ToolbarButton.js +18 -1
  80. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  81. package/dist/core/components/viewers/Data/DataMenu.d.ts +5 -1
  82. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  83. package/dist/core/components/viewers/Data/DataMenu.js +15 -4
  84. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  85. package/dist/core/components/viewers/Data/HeaderButtons.d.ts +3 -1
  86. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  87. package/dist/core/components/viewers/Data/HeaderButtons.js +11 -14
  88. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  89. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  90. package/dist/core/components/viewers/Data/MoreOptions.js +14 -27
  91. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  92. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts +3 -1
  93. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  94. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +4 -2
  95. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  96. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  97. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +13 -18
  98. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  99. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts +3 -1
  100. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  101. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +3 -1
  102. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  103. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts +2 -1
  104. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  105. package/dist/core/components/viewers/Data/details/DetailHeader.js +3 -5
  106. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  107. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  108. package/dist/core/components/viewers/Data/details/FieldValue.js +13 -3
  109. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  110. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts +2 -0
  111. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  112. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +84 -3
  113. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  114. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  115. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +23 -2
  116. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  117. package/dist/core/components/viewers/Viewer.d.ts +7 -1
  118. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  119. package/dist/core/components/viewers/Viewer.js +6 -6
  120. package/dist/core/components/viewers/Viewer.js.map +1 -1
  121. package/dist/core/components/viewers/bim/BimToolbar.d.ts +3 -1
  122. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  123. package/dist/core/components/viewers/bim/BimToolbar.js +2 -2
  124. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  125. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +3 -1
  126. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  127. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  128. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  129. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts +5 -1
  130. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  131. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +3 -2
  132. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  133. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +3 -1
  134. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  135. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +2 -2
  136. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  137. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +1 -1
  138. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  139. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +3 -5
  140. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  141. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +3 -1
  142. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  143. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -2
  144. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  145. package/dist/core/components/viewers/map/MapViewer.d.ts +3 -1
  146. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  147. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  148. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  149. package/dist/core/components/viewers/map/datasets/RowActions.d.ts +2 -1
  150. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  151. package/dist/core/components/viewers/map/datasets/RowActions.js +5 -6
  152. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  153. package/dist/core/components/viewers/map/datasets/index.d.ts +5 -1
  154. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  155. package/dist/core/components/viewers/map/datasets/index.js +15 -16
  156. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  157. package/dist/core/components/viewers/map/src/Geocoder.d.ts +3 -1
  158. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  159. package/dist/core/components/viewers/map/src/Geocoder.js +5 -1
  160. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +6 -1
  162. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  163. package/dist/core/components/viewers/map/src/MapLayers/index.js +5 -3
  164. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  165. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts +5 -1
  166. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  167. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +6 -10
  168. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  169. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +3 -1
  170. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +4 -6
  172. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts +19 -0
  174. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -0
  175. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +163 -0
  176. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -0
  177. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts +3 -0
  178. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -0
  179. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +310 -0
  180. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -0
  181. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts +30 -0
  182. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -0
  183. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js +122 -0
  184. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -0
  185. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts +13 -0
  186. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -0
  187. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js +58 -0
  188. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -0
  189. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +6 -1
  190. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  191. package/dist/core/components/viewers/map/src/MapSidebar/index.js +5 -4
  192. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  193. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +5 -1
  194. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  195. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +5 -8
  196. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  197. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +3 -1
  198. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  199. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  200. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  201. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts +3 -1
  202. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  203. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js +2 -2
  204. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  205. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts +3 -1
  206. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  207. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +4 -7
  208. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  209. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  210. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +8 -8
  211. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  212. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts +18 -0
  213. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -0
  214. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +102 -0
  215. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -0
  216. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  217. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +243 -176
  218. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  219. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts +24 -0
  220. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -0
  221. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +46 -0
  222. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -0
  223. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +8 -1
  224. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  225. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -3
  226. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  227. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +11 -1
  228. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  229. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +5 -3
  230. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  231. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +10 -1
  232. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  233. package/dist/core/components/viewers/map/src/tools/mapTools.js +5 -3
  234. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  235. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts +1 -0
  236. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  237. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +1 -0
  238. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  239. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +14 -5
  240. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  241. package/dist/core/components/viewers/map/utils/geocoding/config.js +22 -11
  242. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  243. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  244. package/dist/core/components/viewers/map/utils/geocoding/index.js +2 -2
  245. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  246. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  247. package/dist/core/components/viewers/map/utils/geocoding/osm.js +5 -4
  248. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  249. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  250. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +7 -5
  251. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  252. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts +3 -1
  253. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  254. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +11 -14
  255. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  256. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts +3 -1
  257. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  258. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +37 -52
  259. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  260. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts +3 -1
  261. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  262. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js +5 -3
  263. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  264. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts +2 -1
  265. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  266. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +5 -6
  267. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  268. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts +2 -1
  269. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  270. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +15 -9
  271. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  272. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts +5 -1
  273. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  274. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +3 -2
  275. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  276. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts +3 -1
  277. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  278. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -2
  279. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  280. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
  281. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  282. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +12 -23
  283. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  284. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  285. package/dist/core/hooks/sites/createSiteHooks.js +0 -1
  286. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  287. package/dist/core/hooks/useCaptureScreenshot.d.ts +2 -0
  288. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -0
  289. package/dist/core/hooks/useCaptureScreenshot.js +110 -0
  290. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -0
  291. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +3 -0
  292. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -0
  293. package/dist/core/hooks/useGeocodingRuntimeConfig.js +17 -0
  294. package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -0
  295. package/dist/core/store/AppConfig/context.d.ts +5 -0
  296. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  297. package/dist/core/store/AppConfig/context.js.map +1 -1
  298. package/dist/core/store/CombineProviders.d.ts +6 -1
  299. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  300. package/dist/core/store/CombineProviders.js +6 -3
  301. package/dist/core/store/CombineProviders.js.map +1 -1
  302. package/dist/core/store/MapSites/context.d.ts +16 -0
  303. package/dist/core/store/MapSites/context.d.ts.map +1 -0
  304. package/dist/core/store/MapSites/context.js +29 -0
  305. package/dist/core/store/MapSites/context.js.map +1 -0
  306. package/dist/core/store/MapSites/reducer.d.ts +52 -0
  307. package/dist/core/store/MapSites/reducer.d.ts.map +1 -0
  308. package/dist/core/store/MapSites/reducer.js +70 -0
  309. package/dist/core/store/MapSites/reducer.js.map +1 -0
  310. package/dist/core/store/index.d.ts +1 -0
  311. package/dist/core/store/index.d.ts.map +1 -1
  312. package/dist/core/store/index.js +1 -0
  313. package/dist/core/store/index.js.map +1 -1
  314. package/dist/core/types/tools.d.ts +2 -1
  315. package/dist/core/types/tools.d.ts.map +1 -1
  316. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  317. package/dist/core/utils/imageUtils.js +2 -1
  318. package/dist/core/utils/imageUtils.js.map +1 -1
  319. package/package.json +1 -1
@@ -0,0 +1,46 @@
1
+ import { uploadToPresignedUrl } from "../AddFile/utils/uploadToPresignedURLS";
2
+ import { ringToFeatureCollection } from "../../../MapLayers/src/SiteLayer/siteGeometry";
3
+ const SITE_GEOMETRY_TAG = "site-geometry";
4
+ const persistDrawnSite = async (params) => {
5
+ var _a;
6
+ const { name, ring, centroid, createSite } = params;
7
+ const site = await createSite({
8
+ siteName: name,
9
+ siteLongitude: centroid[0],
10
+ siteLatitude: centroid[1]
11
+ });
12
+ const siteId = site == null ? void 0 : site.id;
13
+ if (!siteId) throw new Error("Site creation did not return an id");
14
+ const assetId = `${crypto.randomUUID()}.geojson`;
15
+ const fc = ringToFeatureCollection(ring, name);
16
+ const file = new File([JSON.stringify(fc)], `${name || "site"}.geojson`, {
17
+ type: "application/geo+json"
18
+ });
19
+ const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`);
20
+ if (!presRes.ok) throw new Error("Failed to get an upload URL");
21
+ const { presignedUrl } = await presRes.json();
22
+ await uploadToPresignedUrl(presignedUrl, file);
23
+ const fileRes = await fetch(`/api/files/site/${siteId}`, {
24
+ method: "POST",
25
+ headers: { "Content-Type": "application/json" },
26
+ body: JSON.stringify({
27
+ type: "map-file",
28
+ name: `${name || "site"}.geojson`,
29
+ assetId,
30
+ mimeType: "application/geo+json",
31
+ extension: "geojson",
32
+ sizeBytes: file.size,
33
+ tag: SITE_GEOMETRY_TAG,
34
+ isVisible: false
35
+ })
36
+ });
37
+ if (!fileRes.ok) throw new Error("Failed to attach the geometry file to the site");
38
+ const data = await fileRes.json().catch(() => null);
39
+ const fileId = (_a = data == null ? void 0 : data.newFile) == null ? void 0 : _a.id;
40
+ return { siteId, assetId, fileId };
41
+ };
42
+ export {
43
+ SITE_GEOMETRY_TAG,
44
+ persistDrawnSite
45
+ };
46
+ //# sourceMappingURL=persistSite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { uploadToPresignedUrl } from '../AddFile/utils/uploadToPresignedURLS'\r\nimport { ringToFeatureCollection, type Ring } from '../../../MapLayers/src/SiteLayer/siteGeometry'\r\n\r\n/** Tag stored on the File row so the site's boundary geojson can be found later. */\r\nexport const SITE_GEOMETRY_TAG = 'site-geometry'\r\n\r\nexport interface PersistedSite {\r\n siteId: number\r\n assetId: string\r\n fileId?: number\r\n}\r\n\r\n/**\r\n * Persist a freshly drawn site:\r\n * 1. create the DB Site (via the injected `createSite` hook trigger),\r\n * 2. upload the polygon GeoJSON to minio (presigned PUT),\r\n * 3. create a File row attached to the site that references the minio object.\r\n *\r\n * The polygon geometry lives in minio (there is no geometry column on Site);\r\n * the File row links it to the site via `attachedFilesSiteId` + the geometry tag.\r\n */\r\nexport const persistDrawnSite = async (params: {\r\n name: string\r\n ring: Ring\r\n centroid: [number, number]\r\n createSite: (arg: any) => Promise<any>\r\n}): Promise<PersistedSite> => {\r\n const { name, ring, centroid, createSite } = params\r\n\r\n const site = await createSite({\r\n siteName: name,\r\n siteLongitude: centroid[0],\r\n siteLatitude: centroid[1],\r\n })\r\n const siteId = site?.id\r\n if (!siteId) throw new Error('Site creation did not return an id')\r\n\r\n const assetId = `${crypto.randomUUID()}.geojson`\r\n const fc = ringToFeatureCollection(ring, name)\r\n const file = new File([JSON.stringify(fc)], `${name || 'site'}.geojson`, {\r\n type: 'application/geo+json',\r\n })\r\n\r\n const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`)\r\n if (!presRes.ok) throw new Error('Failed to get an upload URL')\r\n const { presignedUrl } = await presRes.json()\r\n await uploadToPresignedUrl(presignedUrl, file)\r\n\r\n const fileRes = await fetch(`/api/files/site/${siteId}`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n type: 'map-file',\r\n name: `${name || 'site'}.geojson`,\r\n assetId,\r\n mimeType: 'application/geo+json',\r\n extension: 'geojson',\r\n sizeBytes: file.size,\r\n tag: SITE_GEOMETRY_TAG,\r\n isVisible: false,\r\n }),\r\n })\r\n // The DB link is required: without it the boundary is orphaned in minio and\r\n // can never be re-shown. Treat failure as fatal so the caller can retry.\r\n if (!fileRes.ok) throw new Error('Failed to attach the geometry file to the site')\r\n const data = await fileRes.json().catch(() => null)\r\n const fileId: number | undefined = data?.newFile?.id\r\n\r\n return { siteId, assetId, fileId }\r\n}\r\n"],"mappings":"AAGA,SAAS,4BAA4B;AACrC,SAAS,+BAA0C;AAG5C,MAAM,oBAAoB;AAiB1B,MAAM,mBAAmB,OAAO,WAKT;AA7B9B;AA8BE,QAAM,EAAE,MAAM,MAAM,UAAU,WAAW,IAAI;AAE7C,QAAM,OAAO,MAAM,WAAW;AAAA,IAC5B,UAAU;AAAA,IACV,eAAe,SAAS,CAAC;AAAA,IACzB,cAAc,SAAS,CAAC;AAAA,EAC1B,CAAC;AACD,QAAM,SAAS,6BAAM;AACrB,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,oCAAoC;AAEjE,QAAM,UAAU,GAAG,OAAO,WAAW,CAAC;AACtC,QAAM,KAAK,wBAAwB,MAAM,IAAI;AAC7C,QAAM,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC,GAAG,GAAG,QAAQ,MAAM,YAAY;AAAA,IACvE,MAAM;AAAA,EACR,CAAC;AAED,QAAM,UAAU,MAAM,MAAM,mCAAmC,mBAAmB,OAAO,CAAC,EAAE;AAC5F,MAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC9D,QAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,KAAK;AAC5C,QAAM,qBAAqB,cAAc,IAAI;AAE7C,QAAM,UAAU,MAAM,MAAM,mBAAmB,MAAM,IAAI;AAAA,IACvD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,GAAG,QAAQ,MAAM;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAGD,MAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,gDAAgD;AACjF,QAAM,OAAO,MAAM,QAAQ,KAAK,EAAE,MAAM,MAAM,IAAI;AAClD,QAAM,UAA6B,kCAAM,YAAN,mBAAe;AAElD,SAAO,EAAE,QAAQ,SAAS,OAAO;AACnC;","names":[]}
@@ -1,8 +1,15 @@
1
1
  import * as React from "react";
2
2
  import { Tool } from '../../../../../../types/tools';
3
+ import { Organization } from '../../../../../../types/dbTypes';
3
4
  interface AddToMapToolProps {
4
5
  tool: Tool;
6
+ organization?: Organization;
7
+ minioBaseUrl?: string;
8
+ martinBaseUrl?: string;
9
+ geocodeEarthApiKey?: string;
10
+ geocoderUrl?: string;
11
+ [key: string]: unknown;
5
12
  }
6
- export default function AddToMap({ tool }: AddToMapToolProps): React.JSX.Element;
13
+ export default function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }: AddToMapToolProps): React.JSX.Element;
7
14
  export {};
8
15
  //# sourceMappingURL=AddToMap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AddToMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAmB,MAAM,+BAA+B,CAAA;AAwBrE,UAAU,iBAAiB;IACzB,IAAI,EAAE,IAAI,CAAA;CACX;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,qBA0N3D"}
1
+ {"version":3,"file":"AddToMap.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAmB,MAAM,+BAA+B,CAAA;AAoBrE,OAAO,EAAU,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAIvE,UAAU,iBAAiB;IACzB,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,iBAAiB,qBA+NvI"}
@@ -19,7 +19,7 @@ import Datasets from "../../../datasets";
19
19
  import AddBuilding from "../../../../Data/buildingDetails/AddBuilding";
20
20
  import { useComments } from "../../../../../../hooks/comments/comments";
21
21
  import { useSensors } from "../../../../../../hooks/sensors/sensors";
22
- function AddToMap({ tool }) {
22
+ function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }) {
23
23
  const t = useTranslations("AddToMap");
24
24
  const { ability } = usePermissions();
25
25
  const [datasetOpen, setDatasetOpen] = React.useState();
@@ -220,14 +220,19 @@ function AddToMap({ tool }) {
220
220
  newBuildingFields,
221
221
  setNewBuildingFields,
222
222
  open: buildingDialogOpen,
223
- onOpenChange: setBuildingDialogOpen
223
+ onOpenChange: setBuildingDialogOpen,
224
+ geocodeEarthApiKey,
225
+ geocoderUrl
224
226
  }
225
227
  ),
226
228
  /* @__PURE__ */ jsx(
227
229
  Datasets,
228
230
  {
229
231
  isOpen: datasetOpen,
230
- setIsOpenAction: setDatasetOpen
232
+ setIsOpenAction: setDatasetOpen,
233
+ organization,
234
+ minioBaseUrl,
235
+ martinBaseUrl
231
236
  }
232
237
  )
233
238
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport * as React from \"react\";\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../../../store'\r\n\r\n// Utilities\r\nimport { ToolsContext, FilesContext, MenusContext } from '../../../../../../store'\r\nimport { Tool, ToolbarToolType } from '../../../../../../types/tools'\r\nimport { ViewerNames } from '../../../../../../types/'\r\nimport { ToolbarSubmenu } from '../../../../../ToolbarSubmenu'\r\n\r\n// Shadcn components\r\nimport { useSidebar, ItemsBadgeButton } from '../../../../../ui/'\r\nimport { DropdownMenuItem } from '../../../../../ui/DropdownMenu'\r\nimport { AddItemDialog } from '../../../../../ui/AddItemDialog'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Adder Components\r\nimport { FileAdder } from './AddFile/FileAdder'\r\nimport { CommentInput } from '../../../../../ui/Comments/CommentInput'\r\nimport { SensorInput } from '../../../../../ui/Sensors/SensorInput'\r\nimport { DatasetAdder } from './AddDataset/DatasetAdder'\r\nimport { SiteAdder } from './AddSite/SiteAdder'\r\nimport Datasets from '../../../datasets'\r\nimport AddBuilding from '../../../../Data/buildingDetails/AddBuilding'\r\nimport { DbFile } from '../../../../../../types/dbTypes';\r\nimport { useComments } from '../../../../../../hooks/comments/comments';\r\nimport { useSensors } from '../../../../../../hooks/sensors/sensors';\r\n\r\ninterface AddToMapToolProps {\r\n tool: Tool\r\n}\r\n\r\nexport default function AddToMap({ tool }: AddToMapToolProps) {\r\n // Translation\r\n const t = useTranslations('AddToMap')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [datasetOpen, setDatasetOpen] = React.useState<boolean>()\r\n\r\n const { dispatch: toolsDispatch, state: toolsState }\r\n = React.useContext(ToolsContext)\r\n const [addingMode, setAddingMode] = React.useState<ToolbarToolType | null>(null)\r\n const { state: fileState } = React.useContext(FilesContext)\r\n const { files } = fileState.files\r\n const mapFiles: DbFile[] = files.filter(file => file.type == 'map-file')\r\n\r\n const {comments} = useComments()\r\n const {sensors} = useSensors()\r\n\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [buildingDialogOpen, setBuildingDialogOpen] = React.useState(false)\r\n\r\n const { currentToolId } = toolsState?.tools || {}\r\n\r\n // Allow other UI (e.g. CommentsSection) to trigger AddToMap modes\r\n React.useEffect(() => {\r\n const isAddToMapMode = (id: any): id is ToolbarToolType => {\r\n return (\r\n id === 'map-add-file'\r\n || id === 'map-add-comment'\r\n || id === 'map-add-building'\r\n || id === 'map-add-dataset'\r\n || id === 'map-add-site'\r\n || id === 'map-add-sensor'\r\n )\r\n }\r\n\r\n if (isAddToMapMode(currentToolId)) {\r\n setAddingMode(currentToolId)\r\n }\r\n else {\r\n setAddingMode(null)\r\n }\r\n }, [currentToolId])\r\n\r\n const handleToolClick = (newTool: ToolbarToolType) => {\r\n setAddingMode(newTool)\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: { currentToolId: newTool },\r\n })\r\n }\r\n\r\n const clearTool = () => {\r\n setAddingMode(null)\r\n toolsDispatch({ type: 'CLEAR-TOOLS' })\r\n }\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const handleCommentsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'communication' } })\r\n }\r\n\r\n const handleSensorsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'sensors' } })\r\n }\r\n\r\n const { currentViewer } = menusState.menus\r\n\r\n const handleOpenFileTab = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'file' } })\r\n }\r\n\r\n return (\r\n <>\r\n <ToolbarSubmenu tool={tool}>\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => handleToolClick('map-add-file')}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.FilePlus />\r\n <span>{t('file')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={mapFiles.length}\r\n onClick={handleOpenFileTab}\r\n />\r\n\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-comment')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.MessageCircle />\r\n <span>{t('comment')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={comments.filter((comment) => currentViewer === comment.viewer).length}\r\n onClick={handleCommentsMenu}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-dataset')\r\n }}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.Database />\r\n <span>{t('dataset')}</span>\r\n </DropdownMenuItem>\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => {\r\n handleToolClick('map-add-site')\r\n }}\r\n disabled={!ability.can('create', 'Site')}\r\n >\r\n <LR.BoxSelect />\r\n <span>{t('site')}</span>\r\n </DropdownMenuItem>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-sensor')\r\n }}\r\n disabled={!ability.can('create', 'Sensor')}\r\n >\r\n <LR.Radio />\r\n <span>{t('sensor')}</span>\r\n </DropdownMenuItem>\r\n {sensors.length > 0 && (\r\n <ItemsBadgeButton\r\n count={sensors.filter((sensor) => currentViewer === sensor.viewer).length}\r\n onClick={handleSensorsMenu}\r\n />\r\n )}\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => setBuildingDialogOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.Building2 />\r\n <span>{t('building')}</span>\r\n </DropdownMenuItem>\r\n\r\n </ToolbarSubmenu>\r\n\r\n {/* File — manages its own dialog and state */}\r\n {addingMode === 'map-add-file' && (\r\n <FileAdder isOpen={addingMode === 'map-add-file'} onClose={clearTool} />\r\n )}\r\n\r\n {/* Comment */}\r\n <CommentInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-comment'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Sensor */}\r\n <SensorInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-sensor'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Site */}\r\n <SiteAdder\r\n isOpen={addingMode === 'map-add-site'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Dataset */}\r\n <AddItemDialog\r\n open={addingMode === 'map-add-dataset'}\r\n onOpenChange={open => !open && clearTool()}\r\n title={t('addDatasetTitle')}\r\n icon={LR.Database}\r\n contentClassName=\"max-w-xl\"\r\n >\r\n <DatasetAdder />\r\n </AddItemDialog>\r\n\r\n {/* Building */}\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={buildingDialogOpen}\r\n onOpenChange={setBuildingDialogOpen}\r\n />\r\n\r\n <Datasets\r\n isOpen={datasetOpen}\r\n setIsOpenAction={setDatasetOpen}\r\n />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/map/src/tools/AddTools/AddToMap.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport * as React from \"react\";\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions } from '../../../../../../store'\r\n\r\n// Utilities\r\nimport { ToolsContext, FilesContext, MenusContext } from '../../../../../../store'\r\nimport { Tool, ToolbarToolType } from '../../../../../../types/tools'\r\nimport { ViewerNames } from '../../../../../../types/'\r\nimport { ToolbarSubmenu } from '../../../../../ToolbarSubmenu'\r\n\r\n// Shadcn components\r\nimport { useSidebar, ItemsBadgeButton } from '../../../../../ui/'\r\nimport { DropdownMenuItem } from '../../../../../ui/DropdownMenu'\r\nimport { AddItemDialog } from '../../../../../ui/AddItemDialog'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Adder Components\r\nimport { FileAdder } from './AddFile/FileAdder'\r\nimport { CommentInput } from '../../../../../ui/Comments/CommentInput'\r\nimport { SensorInput } from '../../../../../ui/Sensors/SensorInput'\r\nimport { DatasetAdder } from './AddDataset/DatasetAdder'\r\nimport { SiteAdder } from './AddSite/SiteAdder'\r\nimport Datasets from '../../../datasets'\r\nimport AddBuilding from '../../../../Data/buildingDetails/AddBuilding'\r\nimport { DbFile, Organization } from '../../../../../../types/dbTypes';\r\nimport { useComments } from '../../../../../../hooks/comments/comments';\r\nimport { useSensors } from '../../../../../../hooks/sensors/sensors';\r\n\r\ninterface AddToMapToolProps {\r\n tool: Tool\r\n organization?: Organization\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport default function AddToMap({ tool, organization, minioBaseUrl, martinBaseUrl, geocodeEarthApiKey, geocoderUrl }: AddToMapToolProps) {\r\n // Translation\r\n const t = useTranslations('AddToMap')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [datasetOpen, setDatasetOpen] = React.useState<boolean>()\r\n\r\n const { dispatch: toolsDispatch, state: toolsState }\r\n = React.useContext(ToolsContext)\r\n const [addingMode, setAddingMode] = React.useState<ToolbarToolType | null>(null)\r\n const { state: fileState } = React.useContext(FilesContext)\r\n const { files } = fileState.files\r\n const mapFiles: DbFile[] = files.filter(file => file.type == 'map-file')\r\n\r\n const {comments} = useComments()\r\n const {sensors} = useSensors()\r\n\r\n const [newBuildingFields, setNewBuildingFields] = React.useState({})\r\n const [buildingDialogOpen, setBuildingDialogOpen] = React.useState(false)\r\n\r\n const { currentToolId } = toolsState?.tools || {}\r\n\r\n // Allow other UI (e.g. CommentsSection) to trigger AddToMap modes\r\n React.useEffect(() => {\r\n const isAddToMapMode = (id: any): id is ToolbarToolType => {\r\n return (\r\n id === 'map-add-file'\r\n || id === 'map-add-comment'\r\n || id === 'map-add-building'\r\n || id === 'map-add-dataset'\r\n || id === 'map-add-site'\r\n || id === 'map-add-sensor'\r\n )\r\n }\r\n\r\n if (isAddToMapMode(currentToolId)) {\r\n setAddingMode(currentToolId)\r\n }\r\n else {\r\n setAddingMode(null)\r\n }\r\n }, [currentToolId])\r\n\r\n const handleToolClick = (newTool: ToolbarToolType) => {\r\n setAddingMode(newTool)\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: { currentToolId: newTool },\r\n })\r\n }\r\n\r\n const clearTool = () => {\r\n setAddingMode(null)\r\n toolsDispatch({ type: 'CLEAR-TOOLS' })\r\n }\r\n\r\n const { dispatch: menusDispatch, state: menusState } = React.useContext(MenusContext)\r\n const { setOpenInfo } = useSidebar()\r\n\r\n const handleCommentsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'communication' } })\r\n }\r\n\r\n const handleSensorsMenu = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'sensors' } })\r\n }\r\n\r\n const { currentViewer } = menusState.menus\r\n\r\n const handleOpenFileTab = () => {\r\n setOpenInfo(true)\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab: 'file' } })\r\n }\r\n\r\n return (\r\n <>\r\n <ToolbarSubmenu tool={tool}>\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => handleToolClick('map-add-file')}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.FilePlus />\r\n <span>{t('file')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={mapFiles.length}\r\n onClick={handleOpenFileTab}\r\n />\r\n\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-comment')\r\n }}\r\n disabled={!ability.can('create', 'Comment')}\r\n >\r\n <LR.MessageCircle />\r\n <span>{t('comment')}</span>\r\n </DropdownMenuItem>\r\n <ItemsBadgeButton\r\n count={comments.filter((comment) => currentViewer === comment.viewer).length}\r\n onClick={handleCommentsMenu}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-dataset')\r\n }}\r\n disabled={!ability.can('create', 'File')}\r\n >\r\n <LR.Database />\r\n <span>{t('dataset')}</span>\r\n </DropdownMenuItem>\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => {\r\n handleToolClick('map-add-site')\r\n }}\r\n disabled={!ability.can('create', 'Site')}\r\n >\r\n <LR.BoxSelect />\r\n <span>{t('site')}</span>\r\n </DropdownMenuItem>\r\n\r\n <div className=\"flex items-center justify-between w-full relative gap-2\">\r\n <DropdownMenuItem\r\n className=\"w-full\"\r\n onClick={() => {\r\n handleToolClick('map-add-sensor')\r\n }}\r\n disabled={!ability.can('create', 'Sensor')}\r\n >\r\n <LR.Radio />\r\n <span>{t('sensor')}</span>\r\n </DropdownMenuItem>\r\n {sensors.length > 0 && (\r\n <ItemsBadgeButton\r\n count={sensors.filter((sensor) => currentViewer === sensor.viewer).length}\r\n onClick={handleSensorsMenu}\r\n />\r\n )}\r\n </div>\r\n\r\n <DropdownMenuItem\r\n onClick={() => setBuildingDialogOpen(true)}\r\n disabled={!ability.can('create', 'Building')}\r\n >\r\n <LR.Building2 />\r\n <span>{t('building')}</span>\r\n </DropdownMenuItem>\r\n\r\n </ToolbarSubmenu>\r\n\r\n {/* File — manages its own dialog and state */}\r\n {addingMode === 'map-add-file' && (\r\n <FileAdder isOpen={addingMode === 'map-add-file'} onClose={clearTool} />\r\n )}\r\n\r\n {/* Comment */}\r\n <CommentInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-comment'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Sensor */}\r\n <SensorInput\r\n viewer={ViewerNames.map}\r\n layout=\"dialog\"\r\n isOpen={addingMode === 'map-add-sensor'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Site */}\r\n <SiteAdder\r\n isOpen={addingMode === 'map-add-site'}\r\n onCancel={clearTool}\r\n />\r\n\r\n {/* Dataset */}\r\n <AddItemDialog\r\n open={addingMode === 'map-add-dataset'}\r\n onOpenChange={open => !open && clearTool()}\r\n title={t('addDatasetTitle')}\r\n icon={LR.Database}\r\n contentClassName=\"max-w-xl\"\r\n >\r\n <DatasetAdder />\r\n </AddItemDialog>\r\n\r\n {/* Building */}\r\n <AddBuilding\r\n newBuildingFields={newBuildingFields}\r\n setNewBuildingFields={setNewBuildingFields}\r\n open={buildingDialogOpen}\r\n onOpenChange={setBuildingDialogOpen}\r\n geocodeEarthApiKey={geocodeEarthApiKey}\r\n geocoderUrl={geocoderUrl}\r\n />\r\n\r\n <Datasets\r\n isOpen={datasetOpen}\r\n setIsOpenAction={setDatasetOpen}\r\n organization={organization}\r\n minioBaseUrl={minioBaseUrl}\r\n martinBaseUrl={martinBaseUrl}\r\n />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
@@ -1,3 +1,13 @@
1
1
  import * as React from "react";
2
- export default function DatasetMapTool(props: any): React.JSX.Element;
2
+ import { Tool } from '../../../../../types/tools';
3
+ import { Organization } from '../../../../../types/dbTypes';
4
+ interface DatasetMapToolProps {
5
+ tool: Tool;
6
+ organization?: Organization;
7
+ minioBaseUrl?: string;
8
+ martinBaseUrl?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ export default function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }: DatasetMapToolProps): React.JSX.Element;
12
+ export {};
3
13
  //# sourceMappingURL=DatasetMapTool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatasetMapTool.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,KAAA,qBA0B3C"}
1
+ {"version":3,"file":"DatasetMapTool.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,UAAU,mBAAmB;IAC3B,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,mBAAmB,qBA4B9G"}
@@ -5,10 +5,9 @@ import { usePermissions } from "../../../../../store";
5
5
  import * as LR from "lucide-react";
6
6
  import { Button } from "../../../../ui/Button";
7
7
  import Datasets from "../../datasets";
8
- function DatasetMapTool(props) {
8
+ function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }) {
9
9
  const { ability } = usePermissions();
10
10
  const [isOpen, setIsOpen] = React.useState(false);
11
- const { tool } = props;
12
11
  return /* @__PURE__ */ jsxs(Fragment, { children: [
13
12
  /* @__PURE__ */ jsx(
14
13
  Button,
@@ -26,7 +25,10 @@ function DatasetMapTool(props) {
26
25
  Datasets,
27
26
  {
28
27
  isOpen,
29
- setIsOpenAction: setIsOpen
28
+ setIsOpenAction: setIsOpen,
29
+ organization,
30
+ minioBaseUrl,
31
+ martinBaseUrl
30
32
  }
31
33
  )
32
34
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { usePermissions } from '../../../../../store'\r\n\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport Datasets from '../../datasets'\r\n\r\nexport default function DatasetMapTool(props) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const { tool } = props\r\n\r\n return (\r\n <>\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n className=\"flex justify-center items-center h-9 w-9 pointer-events-auto\"\r\n onClick={() => setIsOpen(true)}\r\n title={tool?.title}\r\n disabled={!ability.can('read', 'File')}\r\n\r\n >\r\n <LR.Database />\r\n </Button>\r\n <Datasets\r\n isOpen={isOpen}\r\n setIsOpenAction={setIsOpen}\r\n />\r\n </>\r\n )\r\n}"],"mappings":";AAoBI,mBAUI,KAVJ;AAfJ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAE/B,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,cAAc;AAEN,SAAR,eAAgC,OAAO;AAE5C,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAChD,QAAM,EAAE,KAAK,IAAI;AAEjB,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,OAAO,6BAAM;AAAA,QACb,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAGrC,8BAAC,GAAG,UAAH,EAAY;AAAA;AAAA,IACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,iBAAiB;AAAA;AAAA,IACnB;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/DatasetMapTool.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { usePermissions } from '../../../../../store'\r\n\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport Datasets from '../../datasets'\r\nimport { Tool } from '../../../../../types/tools'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\ninterface DatasetMapToolProps {\r\n tool: Tool\r\n organization?: Organization\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport default function DatasetMapTool({ tool, organization, minioBaseUrl, martinBaseUrl }: DatasetMapToolProps) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n\r\n return (\r\n <>\r\n <Button\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n className=\"flex justify-center items-center h-9 w-9 pointer-events-auto\"\r\n onClick={() => setIsOpen(true)}\r\n title={tool?.title}\r\n disabled={!ability.can('read', 'File')}\r\n\r\n >\r\n <LR.Database />\r\n </Button>\r\n <Datasets\r\n isOpen={isOpen}\r\n setIsOpenAction={setIsOpen}\r\n organization={organization}\r\n minioBaseUrl={minioBaseUrl}\r\n martinBaseUrl={martinBaseUrl}\r\n />\r\n </>\r\n )\r\n}"],"mappings":";AA6BI,mBAUI,KAVJ;AAxBJ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAE/B,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,cAAc;AAYN,SAAR,eAAgC,EAAE,MAAM,cAAc,cAAc,cAAc,GAAwB;AAE/G,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAEhD,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,OAAO,6BAAM;AAAA,QACb,UAAU,CAAC,QAAQ,IAAI,QAAQ,MAAM;AAAA,QAGrC,8BAAC,GAAG,UAAH,EAAY;AAAA;AAAA,IACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,4 +1,13 @@
1
1
  import { Tool } from '../../../../../types/tools';
2
+ import { Organization } from '../../../../../types/dbTypes';
2
3
  export type MapToolbarToolType = 'map-dimensions' | 'map-media' | 'map-compare' | 'map-database' | 'map-add' | 'map-add-comment' | 'map-add-dataset' | 'map-add-site' | 'map-add-building' | 'map-add-sensor' | 'map-add-file' | 'map-measure' | 'map-share' | 'map-compare-buildings' | 'open-building-page' | 'open-bim-viewer' | 'open-pointcloud';
3
- export declare function mapToolbarTools(): Tool[];
4
+ type MapToolsConfig = {
5
+ martinBaseUrl?: string;
6
+ minioBaseUrl?: string;
7
+ organization?: Organization;
8
+ geocodeEarthApiKey?: string;
9
+ geocoderUrl?: string;
10
+ };
11
+ export declare function mapToolbarTools(config?: MapToolsConfig): Tool[];
12
+ export {};
4
13
  //# sourceMappingURL=mapTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapTools.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AAajD,MAAM,MAAM,kBAAkB,GAC9B,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,WAAW,GACX,uBAAuB,GACvB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,CAAA;AAGjB,wBAAgB,eAAe,IAAI,IAAI,EAAE,CA2BxC"}
1
+ {"version":3,"file":"mapTools.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAa3D,MAAM,MAAM,kBAAkB,GAC9B,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,WAAW,GACX,uBAAuB,GACvB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,CAAA;AAEjB,KAAK,cAAc,GAAG;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAGD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,CA8B/D"}
@@ -5,16 +5,18 @@ import AddToMap from "./AddTools/AddToMap";
5
5
  import { ShareMapTool } from "./shareMapTool";
6
6
  import DatasetMapTool from "./DatasetMapTool";
7
7
  import Compare from "../compare";
8
- function mapToolbarTools() {
8
+ function mapToolbarTools(config) {
9
9
  const t = useTranslations("mapToolbarTools");
10
+ const extraProps = config != null ? config : {};
10
11
  return [
11
12
  { id: "map-compare", title: t("compareTitle"), url: "/", icon: LR.Columns3, component: Compare },
12
- { id: "map-database", title: t("datasetsTitle"), url: "/", icon: LR.Database, component: DatasetMapTool },
13
+ { id: "map-database", title: t("datasetsTitle"), url: "/", icon: LR.Database, component: DatasetMapTool, extraProps },
13
14
  {
14
15
  id: "map-add",
15
16
  title: t("addTitle"),
16
17
  icon: LR.Plus,
17
- component: AddToMap
18
+ component: AddToMap,
19
+ extraProps
18
20
  },
19
21
  {
20
22
  id: "map-measure",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Utilities\r\nimport { Tool } from '../../../../../types/tools'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom toolbar buttons\r\nimport { MeasureMapTool } from './measureMapTool'\r\n\r\nimport AddToMap from './AddTools/AddToMap'\r\nimport { ShareMapTool } from './shareMapTool'\r\nimport DatasetMapTool from './DatasetMapTool'\r\nimport Compare from '../compare'\r\n\r\nexport type MapToolbarToolType = \r\n'map-dimensions' | \r\n'map-media' | \r\n'map-compare' | \r\n'map-database' | \r\n'map-add' | \r\n'map-add-comment' |\r\n'map-add-dataset' |\r\n'map-add-site' |\r\n'map-add-building' |\r\n'map-add-sensor' |\r\n'map-add-file' |\r\n'map-measure' | \r\n'map-share' |\r\n'map-compare-buildings' |\r\n'open-building-page' |\r\n'open-bim-viewer' |\r\n'open-pointcloud'\r\n\r\n// Export toolbar configuration\r\nexport function mapToolbarTools(): Tool[] {\r\n // Translation\r\n const t = useTranslations('mapToolbarTools')\r\n\r\n return [\r\n { id: 'map-compare', title: t('compareTitle'), url: '/', icon: LR.Columns3, component: Compare },\r\n { id: 'map-database', title: t('datasetsTitle'), url: '/', icon: LR.Database, component: DatasetMapTool },\r\n {\r\n id: 'map-add',\r\n title: t('addTitle'),\r\n icon: LR.Plus,\r\n component: AddToMap,\r\n },\r\n {\r\n id: 'map-measure',\r\n title: t('measureTitle'),\r\n icon: LR.Ruler,\r\n cursor: 'crosshair',\r\n stayActive: true,\r\n component: MeasureMapTool,\r\n },\r\n { id: 'map-share',\r\n title: t('shareTitle'),\r\n icon: LR.Share2,\r\n component: ShareMapTool,\r\n },\r\n ]\r\n}\r\n"],"mappings":"AAGA,SAAS,uBAAuB;AAMhC,YAAY,QAAQ;AAGpB,SAAS,sBAAsB;AAE/B,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,OAAO,oBAAoB;AAC3B,OAAO,aAAa;AAsBb,SAAS,kBAA0B;AAExC,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,SAAO;AAAA,IACL,EAAE,IAAI,eAAe,OAAO,EAAE,cAAc,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,QAAQ;AAAA,IAC/F,EAAE,IAAI,gBAAgB,OAAO,EAAE,eAAe,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,eAAe;AAAA,IACxG;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,UAAU;AAAA,MACnB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,cAAc;AAAA,MACvB,MAAM,GAAG;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MAAE,IAAI;AAAA,MACJ,OAAO,EAAE,YAAY;AAAA,MACrB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/tools/mapTools.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { useTranslations } from 'next-intl'\r\n\r\n// Utilities\r\nimport { Tool } from '../../../../../types/tools'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\n// Custom toolbar buttons\r\nimport { MeasureMapTool } from './measureMapTool'\r\n\r\nimport AddToMap from './AddTools/AddToMap'\r\nimport { ShareMapTool } from './shareMapTool'\r\nimport DatasetMapTool from './DatasetMapTool'\r\nimport Compare from '../compare'\r\n\r\nexport type MapToolbarToolType = \r\n'map-dimensions' | \r\n'map-media' | \r\n'map-compare' | \r\n'map-database' | \r\n'map-add' | \r\n'map-add-comment' |\r\n'map-add-dataset' |\r\n'map-add-site' |\r\n'map-add-building' |\r\n'map-add-sensor' |\r\n'map-add-file' |\r\n'map-measure' | \r\n'map-share' |\r\n'map-compare-buildings' |\r\n'open-building-page' |\r\n'open-bim-viewer' |\r\n'open-pointcloud'\r\n\r\ntype MapToolsConfig = {\r\n martinBaseUrl?: string\r\n minioBaseUrl?: string\r\n organization?: Organization\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\n// Export toolbar configuration\r\nexport function mapToolbarTools(config?: MapToolsConfig): Tool[] {\r\n // Translation\r\n const t = useTranslations('mapToolbarTools')\r\n\r\n const extraProps = (config ?? {}) as unknown as Record<string, unknown>\r\n\r\n return [\r\n { id: 'map-compare', title: t('compareTitle'), url: '/', icon: LR.Columns3, component: Compare },\r\n { id: 'map-database', title: t('datasetsTitle'), url: '/', icon: LR.Database, component: DatasetMapTool, extraProps },\r\n {\r\n id: 'map-add',\r\n title: t('addTitle'),\r\n icon: LR.Plus,\r\n component: AddToMap,\r\n extraProps,\r\n },\r\n {\r\n id: 'map-measure',\r\n title: t('measureTitle'),\r\n icon: LR.Ruler,\r\n cursor: 'crosshair',\r\n stayActive: true,\r\n component: MeasureMapTool,\r\n },\r\n { id: 'map-share',\r\n title: t('shareTitle'),\r\n icon: LR.Share2,\r\n component: ShareMapTool,\r\n },\r\n ]\r\n}\r\n"],"mappings":"AAGA,SAAS,uBAAuB;AAOhC,YAAY,QAAQ;AAGpB,SAAS,sBAAsB;AAE/B,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,OAAO,oBAAoB;AAC3B,OAAO,aAAa;AA8Bb,SAAS,gBAAgB,QAAiC;AAE/D,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,QAAM,aAAc,0BAAU,CAAC;AAE/B,SAAO;AAAA,IACL,EAAE,IAAI,eAAe,OAAO,EAAE,cAAc,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,QAAQ;AAAA,IAC/F,EAAE,IAAI,gBAAgB,OAAO,EAAE,eAAe,GAAG,KAAK,KAAK,MAAM,GAAG,UAAU,WAAW,gBAAgB,WAAW;AAAA,IACpH;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,UAAU;AAAA,MACnB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,MACX;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,cAAc;AAAA,MACvB,MAAM,GAAG;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MAAE,IAAI;AAAA,MACJ,OAAO,EAAE,YAAY;AAAA,MACrB,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
@@ -5,6 +5,7 @@ import type maplibregl from 'maplibre-gl';
5
5
  * Higher priority is clicked first.
6
6
  */
7
7
  export declare enum MapLayerClickPriority {
8
+ SiteLayerClickPriority = 50,
8
9
  BuildingLayersClickPriority = 100,
9
10
  CommentLayersClickPriority = 200,
10
11
  MartinLayerClickPriority = 300,
@@ -1 +1 @@
1
- {"version":3,"file":"MapClickManager.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC;;;;GAIG;AACH,oBAAY,qBAAqB;IAC/B,2BAA2B,MAAM;IACjC,0BAA0B,MAAM;IAChC,wBAAwB,MAAM;IAC9B,0BAA0B,MAAM;IAChC,sBAAsB,MAAM;IAC5B,qBAAqB,MAAM;IAC3B,UAAU,OAAO;CAClB;AACD,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,UAAU,CAAC,aAAa,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,EAAE,KACrC,IAAI,CAAA;AAQT,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,mBAAmB,CAAqC;gBAEpD,GAAG,EAAE,UAAU,CAAC,GAAG;IAOxB,QAAQ,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,aAAa;IAOlB,UAAU,CAAC,OAAO,KAAA;IAKzB,OAAO,CAAC,cAAc;IA4BtB,OAAO;CAIR"}
1
+ {"version":3,"file":"MapClickManager.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AAEzC;;;;GAIG;AACH,oBAAY,qBAAqB;IAG/B,sBAAsB,KAAK;IAC3B,2BAA2B,MAAM;IACjC,0BAA0B,MAAM;IAChC,wBAAwB,MAAM;IAC9B,0BAA0B,MAAM;IAChC,sBAAsB,MAAM;IAC5B,qBAAqB,MAAM;IAC3B,UAAU,OAAO;CAClB;AACD,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,UAAU,CAAC,aAAa,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,EAAE,KACrC,IAAI,CAAA;AAQT,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,mBAAmB,CAAqC;gBAEpD,GAAG,EAAE,UAAU,CAAC,GAAG;IAOxB,QAAQ,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,aAAa;IAOlB,UAAU,CAAC,OAAO,KAAA;IAKzB,OAAO,CAAC,cAAc;IA4BtB,OAAO;CAIR"}
@@ -1,4 +1,5 @@
1
1
  var MapLayerClickPriority = /* @__PURE__ */ ((MapLayerClickPriority2) => {
2
+ MapLayerClickPriority2[MapLayerClickPriority2["SiteLayerClickPriority"] = 50] = "SiteLayerClickPriority";
2
3
  MapLayerClickPriority2[MapLayerClickPriority2["BuildingLayersClickPriority"] = 100] = "BuildingLayersClickPriority";
3
4
  MapLayerClickPriority2[MapLayerClickPriority2["CommentLayersClickPriority"] = 200] = "CommentLayersClickPriority";
4
5
  MapLayerClickPriority2[MapLayerClickPriority2["MartinLayerClickPriority"] = 300] = "MartinLayerClickPriority";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// MapClickManager.ts\r\nimport type maplibregl from 'maplibre-gl'\r\n\r\n/**\r\n * This is very important. Declare a new priority for your layer in this enum if you need to,\r\n * otherwise, just use the one that has been declared\r\n * Higher priority is clicked first.\r\n */\r\nexport enum MapLayerClickPriority {\r\n BuildingLayersClickPriority = 100,\r\n CommentLayersClickPriority = 200,\r\n MartinLayerClickPriority = 300,\r\n OpenDataLayerClickPriority = 350,\r\n FileLayerCLickPriority = 400,\r\n BimModelLayerPriority = 600,\r\n ActiveTool = 1000, // SPECIAL ONE, MAKE SURE TO DISABLE THE TOOL WHEN YOU ARE FINISH.\r\n}\r\nexport type ClickCallback = (\r\n event: maplibregl.MapMouseEvent,\r\n features: maplibregl.MapGeoJSONFeature[],\r\n) => void\r\n\r\ninterface LayerClickHandler {\r\n layerId: string\r\n priority: number\r\n callback: ClickCallback\r\n}\r\n\r\nexport class MapClickManager {\r\n private map: maplibregl.Map // the instance of the map\r\n private clickHandlers: LayerClickHandler[] // all click handlers for layers that has been registered\r\n private boundedClickHandler: (e: maplibregl.MapMouseEvent) => {} // clickHandler has \"this\" object binded to it, so inside the handleClick private function, we can still access this.map.\r\n\r\n constructor(map: maplibregl.Map) {\r\n this.map = map\r\n this.boundedClickHandler = this.handleMapClick.bind(this)\r\n this.clickHandlers = []\r\n this.map.on('click', this.boundedClickHandler)\r\n }\r\n\r\n public register(\r\n layerId: string,\r\n priority: MapLayerClickPriority,\r\n callback: ClickCallback,\r\n ) {\r\n this.clickHandlers.push({ layerId, priority, callback })\r\n this.clickHandlers.sort((a, b) => b.priority - a.priority)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n public unregister(layerId) {\r\n this.clickHandlers = this.clickHandlers.filter(handler => handler.layerId !== layerId)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n private handleMapClick(e: maplibregl.MapMouseEvent) {\r\n // for active tools\r\n for (const handler of this.clickHandlers) {\r\n if (handler.priority === MapLayerClickPriority.ActiveTool) {\r\n handler.callback(e, [])\r\n console.log('call back return ')\r\n return\r\n }\r\n }\r\n\r\n // console.log(e.point)\r\n const features = this.map.queryRenderedFeatures(e.point)\r\n // console.log(features)\r\n\r\n if (!features) return\r\n\r\n for (let i = 0; i < this.clickHandlers.length; i++) {\r\n const currentHandler = this.clickHandlers[i]\r\n const hits = features.filter(f => f.layer?.id == currentHandler.layerId)\r\n\r\n if (hits.length > 0) {\r\n // console.log(currentHandler)\r\n currentHandler.callback(e, hits)\r\n break\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this.map.off('click', this.boundedClickHandler)\r\n this.clickHandlers = []\r\n }\r\n}\r\n"],"mappings":"AAWO,IAAK,wBAAL,kBAAKA,2BAAL;AACL,EAAAA,8CAAA,iCAA8B,OAA9B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,8BAA2B,OAA3B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,4BAAyB,OAAzB;AACA,EAAAA,8CAAA,2BAAwB,OAAxB;AACA,EAAAA,8CAAA,gBAAa,OAAb;AAPU,SAAAA;AAAA,GAAA;AAoBL,MAAM,gBAAgB;AAAA;AAAA,EAK3B,YAAY,KAAqB;AAC/B,SAAK,MAAM;AACX,SAAK,sBAAsB,KAAK,eAAe,KAAK,IAAI;AACxD,SAAK,gBAAgB,CAAC;AACtB,SAAK,IAAI,GAAG,SAAS,KAAK,mBAAmB;AAAA,EAC/C;AAAA,EAEO,SACL,SACA,UACA,UACA;AACA,SAAK,cAAc,KAAK,EAAE,SAAS,UAAU,SAAS,CAAC;AACvD,SAAK,cAAc,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,EAE3D;AAAA,EAEO,WAAW,SAAS;AACzB,SAAK,gBAAgB,KAAK,cAAc,OAAO,aAAW,QAAQ,YAAY,OAAO;AAAA,EAEvF;AAAA,EAEQ,eAAe,GAA6B;AAElD,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI,QAAQ,aAAa,sBAAkC;AACzD,gBAAQ,SAAS,GAAG,CAAC,CAAC;AACtB,gBAAQ,IAAI,mBAAmB;AAC/B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,IAAI,sBAAsB,EAAE,KAAK;AAGvD,QAAI,CAAC,SAAU;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,cAAc,QAAQ,KAAK;AAClD,YAAM,iBAAiB,KAAK,cAAc,CAAC;AAC3C,YAAM,OAAO,SAAS,OAAO,OAAE;AA5ErC;AA4EwC,wBAAE,UAAF,mBAAS,OAAM,eAAe;AAAA,OAAO;AAEvE,UAAI,KAAK,SAAS,GAAG;AAEnB,uBAAe,SAAS,GAAG,IAAI;AAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,IAAI,IAAI,SAAS,KAAK,mBAAmB;AAC9C,SAAK,gBAAgB,CAAC;AAAA,EACxB;AACF;","names":["MapLayerClickPriority"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/MapEventManager/MapClickManager.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// MapClickManager.ts\r\nimport type maplibregl from 'maplibre-gl'\r\n\r\n/**\r\n * This is very important. Declare a new priority for your layer in this enum if you need to,\r\n * otherwise, just use the one that has been declared\r\n * Higher priority is clicked first.\r\n */\r\nexport enum MapLayerClickPriority {\r\n // Lowest priority: a site polygon only handles a click when no other\r\n // interactive layer (buildings, comments, sensors, files, ...) was hit.\r\n SiteLayerClickPriority = 50,\r\n BuildingLayersClickPriority = 100,\r\n CommentLayersClickPriority = 200,\r\n MartinLayerClickPriority = 300,\r\n OpenDataLayerClickPriority = 350,\r\n FileLayerCLickPriority = 400,\r\n BimModelLayerPriority = 600,\r\n ActiveTool = 1000, // SPECIAL ONE, MAKE SURE TO DISABLE THE TOOL WHEN YOU ARE FINISH.\r\n}\r\nexport type ClickCallback = (\r\n event: maplibregl.MapMouseEvent,\r\n features: maplibregl.MapGeoJSONFeature[],\r\n) => void\r\n\r\ninterface LayerClickHandler {\r\n layerId: string\r\n priority: number\r\n callback: ClickCallback\r\n}\r\n\r\nexport class MapClickManager {\r\n private map: maplibregl.Map // the instance of the map\r\n private clickHandlers: LayerClickHandler[] // all click handlers for layers that has been registered\r\n private boundedClickHandler: (e: maplibregl.MapMouseEvent) => {} // clickHandler has \"this\" object binded to it, so inside the handleClick private function, we can still access this.map.\r\n\r\n constructor(map: maplibregl.Map) {\r\n this.map = map\r\n this.boundedClickHandler = this.handleMapClick.bind(this)\r\n this.clickHandlers = []\r\n this.map.on('click', this.boundedClickHandler)\r\n }\r\n\r\n public register(\r\n layerId: string,\r\n priority: MapLayerClickPriority,\r\n callback: ClickCallback,\r\n ) {\r\n this.clickHandlers.push({ layerId, priority, callback })\r\n this.clickHandlers.sort((a, b) => b.priority - a.priority)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n public unregister(layerId) {\r\n this.clickHandlers = this.clickHandlers.filter(handler => handler.layerId !== layerId)\r\n // console.log(this.clickHandlers)\r\n }\r\n\r\n private handleMapClick(e: maplibregl.MapMouseEvent) {\r\n // for active tools\r\n for (const handler of this.clickHandlers) {\r\n if (handler.priority === MapLayerClickPriority.ActiveTool) {\r\n handler.callback(e, [])\r\n console.log('call back return ')\r\n return\r\n }\r\n }\r\n\r\n // console.log(e.point)\r\n const features = this.map.queryRenderedFeatures(e.point)\r\n // console.log(features)\r\n\r\n if (!features) return\r\n\r\n for (let i = 0; i < this.clickHandlers.length; i++) {\r\n const currentHandler = this.clickHandlers[i]\r\n const hits = features.filter(f => f.layer?.id == currentHandler.layerId)\r\n\r\n if (hits.length > 0) {\r\n // console.log(currentHandler)\r\n currentHandler.callback(e, hits)\r\n break\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n this.map.off('click', this.boundedClickHandler)\r\n this.clickHandlers = []\r\n }\r\n}\r\n"],"mappings":"AAWO,IAAK,wBAAL,kBAAKA,2BAAL;AAGL,EAAAA,8CAAA,4BAAyB,MAAzB;AACA,EAAAA,8CAAA,iCAA8B,OAA9B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,8BAA2B,OAA3B;AACA,EAAAA,8CAAA,gCAA6B,OAA7B;AACA,EAAAA,8CAAA,4BAAyB,OAAzB;AACA,EAAAA,8CAAA,2BAAwB,OAAxB;AACA,EAAAA,8CAAA,gBAAa,OAAb;AAVU,SAAAA;AAAA,GAAA;AAuBL,MAAM,gBAAgB;AAAA;AAAA,EAK3B,YAAY,KAAqB;AAC/B,SAAK,MAAM;AACX,SAAK,sBAAsB,KAAK,eAAe,KAAK,IAAI;AACxD,SAAK,gBAAgB,CAAC;AACtB,SAAK,IAAI,GAAG,SAAS,KAAK,mBAAmB;AAAA,EAC/C;AAAA,EAEO,SACL,SACA,UACA,UACA;AACA,SAAK,cAAc,KAAK,EAAE,SAAS,UAAU,SAAS,CAAC;AACvD,SAAK,cAAc,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,EAE3D;AAAA,EAEO,WAAW,SAAS;AACzB,SAAK,gBAAgB,KAAK,cAAc,OAAO,aAAW,QAAQ,YAAY,OAAO;AAAA,EAEvF;AAAA,EAEQ,eAAe,GAA6B;AAElD,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI,QAAQ,aAAa,sBAAkC;AACzD,gBAAQ,SAAS,GAAG,CAAC,CAAC;AACtB,gBAAQ,IAAI,mBAAmB;AAC/B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,IAAI,sBAAsB,EAAE,KAAK;AAGvD,QAAI,CAAC,SAAU;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,cAAc,QAAQ,KAAK;AAClD,YAAM,iBAAiB,KAAK,cAAc,CAAC;AAC3C,YAAM,OAAO,SAAS,OAAO,OAAE;AA/ErC;AA+EwC,wBAAE,UAAF,mBAAS,OAAM,eAAe;AAAA,OAAO;AAEvE,UAAI,KAAK,SAAS,GAAG;AAEnB,uBAAe,SAAS,GAAG,IAAI;AAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,IAAI,IAAI,SAAS,KAAK,mBAAmB;AAC9C,SAAK,gBAAgB,CAAC;AAAA,EACxB;AACF;","names":["MapLayerClickPriority"]}
@@ -1,6 +1,15 @@
1
- export declare const GEOCODE_EARTH_API_KEY: string;
2
- export declare const PHOTON_URL: string;
3
- export declare const NOMINATIM_URL: string;
4
- export declare const PELIAS_BASE: string;
5
- export declare const USE_PELIAS: boolean;
1
+ export type GeocodingRuntimeConfig = {
2
+ geocodeEarthApiKey?: string;
3
+ geocoderUrl?: string;
4
+ photonUrl?: string;
5
+ nominatimUrl?: string;
6
+ };
7
+ export declare function setGeocodingConfig(cfg: GeocodingRuntimeConfig): void;
8
+ export declare function getGeocodingConfig(): {
9
+ geocodeEarthApiKey: string;
10
+ peliasBase: string;
11
+ usePelias: boolean;
12
+ photonUrl: string;
13
+ nominatimUrl: string;
14
+ };
6
15
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,qBAAqB,QAAgD,CAAA;AAKlF,eAAO,MAAM,UAAU,QAAmE,CAAA;AAC1F,eAAO,MAAM,aAAa,QAAiF,CAAA;AAG3G,eAAO,MAAM,WAAW,QAA2E,CAAA;AACnG,eAAO,MAAM,UAAU,SAAuB,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAMpE;AAED,wBAAgB,kBAAkB;;;;;;EAYjC"}
@@ -1,14 +1,25 @@
1
- const GEOCODE_EARTH_API_KEY = process.env.NEXT_PUBLIC_GEOCODE_EARTH_API_KEY;
2
- const PELIAS_URL = process.env.NEXT_PUBLIC_GEOCODER_URL;
3
- const PHOTON_URL = process.env.NEXT_PUBLIC_PHOTON_URL || "https://photon.komoot.io";
4
- const NOMINATIM_URL = process.env.NEXT_PUBLIC_NOMINATIM_URL || "https://nominatim.openstreetmap.org";
5
- const PELIAS_BASE = GEOCODE_EARTH_API_KEY ? "https://api.geocode.earth" : PELIAS_URL || null;
6
- const USE_PELIAS = Boolean(PELIAS_BASE);
1
+ let _geocodeEarthApiKey = void 0;
2
+ let _geocoderUrl = void 0;
3
+ let _photonUrl = "https://photon.komoot.io";
4
+ let _nominatimUrl = "https://nominatim.openstreetmap.org";
5
+ function setGeocodingConfig(cfg) {
6
+ _geocodeEarthApiKey = cfg.geocodeEarthApiKey || void 0;
7
+ _geocoderUrl = cfg.geocoderUrl || void 0;
8
+ if (cfg.photonUrl) _photonUrl = cfg.photonUrl;
9
+ if (cfg.nominatimUrl) _nominatimUrl = cfg.nominatimUrl;
10
+ }
11
+ function getGeocodingConfig() {
12
+ const peliasBase = _geocodeEarthApiKey ? "https://api.geocode.earth" : _geocoderUrl || null;
13
+ return {
14
+ geocodeEarthApiKey: _geocodeEarthApiKey,
15
+ peliasBase,
16
+ usePelias: Boolean(peliasBase),
17
+ photonUrl: _photonUrl,
18
+ nominatimUrl: _nominatimUrl
19
+ };
20
+ }
7
21
  export {
8
- GEOCODE_EARTH_API_KEY,
9
- NOMINATIM_URL,
10
- PELIAS_BASE,
11
- PHOTON_URL,
12
- USE_PELIAS
22
+ getGeocodingConfig,
23
+ setGeocodingConfig
13
24
  };
14
25
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// ---------------------------------------------------------------------------\r\n// Geocoding provider resolution\r\n//\r\n// Geocode Earth is hosted Pelias, so it and a self-hosted Pelias instance share\r\n// one code path (`/v1/autocomplete`, `/v1/reverse`, and the same response shape).\r\n// When neither a key nor a self-hosted URL is configured we fall back to free,\r\n// no-key public OSM services so self-hosters get working geocoding out of the box:\r\n// - autocomplete -> Photon (komoot), which is built for per-keystroke search.\r\n// - reverse -> Nominatim, fine for occasional point lookups.\r\n// (Nominatim's usage policy forbids autocomplete-style traffic, which is why\r\n// Photon handles suggestions.) Both responses are normalized by ./adapters into\r\n// the Pelias property shape (`locality`, `region_a`, `country_a`, `label`, ...)\r\n// that parseLocation / handleLocationSelect already expect.\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const GEOCODE_EARTH_API_KEY = process.env.NEXT_PUBLIC_GEOCODE_EARTH_API_KEY\r\n// Self-hosted Pelias-compatible endpoint (no key). e.g. https://pelias.example.com\r\nconst PELIAS_URL = process.env.NEXT_PUBLIC_GEOCODER_URL\r\n// Public OSM fallbacks. Default to the community instances; self-hosters can point at\r\n// their own Photon/Nominatim via env to avoid the public instances' rate limits.\r\nexport const PHOTON_URL = process.env.NEXT_PUBLIC_PHOTON_URL || 'https://photon.komoot.io'\r\nexport const NOMINATIM_URL = process.env.NEXT_PUBLIC_NOMINATIM_URL || 'https://nominatim.openstreetmap.org'\r\n\r\n// Key wins (best quality), then self-hosted Pelias, otherwise public OSM.\r\nexport const PELIAS_BASE = GEOCODE_EARTH_API_KEY ? 'https://api.geocode.earth' : PELIAS_URL || null\r\nexport const USE_PELIAS = Boolean(PELIAS_BASE)\r\n"],"mappings":"AAkBO,MAAM,wBAAwB,QAAQ,IAAI;AAEjD,MAAM,aAAa,QAAQ,IAAI;AAGxB,MAAM,aAAa,QAAQ,IAAI,0BAA0B;AACzD,MAAM,gBAAgB,QAAQ,IAAI,6BAA6B;AAG/D,MAAM,cAAc,wBAAwB,8BAA8B,cAAc;AACxF,MAAM,aAAa,QAAQ,WAAW;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/config.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// ---------------------------------------------------------------------------\r\n// Geocoding provider resolution\r\n//\r\n// Values are injected at runtime via setGeocodingConfig() (called by\r\n// useGeocodingRuntimeConfig) rather than read from process.env at build time.\r\n// This allows the pre-built Docker image to pick up env vars at container\r\n// start without webpack baking empty strings into the client bundle.\r\n//\r\n// Geocode Earth is hosted Pelias, so it and a self-hosted Pelias instance share\r\n// one code path (/v1/autocomplete, /v1/reverse, and the same response shape).\r\n// When neither a key nor a self-hosted URL is configured we fall back to free,\r\n// no-key public OSM services so self-hosters get working geocoding out of the box:\r\n// - autocomplete -> Photon (komoot), built for per-keystroke search.\r\n// - reverse -> Nominatim, fine for occasional point lookups.\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _geocodeEarthApiKey: string | undefined = undefined\r\nlet _geocoderUrl: string | undefined = undefined\r\nlet _photonUrl: string = 'https://photon.komoot.io'\r\nlet _nominatimUrl: string = 'https://nominatim.openstreetmap.org'\r\n\r\nexport type GeocodingRuntimeConfig = {\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n photonUrl?: string\r\n nominatimUrl?: string\r\n}\r\n\r\nexport function setGeocodingConfig(cfg: GeocodingRuntimeConfig): void {\r\n // Treat empty strings the same as undefined so we don't use blank API keys\r\n _geocodeEarthApiKey = cfg.geocodeEarthApiKey || undefined\r\n _geocoderUrl = cfg.geocoderUrl || undefined\r\n if (cfg.photonUrl) _photonUrl = cfg.photonUrl\r\n if (cfg.nominatimUrl) _nominatimUrl = cfg.nominatimUrl\r\n}\r\n\r\nexport function getGeocodingConfig() {\r\n const peliasBase = _geocodeEarthApiKey\r\n ? 'https://api.geocode.earth'\r\n : _geocoderUrl || null\r\n\r\n return {\r\n geocodeEarthApiKey: _geocodeEarthApiKey,\r\n peliasBase,\r\n usePelias: Boolean(peliasBase),\r\n photonUrl: _photonUrl,\r\n nominatimUrl: _nominatimUrl,\r\n }\r\n}\r\n"],"mappings":"AAmBA,IAAI,sBAA0C;AAC9C,IAAI,eAAmC;AACvC,IAAI,aAAqB;AACzB,IAAI,gBAAwB;AASrB,SAAS,mBAAmB,KAAmC;AAEpE,wBAAsB,IAAI,sBAAsB;AAChD,iBAAe,IAAI,eAAe;AAClC,MAAI,IAAI,UAAW,cAAa,IAAI;AACpC,MAAI,IAAI,aAAc,iBAAgB,IAAI;AAC5C;AAEO,SAAS,qBAAqB;AACnC,QAAM,aAAa,sBACf,8BACA,gBAAgB;AAEpB,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB;AAAA,IACA,WAAW,QAAQ,UAAU;AAAA,IAC7B,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAiCjC,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAU5G,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,2BAAsC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KAC9F,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAkCjC,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAU5G,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,2BAAsC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KAC9F,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAA"}
@@ -1,8 +1,8 @@
1
- import { USE_PELIAS } from "./config";
1
+ import { getGeocodingConfig } from "./config";
2
2
  import { peliasAutocomplete, peliasReverse } from "./pelias";
3
3
  import { photonAutocomplete, nominatimReverse } from "./osm";
4
4
  let peliasAuthFailed = false;
5
- const peliasActive = () => USE_PELIAS && !peliasAuthFailed;
5
+ const peliasActive = () => getGeocodingConfig().usePelias && !peliasAuthFailed;
6
6
  const isAuthError = (error) => {
7
7
  const message = error instanceof Error ? error.message : String(error);
8
8
  return message.includes("401") || message.includes("403");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { USE_PELIAS } from './config'\r\nimport { peliasAutocomplete, peliasReverse } from './pelias'\r\nimport { photonAutocomplete, nominatimReverse } from './osm'\r\n\r\n// Provider-agnostic entry points. The preferred provider (Geocode Earth or a\r\n// self-hosted Pelias) is resolved in ./config from env vars; if it fails we fall\r\n// back to the free public OSM services so address search keeps working.\r\n//\r\n// A bad/expired/origin-restricted key surfaces as a 401/403. Autocomplete fires\r\n// on every keystroke, so once we see an auth failure we stop retrying the keyed\r\n// provider for the rest of the session and serve results directly from public OSM.\r\nlet peliasAuthFailed = false\r\n\r\nconst peliasActive = (): boolean => USE_PELIAS && !peliasAuthFailed\r\n\r\nconst isAuthError = (error: unknown): boolean => {\r\n const message = error instanceof Error ? error.message : String(error)\r\n return message.includes('401') || message.includes('403')\r\n}\r\n\r\nconst handlePeliasFailure = (error: unknown, fallbackName: string): void => {\r\n if (isAuthError(error)) {\r\n peliasAuthFailed = true\r\n console.warn(\r\n `Geocoder: the configured provider rejected the API key (auth error). ` +\r\n `Falling back to public OSM services (Photon/Nominatim) for the rest of this session.`,\r\n )\r\n } else {\r\n console.warn(`Geocoder: provider request failed; falling back to ${fallbackName}.`, error)\r\n }\r\n}\r\n\r\nexport const autocompleteGeocode = async (text: string, countryCode: string, size: number): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasAutocomplete(text, countryCode, size)\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Photon')\r\n }\r\n }\r\n return photonAutocomplete(text, countryCode, size)\r\n}\r\n\r\nexport const reverseGeocode = async (\r\n latitude: string,\r\n longitude: string,\r\n countryCode: string,\r\n { size = 1, coarse = false, layers }: { size?: number; coarse?: boolean; layers?: string } = {},\r\n): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasReverse(latitude, longitude, countryCode, { size, coarse, layers })\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Nominatim')\r\n }\r\n }\r\n return nominatimReverse(latitude, longitude, { coarse })\r\n}\r\n"],"mappings":"AAIA,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB,qBAAqB;AAClD,SAAS,oBAAoB,wBAAwB;AASrD,IAAI,mBAAmB;AAEvB,MAAM,eAAe,MAAe,cAAc,CAAC;AAEnD,MAAM,cAAc,CAAC,UAA4B;AAC/C,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK;AAC1D;AAEA,MAAM,sBAAsB,CAAC,OAAgB,iBAA+B;AAC1E,MAAI,YAAY,KAAK,GAAG;AACtB,uBAAmB;AACnB,YAAQ;AAAA,MACN;AAAA,IAEF;AAAA,EACF,OAAO;AACL,YAAQ,KAAK,sDAAsD,YAAY,KAAK,KAAK;AAAA,EAC3F;AACF;AAEO,MAAM,sBAAsB,OAAO,MAAc,aAAqB,SAAqC;AAChH,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,mBAAmB,MAAM,aAAa,IAAI;AAAA,IACzD,SACO,OAAO;AACZ,0BAAoB,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF;AACA,SAAO,mBAAmB,MAAM,aAAa,IAAI;AACnD;AAEO,MAAM,iBAAiB,OAC5B,UACA,WACA,aACA,EAAE,OAAO,GAAG,SAAS,OAAO,OAAO,IAA0D,CAAC,MACvE;AACvB,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,cAAc,UAAU,WAAW,aAAa,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IACvF,SACO,OAAO;AACZ,0BAAoB,OAAO,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO,iBAAiB,UAAU,WAAW,EAAE,OAAO,CAAC;AACzD;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { getGeocodingConfig } from './config'\r\nimport { peliasAutocomplete, peliasReverse } from './pelias'\r\nimport { photonAutocomplete, nominatimReverse } from './osm'\r\n\r\n// Provider-agnostic entry points. The preferred provider (Geocode Earth or a\r\n// self-hosted Pelias) is resolved in ./config from runtime-injected values;\r\n// if it fails we fall back to the free public OSM services so address search\r\n// keeps working.\r\n//\r\n// A bad/expired/origin-restricted key surfaces as a 401/403. Autocomplete fires\r\n// on every keystroke, so once we see an auth failure we stop retrying the keyed\r\n// provider for the rest of the session and serve results directly from public OSM.\r\nlet peliasAuthFailed = false\r\n\r\nconst peliasActive = (): boolean => getGeocodingConfig().usePelias && !peliasAuthFailed\r\n\r\nconst isAuthError = (error: unknown): boolean => {\r\n const message = error instanceof Error ? error.message : String(error)\r\n return message.includes('401') || message.includes('403')\r\n}\r\n\r\nconst handlePeliasFailure = (error: unknown, fallbackName: string): void => {\r\n if (isAuthError(error)) {\r\n peliasAuthFailed = true\r\n console.warn(\r\n `Geocoder: the configured provider rejected the API key (auth error). ` +\r\n `Falling back to public OSM services (Photon/Nominatim) for the rest of this session.`,\r\n )\r\n } else {\r\n console.warn(`Geocoder: provider request failed; falling back to ${fallbackName}.`, error)\r\n }\r\n}\r\n\r\nexport const autocompleteGeocode = async (text: string, countryCode: string, size: number): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasAutocomplete(text, countryCode, size)\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Photon')\r\n }\r\n }\r\n return photonAutocomplete(text, countryCode, size)\r\n}\r\n\r\nexport const reverseGeocode = async (\r\n latitude: string,\r\n longitude: string,\r\n countryCode: string,\r\n { size = 1, coarse = false, layers }: { size?: number; coarse?: boolean; layers?: string } = {},\r\n): Promise<Feature[]> => {\r\n if (peliasActive()) {\r\n try {\r\n return await peliasReverse(latitude, longitude, countryCode, { size, coarse, layers })\r\n }\r\n catch (error) {\r\n handlePeliasFailure(error, 'Nominatim')\r\n }\r\n }\r\n return nominatimReverse(latitude, longitude, { coarse })\r\n}\r\n"],"mappings":"AAIA,SAAS,0BAA0B;AACnC,SAAS,oBAAoB,qBAAqB;AAClD,SAAS,oBAAoB,wBAAwB;AAUrD,IAAI,mBAAmB;AAEvB,MAAM,eAAe,MAAe,mBAAmB,EAAE,aAAa,CAAC;AAEvE,MAAM,cAAc,CAAC,UAA4B;AAC/C,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK;AAC1D;AAEA,MAAM,sBAAsB,CAAC,OAAgB,iBAA+B;AAC1E,MAAI,YAAY,KAAK,GAAG;AACtB,uBAAmB;AACnB,YAAQ;AAAA,MACN;AAAA,IAEF;AAAA,EACF,OAAO;AACL,YAAQ,KAAK,sDAAsD,YAAY,KAAK,KAAK;AAAA,EAC3F;AACF;AAEO,MAAM,sBAAsB,OAAO,MAAc,aAAqB,SAAqC;AAChH,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,mBAAmB,MAAM,aAAa,IAAI;AAAA,IACzD,SACO,OAAO;AACZ,0BAAoB,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF;AACA,SAAO,mBAAmB,MAAM,aAAa,IAAI;AACnD;AAEO,MAAM,iBAAiB,OAC5B,UACA,WACA,aACA,EAAE,OAAO,GAAG,SAAS,OAAO,OAAO,IAA0D,CAAC,MACvE;AACvB,MAAI,aAAa,GAAG;AAClB,QAAI;AACF,aAAO,MAAM,cAAc,UAAU,WAAW,aAAa,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IACvF,SACO,OAAO;AACZ,0BAAoB,OAAO,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO,iBAAiB,UAAU,WAAW,EAAE,OAAO,CAAC;AACzD;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"osm.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAoBvH,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,YAAY;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,KAC9B,OAAO,CAAC,OAAO,EAAE,CAenB,CAAA"}
1
+ {"version":3,"file":"osm.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAOjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAsBvH,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,YAAY;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,KAC9B,OAAO,CAAC,OAAO,EAAE,CAiBnB,CAAA"}
@@ -1,8 +1,9 @@
1
- import { PHOTON_URL, NOMINATIM_URL } from "./config";
1
+ import { getGeocodingConfig } from "./config";
2
2
  import { normalizePhotonFeature, normalizeNominatimResult } from "./adapters";
3
3
  const photonAutocomplete = async (text, countryCode, size) => {
4
+ const { photonUrl } = getGeocodingConfig();
4
5
  const params = new URLSearchParams({ q: text, limit: String(size * 2), lang: "en" });
5
- const response = await fetch(`${PHOTON_URL}/api?${params}`);
6
+ const response = await fetch(`${photonUrl}/api?${params}`);
6
7
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
7
8
  const data = await response.json();
8
9
  let features = (data.features || []).map(normalizePhotonFeature);
@@ -18,15 +19,15 @@ const photonAutocomplete = async (text, countryCode, size) => {
18
19
  return features.slice(0, size);
19
20
  };
20
21
  const nominatimReverse = async (latitude, longitude, { coarse }) => {
22
+ const { nominatimUrl } = getGeocodingConfig();
21
23
  const params = new URLSearchParams({
22
24
  format: "jsonv2",
23
25
  lat: latitude,
24
26
  lon: longitude,
25
27
  addressdetails: "1",
26
28
  zoom: coarse ? "10" : "18"
27
- // coarse -> city level, otherwise building level
28
29
  });
29
- const response = await fetch(`${NOMINATIM_URL}/reverse?${params}`);
30
+ const response = await fetch(`${nominatimUrl}/reverse?${params}`);
30
31
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
31
32
  const data = await response.json();
32
33
  if (!data || data.error || data.lat == null) return [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { PHOTON_URL, NOMINATIM_URL } from './config'\r\nimport { normalizePhotonFeature, normalizeNominatimResult } from './adapters'\r\n\r\n// Free, no-key public OSM fallbacks. Photon serves autocomplete (it is built for\r\n// per-keystroke search); Nominatim serves reverse lookups (occasional, single point).\r\n\r\nexport const photonAutocomplete = async (text: string, countryCode: string | undefined, size: number): Promise<Feature[]> => {\r\n // Photon has no country filter, so over-fetch and post-filter by country code.\r\n const params = new URLSearchParams({ q: text, limit: String(size * 2), lang: 'en' })\r\n\r\n const response = await fetch(`${PHOTON_URL}/api?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n let features: Feature[] = (data.features || []).map(normalizePhotonFeature)\r\n\r\n if (countryCode) {\r\n const cc = countryCode.toUpperCase()\r\n const inCountry = features.filter(f => {\r\n const ca = (f.properties as any)?.country_a\r\n return !ca || ca === cc\r\n })\r\n if (inCountry.length) features = inCountry\r\n }\r\n\r\n return features.slice(0, size)\r\n}\r\n\r\nexport const nominatimReverse = async (\r\n latitude: string,\r\n longitude: string,\r\n { coarse }: { coarse: boolean },\r\n): Promise<Feature[]> => {\r\n const params = new URLSearchParams({\r\n format: 'jsonv2',\r\n lat: latitude,\r\n lon: longitude,\r\n addressdetails: '1',\r\n zoom: coarse ? '10' : '18', // coarse -> city level, otherwise building level\r\n })\r\n\r\n const response = await fetch(`${NOMINATIM_URL}/reverse?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n if (!data || data.error || data.lat == null) return []\r\n return [normalizeNominatimResult(data)]\r\n}\r\n"],"mappings":"AAIA,SAAS,YAAY,qBAAqB;AAC1C,SAAS,wBAAwB,gCAAgC;AAK1D,MAAM,qBAAqB,OAAO,MAAc,aAAiC,SAAqC;AAE3H,QAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC;AAEnF,QAAM,WAAW,MAAM,MAAM,GAAG,UAAU,QAAQ,MAAM,EAAE;AAC1D,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,YAAuB,KAAK,YAAY,CAAC,GAAG,IAAI,sBAAsB;AAE1E,MAAI,aAAa;AACf,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,YAAY,SAAS,OAAO,OAAK;AAtB3C;AAuBM,YAAM,MAAM,OAAE,eAAF,mBAAsB;AAClC,aAAO,CAAC,MAAM,OAAO;AAAA,IACvB,CAAC;AACD,QAAI,UAAU,OAAQ,YAAW;AAAA,EACnC;AAEA,SAAO,SAAS,MAAM,GAAG,IAAI;AAC/B;AAEO,MAAM,mBAAmB,OAC9B,UACA,WACA,EAAE,OAAO,MACc;AACvB,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,MAAM,SAAS,OAAO;AAAA;AAAA,EACxB,CAAC;AAED,QAAM,WAAW,MAAM,MAAM,GAAG,aAAa,YAAY,MAAM,EAAE;AACjE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAM,QAAO,CAAC;AACrD,SAAO,CAAC,yBAAyB,IAAI,CAAC;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/osm.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { Feature } from 'geojson'\r\nimport { getGeocodingConfig } from './config'\r\nimport { normalizePhotonFeature, normalizeNominatimResult } from './adapters'\r\n\r\n// Free, no-key public OSM fallbacks. Photon serves autocomplete (it is built for\r\n// per-keystroke search); Nominatim serves reverse lookups (occasional, single point).\r\n\r\nexport const photonAutocomplete = async (text: string, countryCode: string | undefined, size: number): Promise<Feature[]> => {\r\n const { photonUrl } = getGeocodingConfig()\r\n\r\n // Photon has no country filter, so over-fetch and post-filter by country code.\r\n const params = new URLSearchParams({ q: text, limit: String(size * 2), lang: 'en' })\r\n\r\n const response = await fetch(`${photonUrl}/api?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n let features: Feature[] = (data.features || []).map(normalizePhotonFeature)\r\n\r\n if (countryCode) {\r\n const cc = countryCode.toUpperCase()\r\n const inCountry = features.filter(f => {\r\n const ca = (f.properties as any)?.country_a\r\n return !ca || ca === cc\r\n })\r\n if (inCountry.length) features = inCountry\r\n }\r\n\r\n return features.slice(0, size)\r\n}\r\n\r\nexport const nominatimReverse = async (\r\n latitude: string,\r\n longitude: string,\r\n { coarse }: { coarse: boolean },\r\n): Promise<Feature[]> => {\r\n const { nominatimUrl } = getGeocodingConfig()\r\n\r\n const params = new URLSearchParams({\r\n format: 'jsonv2',\r\n lat: latitude,\r\n lon: longitude,\r\n addressdetails: '1',\r\n zoom: coarse ? '10' : '18',\r\n })\r\n\r\n const response = await fetch(`${nominatimUrl}/reverse?${params}`)\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)\r\n\r\n const data = await response.json()\r\n if (!data || data.error || data.lat == null) return []\r\n return [normalizeNominatimResult(data)]\r\n}\r\n"],"mappings":"AAIA,SAAS,0BAA0B;AACnC,SAAS,wBAAwB,gCAAgC;AAK1D,MAAM,qBAAqB,OAAO,MAAc,aAAiC,SAAqC;AAC3H,QAAM,EAAE,UAAU,IAAI,mBAAmB;AAGzC,QAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC;AAEnF,QAAM,WAAW,MAAM,MAAM,GAAG,SAAS,QAAQ,MAAM,EAAE;AACzD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,YAAuB,KAAK,YAAY,CAAC,GAAG,IAAI,sBAAsB;AAE1E,MAAI,aAAa;AACf,UAAM,KAAK,YAAY,YAAY;AACnC,UAAM,YAAY,SAAS,OAAO,OAAK;AAxB3C;AAyBM,YAAM,MAAM,OAAE,eAAF,mBAAsB;AAClC,aAAO,CAAC,MAAM,OAAO;AAAA,IACvB,CAAC;AACD,QAAI,UAAU,OAAQ,YAAW;AAAA,EACnC;AAEA,SAAO,SAAS,MAAM,GAAG,IAAI;AAC/B;AAEO,MAAM,mBAAmB,OAC9B,UACA,WACA,EAAE,OAAO,MACc;AACvB,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAE5C,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,MAAM,SAAS,OAAO;AAAA,EACxB,CAAC;AAED,QAAM,WAAW,MAAM,MAAM,GAAG,YAAY,YAAY,MAAM,EAAE;AAChE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAE1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAM,QAAO,CAAC;AACrD,SAAO,CAAC,yBAAyB,IAAI,CAAC;AACxC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"pelias.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/pelias.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAavH,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,GAAG,SAAS,EAC/B,0BAA0B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC3E,OAAO,CAAC,OAAO,EAAE,CAiBnB,CAAA"}
1
+ {"version":3,"file":"pelias.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/utils/geocoding/pelias.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMjC,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,aAAa,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAevH,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,GAAG,SAAS,EAC/B,0BAA0B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAC3E,OAAO,CAAC,OAAO,EAAE,CAkBnB,CAAA"}
@@ -1,19 +1,21 @@
1
- import { GEOCODE_EARTH_API_KEY, PELIAS_BASE } from "./config";
1
+ import { getGeocodingConfig } from "./config";
2
2
  const peliasAutocomplete = async (text, countryCode, size) => {
3
3
  var _a;
4
+ const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig();
4
5
  const params = new URLSearchParams({
5
6
  "text": text,
6
7
  "size": String(size)
7
8
  });
8
9
  if (countryCode) params.set("boundary.country", countryCode.toUpperCase());
9
- if (GEOCODE_EARTH_API_KEY) params.set("api_key", GEOCODE_EARTH_API_KEY);
10
- const response = await fetch(`${PELIAS_BASE}/v1/autocomplete?${params}`);
10
+ if (geocodeEarthApiKey) params.set("api_key", geocodeEarthApiKey);
11
+ const response = await fetch(`${peliasBase}/v1/autocomplete?${params}`);
11
12
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
12
13
  const geojson = await response.json();
13
14
  return ((_a = geojson.features) == null ? void 0 : _a.length) ? geojson.features : [];
14
15
  };
15
16
  const peliasReverse = async (latitude, longitude, countryCode, { size, coarse, layers }) => {
16
17
  var _a;
18
+ const { geocodeEarthApiKey, peliasBase } = getGeocodingConfig();
17
19
  const params = new URLSearchParams({
18
20
  "point.lat": latitude,
19
21
  "point.lon": longitude,
@@ -22,8 +24,8 @@ const peliasReverse = async (latitude, longitude, countryCode, { size, coarse, l
22
24
  if (countryCode) params.set("boundary.country", countryCode.toUpperCase());
23
25
  if (coarse) params.set("layers", "coarse");
24
26
  else if (layers) params.set("layers", layers);
25
- if (GEOCODE_EARTH_API_KEY) params.set("api_key", GEOCODE_EARTH_API_KEY);
26
- const response = await fetch(`${PELIAS_BASE}/v1/reverse?${params}`);
27
+ if (geocodeEarthApiKey) params.set("api_key", geocodeEarthApiKey);
28
+ const response = await fetch(`${peliasBase}/v1/reverse?${params}`);
27
29
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
28
30
  const data = await response.json();
29
31
  return ((_a = data.features) == null ? void 0 : _a.length) ? data.features : [];