@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,122 @@
1
+ import { booleanPointInPolygon, polygon as turfPolygon } from "@turf/turf";
2
+ import { uploadToPresignedUrl } from "../../../tools/AddTools/AddFile/utils/uploadToPresignedURLS";
3
+ const polygonCentroid = (pts) => {
4
+ let x = 0, y = 0, area = 0;
5
+ for (let i = 0; i < pts.length; i++) {
6
+ const [x0, y0] = pts[i];
7
+ const [x1, y1] = pts[(i + 1) % pts.length];
8
+ const cross = x0 * y1 - x1 * y0;
9
+ area += cross;
10
+ x += (x0 + x1) * cross;
11
+ y += (y0 + y1) * cross;
12
+ }
13
+ area *= 0.5;
14
+ if (area === 0) {
15
+ const n = pts.length || 1;
16
+ return [pts.reduce((s, p) => s + p[0], 0) / n, pts.reduce((s, p) => s + p[1], 0) / n];
17
+ }
18
+ return [x / (6 * area), y / (6 * area)];
19
+ };
20
+ const ringBounds = (ring) => {
21
+ let minLng = Infinity, minLat = Infinity, maxLng = -Infinity, maxLat = -Infinity;
22
+ for (const [lng, lat] of ring) {
23
+ if (lng < minLng) minLng = lng;
24
+ if (lat < minLat) minLat = lat;
25
+ if (lng > maxLng) maxLng = lng;
26
+ if (lat > maxLat) maxLat = lat;
27
+ }
28
+ return [[minLng, minLat], [maxLng, maxLat]];
29
+ };
30
+ const pointToSegmentDistance = (px, py, ax, ay, bx, by) => {
31
+ const dx = bx - ax;
32
+ const dy = by - ay;
33
+ const lenSq = dx * dx + dy * dy;
34
+ let t = lenSq === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / lenSq;
35
+ t = Math.max(0, Math.min(1, t));
36
+ return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
37
+ };
38
+ const ringToFeatureCollection = (ring, name) => ({
39
+ type: "FeatureCollection",
40
+ features: [
41
+ {
42
+ type: "Feature",
43
+ geometry: { type: "Polygon", coordinates: [[...ring, ring[0]]] },
44
+ properties: { type: "site", name }
45
+ }
46
+ ]
47
+ });
48
+ const filterPointsInRing = (ring, items, getLngLat) => {
49
+ if (ring.length < 3) return [];
50
+ try {
51
+ const poly = turfPolygon([[...ring, ring[0]]]);
52
+ return (items != null ? items : []).filter((item) => {
53
+ const c = getLngLat(item);
54
+ return c != null && booleanPointInPolygon(c, poly);
55
+ });
56
+ } catch (e) {
57
+ return [];
58
+ }
59
+ };
60
+ const ringFromGeoJson = (geo) => {
61
+ var _a, _b, _c;
62
+ const geometry = (() => {
63
+ var _a2, _b2, _c2;
64
+ if (!geo) return null;
65
+ if (geo.type === "FeatureCollection") {
66
+ const f = ((_a2 = geo.features) != null ? _a2 : []).find(
67
+ (feat) => {
68
+ var _a3, _b3;
69
+ return ((_a3 = feat == null ? void 0 : feat.geometry) == null ? void 0 : _a3.type) === "Polygon" || ((_b3 = feat == null ? void 0 : feat.geometry) == null ? void 0 : _b3.type) === "MultiPolygon";
70
+ }
71
+ );
72
+ return (_b2 = f == null ? void 0 : f.geometry) != null ? _b2 : null;
73
+ }
74
+ if (geo.type === "Feature") return (_c2 = geo.geometry) != null ? _c2 : null;
75
+ return geo;
76
+ })();
77
+ if (!geometry) return null;
78
+ let coords;
79
+ if (geometry.type === "Polygon") coords = (_a = geometry.coordinates) == null ? void 0 : _a[0];
80
+ else if (geometry.type === "MultiPolygon") coords = (_c = (_b = geometry.coordinates) == null ? void 0 : _b[0]) == null ? void 0 : _c[0];
81
+ if (!Array.isArray(coords) || coords.length < 3) return null;
82
+ const ring = coords.map((c) => [c[0], c[1]]);
83
+ const first = ring[0];
84
+ const last = ring[ring.length - 1];
85
+ if (ring.length > 1 && first[0] === last[0] && first[1] === last[1]) ring.pop();
86
+ return ring;
87
+ };
88
+ const fetchSiteBoundaryRing = async (siteId) => {
89
+ var _a;
90
+ try {
91
+ const res = await fetch(`/api/files/site/${siteId}`);
92
+ if (!res.ok) return null;
93
+ const { files } = await res.json();
94
+ const geomFile = (_a = (files != null ? files : []).find((f) => f.tag === "site-geometry" && f.url)) != null ? _a : (files != null ? files : []).find((f) => (f.extension === "geojson" || f.mimeType && String(f.mimeType).includes("geo+json")) && f.url);
95
+ if (!(geomFile == null ? void 0 : geomFile.url)) return null;
96
+ const geo = await fetch(geomFile.url).then((r) => r.json());
97
+ return ringFromGeoJson(geo);
98
+ } catch (e) {
99
+ return null;
100
+ }
101
+ };
102
+ const uploadGeoJsonToAsset = async (assetId, ring, name) => {
103
+ const fc = ringToFeatureCollection(ring, name);
104
+ const file = new File([JSON.stringify(fc)], `${name || "site"}.geojson`, {
105
+ type: "application/geo+json"
106
+ });
107
+ const presRes = await fetch(`/api/presigned-url-upload?asset=${encodeURIComponent(assetId)}`);
108
+ if (!presRes.ok) throw new Error("Failed to get an upload URL");
109
+ const { presignedUrl } = await presRes.json();
110
+ await uploadToPresignedUrl(presignedUrl, file);
111
+ };
112
+ export {
113
+ fetchSiteBoundaryRing,
114
+ filterPointsInRing,
115
+ pointToSegmentDistance,
116
+ polygonCentroid,
117
+ ringBounds,
118
+ ringFromGeoJson,
119
+ ringToFeatureCollection,
120
+ uploadGeoJsonToAsset
121
+ };
122
+ //# sourceMappingURL=siteGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { booleanPointInPolygon, polygon as turfPolygon } from '@turf/turf'\r\nimport { uploadToPresignedUrl } from '../../../tools/AddTools/AddFile/utils/uploadToPresignedURLS'\r\n\r\nexport type Ring = [number, number][]\r\n\r\n/** Area-weighted centroid of a polygon ring; used to place a single label. */\r\nexport const polygonCentroid = (pts: Ring): [number, number] => {\r\n let x = 0, y = 0, area = 0\r\n for (let i = 0; i < pts.length; i++) {\r\n const [x0, y0] = pts[i]\r\n const [x1, y1] = pts[(i + 1) % pts.length]\r\n const cross = x0 * y1 - x1 * y0\r\n area += cross\r\n x += (x0 + x1) * cross\r\n y += (y0 + y1) * cross\r\n }\r\n area *= 0.5\r\n if (area === 0) {\r\n const n = pts.length || 1\r\n return [pts.reduce((s, p) => s + p[0], 0) / n, pts.reduce((s, p) => s + p[1], 0) / n]\r\n }\r\n return [x / (6 * area), y / (6 * area)]\r\n}\r\n\r\n/** Bounding box of a ring as [[minLng, minLat], [maxLng, maxLat]]. */\r\nexport const ringBounds = (ring: Ring): [[number, number], [number, number]] => {\r\n let minLng = Infinity, minLat = Infinity, maxLng = -Infinity, maxLat = -Infinity\r\n for (const [lng, lat] of ring) {\r\n if (lng < minLng) minLng = lng\r\n if (lat < minLat) minLat = lat\r\n if (lng > maxLng) maxLng = lng\r\n if (lat > maxLat) maxLat = lat\r\n }\r\n return [[minLng, minLat], [maxLng, maxLat]]\r\n}\r\n\r\n/** Shortest distance from point (px,py) to the segment (ax,ay)-(bx,by). */\r\nexport const pointToSegmentDistance = (\r\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\r\n): number => {\r\n const dx = bx - ax\r\n const dy = by - ay\r\n const lenSq = dx * dx + dy * dy\r\n let t = lenSq === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / lenSq\r\n t = Math.max(0, Math.min(1, t))\r\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy))\r\n}\r\n\r\n/** Build the GeoJSON FeatureCollection stored in minio for a site polygon. */\r\nexport const ringToFeatureCollection = (ring: Ring, name: string): GeoJSON.FeatureCollection => ({\r\n type: 'FeatureCollection',\r\n features: [\r\n {\r\n type: 'Feature',\r\n geometry: { type: 'Polygon', coordinates: [[...ring, ring[0]]] },\r\n properties: { type: 'site', name },\r\n },\r\n ],\r\n})\r\n\r\n/**\r\n * Return the items whose [lng, lat] point falls inside the polygon ring.\r\n * The Turf polygon is built once, so this is cheap for many points.\r\n */\r\nexport const filterPointsInRing = <T>(\r\n ring: Ring,\r\n items: T[],\r\n getLngLat: (item: T) => [number, number] | null,\r\n): T[] => {\r\n if (ring.length < 3) return []\r\n try {\r\n const poly = turfPolygon([[...ring, ring[0]]])\r\n return (items ?? []).filter((item) => {\r\n const c = getLngLat(item)\r\n return c != null && booleanPointInPolygon(c, poly)\r\n })\r\n }\r\n catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Extract the outer ring (open, no repeated closing point) from a stored\r\n * GeoJSON value, accepting a FeatureCollection, Feature, or bare geometry.\r\n */\r\nexport const ringFromGeoJson = (geo: any): Ring | null => {\r\n const geometry = (() => {\r\n if (!geo) return null\r\n if (geo.type === 'FeatureCollection') {\r\n const f = (geo.features ?? []).find(\r\n (feat: any) => feat?.geometry?.type === 'Polygon' || feat?.geometry?.type === 'MultiPolygon',\r\n )\r\n return f?.geometry ?? null\r\n }\r\n if (geo.type === 'Feature') return geo.geometry ?? null\r\n return geo\r\n })()\r\n\r\n if (!geometry) return null\r\n\r\n let coords: any\r\n if (geometry.type === 'Polygon') coords = geometry.coordinates?.[0]\r\n else if (geometry.type === 'MultiPolygon') coords = geometry.coordinates?.[0]?.[0]\r\n if (!Array.isArray(coords) || coords.length < 3) return null\r\n\r\n const ring: Ring = coords.map((c: number[]) => [c[0], c[1]] as [number, number])\r\n // Drop the closing point if it duplicates the first.\r\n const first = ring[0]\r\n const last = ring[ring.length - 1]\r\n if (ring.length > 1 && first[0] === last[0] && first[1] === last[1]) ring.pop()\r\n return ring\r\n}\r\n\r\n/**\r\n * Load a site's saved boundary ring from minio (via its attached geometry\r\n * file). Returns null if the site has no saved boundary or it can't be read.\r\n */\r\nexport const fetchSiteBoundaryRing = async (siteId: number): Promise<Ring | null> => {\r\n try {\r\n const res = await fetch(`/api/files/site/${siteId}`)\r\n if (!res.ok) return null\r\n const { files } = await res.json()\r\n const geomFile = (files ?? []).find((f: any) => f.tag === 'site-geometry' && f.url)\r\n ?? (files ?? []).find((f: any) =>\r\n (f.extension === 'geojson' || (f.mimeType && String(f.mimeType).includes('geo+json'))) && f.url)\r\n if (!geomFile?.url) return null\r\n const geo = await fetch(geomFile.url).then(r => r.json())\r\n return ringFromGeoJson(geo)\r\n }\r\n catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * (Over)write a site's GeoJSON object in minio under the given asset key.\r\n * Mirrors the presigned-upload flow used by FileAdder/DatasetAdder.\r\n */\r\nexport const uploadGeoJsonToAsset = async (\r\n assetId: string,\r\n ring: Ring,\r\n name: string,\r\n): Promise<void> => {\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 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"],"mappings":"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","names":["_a","_b","_c"]}
@@ -0,0 +1,13 @@
1
+ import { type Site } from '../../../../../../../types/dbTypes';
2
+ /**
3
+ * Shared "show site(s) on the map" action used by the sites table row menu and
4
+ * the "View All on Map" header button. It switches to the map viewer FIRST (so
5
+ * the action always navigates, even if a boundary fails to load), then loads
6
+ * each site's polygon GeoJSON from minio, hands it to the SiteLayer via the
7
+ * MapSites store, and fits the camera to the loaded boundaries. Sites without a
8
+ * saved boundary fall back to flying to their point.
9
+ */
10
+ export declare function useShowSitesOnMap(): (sites: Site[], opts?: {
11
+ switchViewer?: boolean;
12
+ }) => Promise<void>;
13
+ //# sourceMappingURL=useShowSitesOnMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShowSitesOnMap.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.ts"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAG3E;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,YAMQ,IAAI,EAAE,SAAS;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,mBAmDjF"}
@@ -0,0 +1,58 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { MapContext, useMenusContext, useMapSitesContext } from "../../../../../../../store";
4
+ import { ViewerNames } from "../../../../../../../types/dbTypes";
5
+ import { ringFromGeoJson, ringBounds } from "./siteGeometry";
6
+ function useShowSitesOnMap() {
7
+ const { dispatch: mapSitesDispatch } = useMapSitesContext();
8
+ const { dispatch: menusDispatch } = useMenusContext();
9
+ const { state: mapState } = React.useContext(MapContext);
10
+ const { map } = mapState.map;
11
+ return React.useCallback(async (sites, opts) => {
12
+ var _a;
13
+ if ((_a = opts == null ? void 0 : opts.switchViewer) != null ? _a : true) {
14
+ menusDispatch({ type: "SET_VIEWER", payload: { currentViewer: ViewerNames.map } });
15
+ }
16
+ const valid = sites.filter((s) => s == null ? void 0 : s.id);
17
+ const rings = await Promise.all(valid.map(async (site) => {
18
+ var _a2, _b;
19
+ try {
20
+ const res = await fetch(`/api/files/site/${site.id}`);
21
+ if (!res.ok) return null;
22
+ const { files } = await res.json();
23
+ const geomFile = (_a2 = (files != null ? files : []).find((f) => f.tag === "site-geometry" && f.url)) != null ? _a2 : (files != null ? files : []).find((f) => (f.extension === "geojson" || f.mimeType && String(f.mimeType).includes("geo+json")) && f.url);
24
+ if (!(geomFile == null ? void 0 : geomFile.url)) return null;
25
+ const geo = await fetch(geomFile.url).then((r) => r.json());
26
+ const ring = ringFromGeoJson(geo);
27
+ if (!ring) return null;
28
+ mapSitesDispatch({
29
+ type: "SHOW_SITE",
30
+ payload: {
31
+ site: {
32
+ id: site.id,
33
+ name: (_b = site.siteName) != null ? _b : "Site",
34
+ ring,
35
+ assetId: geomFile.assetId,
36
+ fileId: geomFile.id
37
+ }
38
+ }
39
+ });
40
+ return ring;
41
+ } catch (e) {
42
+ return null;
43
+ }
44
+ }));
45
+ if (!map) return;
46
+ const foundRings = rings.filter((r) => !!r);
47
+ if (foundRings.length > 0) {
48
+ map.fitBounds(ringBounds(foundRings.flat()), { padding: 60, duration: 1e3 });
49
+ } else {
50
+ const pt = valid.find((s) => typeof s.siteLongitude === "number" && typeof s.siteLatitude === "number");
51
+ if (pt) map.flyTo({ center: [pt.siteLongitude, pt.siteLatitude], zoom: 18, duration: 1e3 });
52
+ }
53
+ }, [map, mapSitesDispatch, menusDispatch]);
54
+ }
55
+ export {
56
+ useShowSitesOnMap
57
+ };
58
+ //# sourceMappingURL=useShowSitesOnMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.ts"],"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 { MapContext, useMenusContext, useMapSitesContext } from '../../../../../../../store'\r\nimport { ViewerNames, type Site } from '../../../../../../../types/dbTypes'\r\nimport { ringFromGeoJson, ringBounds, type Ring } from './siteGeometry'\r\n\r\n/**\r\n * Shared \"show site(s) on the map\" action used by the sites table row menu and\r\n * the \"View All on Map\" header button. It switches to the map viewer FIRST (so\r\n * the action always navigates, even if a boundary fails to load), then loads\r\n * each site's polygon GeoJSON from minio, hands it to the SiteLayer via the\r\n * MapSites store, and fits the camera to the loaded boundaries. Sites without a\r\n * saved boundary fall back to flying to their point.\r\n */\r\nexport function useShowSitesOnMap() {\r\n const { dispatch: mapSitesDispatch } = useMapSitesContext()\r\n const { dispatch: menusDispatch } = useMenusContext()\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { map } = mapState.map\r\n\r\n return React.useCallback(async (sites: Site[], opts?: { switchViewer?: boolean }) => {\r\n if (opts?.switchViewer ?? true) {\r\n menusDispatch({ type: 'SET_VIEWER', payload: { currentViewer: ViewerNames.map } })\r\n }\r\n\r\n const valid = sites.filter(s => s?.id)\r\n const rings = await Promise.all(valid.map(async (site): Promise<Ring | null> => {\r\n try {\r\n const res = await fetch(`/api/files/site/${site.id}`)\r\n if (!res.ok) return null\r\n const { files } = await res.json()\r\n // Prefer the file tagged as the site boundary; fall back to any geojson\r\n // attachment so older sites (saved before tagging) still resolve.\r\n const geomFile = (files ?? []).find((f: any) => f.tag === 'site-geometry' && f.url)\r\n ?? (files ?? []).find((f: any) =>\r\n (f.extension === 'geojson' || (f.mimeType && String(f.mimeType).includes('geo+json'))) && f.url)\r\n if (!geomFile?.url) return null\r\n const geo = await fetch(geomFile.url).then(r => r.json())\r\n const ring = ringFromGeoJson(geo)\r\n if (!ring) return null\r\n mapSitesDispatch({\r\n type: 'SHOW_SITE',\r\n payload: {\r\n site: {\r\n id: site.id,\r\n name: site.siteName ?? 'Site',\r\n ring,\r\n assetId: geomFile.assetId,\r\n fileId: geomFile.id,\r\n },\r\n },\r\n })\r\n return ring\r\n }\r\n catch {\r\n return null\r\n }\r\n }))\r\n\r\n if (!map) return\r\n const foundRings = rings.filter((r): r is Ring => !!r)\r\n if (foundRings.length > 0) {\r\n // Fit to the combined extent of every loaded boundary.\r\n map.fitBounds(ringBounds(foundRings.flat() as Ring), { padding: 60, duration: 1000 })\r\n }\r\n else {\r\n // No boundaries found — fly to the first site that has a point.\r\n const pt = valid.find(s => typeof s.siteLongitude === 'number' && typeof s.siteLatitude === 'number')\r\n if (pt) map.flyTo({ center: [pt.siteLongitude as number, pt.siteLatitude as number], zoom: 18, duration: 1000 })\r\n }\r\n }, [map, mapSitesDispatch, menusDispatch])\r\n}\r\n"],"mappings":";AAKA,YAAY,WAAW;AACvB,SAAS,YAAY,iBAAiB,0BAA0B;AAChE,SAAS,mBAA8B;AACvC,SAAS,iBAAiB,kBAA6B;AAUhD,SAAS,oBAAoB;AAClC,QAAM,EAAE,UAAU,iBAAiB,IAAI,mBAAmB;AAC1D,QAAM,EAAE,UAAU,cAAc,IAAI,gBAAgB;AACpD,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,IAAI,IAAI,SAAS;AAEzB,SAAO,MAAM,YAAY,OAAO,OAAe,SAAsC;AAxBvF;AAyBI,SAAI,kCAAM,iBAAN,YAAsB,MAAM;AAC9B,oBAAc,EAAE,MAAM,cAAc,SAAS,EAAE,eAAe,YAAY,IAAI,EAAE,CAAC;AAAA,IACnF;AAEA,UAAM,QAAQ,MAAM,OAAO,OAAK,uBAAG,EAAE;AACrC,UAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,SAA+B;AA9BpF,UAAAA,KAAA;AA+BM,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,mBAAmB,KAAK,EAAE,EAAE;AACpD,YAAI,CAAC,IAAI,GAAI,QAAO;AACpB,cAAM,EAAE,MAAM,IAAI,MAAM,IAAI,KAAK;AAGjC,cAAM,YAAYA,OAAA,wBAAS,CAAC,GAAG,KAAK,CAAC,MAAW,EAAE,QAAQ,mBAAmB,EAAE,GAAG,MAAhE,OAAAA,OACZ,wBAAS,CAAC,GAAG,KAAK,CAAC,OACpB,EAAE,cAAc,aAAc,EAAE,YAAY,OAAO,EAAE,QAAQ,EAAE,SAAS,UAAU,MAAO,EAAE,GAAG;AACnG,YAAI,EAAC,qCAAU,KAAK,QAAO;AAC3B,cAAM,MAAM,MAAM,MAAM,SAAS,GAAG,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC;AACxD,cAAM,OAAO,gBAAgB,GAAG;AAChC,YAAI,CAAC,KAAM,QAAO;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,cACJ,IAAI,KAAK;AAAA,cACT,OAAM,UAAK,aAAL,YAAiB;AAAA,cACvB;AAAA,cACA,SAAS,SAAS;AAAA,cAClB,QAAQ,SAAS;AAAA,YACnB;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT,SACM;AACJ,eAAO;AAAA,MACT;AAAA,IACF,CAAC,CAAC;AAEF,QAAI,CAAC,IAAK;AACV,UAAM,aAAa,MAAM,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AACrD,QAAI,WAAW,SAAS,GAAG;AAEzB,UAAI,UAAU,WAAW,WAAW,KAAK,CAAS,GAAG,EAAE,SAAS,IAAI,UAAU,IAAK,CAAC;AAAA,IACtF,OACK;AAEH,YAAM,KAAK,MAAM,KAAK,OAAK,OAAO,EAAE,kBAAkB,YAAY,OAAO,EAAE,iBAAiB,QAAQ;AACpG,UAAI,GAAI,KAAI,MAAM,EAAE,QAAQ,CAAC,GAAG,eAAyB,GAAG,YAAsB,GAAG,MAAM,IAAI,UAAU,IAAK,CAAC;AAAA,IACjH;AAAA,EACF,GAAG,CAAC,KAAK,kBAAkB,aAAa,CAAC;AAC3C;","names":["_a"]}
@@ -1,3 +1,8 @@
1
1
  import * as React from 'react';
2
- export declare function MapSidebar(): React.JSX.Element;
2
+ import { Organization } from '../../../../../types/dbTypes';
3
+ export declare function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }: {
4
+ minioBaseUrl?: string;
5
+ martinBaseUrl?: string;
6
+ organization?: Organization;
7
+ }): React.JSX.Element;
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,wBAAgB,UAAU,sBA2BzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,wBAAgB,UAAU,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,qBA4BvJ"}
@@ -9,7 +9,7 @@ import { SettingsTab } from "./src/SettingsTab";
9
9
  import { InfoSidebarContainer } from "../../../../../components/ui/InfoSidebar/Container";
10
10
  import { CommunicationTab } from "./src/CommunicationTab";
11
11
  import { SensorsTab } from "./src/SensorsTab";
12
- function MapSidebar() {
12
+ function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }) {
13
13
  const { ability } = usePermissions();
14
14
  const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext);
15
15
  const { selectedTab } = menusState.menus;
@@ -19,6 +19,7 @@ function MapSidebar() {
19
19
  return /* @__PURE__ */ jsxs(
20
20
  InfoSidebarContainer,
21
21
  {
22
+ organization,
22
23
  tabSelector: /* @__PURE__ */ jsx(
23
24
  TabSelector,
24
25
  {
@@ -28,10 +29,10 @@ function MapSidebar() {
28
29
  ),
29
30
  children: [
30
31
  selectedTab === "file" && ability.can("read", "File") && /* @__PURE__ */ jsx(FileTab, {}),
31
- selectedTab === "layers" && ability.can("read", "File") && /* @__PURE__ */ jsx(LayersTab, {}),
32
+ selectedTab === "layers" && ability.can("read", "File") && /* @__PURE__ */ jsx(LayersTab, { martinBaseUrl, organization }),
32
33
  selectedTab === "communication" && ability.can("read", "Comment") && /* @__PURE__ */ jsx(CommunicationTab, {}),
33
- selectedTab === "sensors" && ability.can("read", "Sensor") && /* @__PURE__ */ jsx(SensorsTab, {}),
34
- selectedTab === "settings" && /* @__PURE__ */ jsx(SettingsTab, {})
34
+ selectedTab === "sensors" && ability.can("read", "Sensor") && /* @__PURE__ */ jsx(SensorsTab, { minioBaseUrl }),
35
+ selectedTab === "settings" && /* @__PURE__ */ jsx(SettingsTab, { countryCode: organization == null ? void 0 : organization.country })
35
36
  ]
36
37
  }
37
38
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\n\r\nexport function MapSidebar() {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab />}\r\n {selectedTab === 'settings' && <SettingsTab />} \r\n </InfoSidebarContainer>\r\n )\r\n}"],"mappings":";AA6BI,SAEI,KAFJ;AAxBJ,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,sBAAsB;AAE7C,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAEpB,SAAS,aAAa;AAE3B,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,kBAAkB,CAACA,iBAAgC;AACvD,kBAAc,EAAE,MAAM,4BAA4B,SAAS,EAAE,aAAAA,aAAY,EAAE,CAAC;AAAA,EAC9E;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAmB;AAAA;AAAA,MACrB;AAAA,MAGD;AAAA,wBAAgB,UAAU,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,WAAQ;AAAA,QAClE,gBAAgB,YAAY,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,aAAU;AAAA,QACtE,gBAAgB,mBAAmB,QAAQ,IAAI,QAAQ,SAAS,KAAK,oBAAC,oBAAiB;AAAA,QACvF,gBAAgB,aAAa,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAC,cAAW;AAAA,QAC1E,gBAAgB,cAAc,oBAAC,eAAY;AAAA;AAAA;AAAA,EAC9C;AAEJ;","names":["selectedTab"]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/map/src/MapSidebar/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { TabSelector } from './TabSelector'\r\nimport { MenusContext, usePermissions } from '../../../../../store'\r\nimport { SidebarTabType } from '../../../../../store/Menus/reducer'\r\nimport { FileTab } from './src/FileTab'\r\nimport { LayersTab } from './src/LayersTab'\r\n\r\nimport { SettingsTab } from './src/SettingsTab'\r\nimport { InfoSidebarContainer } from '../../../../../components/ui/InfoSidebar/Container'\r\nimport { CommunicationTab } from './src/CommunicationTab'\r\nimport { SensorsTab } from './src/SensorsTab'\r\nimport { Organization } from '../../../../../types/dbTypes'\r\n\r\nexport function MapSidebar({ minioBaseUrl, martinBaseUrl, organization }: { minioBaseUrl?: string; martinBaseUrl?: string; organization?: Organization }) {\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { selectedTab } = menusState.menus\r\n\r\n const handleTabChange = (selectedTab: SidebarTabType) => {\r\n menusDispatch({ type: 'SET_SIDEBAR_SELECTED_TAB', payload: { selectedTab } })\r\n }\r\n\r\n return (\r\n <InfoSidebarContainer\r\n organization={organization}\r\n tabSelector={\r\n <TabSelector\r\n activeTab={selectedTab}\r\n onTabChangeAction={handleTabChange}\r\n />\r\n }\r\n >\r\n {selectedTab === 'file' && ability.can('read', 'File') && <FileTab />}\r\n {selectedTab === 'layers' && ability.can('read', 'File') && <LayersTab martinBaseUrl={martinBaseUrl} organization={organization} />}\r\n {selectedTab === 'communication' && ability.can('read', 'Comment') && <CommunicationTab />}\r\n {selectedTab === 'sensors' && ability.can('read', 'Sensor') && <SensorsTab minioBaseUrl={minioBaseUrl} />}\r\n {selectedTab === 'settings' && <SettingsTab countryCode={organization?.country} />}\r\n </InfoSidebarContainer>\r\n )\r\n}"],"mappings":";AA8BI,SAGI,KAHJ;AAzBJ,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,sBAAsB;AAE7C,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAGpB,SAAS,WAAW,EAAE,cAAc,eAAe,aAAa,GAAmF;AAExJ,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,kBAAkB,CAACA,iBAAgC;AACvD,kBAAc,EAAE,MAAM,4BAA4B,SAAS,EAAE,aAAAA,aAAY,EAAE,CAAC;AAAA,EAC9E;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAmB;AAAA;AAAA,MACrB;AAAA,MAGD;AAAA,wBAAgB,UAAU,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,WAAQ;AAAA,QAClE,gBAAgB,YAAY,QAAQ,IAAI,QAAQ,MAAM,KAAK,oBAAC,aAAU,eAA8B,cAA4B;AAAA,QAChI,gBAAgB,mBAAmB,QAAQ,IAAI,QAAQ,SAAS,KAAK,oBAAC,oBAAiB;AAAA,QACvF,gBAAgB,aAAa,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAC,cAAW,cAA4B;AAAA,QACtG,gBAAgB,cAAc,oBAAC,eAAY,aAAa,6CAAc,SAAS;AAAA;AAAA;AAAA,EAClF;AAEJ;","names":["selectedTab"]}
@@ -1,3 +1,7 @@
1
1
  import * as React from 'react';
2
- export declare function LayersTab(): React.JSX.Element;
2
+ import { Organization } from '../../../../../../../types/dbTypes';
3
+ export declare function LayersTab({ martinBaseUrl, organization }: {
4
+ martinBaseUrl?: string;
5
+ organization?: Organization;
6
+ }): React.JSX.Element;
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAyF9B,wBAAgB,SAAS,sBAwJxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAgB,YAAY,EAAE,MAAM,oCAAoC,CAAA;AA+E/E,wBAAgB,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,qBAuJjH"}
@@ -3,7 +3,6 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { usePathname } from "next/navigation";
5
5
  import { DatasetsContext, MenusContext, useMapContext } from "../../../../../../../store";
6
- import { useAppConfigContext } from "../../../../../../../store/AppConfig/context";
7
6
  import {
8
7
  useOpenDataPortalsByCountrySubdivision,
9
8
  useOpenDataPortalsByGroup,
@@ -74,14 +73,13 @@ function sanitizeDatasets(list) {
74
73
  });
75
74
  return filtered.sort((a, b) => (a.name || "").localeCompare(b.name || ""));
76
75
  }
77
- function LayersTab() {
76
+ function LayersTab({ martinBaseUrl, organization }) {
78
77
  var _a, _b, _c, _d;
79
78
  const [searchQuery, setSearchQuery] = React.useState("");
80
79
  const [favourites, setFavourites] = React.useState([]);
81
80
  const { state: mapState } = useMapContext();
82
81
  const { currentLocation } = mapState.map;
83
- const { state: appConfigState } = useAppConfigContext();
84
- const org = appConfigState.appConfig.organization;
82
+ const org = organization;
85
83
  const orgCountry = ((org == null ? void 0 : org.country) || "").toUpperCase();
86
84
  const municipality = (_b = (_a = currentLocation == null ? void 0 : currentLocation.municipality) != null ? _a : org == null ? void 0 : org.municipality) != null ? _b : null;
87
85
  const countrySubdivision = (_d = (_c = currentLocation == null ? void 0 : currentLocation.countrySubdivision) != null ? _c : org == null ? void 0 : org.countrySubdivision) != null ? _d : null;
@@ -118,11 +116,10 @@ function LayersTab() {
118
116
  const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage });
119
117
  React.useEffect(() => {
120
118
  const loadOrganizationalDatasets = async () => {
121
- var _a2;
122
119
  try {
123
- const martinBaseUrl = (_a2 = appConfigState.runtimeConfig.martinUrl) == null ? void 0 : _a2.replace(/\/+$/, "");
124
- if (!martinBaseUrl) return;
125
- const datasetsUrl = martinBaseUrl.includes("/tiles/index.json") ? martinBaseUrl : `${martinBaseUrl}/tiles/index.json`;
120
+ const martinBaseUrlClean = (martinBaseUrl != null ? martinBaseUrl : "").replace(/\/+$/, "");
121
+ if (!martinBaseUrlClean) return;
122
+ const datasetsUrl = martinBaseUrlClean.includes("/tiles/index.json") ? martinBaseUrlClean : `${martinBaseUrlClean}/tiles/index.json`;
126
123
  const localPortal = {
127
124
  id: -1,
128
125
  name: "Organizational Datasets",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../../../../store'\r\nimport { useAppConfigContext } from '../../../../../../../store/AppConfig/context'\r\nimport {\r\n useOpenDataPortalsByCountrySubdivision,\r\n useOpenDataPortalsByGroup,\r\n useOpenDataPortalsByMunicipality,\r\n} from '../../../../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetGroup } from '../../../../../../../types/dbTypes'\r\nimport type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { useDatasetsForPortals } from '../../../../datasets/src/useDatasetsForPortals'\r\nimport { fetchLocalDatasets } from '../../../../datasets/src/localDatasets'\r\nimport { SearchInput } from '../../../../../../ui'\r\nimport { AppliedDatasetsSection } from './src/AppliedDatasetsSection'\r\nimport { AvailableDatasetsSection } from './src/AvailableDatasetsSection'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return { isAdmin: true, currentOrgId: 1, allowedOrgIds: ADMIN_ALLOWED_ORGS }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n return { isAdmin: false, currentOrgId, allowedOrgIds: Array.from(new Set([2, currentOrgId])) }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\nconst BLOCKLIST_URLS = [\r\n '/2021_statistics_canada_boundaries/featureserver',\r\n '/limites_du_recensement_de_statistique_canada_(2021)/featureserver',\r\n]\r\nconst BLOCKLIST_NAMES = [\r\n '2021 statistics canada boundaries',\r\n 'limites du recensement de statistique canada (2021)',\r\n]\r\n\r\nfunction isBlocklisted(ds: Dataset) {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return BLOCKLIST_URLS.some(u => url.includes(u)) || BLOCKLIST_NAMES.some(n => name.includes(n))\r\n}\r\n\r\nfunction sanitizeDatasets(list: Dataset[]) {\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of list) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) uniqueByName.set(name, ds)\r\n }\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding') && !isBlocklisted(ds)\r\n })\r\n return filtered.sort((a, b) => (a.name || '').localeCompare(b.name || ''))\r\n}\r\n\r\nexport function LayersTab() {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const [favourites, setFavourites] = React.useState<Dataset[]>([])\r\n\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const { state: appConfigState } = useAppConfigContext()\r\n const org = appConfigState.appConfig.organization\r\n const orgCountry = (org?.country || '').toUpperCase()\r\n\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true\r\n if (!portalCountry) return true\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(\r\n () => (Array.isArray(municipalPortals) ? municipalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [municipalPortals, matchesOrgCountry],\r\n )\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(\r\n () => (Array.isArray(nationalPortals) ? nationalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [nationalPortals, matchesOrgCountry],\r\n )\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n try {\r\n const martinBaseUrl = appConfigState.runtimeConfig.martinUrl?.replace(/\\/+$/, '')\r\n if (!martinBaseUrl) return\r\n\r\n const datasetsUrl = martinBaseUrl.includes('/tiles/index.json')\r\n ? martinBaseUrl\r\n : `${martinBaseUrl}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n const organizationalDatasets = await fetchLocalDatasets(localPortal as any)\r\n const visible = organizationalDatasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n if (visible.length > 0) {\r\n datasetDispatch({ type: 'SET_DATASETS', payload: { datasets: visible } })\r\n }\r\n }\r\n catch (error) {\r\n console.error('Failed to load organizational datasets:', error)\r\n }\r\n }\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility])\r\n\r\n const nationalDatasets = React.useMemo(\r\n () => sanitizeDatasets(national.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [national.datasets, orgVisibility],\r\n )\r\n const subdivisionDatasets = React.useMemo(\r\n () => sanitizeDatasets(subdivision.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [subdivision.datasets, orgVisibility],\r\n )\r\n const municipalDatasets = React.useMemo(\r\n () => sanitizeDatasets(municipal.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [municipal.datasets, orgVisibility],\r\n )\r\n const orgDatasets = React.useMemo(\r\n () => sanitizeDatasets((datasetState.datasets.datasets || []).filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [datasetState.datasets.datasets, orgVisibility],\r\n )\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const combined = [...nationalDatasets, ...subdivisionDatasets, ...municipalDatasets, ...orgDatasets]\r\n return sanitizeDatasets(combined)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, orgDatasets])\r\n\r\n const liveDatasets = React.useMemo(\r\n () => allDatasets.filter(ds => ds.portal?.live === true),\r\n [allDatasets],\r\n )\r\n\r\n const toggleFavourite = React.useCallback((dataset: Dataset) => {\r\n setFavourites(prev => (\r\n prev.some(f => f.name === dataset.name)\r\n ? prev.filter(f => f.name !== dataset.name)\r\n : [...prev, dataset]\r\n ))\r\n }, [])\r\n\r\n const showMunicipal = Boolean(municipality)\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 overflow-y-auto space-y-2 divide-y\">\r\n <div className=\"pb-2\">\r\n <AppliedDatasetsSection />\r\n </div>\r\n <div className=\"pt-2\">\r\n <AvailableDatasetsSection\r\n query={searchQuery}\r\n allDatasets={allDatasets}\r\n nationalDatasets={nationalDatasets}\r\n subdivisionDatasets={subdivisionDatasets}\r\n municipalDatasets={municipalDatasets}\r\n organizationalDatasets={orgDatasets}\r\n liveDatasets={liveDatasets}\r\n showMunicipal={showMunicipal}\r\n favourites={favourites}\r\n onFavouriteToggle={toggleFavourite}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { usePathname } from 'next/navigation'\r\n\r\nimport { DatasetsContext, MenusContext, useMapContext } from '../../../../../../../store'\r\n// import { useAppConfigContext } from '../../../../../../../store/AppConfig/context'\r\nimport {\r\n useOpenDataPortalsByCountrySubdivision,\r\n useOpenDataPortalsByGroup,\r\n useOpenDataPortalsByMunicipality,\r\n} from '../../../../../../../hooks/openDataPortals/openDataPortals'\r\nimport { DatasetGroup, Organization } from '../../../../../../../types/dbTypes'\r\nimport type { Dataset } from '../../../../../../../types/datasetTypes'\r\nimport { useDatasetsForPortals } from '../../../../datasets/src/useDatasetsForPortals'\r\nimport { fetchLocalDatasets } from '../../../../datasets/src/localDatasets'\r\nimport { SearchInput } from '../../../../../../ui'\r\nimport { AppliedDatasetsSection } from './src/AppliedDatasetsSection'\r\nimport { AvailableDatasetsSection } from './src/AvailableDatasetsSection'\r\n\r\ntype OrgVisibility = {\r\n isAdmin: boolean\r\n currentOrgId: number\r\n allowedOrgIds: number[]\r\n}\r\n\r\nconst ADMIN_ALLOWED_ORGS = [1, 2, 3, 4, 5, 6]\r\nconst ORG_BY_PATH_PREFIX: Record<string, number> = {\r\n '/envirocentre': 1,\r\n '/dnd': 3,\r\n '/canada': 4,\r\n '/gac': 5,\r\n '/carleton': 6,\r\n}\r\n\r\nfunction normalizeOrgId(org?: number | string | null) {\r\n if (org === null || org === undefined) return undefined\r\n const parsed = typeof org === 'number' ? org : Number.parseInt(String(org), 10)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\nfunction getOrgVisibilityFromPath(pathname?: string | null): OrgVisibility {\r\n const normalizedPath = (pathname || '').toLowerCase()\r\n const firstSegment = normalizedPath.split('/').filter(Boolean)[0]\r\n const prefix = firstSegment ? `/${firstSegment}` : ''\r\n\r\n if (prefix === '/cdt') {\r\n return { isAdmin: true, currentOrgId: 1, allowedOrgIds: ADMIN_ALLOWED_ORGS }\r\n }\r\n\r\n const currentOrgId = ORG_BY_PATH_PREFIX[prefix] ?? 2\r\n return { isAdmin: false, currentOrgId, allowedOrgIds: Array.from(new Set([2, currentOrgId])) }\r\n}\r\n\r\nfunction datasetVisibleForOrg(dataset: Dataset, visibility: OrgVisibility) {\r\n if (visibility.isAdmin) return true\r\n if (dataset.group !== DatasetGroup.Organizational) return true\r\n const orgId = normalizeOrgId(dataset.organization)\r\n if (orgId === undefined) return false\r\n return visibility.allowedOrgIds.includes(orgId)\r\n}\r\n\r\nconst BLOCKLIST_URLS = [\r\n '/2021_statistics_canada_boundaries/featureserver',\r\n '/limites_du_recensement_de_statistique_canada_(2021)/featureserver',\r\n]\r\nconst BLOCKLIST_NAMES = [\r\n '2021 statistics canada boundaries',\r\n 'limites du recensement de statistique canada (2021)',\r\n]\r\n\r\nfunction isBlocklisted(ds: Dataset) {\r\n const url = (ds.url || '').toLowerCase()\r\n const name = (ds.name || '').toLowerCase()\r\n return BLOCKLIST_URLS.some(u => url.includes(u)) || BLOCKLIST_NAMES.some(n => name.includes(n))\r\n}\r\n\r\nfunction sanitizeDatasets(list: Dataset[]) {\r\n const uniqueByName = new Map<string, Dataset>()\r\n for (const ds of list) {\r\n const name = ds.name?.toLowerCase() || ''\r\n if (!uniqueByName.has(name)) uniqueByName.set(name, ds)\r\n }\r\n const filtered = [...uniqueByName.values()].filter((ds) => {\r\n const name = ds.name?.toLowerCase() || ''\r\n const type = ds.type?.toLowerCase() || ''\r\n return !name.includes('basemap') && !type.includes('geocoding') && !isBlocklisted(ds)\r\n })\r\n return filtered.sort((a, b) => (a.name || '').localeCompare(b.name || ''))\r\n}\r\n\r\nexport function LayersTab({ martinBaseUrl, organization }: { martinBaseUrl?: string; organization?: Organization }) {\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const [favourites, setFavourites] = React.useState<Dataset[]>([])\r\n\r\n const { state: mapState } = useMapContext()\r\n const { currentLocation } = mapState.map\r\n const org = organization\r\n const orgCountry = (org?.country || '').toUpperCase()\r\n\r\n const municipality = currentLocation?.municipality ?? org?.municipality ?? null\r\n const countrySubdivision = currentLocation?.countrySubdivision ?? org?.countrySubdivision ?? null\r\n\r\n const { state: datasetState, dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { rowsPerPage } = menusState.menus\r\n\r\n const pathname = usePathname()\r\n const orgVisibility = React.useMemo(() => getOrgVisibilityFromPath(pathname), [pathname])\r\n\r\n const { openDataPortals: municipalPortals } = useOpenDataPortalsByMunicipality(municipality)\r\n const { openDataPortals: subdivisionPortals } = useOpenDataPortalsByCountrySubdivision(countrySubdivision)\r\n const { openDataPortals: nationalPortals } = useOpenDataPortalsByGroup(DatasetGroup.National)\r\n\r\n const matchesOrgCountry = React.useCallback(\r\n (portalCountry: string | null | undefined) => {\r\n if (!orgCountry) return true\r\n if (!portalCountry) return true\r\n return portalCountry.toUpperCase() === orgCountry\r\n },\r\n [orgCountry],\r\n )\r\n\r\n const filteredMunicipalPortals = React.useMemo(\r\n () => (Array.isArray(municipalPortals) ? municipalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [municipalPortals, matchesOrgCountry],\r\n )\r\n const filteredSubdivisionPortals = React.useMemo(\r\n () => (Array.isArray(subdivisionPortals)\r\n ? subdivisionPortals.filter(p => p.municipality == null && matchesOrgCountry(p.country))\r\n : []),\r\n [subdivisionPortals, matchesOrgCountry],\r\n )\r\n const filteredNationalPortals = React.useMemo(\r\n () => (Array.isArray(nationalPortals) ? nationalPortals.filter(p => matchesOrgCountry(p.country)) : []),\r\n [nationalPortals, matchesOrgCountry],\r\n )\r\n\r\n const municipal = useDatasetsForPortals(filteredMunicipalPortals, { rowsPerPage })\r\n const subdivision = useDatasetsForPortals(filteredSubdivisionPortals, { rowsPerPage })\r\n const national = useDatasetsForPortals(filteredNationalPortals, { rowsPerPage })\r\n\r\n React.useEffect(() => {\r\n const loadOrganizationalDatasets = async () => {\r\n try {\r\n const martinBaseUrlClean = (martinBaseUrl ?? '').replace(/\\/+$/, '')\r\n if (!martinBaseUrlClean) return\r\n\r\n const datasetsUrl = martinBaseUrlClean.includes('/tiles/index.json')\r\n ? martinBaseUrlClean\r\n : `${martinBaseUrlClean}/tiles/index.json`\r\n\r\n const localPortal = {\r\n id: -1,\r\n name: 'Organizational Datasets',\r\n apiUrl: datasetsUrl,\r\n dataManagementSystem: 'Other' as const,\r\n countrySubdivision: null,\r\n municipality: null,\r\n group: 'Organizational' as const,\r\n }\r\n\r\n const organizationalDatasets = await fetchLocalDatasets(localPortal as any)\r\n const visible = organizationalDatasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))\r\n if (visible.length > 0) {\r\n datasetDispatch({ type: 'SET_DATASETS', payload: { datasets: visible } })\r\n }\r\n }\r\n catch (error) {\r\n console.error('Failed to load organizational datasets:', error)\r\n }\r\n }\r\n loadOrganizationalDatasets()\r\n }, [datasetDispatch, orgVisibility])\r\n\r\n const nationalDatasets = React.useMemo(\r\n () => sanitizeDatasets(national.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [national.datasets, orgVisibility],\r\n )\r\n const subdivisionDatasets = React.useMemo(\r\n () => sanitizeDatasets(subdivision.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [subdivision.datasets, orgVisibility],\r\n )\r\n const municipalDatasets = React.useMemo(\r\n () => sanitizeDatasets(municipal.datasets.filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [municipal.datasets, orgVisibility],\r\n )\r\n const orgDatasets = React.useMemo(\r\n () => sanitizeDatasets((datasetState.datasets.datasets || []).filter(ds => datasetVisibleForOrg(ds, orgVisibility))),\r\n [datasetState.datasets.datasets, orgVisibility],\r\n )\r\n\r\n const allDatasets = React.useMemo(() => {\r\n const combined = [...nationalDatasets, ...subdivisionDatasets, ...municipalDatasets, ...orgDatasets]\r\n return sanitizeDatasets(combined)\r\n }, [nationalDatasets, subdivisionDatasets, municipalDatasets, orgDatasets])\r\n\r\n const liveDatasets = React.useMemo(\r\n () => allDatasets.filter(ds => ds.portal?.live === true),\r\n [allDatasets],\r\n )\r\n\r\n const toggleFavourite = React.useCallback((dataset: Dataset) => {\r\n setFavourites(prev => (\r\n prev.some(f => f.name === dataset.name)\r\n ? prev.filter(f => f.name !== dataset.name)\r\n : [...prev, dataset]\r\n ))\r\n }, [])\r\n\r\n const showMunicipal = Boolean(municipality)\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 py-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder=\"Search...\"\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <div className=\"flex-1 min-h-0 overflow-y-auto space-y-2 divide-y\">\r\n <div className=\"pb-2\">\r\n <AppliedDatasetsSection />\r\n </div>\r\n <div className=\"pt-2\">\r\n <AvailableDatasetsSection\r\n query={searchQuery}\r\n allDatasets={allDatasets}\r\n nationalDatasets={nationalDatasets}\r\n subdivisionDatasets={subdivisionDatasets}\r\n municipalDatasets={municipalDatasets}\r\n organizationalDatasets={orgDatasets}\r\n liveDatasets={liveDatasets}\r\n showMunicipal={showMunicipal}\r\n favourites={favourites}\r\n onFavouriteToggle={toggleFavourite}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA0NQ,cAMF,YANE;AArNR,YAAY,WAAW;AACvB,SAAS,mBAAmB;AAE5B,SAAS,iBAAiB,cAAc,qBAAqB;AAE7D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAkC;AAE3C,SAAS,6BAA6B;AACtC,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AACvC,SAAS,gCAAgC;AAQzC,MAAM,qBAAqB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,MAAM,qBAA6C;AAAA,EACjD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,SAAS,eAAe,KAA8B;AACpD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,QAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,OAAO,SAAS,OAAO,GAAG,GAAG,EAAE;AAC9E,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,yBAAyB,UAAyC;AA5C3E;AA6CE,QAAM,kBAAkB,YAAY,IAAI,YAAY;AACpD,QAAM,eAAe,eAAe,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AAChE,QAAM,SAAS,eAAe,IAAI,YAAY,KAAK;AAEnD,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,SAAS,MAAM,cAAc,GAAG,eAAe,mBAAmB;AAAA,EAC7E;AAEA,QAAM,gBAAe,wBAAmB,MAAM,MAAzB,YAA8B;AACnD,SAAO,EAAE,SAAS,OAAO,cAAc,eAAe,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;AAC/F;AAEA,SAAS,qBAAqB,SAAkB,YAA2B;AACzE,MAAI,WAAW,QAAS,QAAO;AAC/B,MAAI,QAAQ,UAAU,aAAa,eAAgB,QAAO;AAC1D,QAAM,QAAQ,eAAe,QAAQ,YAAY;AACjD,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,WAAW,cAAc,SAAS,KAAK;AAChD;AAEA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AACF;AACA,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AACF;AAEA,SAAS,cAAc,IAAa;AAClC,QAAM,OAAO,GAAG,OAAO,IAAI,YAAY;AACvC,QAAM,QAAQ,GAAG,QAAQ,IAAI,YAAY;AACzC,SAAO,eAAe,KAAK,OAAK,IAAI,SAAS,CAAC,CAAC,KAAK,gBAAgB,KAAK,OAAK,KAAK,SAAS,CAAC,CAAC;AAChG;AAEA,SAAS,iBAAiB,MAAiB;AAhF3C;AAiFE,QAAM,eAAe,oBAAI,IAAqB;AAC9C,aAAW,MAAM,MAAM;AACrB,UAAM,SAAO,QAAG,SAAH,mBAAS,kBAAiB;AACvC,QAAI,CAAC,aAAa,IAAI,IAAI,EAAG,cAAa,IAAI,MAAM,EAAE;AAAA,EACxD;AACA,QAAM,WAAW,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO;AAtF7D,QAAAA,KAAA;AAuFI,UAAM,SAAOA,MAAA,GAAG,SAAH,gBAAAA,IAAS,kBAAiB;AACvC,UAAM,SAAO,QAAG,SAAH,mBAAS,kBAAiB;AACvC,WAAO,CAAC,KAAK,SAAS,SAAS,KAAK,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,cAAc,EAAE;AAAA,EACtF,CAAC;AACD,SAAO,SAAS,KAAK,CAAC,GAAG,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC3E;AAEO,SAAS,UAAU,EAAE,eAAe,aAAa,GAA4D;AA9FpH;AA+FE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAoB,CAAC,CAAC;AAEhE,QAAM,EAAE,OAAO,SAAS,IAAI,cAAc;AAC1C,QAAM,EAAE,gBAAgB,IAAI,SAAS;AACrC,QAAM,MAAM;AACZ,QAAM,eAAc,2BAAK,YAAW,IAAI,YAAY;AAEpD,QAAM,gBAAe,8DAAiB,iBAAjB,YAAiC,2BAAK,iBAAtC,YAAsD;AAC3E,QAAM,sBAAqB,8DAAiB,uBAAjB,YAAuC,2BAAK,uBAA5C,YAAkE;AAE7F,QAAM,EAAE,OAAO,cAAc,UAAU,gBAAgB,IAAI,MAAM,WAAW,eAAe;AAC3F,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,YAAY,IAAI,WAAW;AAEnC,QAAM,WAAW,YAAY;AAC7B,QAAM,gBAAgB,MAAM,QAAQ,MAAM,yBAAyB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAExF,QAAM,EAAE,iBAAiB,iBAAiB,IAAI,iCAAiC,YAAY;AAC3F,QAAM,EAAE,iBAAiB,mBAAmB,IAAI,uCAAuC,kBAAkB;AACzG,QAAM,EAAE,iBAAiB,gBAAgB,IAAI,0BAA0B,aAAa,QAAQ;AAE5F,QAAM,oBAAoB,MAAM;AAAA,IAC9B,CAAC,kBAA6C;AAC5C,UAAI,CAAC,WAAY,QAAO;AACxB,UAAI,CAAC,cAAe,QAAO;AAC3B,aAAO,cAAc,YAAY,MAAM;AAAA,IACzC;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,MAAO,MAAM,QAAQ,gBAAgB,IAAI,iBAAiB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;AAAA,IACvG,CAAC,kBAAkB,iBAAiB;AAAA,EACtC;AACA,QAAM,6BAA6B,MAAM;AAAA,IACvC,MAAO,MAAM,QAAQ,kBAAkB,IACnC,mBAAmB,OAAO,OAAK,EAAE,gBAAgB,QAAQ,kBAAkB,EAAE,OAAO,CAAC,IACrF,CAAC;AAAA,IACL,CAAC,oBAAoB,iBAAiB;AAAA,EACxC;AACA,QAAM,0BAA0B,MAAM;AAAA,IACpC,MAAO,MAAM,QAAQ,eAAe,IAAI,gBAAgB,OAAO,OAAK,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;AAAA,IACrG,CAAC,iBAAiB,iBAAiB;AAAA,EACrC;AAEA,QAAM,YAAY,sBAAsB,0BAA0B,EAAE,YAAY,CAAC;AACjF,QAAM,cAAc,sBAAsB,4BAA4B,EAAE,YAAY,CAAC;AACrF,QAAM,WAAW,sBAAsB,yBAAyB,EAAE,YAAY,CAAC;AAE/E,QAAM,UAAU,MAAM;AACpB,UAAM,6BAA6B,YAAY;AAC7C,UAAI;AACF,cAAM,sBAAsB,wCAAiB,IAAI,QAAQ,QAAQ,EAAE;AACnE,YAAI,CAAC,mBAAoB;AAEzB,cAAM,cAAc,mBAAmB,SAAS,mBAAmB,IAC/D,qBACA,GAAG,kBAAkB;AAEzB,cAAM,cAAc;AAAA,UAClB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,sBAAsB;AAAA,UACtB,oBAAoB;AAAA,UACpB,cAAc;AAAA,UACd,OAAO;AAAA,QACT;AAEA,cAAM,yBAAyB,MAAM,mBAAmB,WAAkB;AAC1E,cAAM,UAAU,uBAAuB,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC;AAC3F,YAAI,QAAQ,SAAS,GAAG;AACtB,0BAAgB,EAAE,MAAM,gBAAgB,SAAS,EAAE,UAAU,QAAQ,EAAE,CAAC;AAAA,QAC1E;AAAA,MACF,SACO,OAAO;AACZ,gBAAQ,MAAM,2CAA2C,KAAK;AAAA,MAChE;AAAA,IACF;AACA,+BAA2B;AAAA,EAC7B,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,mBAAmB,MAAM;AAAA,IAC7B,MAAM,iBAAiB,SAAS,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IAC9F,CAAC,SAAS,UAAU,aAAa;AAAA,EACnC;AACA,QAAM,sBAAsB,MAAM;AAAA,IAChC,MAAM,iBAAiB,YAAY,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IACjG,CAAC,YAAY,UAAU,aAAa;AAAA,EACtC;AACA,QAAM,oBAAoB,MAAM;AAAA,IAC9B,MAAM,iBAAiB,UAAU,SAAS,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IAC/F,CAAC,UAAU,UAAU,aAAa;AAAA,EACpC;AACA,QAAM,cAAc,MAAM;AAAA,IACxB,MAAM,kBAAkB,aAAa,SAAS,YAAY,CAAC,GAAG,OAAO,QAAM,qBAAqB,IAAI,aAAa,CAAC,CAAC;AAAA,IACnH,CAAC,aAAa,SAAS,UAAU,aAAa;AAAA,EAChD;AAEA,QAAM,cAAc,MAAM,QAAQ,MAAM;AACtC,UAAM,WAAW,CAAC,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,mBAAmB,GAAG,WAAW;AACnG,WAAO,iBAAiB,QAAQ;AAAA,EAClC,GAAG,CAAC,kBAAkB,qBAAqB,mBAAmB,WAAW,CAAC;AAE1E,QAAM,eAAe,MAAM;AAAA,IACzB,MAAM,YAAY,OAAO,QAAG;AAzMhC,UAAAA;AAyMmC,eAAAA,MAAA,GAAG,WAAH,gBAAAA,IAAW,UAAS;AAAA,KAAI;AAAA,IACvD,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,kBAAkB,MAAM,YAAY,CAAC,YAAqB;AAC9D,kBAAc,UACZ,KAAK,KAAK,OAAK,EAAE,SAAS,QAAQ,IAAI,IAClC,KAAK,OAAO,OAAK,EAAE,SAAS,QAAQ,IAAI,IACxC,CAAC,GAAG,MAAM,OAAO,CACtB;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,QAAQ,YAAY;AAE1C,SACE,qBAAC,SAAI,WAAU,uDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA,qBAAC,SAAI,WAAU,qDACb;AAAA,0BAAC,SAAI,WAAU,QACb,8BAAC,0BAAuB,GAC1B;AAAA,MACA,oBAAC,SAAI,WAAU,QACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAwB;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA,mBAAmB;AAAA;AAAA,MACrB,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["_a"]}
@@ -5,5 +5,7 @@ export interface FileItem {
5
5
  icon: React.ElementType;
6
6
  visible: boolean;
7
7
  }
8
- export declare function SensorsTab(): React.JSX.Element;
8
+ export declare function SensorsTab({ minioBaseUrl }: {
9
+ minioBaseUrl?: string;
10
+ }): React.JSX.Element;
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,UAAU,sBAMzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,CAAC,WAAW,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,qBAMrE"}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { SensorsSection } from "../../../../../../ui/Sensors/SensorsSection";
4
- function SensorsTab() {
5
- return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col space-y-6 py-4 overflow-hidden", children: /* @__PURE__ */ jsx(SensorsSection, {}) });
4
+ function SensorsTab({ minioBaseUrl }) {
5
+ return /* @__PURE__ */ jsx("div", { className: "flex-1 flex flex-col space-y-6 py-4 overflow-hidden", children: /* @__PURE__ */ jsx(SensorsSection, { minioBaseUrl }) });
6
6
  }
7
7
  export {
8
8
  SensorsTab
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { SensorsSection } from '../../../../../../ui/Sensors/SensorsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function SensorsTab() {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <SensorsSection />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAiBM;AAVN,SAAS,sBAAsB;AAOxB,SAAS,aAAa;AAC3B,SACE,oBAAC,SAAI,WAAU,uDACb,8BAAC,kBAAe,GAClB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\nimport { SensorsSection } from '../../../../../../ui/Sensors/SensorsSection'\r\nexport interface FileItem {\r\n task: DbFile\r\n icon: React.ElementType\r\n visible: boolean\r\n}\r\n\r\nexport function SensorsTab({ minioBaseUrl }: { minioBaseUrl?: string }) {\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 py-4 overflow-hidden\">\r\n <SensorsSection minioBaseUrl={minioBaseUrl} />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAiBM;AAVN,SAAS,sBAAsB;AAOxB,SAAS,WAAW,EAAE,aAAa,GAA8B;AACtE,SACE,oBAAC,SAAI,WAAU,uDACb,8BAAC,kBAAe,cAA4B,GAC9C;AAEJ;","names":[]}
@@ -1,3 +1,5 @@
1
1
  import * as React from "react";
2
- export declare function SettingsTab(): React.JSX.Element;
2
+ export declare function SettingsTab({ countryCode }: {
3
+ countryCode?: string;
4
+ }): React.JSX.Element;
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,WAAW,sBAO1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,WAAW,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,qBAOpE"}
@@ -2,10 +2,10 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { LocationSettings } from "./src/LocationSettings";
4
4
  import { MapCustomization } from "./src/MapCustomization";
5
- function SettingsTab() {
5
+ function SettingsTab({ countryCode }) {
6
6
  return /* @__PURE__ */ jsxs("div", { className: "w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point", children: [
7
7
  /* @__PURE__ */ jsx(MapCustomization, {}),
8
- /* @__PURE__ */ jsx(LocationSettings, {})
8
+ /* @__PURE__ */ jsx(LocationSettings, { countryCode })
9
9
  ] });
10
10
  }
11
11
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { LocationSettings } from './src/LocationSettings';\r\nimport { MapCustomization } from './src/MapCustomization';\r\n\r\nexport function SettingsTab() {\r\n return (\r\n <div className=\"w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point\">\r\n <MapCustomization />\r\n <LocationSettings />\r\n </div>\r\n )\r\n}"],"mappings":";AAWI,SACE,KADF;AALJ,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,cAAc;AAC5B,SACE,qBAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,oBAAiB;AAAA,IAClB,oBAAC,oBAAiB;AAAA,KACpB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from \"react\";\r\nimport { LocationSettings } from './src/LocationSettings';\r\nimport { MapCustomization } from './src/MapCustomization';\r\n\r\nexport function SettingsTab({ countryCode }: { countryCode?: string }) {\r\n return (\r\n <div className=\"w-full h-full flex flex-col gap-6 p-4 overflow-y-auto point\">\r\n <MapCustomization />\r\n <LocationSettings countryCode={countryCode} />\r\n </div>\r\n )\r\n}"],"mappings":";AAWI,SACE,KADF;AALJ,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,YAAY,EAAE,YAAY,GAA6B;AACrE,SACE,qBAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,oBAAiB;AAAA,IAClB,oBAAC,oBAAiB,aAA0B;AAAA,KAC9C;AAEJ;","names":[]}
@@ -1,3 +1,5 @@
1
1
  import * as React from "react";
2
- export declare function LocationSettings(): React.JSX.Element;
2
+ export declare function LocationSettings({ countryCode }: {
3
+ countryCode?: string;
4
+ }): React.JSX.Element;
3
5
  //# sourceMappingURL=LocationSettings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocationSettings.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,wBAAgB,gBAAgB,sBAkU/B"}
1
+ {"version":3,"file":"LocationSettings.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,qBAiUzE"}
@@ -23,19 +23,16 @@ import * as React from "react";
23
23
  import { useTranslations } from "next-intl";
24
24
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../../../../../../ui/Select";
25
25
  import { MapContext } from "../../../../../../../../store";
26
- import { useAppConfigContext } from "../../../../../../../../store/AppConfig/context";
27
26
  import { Input, CollapsibleSection } from "../../../../../../../ui/";
28
27
  import { useState } from "react";
29
- function LocationSettings() {
30
- var _a;
28
+ function LocationSettings({ countryCode }) {
31
29
  const [municipalityInput, setMunicipalityInput] = useState("");
32
30
  const [municipalitySuggestions, setMunicipalitySuggestions] = useState([]);
33
31
  const [showSuggestions, setShowSuggestions] = useState(false);
34
32
  const t = useTranslations("SettingsTab");
35
33
  const { dispatch: mapDispatch, state: mapState } = React.useContext(MapContext);
36
34
  const { currentLocation, map, countrySubdivisionsData } = mapState.map;
37
- const { state: appConfigState } = useAppConfigContext();
38
- const orgCountryCode = (((_a = appConfigState.appConfig.organization) == null ? void 0 : _a.country) || "CA").toLowerCase();
35
+ const orgCountryCode = (countryCode || "CA").toLowerCase();
39
36
  const [currentLat, setCurrentLat] = React.useState();
40
37
  const [currentLng, setCurrentLng] = React.useState();
41
38
  const [currentZoom, setCurrentZoom] = React.useState();
@@ -286,8 +283,8 @@ function LocationSettings() {
286
283
  children: [
287
284
  /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("selectCountrySubdivision") }) }),
288
285
  /* @__PURE__ */ jsx(SelectContent, { children: Object.entries(countrySubdivisionsData != null ? countrySubdivisionsData : {}).map(([code, sub]) => {
289
- var _a2;
290
- return /* @__PURE__ */ jsx(SelectItem, { value: code, children: (_a2 = sub == null ? void 0 : sub.name) != null ? _a2 : code }, code);
286
+ var _a;
287
+ return /* @__PURE__ */ jsx(SelectItem, { value: code, children: (_a = sub == null ? void 0 : sub.name) != null ? _a : code }, code);
291
288
  }) })
292
289
  ]
293
290
  }