@collabdt/core 0.0.56 → 0.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/dist/core/components/AppSidebarContent.d.ts +2 -1
  2. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  3. package/dist/core/components/AppSidebarContent.js +10 -7
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/Toolbar.d.ts +7 -1
  6. package/dist/core/components/Toolbar.d.ts.map +1 -1
  7. package/dist/core/components/Toolbar.js +3 -3
  8. package/dist/core/components/Toolbar.js.map +1 -1
  9. package/dist/core/components/TopNavigationBar.d.ts +6 -1
  10. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  11. package/dist/core/components/TopNavigationBar.js +2 -2
  12. package/dist/core/components/TopNavigationBar.js.map +1 -1
  13. package/dist/core/components/authentication/AuthPage.d.ts +2 -1
  14. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  15. package/dist/core/components/authentication/AuthPage.js +3 -5
  16. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  17. package/dist/core/components/authentication/Signin.d.ts +2 -1
  18. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  19. package/dist/core/components/authentication/Signin.js +2 -2
  20. package/dist/core/components/authentication/Signin.js.map +1 -1
  21. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  22. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +109 -36
  23. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  24. package/dist/core/components/settings/index.d.ts +3 -1
  25. package/dist/core/components/settings/index.d.ts.map +1 -1
  26. package/dist/core/components/settings/index.js +2 -2
  27. package/dist/core/components/settings/index.js.map +1 -1
  28. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  29. package/dist/core/components/settings/src/AccountSettingsPanel.js +9 -2
  30. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  31. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts +5 -1
  32. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  33. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +7 -5
  34. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  35. package/dist/core/components/settings/src/SettingsContent.d.ts +2 -1
  36. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  37. package/dist/core/components/settings/src/SettingsContent.js +2 -2
  38. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  39. package/dist/core/components/support/BugReportDialog.d.ts +3 -2
  40. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
  41. package/dist/core/components/support/BugReportDialog.js +71 -25
  42. package/dist/core/components/support/BugReportDialog.js.map +1 -1
  43. package/dist/core/components/support/FeatureRequestDialog.d.ts +3 -1
  44. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
  45. package/dist/core/components/support/FeatureRequestDialog.js +7 -4
  46. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
  47. package/dist/core/components/support/SupportMenu.d.ts.map +1 -1
  48. package/dist/core/components/support/SupportMenu.js +1 -4
  49. package/dist/core/components/support/SupportMenu.js.map +1 -1
  50. package/dist/core/components/ui/AnimatedBackground.d.ts +2 -1
  51. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  52. package/dist/core/components/ui/AnimatedBackground.js +2 -5
  53. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  54. package/dist/core/components/ui/InfoSidebar/Container.d.ts +3 -1
  55. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  56. package/dist/core/components/ui/InfoSidebar/Container.js +4 -2
  57. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  58. package/dist/core/components/ui/InfoSidebar/Header.d.ts +3 -2
  59. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  60. package/dist/core/components/ui/InfoSidebar/Header.js +5 -6
  61. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  62. package/dist/core/components/ui/InfoSidebar/index.d.ts +7 -1
  63. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  64. package/dist/core/components/ui/InfoSidebar/index.js +4 -4
  65. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  66. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +2 -1
  67. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  68. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -4
  69. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  70. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +3 -1
  71. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  72. package/dist/core/components/ui/Sensors/SensorsSection.js +3 -1
  73. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  74. package/dist/core/components/ui/Sidebar.d.ts +8 -0
  75. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  76. package/dist/core/components/ui/Sidebar.js +21 -7
  77. package/dist/core/components/ui/Sidebar.js.map +1 -1
  78. package/dist/core/components/ui/ToolbarButton.js +18 -1
  79. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  80. package/dist/core/components/viewers/Data/DataMenu.d.ts +5 -1
  81. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  82. package/dist/core/components/viewers/Data/DataMenu.js +6 -3
  83. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  84. package/dist/core/components/viewers/Data/HeaderButtons.d.ts +3 -1
  85. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  86. package/dist/core/components/viewers/Data/HeaderButtons.js +6 -2
  87. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  88. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts +3 -1
  89. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  90. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +4 -2
  91. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  92. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts +3 -1
  93. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  94. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +3 -1
  95. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  96. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts +2 -1
  97. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  98. package/dist/core/components/viewers/Data/details/DetailHeader.js +3 -5
  99. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  100. package/dist/core/components/viewers/Viewer.d.ts +7 -1
  101. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  102. package/dist/core/components/viewers/Viewer.js +6 -6
  103. package/dist/core/components/viewers/Viewer.js.map +1 -1
  104. package/dist/core/components/viewers/bim/BimToolbar.d.ts +3 -1
  105. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  106. package/dist/core/components/viewers/bim/BimToolbar.js +2 -2
  107. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  108. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +3 -1
  109. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  110. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  111. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  112. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts +5 -1
  113. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  114. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +3 -2
  115. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  116. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +3 -1
  117. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  118. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +2 -2
  119. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  120. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +1 -1
  121. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  122. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +3 -5
  123. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  124. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +3 -1
  125. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  126. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -2
  127. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  128. package/dist/core/components/viewers/map/MapViewer.d.ts +3 -1
  129. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  130. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  131. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  132. package/dist/core/components/viewers/map/datasets/RowActions.d.ts +2 -1
  133. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  134. package/dist/core/components/viewers/map/datasets/RowActions.js +5 -6
  135. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  136. package/dist/core/components/viewers/map/datasets/index.d.ts +5 -1
  137. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  138. package/dist/core/components/viewers/map/datasets/index.js +15 -16
  139. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  140. package/dist/core/components/viewers/map/src/Geocoder.d.ts +3 -1
  141. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  142. package/dist/core/components/viewers/map/src/Geocoder.js +5 -1
  143. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  144. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +6 -1
  145. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  146. package/dist/core/components/viewers/map/src/MapLayers/index.js +3 -3
  147. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  148. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts +5 -1
  149. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  150. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +6 -10
  151. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  152. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +3 -1
  153. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  154. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +4 -6
  155. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  156. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +6 -1
  157. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  158. package/dist/core/components/viewers/map/src/MapSidebar/index.js +5 -4
  159. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  160. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +5 -1
  161. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  162. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +5 -8
  163. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  164. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +3 -1
  165. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  166. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  167. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  168. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts +3 -1
  169. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  170. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js +2 -2
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts +3 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +4 -7
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  177. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +8 -8
  178. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  179. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +8 -1
  180. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  181. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -3
  182. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  183. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +11 -1
  184. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  185. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +5 -3
  186. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  187. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +10 -1
  188. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  189. package/dist/core/components/viewers/map/src/tools/mapTools.js +5 -3
  190. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  191. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +14 -5
  192. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  193. package/dist/core/components/viewers/map/utils/geocoding/config.js +22 -11
  194. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  195. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  196. package/dist/core/components/viewers/map/utils/geocoding/index.js +2 -2
  197. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  198. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  199. package/dist/core/components/viewers/map/utils/geocoding/osm.js +5 -4
  200. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  201. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  202. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +7 -5
  203. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  204. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts +3 -1
  205. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  206. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +11 -14
  207. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  208. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts +3 -1
  209. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  210. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +37 -52
  211. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  212. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts +3 -1
  213. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  214. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js +5 -3
  215. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  216. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts +2 -1
  217. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  218. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +5 -6
  219. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  220. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts +2 -1
  221. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  222. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +15 -9
  223. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  224. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts +5 -1
  225. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  226. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +3 -2
  227. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  228. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts +3 -1
  229. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  230. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -2
  231. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  232. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
  233. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  234. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +12 -23
  235. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  236. package/dist/core/hooks/useCaptureScreenshot.d.ts +2 -0
  237. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -0
  238. package/dist/core/hooks/useCaptureScreenshot.js +63 -0
  239. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -0
  240. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +3 -0
  241. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -0
  242. package/dist/core/hooks/useGeocodingRuntimeConfig.js +17 -0
  243. package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -0
  244. package/dist/core/store/AppConfig/context.d.ts +5 -0
  245. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  246. package/dist/core/store/AppConfig/context.js.map +1 -1
  247. package/dist/core/store/CombineProviders.d.ts +6 -1
  248. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  249. package/dist/core/store/CombineProviders.js +4 -3
  250. package/dist/core/store/CombineProviders.js.map +1 -1
  251. package/dist/core/types/tools.d.ts +2 -1
  252. package/dist/core/types/tools.d.ts.map +1 -1
  253. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  254. package/dist/core/utils/imageUtils.js +2 -1
  255. package/dist/core/utils/imageUtils.js.map +1 -1
  256. package/package.json +1 -1
@@ -5,7 +5,8 @@ export declare const handleChangeViewer: (viewer: ViewerNames, setSelectedItem:
5
5
  interface AppSidebarProps {
6
6
  organization: Organization;
7
7
  countrySubdivisionsData?: Record<string, string>;
8
+ minioBaseUrl?: string;
8
9
  }
9
- export declare function AppSidebarContent({ organization, countrySubdivisionsData }: AppSidebarProps): React.JSX.Element;
10
+ export declare function AppSidebarContent({ organization, countrySubdivisionsData, minioBaseUrl, }: AppSidebarProps): React.JSX.Element;
10
11
  export {};
11
12
  //# sourceMappingURL=AppSidebarContent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppSidebarContent.d.ts","sourceRoot":"","sources":["../../../src/core/components/AppSidebarContent.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AA6BvC,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAA;AASzD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EACnB,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,SAAS,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,EACjE,eAAe,GAAG,SAYnB,CAAA;AAED,UAAU,eAAe;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,uBAAuB,EAAE,EAAE,eAAe,qBAqW3F"}
1
+ {"version":3,"file":"AppSidebarContent.d.ts","sourceRoot":"","sources":["../../../src/core/components/AppSidebarContent.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AA6BvC,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAA;AASzD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EACnB,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,iBAAiB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAC1D,SAAS,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,EACjE,eAAe,GAAG,SAYnB,CAAA;AAED,UAAU,eAAe;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,uBAAuB,EAAE,YAAY,GAAG,EAAE,eAAe,qBAyW1G"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { AppConfigContext, MapContext, useMenusContext, useAppConfigContext } from "../store";
4
+ import { AppConfigContext, MapContext, useMenusContext } from "../store";
5
5
  import { ViewerNames } from "../types/";
6
6
  import { BugReportDialog } from "../components/support/BugReportDialog";
7
7
  import { FeatureRequestDialog } from "../components/support/FeatureRequestDialog";
@@ -36,8 +36,8 @@ const handleChangeViewer = (viewer, setSelectedItem, setSelectedSite, setSelecte
36
36
  payload: { currentViewer: viewer }
37
37
  });
38
38
  };
39
- function AppSidebarContent({ organization, countrySubdivisionsData }) {
40
- var _a, _b, _c, _d;
39
+ function AppSidebarContent({ organization, countrySubdivisionsData, minioBaseUrl }) {
40
+ var _a, _b, _c, _d, _e, _f, _g, _h;
41
41
  const t = useTranslations("AppSidebar");
42
42
  const { dispatch: appConfigDispatch } = React.useContext(AppConfigContext);
43
43
  const { dispatch: mapDispatch } = React.useContext(MapContext);
@@ -64,8 +64,7 @@ function AppSidebarContent({ organization, countrySubdivisionsData }) {
64
64
  appContent.push(...allViewers);
65
65
  }
66
66
  const logoKey = organization == null ? void 0 : organization.logoKey;
67
- const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext();
68
- const logoUrl = minioUrl && logoKey ? `${minioUrl}/org-logos/${logoKey}` : "/images/cdt-logo-stroke.svg";
67
+ const logoUrl = minioBaseUrl && logoKey ? `${minioBaseUrl}/org-logos/${logoKey}` : "/images/cdt-logo-stroke.svg";
69
68
  const { dispatch: menusDispatch, state: menusState } = useMenusContext();
70
69
  const { setSelectedItem, setSelectedSite, setSelectedFile, setView } = useMenusContext();
71
70
  const { data: session } = useSession();
@@ -291,14 +290,18 @@ function AppSidebarContent({ organization, countrySubdivisionsData }) {
291
290
  BugReportDialog,
292
291
  {
293
292
  open: bugOpen,
294
- onOpenChange: setBugOpen
293
+ onOpenChange: setBugOpen,
294
+ userEmail: (_f = (_e = session == null ? void 0 : session.user) == null ? void 0 : _e.email) != null ? _f : void 0,
295
+ viewer: currentViewer
295
296
  }
296
297
  ),
297
298
  /* @__PURE__ */ jsx(
298
299
  FeatureRequestDialog,
299
300
  {
300
301
  open: featureOpen,
301
- onOpenChange: setFeatureOpen
302
+ onOpenChange: setFeatureOpen,
303
+ userEmail: (_h = (_g = session == null ? void 0 : session.user) == null ? void 0 : _g.email) != null ? _h : void 0,
304
+ viewer: currentViewer
302
305
  }
303
306
  )
304
307
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/AppSidebarContent.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\n\r\n// Dependencies\r\nimport { AppConfigContext, MapContext, useMenusContext, useAppConfigContext } from '../store'\r\nimport { ViewerNames } from '../types/'\r\nimport { BugReportDialog } from \"../components/support/BugReportDialog\";\r\nimport { FeatureRequestDialog } from \"../components/support/FeatureRequestDialog\";\r\n\r\n// Shadcn Components\r\nimport {\r\n SidebarContent,\r\n SidebarGroup,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarHeader,\r\n SidebarFooter,\r\n useSidebar,\r\n} from '../components/ui/Sidebar'\r\n\r\nimport { Button } from './ui/Button'\r\n\r\n// Custom Components\r\nimport LanguageSwitch from './LanguageSwitch'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\nimport { Logo } from './Logo'\r\nimport { Separator } from './ui/Separator'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Organization, Language } from '../types/dbTypes'\r\nimport { RoleNames } from '../types/global'\r\nimport { useSession } from 'next-auth/react'\r\nimport { useUserRole } from '../hooks/users/users'\r\n\r\nimport { SupportMenu } from \"../components/support/SupportMenu\"\r\n\r\n\r\n\r\nexport const handleChangeViewer = (\r\n viewer: ViewerNames,\r\n setSelectedItem: React.Dispatch<React.SetStateAction<any>>,\r\n setSelectedSite: React.Dispatch<React.SetStateAction<any>>,\r\n setSelectedFile: React.Dispatch<React.SetStateAction<any>>,\r\n setView: React.Dispatch<React.SetStateAction<'table' | 'detail'>>,\r\n menusDispatch: any,\r\n) => {\r\n // Reset selected item, file, & view when changing viewer\r\n setSelectedItem(null)\r\n setSelectedSite(null)\r\n setSelectedFile(null)\r\n setView('table')\r\n\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: viewer },\r\n })\r\n}\r\n\r\ninterface AppSidebarProps {\r\n organization: Organization\r\n countrySubdivisionsData?: Record<string, string>;\r\n}\r\n\r\nexport function AppSidebarContent({ organization, countrySubdivisionsData }: AppSidebarProps) {\r\n // Translations\r\n const t = useTranslations('AppSidebar')\r\n\r\n const { dispatch: appConfigDispatch } = React.useContext(AppConfigContext)\r\n const { dispatch: mapDispatch } = React.useContext(MapContext)\r\n\r\n \r\n\r\n React.useEffect(() => {\r\n appConfigDispatch({\r\n type: 'SET_ORGANIZATION',\r\n payload: { organization },\r\n })\r\n }, [organization, appConfigDispatch])\r\n \r\n React.useEffect(() => {\r\n if (countrySubdivisionsData) {\r\n mapDispatch({\r\n type: 'SET_COUNTRY_SUBDIVISIONS',\r\n payload: { countrySubdivisionsData, organizationCountry: organization.country },\r\n })\r\n }\r\n }, [countrySubdivisionsData, mapDispatch, organization.country])\r\n\r\n const sidebarTitle = organization?.title ?? organization.name ?? 'CDT Platform'\r\n\r\n const allViewers: ViewerNames[] = [ViewerNames.extensions, ViewerNames.bim, ViewerNames.pointcloud, ViewerNames.sites, ViewerNames.infrastructure, ViewerNames.buildings, ViewerNames.files,];\r\n const appContent: ViewerNames[] = [ViewerNames.map];\r\n\r\n if (organization.appContent && organization.appContent.length > 0) {\r\n appContent.push(...organization.appContent as ViewerNames[]);\r\n } else {\r\n appContent.push(...allViewers);\r\n }\r\n\r\n const logoKey = organization?.logoKey\r\n const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n const logoUrl = minioUrl && logoKey\r\n ? `${minioUrl}/org-logos/${logoKey}`\r\n : '/images/cdt-logo-stroke.svg'\r\n\r\n\r\n const { dispatch: menusDispatch, state: menusState } = useMenusContext()\r\n const { setSelectedItem, setSelectedSite, setSelectedFile, setView } = useMenusContext()\r\n\r\n const { data: session } = useSession()\r\n const { userRole } = useUserRole(session?.user?.id || '')\r\n const normalizedUserRoles = React.useMemo(\r\n () => new Set(userRole?.name ? [userRole.name.trim().toLowerCase()] : []),\r\n [userRole]\r\n )\r\n\r\n const { sidebarState, setOpenInfo, isMobile, openMobile } = useSidebar()\r\n\r\n const changeViewer = (viewer: ViewerNames) => {\r\n handleChangeViewer(viewer, setSelectedItem, setSelectedSite, setSelectedFile, setView, menusDispatch)\r\n setOpenInfo(false)\r\n }\r\n\r\n const handleMapClick = () => {\r\n changeViewer(ViewerNames.map)\r\n }\r\n\r\n interface MenuItem {\r\n title: string\r\n id: ViewerNames | string\r\n icon: React.ElementType\r\n onClick?: () => void\r\n accessibleTo?: RoleNames[],\r\n url?: string\r\n tooltip?: string\r\n }\r\n\r\n // Sidebar menu items\r\n const viewerItems: MenuItem[] = [\r\n {\r\n title: t('mapTitle'),\r\n id: ViewerNames.map,\r\n icon: LR.Map,\r\n onClick: handleMapClick,\r\n },\r\n {\r\n title: t('bimTitle'),\r\n id: ViewerNames.bim,\r\n icon: LR.Box,\r\n onClick: () => changeViewer(ViewerNames.bim),\r\n },\r\n {\r\n title: t('pointCloudTitle'),\r\n id: ViewerNames.pointcloud,\r\n icon: LR.Grip,\r\n onClick: () => changeViewer(ViewerNames.pointcloud),\r\n }\r\n ]\r\n\r\n const datasetItems: MenuItem[] = [\r\n {\r\n title: t('siteTitle'),\r\n id: ViewerNames.sites,\r\n onClick: () => changeViewer(ViewerNames.sites),\r\n icon: LR.BoxSelect,\r\n },\r\n {\r\n title: t('buildingsTitle'),\r\n id: ViewerNames.buildings,\r\n icon: LR.Building2,\r\n onClick: () => changeViewer(ViewerNames.buildings),\r\n },\r\n {\r\n title: t('filesTitle'),\r\n id: ViewerNames.files,\r\n icon: LR.GalleryVerticalEnd,\r\n onClick: () => changeViewer(ViewerNames.files),\r\n },\r\n // {\r\n // title: t('landTitle'),\r\n // id: ViewerNames.land,\r\n // icon: LR.Mountain,\r\n // onClick: () => changeViewer(ViewerNames.land),\r\n // },\r\n {\r\n title: t('infrastructureTitle'),\r\n id: ViewerNames.infrastructure,\r\n icon: LR.TrainTrack,\r\n onClick: () => changeViewer(ViewerNames.infrastructure),\r\n },\r\n\r\n ]\r\n\r\n const managementItems: MenuItem[] = [\r\n // {\r\n // title: t('users'),\r\n // id: ViewerNames.users,\r\n // onClick: () => changeViewer(ViewerNames.users),\r\n // icon: LR.Users,\r\n // accessibleTo: [RoleNames.admin],\r\n // },\r\n {\r\n title: t('addExtensions'),\r\n id: ViewerNames.extensions,\r\n icon: LR.Blocks,\r\n onClick: () => changeViewer(ViewerNames.extensions),\r\n }\r\n ]\r\n\r\n // Sidebar footer items\r\n const serviceItems: MenuItem[] = [\r\n {\r\n title: t('support'),\r\n id: 'support',\r\n url: 'mailto:info@collabdt.org?subject=Support Request - CDT Platform',\r\n icon: LR.LifeBuoy,\r\n tooltip: t('contact')\r\n },\r\n // {\r\n // title: t('feedback'),\r\n // url: 'mailto:info@collabdt.org?subject=Feedback - CDT Platform',\r\n // icon: LR.Send,\r\n // },\r\n ]\r\n const { currentViewer } = menusState.menus\r\n\r\n // On mobile, treat the sheet open as expanded so labels render when the drawer is visible\r\n const isCollapsed = isMobile ? !openMobile : sidebarState === 'collapsed'\r\n\r\n const buildBtnClass = (active: boolean) => [\r\n 'text-sm flex items-center gap-2 w-full cursor-pointer transition-colors rounded-md',\r\n isCollapsed ? 'justify-center p-2' : 'justify-start p-2',\r\n active ? 'bg-primary/5 hover:bg-primary/10 border border-primary/15' : 'hover:bg-muted/50',\r\n ].join(' ')\r\n\r\n const buildIconClass = (active: boolean) => [\r\n 'h-4 w-4 shrink-0',\r\n active ? 'text-primary stroke-2' : 'text-muted-foreground'\r\n ].join(' ')\r\n\r\n const canRenderItem = React.useCallback((item: MenuItem) => {\r\n if (item.accessibleTo == null) return true\r\n return item.accessibleTo.some(role => normalizedUserRoles.has(role.toLowerCase()))\r\n }, [normalizedUserRoles])\r\n\r\n const visibleDatasetItems = datasetItems\r\n .filter(item => !appContent || appContent.includes(item.id as ViewerNames))\r\n .filter(canRenderItem)\r\n\r\n const [bugOpen, setBugOpen] = React.useState(false);\r\n const [featureOpen, setFeatureOpen] = React.useState(false);\r\n \r\n return (\r\n <>\r\n <SidebarContent className='overflow-hidden'>\r\n <SidebarHeader className={`w-full pt-7 flex items-center justify-center ${isCollapsed ? 'items-center' : 'pl-4 items-start'}`}>\r\n <div className='flex flex-row items-center gap-3'>\r\n <Logo image={logoUrl} />\r\n {sidebarState === 'expanded'\r\n && <h1 className=\"text-sm font-bold max-w-36\">{sidebarTitle}</h1>}\r\n </div>\r\n </SidebarHeader>\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n\r\n <div className='overflow-y-auto overflow-x-hidden'>\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('3dViewer')}</SidebarGroupLabel>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {viewerItems.filter(item => !appContent || appContent.includes(item.id as ViewerNames))\r\n .filter(canRenderItem)\r\n .map(item => {\r\n const active = item.id === currentViewer;\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span className={`${isCollapsed ? 'hidden' : 'inline'} ${active ? 'font-bold text-primary' : ''}`}>{item.title}</span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n );\r\n })\r\n }\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n\r\n\r\n {visibleDatasetItems.length > 0 && (\r\n <>\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('data')}</SidebarGroupLabel>\r\n\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {visibleDatasetItems.map(item => {\r\n const active = item.id === currentViewer\r\n\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span\r\n className={`${isCollapsed ? 'hidden' : 'inline'} ${\r\n active ? 'font-bold text-primary' : ''\r\n }`}\r\n >\r\n {item.title}\r\n </span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n )\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </>\r\n )}\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('extensions')}</SidebarGroupLabel>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {managementItems.filter(canRenderItem).map(item => {\r\n const active = item.id === currentViewer\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span className={`${isCollapsed ? 'hidden' : 'inline'} ${active ? 'font-bold text-primary' : ''}`}>{item.title}</span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n )\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </div>\r\n </SidebarContent>\r\n {/* Footer Content - only show when not in BIM mode or when collapsed */}\r\n <SidebarFooter className={`w-full flex flex-col gap-4 ${isCollapsed ? 'items-center justify-center px-0 pb-4' : 'items-start justify-start px-2 pb-4'}`}>\r\n {/* Preferences */}\r\n {organization.languages?.length > 1 && (\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('preferences')}</SidebarGroupLabel>\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <LanguageSwitch showLabel={sidebarState === 'expanded'} languages={organization.languages as Language[]} />\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n )}\r\n {/* Services */}\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('service')}</SidebarGroupLabel>\r\n <SidebarMenu>\r\n {serviceItems.map((item, index) => (\r\n <SidebarMenuItem key={index}>\r\n {item.id === \"support\" ? (\r\n <SupportMenu\r\n isCollapsed={isCollapsed}\r\n item={item}\r\n onOpenBug={() => setBugOpen(true)}\r\n onOpenFeature={() => setFeatureOpen(true)}\r\n />\r\n ) : (\r\n <SidebarMenuButton asChild>\r\n <a\r\n href={item.url}\r\n className={`text-xs flex items-center gap-2 w-full ${\r\n isCollapsed ? \"justify-center p-2\" : \"justify-start p-2\"\r\n }`}\r\n title={item.tooltip}\r\n >\r\n <item.icon className=\"h-4 w-4\" />\r\n <span className={isCollapsed ? \"hidden\" : \"inline\"}>\r\n {item.title}\r\n </span>\r\n </a>\r\n </SidebarMenuButton>\r\n )}\r\n </SidebarMenuItem>\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n </SidebarFooter>\r\n <BugReportDialog\r\n open={bugOpen}\r\n onOpenChange={setBugOpen}\r\n />\r\n\r\n <FeatureRequestDialog\r\n open={featureOpen}\r\n onOpenChange={setFeatureOpen}\r\n />\r\n </>\r\n )\r\n}"],"mappings":";AAyQU,SAwCE,UAvCA,KADF;AApQV,YAAY,WAAW;AAGvB,SAAS,kBAAkB,YAAY,iBAAiB,2BAA2B;AACnF,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAGrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,cAAc;AAGvB,OAAO,oBAAoB;AAG3B,YAAY,QAAQ;AAEpB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAGhC,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAE5B,SAAS,mBAAmB;AAIrB,MAAM,qBAAqB,CAChC,QACA,iBACA,iBACA,iBACA,SACA,kBACG;AAEH,kBAAgB,IAAI;AACpB,kBAAgB,IAAI;AACpB,kBAAgB,IAAI;AACpB,UAAQ,OAAO;AAEf,gBAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS,EAAE,eAAe,OAAO;AAAA,EACnC,CAAC;AACH;AAOO,SAAS,kBAAkB,EAAE,cAAc,wBAAwB,GAAoB;AAxE9F;AA0EE,QAAM,IAAI,gBAAgB,YAAY;AAEtC,QAAM,EAAE,UAAU,kBAAkB,IAAI,MAAM,WAAW,gBAAgB;AACzE,QAAM,EAAE,UAAU,YAAY,IAAI,MAAM,WAAW,UAAU;AAI7D,QAAM,UAAU,MAAM;AACpB,sBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,EAAE,aAAa;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,iBAAiB,CAAC;AAEpC,QAAM,UAAU,MAAM;AACpB,QAAI,yBAAyB;AAC3B,kBAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS,EAAE,yBAAyB,qBAAqB,aAAa,QAAQ;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,yBAAyB,aAAa,aAAa,OAAO,CAAC;AAE/D,QAAM,gBAAe,wDAAc,UAAd,YAAuB,aAAa,SAApC,YAA4C;AAEjE,QAAM,aAA4B,CAAC,YAAY,YAAY,YAAY,KAAK,YAAY,YAAY,YAAY,OAAO,YAAY,gBAAgB,YAAY,WAAW,YAAY,KAAM;AAC5L,QAAM,aAA4B,CAAC,YAAY,GAAG;AAElD,MAAI,aAAa,cAAc,aAAa,WAAW,SAAS,GAAG;AACjE,eAAW,KAAK,GAAG,aAAa,UAA2B;AAAA,EAC7D,OAAO;AACL,eAAW,KAAK,GAAG,UAAU;AAAA,EAC/B;AAEA,QAAM,UAAU,6CAAc;AAC9B,QAAM,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,IAAI,oBAAoB;AACvE,QAAM,UAAU,YAAY,UACxB,GAAG,QAAQ,cAAc,OAAO,KAChC;AAGJ,QAAM,EAAE,UAAU,eAAe,OAAO,WAAW,IAAI,gBAAgB;AACvE,QAAM,EAAE,iBAAiB,iBAAiB,iBAAiB,QAAQ,IAAI,gBAAgB;AAEvF,QAAM,EAAE,MAAM,QAAQ,IAAI,WAAW;AACrC,QAAM,EAAE,SAAS,IAAI,cAAY,wCAAS,SAAT,mBAAe,OAAM,EAAE;AACxD,QAAM,sBAAsB,MAAM;AAAA,IAChC,MAAM,IAAI,KAAI,qCAAU,QAAO,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;AAAA,IACxE,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,EAAE,cAAc,aAAa,UAAU,WAAW,IAAI,WAAW;AAEvE,QAAM,eAAe,CAAC,WAAwB;AAC5C,uBAAmB,QAAQ,iBAAiB,iBAAiB,iBAAiB,SAAS,aAAa;AACpG,gBAAY,KAAK;AAAA,EACnB;AAEA,QAAM,iBAAiB,MAAM;AAC3B,iBAAa,YAAY,GAAG;AAAA,EAC9B;AAaA,QAAM,cAA0B;AAAA,IAC9B;AAAA,MACE,OAAO,EAAE,UAAU;AAAA,MACnB,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,OAAO,EAAE,UAAU;AAAA,MACnB,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,GAAG;AAAA,IAC7C;AAAA,IACA;AAAA,MACE,OAAO,EAAE,iBAAiB;AAAA,MAC1B,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,UAAU;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,eAA2B;AAAA,IAC/B;AAAA,MACE,OAAO,EAAE,WAAW;AAAA,MACpB,IAAI,YAAY;AAAA,MAChB,SAAS,MAAM,aAAa,YAAY,KAAK;AAAA,MAC7C,MAAM,GAAG;AAAA,IACX;AAAA,IACA;AAAA,MACE,OAAO,EAAE,gBAAgB;AAAA,MACzB,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,SAAS;AAAA,IACnD;AAAA,IACA;AAAA,MACE,OAAO,EAAE,YAAY;AAAA,MACrB,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,KAAK;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA;AAAA,MACE,OAAO,EAAE,qBAAqB;AAAA,MAC9B,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,cAAc;AAAA,IACxD;AAAA,EAEF;AAEA,QAAM,kBAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQlC;AAAA,MACE,OAAO,EAAE,eAAe;AAAA,MACxB,IAAI,YAAY;AAAA,MAChB,MAAM,GAAG;AAAA,MACT,SAAS,MAAM,aAAa,YAAY,UAAU;AAAA,IACpD;AAAA,EACF;AAGA,QAAM,eAA2B;AAAA,IAC/B;AAAA,MACE,OAAO,EAAE,SAAS;AAAA,MAClB,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,MAAM,GAAG;AAAA,MACT,SAAS,EAAE,SAAS;AAAA,IACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,QAAM,EAAE,cAAc,IAAI,WAAW;AAGrC,QAAM,cAAc,WAAW,CAAC,aAAa,iBAAiB;AAE9D,QAAM,gBAAgB,CAAC,WAAoB;AAAA,IACzC;AAAA,IACA,cAAc,uBAAuB;AAAA,IACrC,SAAS,8DAA8D;AAAA,EACzE,EAAE,KAAK,GAAG;AAEV,QAAM,iBAAiB,CAAC,WAAoB;AAAA,IAC1C;AAAA,IACA,SAAS,0BAA0B;AAAA,EACrC,EAAE,KAAK,GAAG;AAEV,QAAM,gBAAgB,MAAM,YAAY,CAAC,SAAmB;AAC1D,QAAI,KAAK,gBAAgB,KAAM,QAAO;AACtC,WAAO,KAAK,aAAa,KAAK,UAAQ,oBAAoB,IAAI,KAAK,YAAY,CAAC,CAAC;AAAA,EACnF,GAAG,CAAC,mBAAmB,CAAC;AAExB,QAAM,sBAAsB,aAC3B,OAAO,UAAQ,CAAC,cAAc,WAAW,SAAS,KAAK,EAAiB,CAAC,EACzE,OAAO,aAAa;AAErB,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,KAAK;AAE1D,SACE,iCACE;AAAA,yBAAC,kBAAe,WAAU,mBACxB;AAAA,0BAAC,iBAAc,WAAW,iDAAiD,cAAc,iBAAiB,kBAAkB,IAC1H,+BAAC,SAAI,WAAU,oCACb;AAAA,4BAAC,QAAK,OAAO,SAAS;AAAA,QACrB,iBAAiB,cACb,oBAAC,QAAG,WAAU,8BAA8B,wBAAa;AAAA,SAChE,GACF;AAAA,MACC,eAAe,oBAAC,aAAU,WAAU,sBAAqB;AAAA,MAE1D,qBAAC,SAAI,WAAU,qCACb;AAAA,6BAAC,gBACC;AAAA,8BAAC,qBAAmB,YAAE,UAAU,GAAE;AAAA,UAClC,oBAAC,uBACC,8BAAC,eACE,sBAAY,OAAO,UAAQ,CAAC,cAAc,WAAW,SAAS,KAAK,EAAiB,CAAC,EACnF,OAAO,aAAa,EACpB,IAAI,UAAQ;AACX,kBAAM,SAAS,KAAK,OAAO;AAC3B,mBACE,oBAAC,mBACC,8BAAC,qBAAkB,SAAO,MACxB;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,KAAK;AAAA,gBACd,OAAO,cAAc,KAAK,QAAQ;AAAA,gBAClC,WAAW,cAAc,MAAM;AAAA,gBAC/B,SAAQ;AAAA,gBAER;AAAA,sCAAC,KAAK,MAAL,EAAU,WAAW,eAAe,MAAM,GAAG;AAAA,kBAC9C,oBAAC,UAAK,WAAW,GAAG,cAAc,WAAW,QAAQ,IAAI,SAAS,2BAA2B,EAAE,IAAK,eAAK,OAAM;AAAA;AAAA;AAAA,YACjH,GACF,KAXoB,KAAK,KAY3B;AAAA,UAEJ,CAAC,GAEL,GACF;AAAA,WACF;AAAA,QAGC,oBAAoB,SAAS,KAC5B,iCACG;AAAA,yBAAe,oBAAC,aAAU,WAAU,sBAAqB;AAAA,UAE1D,qBAAC,gBACC;AAAA,gCAAC,qBAAmB,YAAE,MAAM,GAAE;AAAA,YAE9B,oBAAC,uBACC,8BAAC,eACE,8BAAoB,IAAI,UAAQ;AAC/B,oBAAM,SAAS,KAAK,OAAO;AAE3B,qBACE,oBAAC,mBACC,8BAAC,qBAAkB,SAAO,MACxB;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,KAAK;AAAA,kBACd,OAAO,cAAc,KAAK,QAAQ;AAAA,kBAClC,WAAW,cAAc,MAAM;AAAA,kBAC/B,SAAQ;AAAA,kBAER;AAAA,wCAAC,KAAK,MAAL,EAAU,WAAW,eAAe,MAAM,GAAG;AAAA,oBAC9C;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAW,GAAG,cAAc,WAAW,QAAQ,IAC7C,SAAS,2BAA2B,EACtC;AAAA,wBAEC,eAAK;AAAA;AAAA,oBACR;AAAA;AAAA;AAAA,cACF,GACF,KAjBoB,KAAK,KAkB3B;AAAA,YAEJ,CAAC,GACH,GACF;AAAA,aACF;AAAA,WACF;AAAA,QAED,eAAe,oBAAC,aAAU,WAAU,sBAAqB;AAAA,QAC1D,qBAAC,gBACC;AAAA,8BAAC,qBAAmB,YAAE,YAAY,GAAE;AAAA,UACpC,oBAAC,uBACC,8BAAC,eACE,0BAAgB,OAAO,aAAa,EAAE,IAAI,UAAQ;AACjD,kBAAM,SAAS,KAAK,OAAO;AAC3B,mBACE,oBAAC,mBACC,8BAAC,qBAAkB,SAAO,MACxB;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,KAAK;AAAA,gBACd,OAAO,cAAc,KAAK,QAAQ;AAAA,gBAClC,WAAW,cAAc,MAAM;AAAA,gBAC/B,SAAQ;AAAA,gBAER;AAAA,sCAAC,KAAK,MAAL,EAAU,WAAW,eAAe,MAAM,GAAG;AAAA,kBAC9C,oBAAC,UAAK,WAAW,GAAG,cAAc,WAAW,QAAQ,IAAI,SAAS,2BAA2B,EAAE,IAAK,eAAK,OAAM;AAAA;AAAA;AAAA,YACjH,GACF,KAXoB,KAAK,KAY3B;AAAA,UAEJ,CAAC,GACH,GACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,qBAAC,iBAAc,WAAW,8BAA8B,cAAc,0CAA0C,qCAAqC,IAElJ;AAAA,0BAAa,cAAb,mBAAwB,UAAS,KAChC,qBAAC,gBACC;AAAA,4BAAC,qBAAmB,YAAE,aAAa,GAAE;AAAA,QACrC,oBAAC,eACC,8BAAC,mBACC,8BAAC,kBAAe,WAAW,iBAAiB,YAAY,WAAW,aAAa,WAAyB,GAC3G,GACF;AAAA,SACF;AAAA,MAGF,qBAAC,gBACC;AAAA,4BAAC,qBAAmB,YAAE,SAAS,GAAE;AAAA,QACjC,oBAAC,eACA,uBAAa,IAAI,CAAC,MAAM,UACvB,oBAAC,mBACE,eAAK,OAAO,YACX;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,WAAW,MAAM,WAAW,IAAI;AAAA,YAChC,eAAe,MAAM,eAAe,IAAI;AAAA;AAAA,QAC1C,IAEA,oBAAC,qBAAkB,SAAO,MACxB;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WAAW,0CACT,cAAc,uBAAuB,mBACvC;AAAA,YACA,OAAO,KAAK;AAAA,YAEZ;AAAA,kCAAC,KAAK,MAAL,EAAU,WAAU,WAAU;AAAA,cAC/B,oBAAC,UAAK,WAAW,cAAc,WAAW,UACvC,eAAK,OACR;AAAA;AAAA;AAAA,QACF,GACF,KAtBkB,KAwBtB,CACD,GACH;AAAA,SACA;AAAA,OACF;AAAA,IACE;AAAA,MAAC;AAAA;AAAA,QACD,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/AppSidebarContent.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\n\r\n// Dependencies\r\nimport { AppConfigContext, MapContext, useMenusContext } from '../store'\r\nimport { ViewerNames } from '../types/'\r\nimport { BugReportDialog } from \"../components/support/BugReportDialog\";\r\nimport { FeatureRequestDialog } from \"../components/support/FeatureRequestDialog\";\r\n\r\n// Shadcn Components\r\nimport {\r\n SidebarContent,\r\n SidebarGroup,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarHeader,\r\n SidebarFooter,\r\n useSidebar,\r\n} from '../components/ui/Sidebar'\r\n\r\nimport { Button } from './ui/Button'\r\n\r\n// Custom Components\r\nimport LanguageSwitch from './LanguageSwitch'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\nimport { Logo } from './Logo'\r\nimport { Separator } from './ui/Separator'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Organization, Language } from '../types/dbTypes'\r\nimport { RoleNames } from '../types/global'\r\nimport { useSession } from 'next-auth/react'\r\nimport { useUserRole } from '../hooks/users/users'\r\n\r\nimport { SupportMenu } from \"../components/support/SupportMenu\"\r\n\r\n\r\n\r\nexport const handleChangeViewer = (\r\n viewer: ViewerNames,\r\n setSelectedItem: React.Dispatch<React.SetStateAction<any>>,\r\n setSelectedSite: React.Dispatch<React.SetStateAction<any>>,\r\n setSelectedFile: React.Dispatch<React.SetStateAction<any>>,\r\n setView: React.Dispatch<React.SetStateAction<'table' | 'detail'>>,\r\n menusDispatch: any,\r\n) => {\r\n // Reset selected item, file, & view when changing viewer\r\n setSelectedItem(null)\r\n setSelectedSite(null)\r\n setSelectedFile(null)\r\n setView('table')\r\n\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: viewer },\r\n })\r\n}\r\n\r\ninterface AppSidebarProps {\r\n organization: Organization\r\n countrySubdivisionsData?: Record<string, string>;\r\n minioBaseUrl?: string\r\n}\r\n\r\nexport function AppSidebarContent({ organization, countrySubdivisionsData, minioBaseUrl, }: AppSidebarProps) {\r\n // Translations\r\n const t = useTranslations('AppSidebar')\r\n\r\n const { dispatch: appConfigDispatch } = React.useContext(AppConfigContext)\r\n const { dispatch: mapDispatch } = React.useContext(MapContext)\r\n\r\n \r\n\r\n React.useEffect(() => {\r\n appConfigDispatch({\r\n type: 'SET_ORGANIZATION',\r\n payload: { organization },\r\n })\r\n }, [organization, appConfigDispatch])\r\n \r\n React.useEffect(() => {\r\n if (countrySubdivisionsData) {\r\n mapDispatch({\r\n type: 'SET_COUNTRY_SUBDIVISIONS',\r\n payload: { countrySubdivisionsData, organizationCountry: organization.country },\r\n })\r\n }\r\n }, [countrySubdivisionsData, mapDispatch, organization.country])\r\n\r\n const sidebarTitle = organization?.title ?? organization.name ?? 'CDT Platform'\r\n\r\n const allViewers: ViewerNames[] = [ViewerNames.extensions, ViewerNames.bim, ViewerNames.pointcloud, ViewerNames.sites, ViewerNames.infrastructure, ViewerNames.buildings, ViewerNames.files,];\r\n const appContent: ViewerNames[] = [ViewerNames.map];\r\n\r\n if (organization.appContent && organization.appContent.length > 0) {\r\n appContent.push(...organization.appContent as ViewerNames[]);\r\n } else {\r\n appContent.push(...allViewers);\r\n }\r\n\r\n const logoKey = organization?.logoKey\r\n //const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n const logoUrl = minioBaseUrl && logoKey\r\n ? `${minioBaseUrl}/org-logos/${logoKey}`\r\n : '/images/cdt-logo-stroke.svg'\r\n\r\n\r\n const { dispatch: menusDispatch, state: menusState } = useMenusContext()\r\n const { setSelectedItem, setSelectedSite, setSelectedFile, setView } = useMenusContext()\r\n\r\n const { data: session } = useSession()\r\n const { userRole } = useUserRole(session?.user?.id || '')\r\n const normalizedUserRoles = React.useMemo(\r\n () => new Set(userRole?.name ? [userRole.name.trim().toLowerCase()] : []),\r\n [userRole]\r\n )\r\n\r\n const { sidebarState, setOpenInfo, isMobile, openMobile } = useSidebar()\r\n\r\n const changeViewer = (viewer: ViewerNames) => {\r\n handleChangeViewer(viewer, setSelectedItem, setSelectedSite, setSelectedFile, setView, menusDispatch)\r\n setOpenInfo(false)\r\n }\r\n\r\n const handleMapClick = () => {\r\n changeViewer(ViewerNames.map)\r\n }\r\n\r\n interface MenuItem {\r\n title: string\r\n id: ViewerNames | string\r\n icon: React.ElementType\r\n onClick?: () => void\r\n accessibleTo?: RoleNames[],\r\n url?: string\r\n tooltip?: string\r\n }\r\n\r\n // Sidebar menu items\r\n const viewerItems: MenuItem[] = [\r\n {\r\n title: t('mapTitle'),\r\n id: ViewerNames.map,\r\n icon: LR.Map,\r\n onClick: handleMapClick,\r\n },\r\n {\r\n title: t('bimTitle'),\r\n id: ViewerNames.bim,\r\n icon: LR.Box,\r\n onClick: () => changeViewer(ViewerNames.bim),\r\n },\r\n {\r\n title: t('pointCloudTitle'),\r\n id: ViewerNames.pointcloud,\r\n icon: LR.Grip,\r\n onClick: () => changeViewer(ViewerNames.pointcloud),\r\n }\r\n ]\r\n\r\n const datasetItems: MenuItem[] = [\r\n {\r\n title: t('siteTitle'),\r\n id: ViewerNames.sites,\r\n onClick: () => changeViewer(ViewerNames.sites),\r\n icon: LR.BoxSelect,\r\n },\r\n {\r\n title: t('buildingsTitle'),\r\n id: ViewerNames.buildings,\r\n icon: LR.Building2,\r\n onClick: () => changeViewer(ViewerNames.buildings),\r\n },\r\n {\r\n title: t('filesTitle'),\r\n id: ViewerNames.files,\r\n icon: LR.GalleryVerticalEnd,\r\n onClick: () => changeViewer(ViewerNames.files),\r\n },\r\n // {\r\n // title: t('landTitle'),\r\n // id: ViewerNames.land,\r\n // icon: LR.Mountain,\r\n // onClick: () => changeViewer(ViewerNames.land),\r\n // },\r\n {\r\n title: t('infrastructureTitle'),\r\n id: ViewerNames.infrastructure,\r\n icon: LR.TrainTrack,\r\n onClick: () => changeViewer(ViewerNames.infrastructure),\r\n },\r\n\r\n ]\r\n\r\n const managementItems: MenuItem[] = [\r\n // {\r\n // title: t('users'),\r\n // id: ViewerNames.users,\r\n // onClick: () => changeViewer(ViewerNames.users),\r\n // icon: LR.Users,\r\n // accessibleTo: [RoleNames.admin],\r\n // },\r\n {\r\n title: t('addExtensions'),\r\n id: ViewerNames.extensions,\r\n icon: LR.Blocks,\r\n onClick: () => changeViewer(ViewerNames.extensions),\r\n }\r\n ]\r\n\r\n // Sidebar footer items\r\n const serviceItems: MenuItem[] = [\r\n {\r\n title: t('support'),\r\n id: 'support',\r\n url: 'mailto:info@collabdt.org?subject=Support Request - CDT Platform',\r\n icon: LR.LifeBuoy,\r\n tooltip: t('contact')\r\n },\r\n // {\r\n // title: t('feedback'),\r\n // url: 'mailto:info@collabdt.org?subject=Feedback - CDT Platform',\r\n // icon: LR.Send,\r\n // },\r\n ]\r\n const { currentViewer } = menusState.menus\r\n\r\n // On mobile, treat the sheet open as expanded so labels render when the drawer is visible\r\n const isCollapsed = isMobile ? !openMobile : sidebarState === 'collapsed'\r\n\r\n const buildBtnClass = (active: boolean) => [\r\n 'text-sm flex items-center gap-2 w-full cursor-pointer transition-colors rounded-md',\r\n isCollapsed ? 'justify-center p-2' : 'justify-start p-2',\r\n active ? 'bg-primary/5 hover:bg-primary/10 border border-primary/15' : 'hover:bg-muted/50',\r\n ].join(' ')\r\n\r\n const buildIconClass = (active: boolean) => [\r\n 'h-4 w-4 shrink-0',\r\n active ? 'text-primary stroke-2' : 'text-muted-foreground'\r\n ].join(' ')\r\n\r\n const canRenderItem = React.useCallback((item: MenuItem) => {\r\n if (item.accessibleTo == null) return true\r\n return item.accessibleTo.some(role => normalizedUserRoles.has(role.toLowerCase()))\r\n }, [normalizedUserRoles])\r\n\r\n const visibleDatasetItems = datasetItems\r\n .filter(item => !appContent || appContent.includes(item.id as ViewerNames))\r\n .filter(canRenderItem)\r\n\r\n const [bugOpen, setBugOpen] = React.useState(false);\r\n const [featureOpen, setFeatureOpen] = React.useState(false);\r\n \r\n return (\r\n <>\r\n <SidebarContent className='overflow-hidden'>\r\n <SidebarHeader className={`w-full pt-7 flex items-center justify-center ${isCollapsed ? 'items-center' : 'pl-4 items-start'}`}>\r\n <div className='flex flex-row items-center gap-3'>\r\n <Logo image={logoUrl} />\r\n {sidebarState === 'expanded'\r\n && <h1 className=\"text-sm font-bold max-w-36\">{sidebarTitle}</h1>}\r\n </div>\r\n </SidebarHeader>\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n\r\n <div className='overflow-y-auto overflow-x-hidden'>\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('3dViewer')}</SidebarGroupLabel>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {viewerItems.filter(item => !appContent || appContent.includes(item.id as ViewerNames))\r\n .filter(canRenderItem)\r\n .map(item => {\r\n const active = item.id === currentViewer;\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span className={`${isCollapsed ? 'hidden' : 'inline'} ${active ? 'font-bold text-primary' : ''}`}>{item.title}</span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n );\r\n })\r\n }\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n\r\n\r\n {visibleDatasetItems.length > 0 && (\r\n <>\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('data')}</SidebarGroupLabel>\r\n\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {visibleDatasetItems.map(item => {\r\n const active = item.id === currentViewer\r\n\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span\r\n className={`${isCollapsed ? 'hidden' : 'inline'} ${\r\n active ? 'font-bold text-primary' : ''\r\n }`}\r\n >\r\n {item.title}\r\n </span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n )\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </>\r\n )}\r\n {isCollapsed && <Separator className=\"z-30 w-2/3 mx-auto\" />}\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('extensions')}</SidebarGroupLabel>\r\n <SidebarGroupContent>\r\n <SidebarMenu>\r\n {managementItems.filter(canRenderItem).map(item => {\r\n const active = item.id === currentViewer\r\n return (\r\n <SidebarMenuItem key={item.title}>\r\n <SidebarMenuButton asChild>\r\n <Button\r\n onClick={item.onClick}\r\n title={isCollapsed ? item.title : undefined}\r\n className={buildBtnClass(active)}\r\n variant=\"ghost\"\r\n >\r\n <item.icon className={buildIconClass(active)} />\r\n <span className={`${isCollapsed ? 'hidden' : 'inline'} ${active ? 'font-bold text-primary' : ''}`}>{item.title}</span>\r\n </Button>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n )\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroupContent>\r\n </SidebarGroup>\r\n </div>\r\n </SidebarContent>\r\n {/* Footer Content - only show when not in BIM mode or when collapsed */}\r\n <SidebarFooter className={`w-full flex flex-col gap-4 ${isCollapsed ? 'items-center justify-center px-0 pb-4' : 'items-start justify-start px-2 pb-4'}`}>\r\n {/* Preferences */}\r\n {organization.languages?.length > 1 && (\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('preferences')}</SidebarGroupLabel>\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <LanguageSwitch showLabel={sidebarState === 'expanded'} languages={organization.languages as Language[]} />\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n )}\r\n {/* Services */}\r\n <SidebarGroup>\r\n <SidebarGroupLabel>{t('service')}</SidebarGroupLabel>\r\n <SidebarMenu>\r\n {serviceItems.map((item, index) => (\r\n <SidebarMenuItem key={index}>\r\n {item.id === \"support\" ? (\r\n <SupportMenu\r\n isCollapsed={isCollapsed}\r\n item={item}\r\n onOpenBug={() => setBugOpen(true)}\r\n onOpenFeature={() => setFeatureOpen(true)}\r\n />\r\n ) : (\r\n <SidebarMenuButton asChild>\r\n <a\r\n href={item.url}\r\n className={`text-xs flex items-center gap-2 w-full ${\r\n isCollapsed ? \"justify-center p-2\" : \"justify-start p-2\"\r\n }`}\r\n title={item.tooltip}\r\n >\r\n <item.icon className=\"h-4 w-4\" />\r\n <span className={isCollapsed ? \"hidden\" : \"inline\"}>\r\n {item.title}\r\n </span>\r\n </a>\r\n </SidebarMenuButton>\r\n )}\r\n </SidebarMenuItem>\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n </SidebarFooter>\r\n <BugReportDialog\r\n open={bugOpen}\r\n onOpenChange={setBugOpen}\r\n userEmail={session?.user?.email ?? undefined}\r\n viewer={currentViewer}\r\n />\r\n\r\n <FeatureRequestDialog\r\n open={featureOpen}\r\n onOpenChange={setFeatureOpen}\r\n userEmail={session?.user?.email ?? undefined}\r\n viewer={currentViewer}\r\n />\r\n </>\r\n )\r\n}"],"mappings":"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","names":[]}
@@ -1,8 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { ViewerNames } from '../types';
3
+ import { Organization } from '../types/dbTypes';
3
4
  interface Props {
4
5
  viewer: ViewerNames;
6
+ minioBaseUrl?: string;
7
+ martinBaseUrl?: string;
8
+ organization?: Organization;
9
+ geocodeEarthApiKey?: string;
10
+ geocoderUrl?: string;
5
11
  }
6
- export declare function Toolbar({ viewer }: Props): React.JSX.Element;
12
+ export declare function Toolbar({ viewer, minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl }: Props): React.JSX.Element;
7
13
  export {};
8
14
  //# sourceMappingURL=Toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/core/components/Toolbar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAoBtC,UAAU,KAAK;IACb,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,qBAWxC"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/core/components/Toolbar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAkB/C,UAAU,KAAK;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,KAAK,qBAWpH"}
@@ -12,12 +12,12 @@ const PointCloudToolbar = dynamic(
12
12
  () => import("./viewers/pointcloud/PointCloudToolbar").then((m) => ({ default: m.PointCloudToolbar })),
13
13
  { ssr: false }
14
14
  );
15
- function Toolbar({ viewer }) {
15
+ function Toolbar({ viewer, minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl }) {
16
16
  if (viewer === ViewerNames.map) {
17
- return /* @__PURE__ */ jsx(ToolbarBody, { viewer: "map", tools: mapToolbarTools() });
17
+ return /* @__PURE__ */ jsx(ToolbarBody, { viewer: "map", tools: mapToolbarTools({ minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl }) });
18
18
  }
19
19
  if (viewer === ViewerNames.bim) {
20
- return /* @__PURE__ */ jsx(BimToolbar, {});
20
+ return /* @__PURE__ */ jsx(BimToolbar, { minioBaseUrl });
21
21
  }
22
22
  if (viewer === ViewerNames.pointcloud) {
23
23
  return /* @__PURE__ */ jsx(PointCloudToolbar, {});
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/Toolbar.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { ViewerNames } from '../types'\r\nimport { mapToolbarTools } from '../components/viewers/map/src/tools/mapTools'\r\nimport { ToolbarBody } from './ToolbarBody'\r\n\r\n// The BIM and PointCloud toolbar tool registries transitively import\r\n// @thatopen and Potree-adjacent code. Statically importing them here (eagerly\r\n// mounted by Viewer.tsx) kept ~456 KB of @thatopen on the map route's\r\n// first-load JS. Dynamic-importing both per-viewer toolbars cuts that path.\r\n//\r\n// MapToolbar stays inline (no separate file, no dynamic) because the map\r\n// is the default landing surface and every user pays its cost anyway.\r\nconst BimToolbar = dynamic(\r\n () => import('./viewers/bim/BimToolbar').then(m => ({ default: m.BimToolbar })),\r\n { ssr: false },\r\n)\r\nconst PointCloudToolbar = dynamic(\r\n () => import('./viewers/pointcloud/PointCloudToolbar').then(m => ({ default: m.PointCloudToolbar })),\r\n { ssr: false },\r\n)\r\n\r\ninterface Props {\r\n viewer: ViewerNames\r\n}\r\n\r\nexport function Toolbar({ viewer }: Props) {\r\n if (viewer === ViewerNames.map) {\r\n return <ToolbarBody viewer=\"map\" tools={mapToolbarTools()} />\r\n }\r\n if (viewer === ViewerNames.bim) {\r\n return <BimToolbar />\r\n }\r\n if (viewer === ViewerNames.pointcloud) {\r\n return <PointCloudToolbar />\r\n }\r\n return null\r\n}\r\n"],"mappings":";AAkCW;AA3BX,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAS5B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,0BAA0B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC9E,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,wCAAwC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EACnG,EAAE,KAAK,MAAM;AACf;AAMO,SAAS,QAAQ,EAAE,OAAO,GAAU;AACzC,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,GAAG;AAAA,EAC7D;AACA,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,cAAW;AAAA,EACrB;AACA,MAAI,WAAW,YAAY,YAAY;AACrC,WAAO,oBAAC,qBAAkB;AAAA,EAC5B;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/Toolbar.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { ViewerNames } from '../types'\r\nimport { mapToolbarTools } from '../components/viewers/map/src/tools/mapTools'\r\nimport { ToolbarBody } from './ToolbarBody'\r\nimport { Organization } from '../types/dbTypes'\r\n\r\n// The BIM and PointCloud toolbar tool registries transitively import\r\n// @thatopen and Potree-adjacent code. Statically importing them here (eagerly\r\n// mounted by Viewer.tsx) kept ~456 KB of @thatopen on the map route's\r\n// first-load JS. Dynamic-importing both per-viewer toolbars cuts that path.\r\n//\r\n// MapToolbar stays inline (no separate file, no dynamic) because the map\r\n// is the default landing surface and every user pays its cost anyway.\r\nconst BimToolbar = dynamic(\r\n () => import('./viewers/bim/BimToolbar').then(m => ({ default: m.BimToolbar })),\r\n { ssr: false },\r\n)\r\nconst PointCloudToolbar = dynamic(\r\n () => import('./viewers/pointcloud/PointCloudToolbar').then(m => ({ default: m.PointCloudToolbar })),\r\n { ssr: false },\r\n)\r\n\r\ninterface Props {\r\n viewer: ViewerNames\r\n minioBaseUrl?: string\r\n martinBaseUrl?: string\r\n organization?: Organization\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport function Toolbar({ viewer, minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl }: Props) {\r\n if (viewer === ViewerNames.map) {\r\n return <ToolbarBody viewer=\"map\" tools={mapToolbarTools({ minioBaseUrl, martinBaseUrl, organization, geocodeEarthApiKey, geocoderUrl })} />\r\n }\r\n if (viewer === ViewerNames.bim) {\r\n return <BimToolbar minioBaseUrl={minioBaseUrl} />\r\n }\r\n if (viewer === ViewerNames.pointcloud) {\r\n return <PointCloudToolbar />\r\n }\r\n return null\r\n}\r\n"],"mappings":";AAwCW;AAjCX,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAU5B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,0BAA0B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC9E,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,wCAAwC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EACnG,EAAE,KAAK,MAAM;AACf;AAWO,SAAS,QAAQ,EAAE,QAAQ,cAAc,eAAe,cAAc,oBAAoB,YAAY,GAAU;AACrH,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,eAAY,QAAO,OAAM,OAAO,gBAAgB,EAAE,cAAc,eAAe,cAAc,oBAAoB,YAAY,CAAC,GAAG;AAAA,EAC3I;AACA,MAAI,WAAW,YAAY,KAAK;AAC9B,WAAO,oBAAC,cAAW,cAA4B;AAAA,EACjD;AACA,MAAI,WAAW,YAAY,YAAY;AACrC,WAAO,oBAAC,qBAAkB;AAAA,EAC5B;AACA,SAAO;AACT;","names":[]}
@@ -1,3 +1,8 @@
1
1
  import * as React from 'react';
2
- export default function NavigationBar(): React.JSX.Element;
2
+ interface NavigationBarProps {
3
+ geocodeEarthApiKey?: string;
4
+ geocoderUrl?: string;
5
+ }
6
+ export default function NavigationBar({ geocodeEarthApiKey, geocoderUrl }: NavigationBarProps): React.JSX.Element;
7
+ export {};
3
8
  //# sourceMappingURL=TopNavigationBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavigationBar.d.ts","sourceRoot":"","sources":["../../../src/core/components/TopNavigationBar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoC9B,MAAM,CAAC,OAAO,UAAU,aAAa,sBA6CpC"}
1
+ {"version":3,"file":"TopNavigationBar.d.ts","sourceRoot":"","sources":["../../../src/core/components/TopNavigationBar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAoC9B,UAAU,kBAAkB;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,kBAAkB,qBA6C5F"}
@@ -24,7 +24,7 @@ const PCSearchTool = dynamic(
24
24
  () => import("./viewers/pointcloud/src/tools/PCSearchTool"),
25
25
  { ssr: false }
26
26
  );
27
- function NavigationBar() {
27
+ function NavigationBar({ geocodeEarthApiKey, geocoderUrl }) {
28
28
  const t = useTranslations("NavigationBar");
29
29
  const { toggleInfoSidebar, openInfo } = useSidebar();
30
30
  const { state: menusState } = React.useContext(MenusContext);
@@ -49,7 +49,7 @@ function NavigationBar() {
49
49
  children: /* @__PURE__ */ jsx(LR.Menu, { className: "h-4 w-4" })
50
50
  }
51
51
  ),
52
- currentViewer === ViewerNames.map && /* @__PURE__ */ jsx(Geocoder, {}),
52
+ currentViewer === ViewerNames.map && /* @__PURE__ */ jsx(Geocoder, { geocodeEarthApiKey, geocoderUrl }),
53
53
  currentViewer === ViewerNames.bim && /* @__PURE__ */ jsx(BIMSearchTool, {}),
54
54
  currentViewer === ViewerNames.pointcloud && /* @__PURE__ */ jsx(PCSearchTool, {})
55
55
  ] }) });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/components/TopNavigationBar.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Shadcn Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MenusContext } from '../store'\r\nimport { Button } from '../components/ui/Button'\r\nimport { useSidebar } from '../components/ui/Sidebar'\r\nimport * as LR from 'lucide-react'\r\nimport {\r\n Menubar,\r\n MenubarContent,\r\n MenubarMenu,\r\n MenubarTrigger,\r\n} from '../components/ui/Menubar'\r\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\r\n\r\nimport { ViewerNames } from '../types'\r\nimport Geocoder from './viewers/map/src/Geocoder'\r\n\r\n// The BIM and PointCloud search tools used to be statically imported at the\r\n// top of this file, even though the JSX below only renders them when the\r\n// matching viewer is active. The static imports pulled @thatopen and\r\n// Potree-adjacent code into the eager bundle. Switching to next/dynamic ties\r\n// their code to the matching viewer's lazy chunk.\r\nconst BIMSearchTool = dynamic(\r\n () => import('./viewers/bim/src/tools/BIMSearchTool'),\r\n { ssr: false },\r\n)\r\nconst PCSearchTool = dynamic(\r\n () => import('./viewers/pointcloud/src/tools/PCSearchTool'),\r\n { ssr: false },\r\n)\r\n\r\n\r\n\r\n// Components\r\n\r\nexport default function NavigationBar() {\r\n // Translations\r\n const t = useTranslations('NavigationBar')\r\n\r\n // Access the sidebar context to trigger state changes\r\n const { toggleInfoSidebar, openInfo } = useSidebar()\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const needsInfoSidebar = currentViewer === ViewerNames.bim || currentViewer === ViewerNames.pointcloud || currentViewer === ViewerNames.map\r\n\r\n // Hide the NavigationBar when InfoSidebar is open in BIM mode\r\n if (needsInfoSidebar && openInfo) {\r\n return null\r\n }\r\n\r\n return (\r\n <Menubar className=\"flex-row absolute z-20 m-3 bg-transparent border-none shadow-none w-auto h-auto\">\r\n <Menubar className=\"flex px-3 gap-1 h-full justify-between items-start\">\r\n <MenubarMenu>\r\n <VisuallyHidden>\r\n <MenubarTrigger />\r\n <MenubarContent />\r\n </VisuallyHidden>\r\n </MenubarMenu>\r\n\r\n {needsInfoSidebar && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger w-6 justify-end opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={toggleInfoSidebar}\r\n title={t('openInfoTitle')}\r\n >\r\n <LR.Menu className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n\r\n {/* geocode search */}\r\n {currentViewer === ViewerNames.map && <Geocoder />}\r\n {currentViewer === ViewerNames.bim && <BIMSearchTool />}\r\n {currentViewer === ViewerNames.pointcloud && <PCSearchTool />}\r\n </Menubar>\r\n </Menubar>\r\n )\r\n}"],"mappings":";AA8DU,SACE,KADF;AAxDV,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAE/B,SAAS,mBAAmB;AAC5B,OAAO,cAAc;AAOrB,MAAM,gBAAgB;AAAA,EACpB,MAAM,OAAO,uCAAuC;AAAA,EACpD,EAAE,KAAK,MAAM;AACf;AACA,MAAM,eAAe;AAAA,EACnB,MAAM,OAAO,6CAA6C;AAAA,EAC1D,EAAE,KAAK,MAAM;AACf;AAMe,SAAR,gBAAiC;AAEtC,QAAM,IAAI,gBAAgB,eAAe;AAGzC,QAAM,EAAE,mBAAmB,SAAS,IAAI,WAAW;AACnD,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,QAAM,mBAAmB,kBAAkB,YAAY,OAAO,kBAAkB,YAAY,cAAc,kBAAkB,YAAY;AAGxI,MAAI,oBAAoB,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,WAAQ,WAAU,mFACjB,+BAAC,WAAQ,WAAU,sDACjB;AAAA,wBAAC,eACC,+BAAC,kBACC;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,kBAAe;AAAA,OAClB,GACF;AAAA,IAEG,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,EAAE,eAAe;AAAA,QAExB,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA;AAAA,IAC/B;AAAA,IAIL,kBAAkB,YAAY,OAAO,oBAAC,YAAS;AAAA,IAC/C,kBAAkB,YAAY,OAAO,oBAAC,iBAAc;AAAA,IACpD,kBAAkB,YAAY,cAAc,oBAAC,gBAAa;AAAA,KAC3D,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/components/TopNavigationBar.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Shadcn Components\r\nimport * as React from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { useTranslations } from 'next-intl'\r\nimport { MenusContext } from '../store'\r\nimport { Button } from '../components/ui/Button'\r\nimport { useSidebar } from '../components/ui/Sidebar'\r\nimport * as LR from 'lucide-react'\r\nimport {\r\n Menubar,\r\n MenubarContent,\r\n MenubarMenu,\r\n MenubarTrigger,\r\n} from '../components/ui/Menubar'\r\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden'\r\n\r\nimport { ViewerNames } from '../types'\r\nimport Geocoder from './viewers/map/src/Geocoder'\r\n\r\n// The BIM and PointCloud search tools used to be statically imported at the\r\n// top of this file, even though the JSX below only renders them when the\r\n// matching viewer is active. The static imports pulled @thatopen and\r\n// Potree-adjacent code into the eager bundle. Switching to next/dynamic ties\r\n// their code to the matching viewer's lazy chunk.\r\nconst BIMSearchTool = dynamic(\r\n () => import('./viewers/bim/src/tools/BIMSearchTool'),\r\n { ssr: false },\r\n)\r\nconst PCSearchTool = dynamic(\r\n () => import('./viewers/pointcloud/src/tools/PCSearchTool'),\r\n { ssr: false },\r\n)\r\n\r\n\r\n\r\n// Components\r\n\r\ninterface NavigationBarProps {\r\n geocodeEarthApiKey?: string\r\n geocoderUrl?: string\r\n}\r\n\r\nexport default function NavigationBar({ geocodeEarthApiKey, geocoderUrl }: NavigationBarProps) {\r\n // Translations\r\n const t = useTranslations('NavigationBar')\r\n\r\n // Access the sidebar context to trigger state changes\r\n const { toggleInfoSidebar, openInfo } = useSidebar()\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n const needsInfoSidebar = currentViewer === ViewerNames.bim || currentViewer === ViewerNames.pointcloud || currentViewer === ViewerNames.map\r\n\r\n // Hide the NavigationBar when InfoSidebar is open in BIM mode\r\n if (needsInfoSidebar && openInfo) {\r\n return null\r\n }\r\n\r\n return (\r\n <Menubar className=\"flex-row absolute z-20 m-3 bg-transparent border-none shadow-none w-auto h-auto\">\r\n <Menubar className=\"flex px-3 gap-1 h-full justify-between items-start\">\r\n <MenubarMenu>\r\n <VisuallyHidden>\r\n <MenubarTrigger />\r\n <MenubarContent />\r\n </VisuallyHidden>\r\n </MenubarMenu>\r\n\r\n {needsInfoSidebar && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger w-6 justify-end opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={toggleInfoSidebar}\r\n title={t('openInfoTitle')}\r\n >\r\n <LR.Menu className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n\r\n {/* geocode search */}\r\n {currentViewer === ViewerNames.map && <Geocoder geocodeEarthApiKey={geocodeEarthApiKey} geocoderUrl={geocoderUrl} />}\r\n {currentViewer === ViewerNames.bim && <BIMSearchTool />}\r\n {currentViewer === ViewerNames.pointcloud && <PCSearchTool />}\r\n </Menubar>\r\n </Menubar>\r\n )\r\n}"],"mappings":";AAmEU,SACE,KADF;AA7DV,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAE/B,SAAS,mBAAmB;AAC5B,OAAO,cAAc;AAOrB,MAAM,gBAAgB;AAAA,EACpB,MAAM,OAAO,uCAAuC;AAAA,EACpD,EAAE,KAAK,MAAM;AACf;AACA,MAAM,eAAe;AAAA,EACnB,MAAM,OAAO,6CAA6C;AAAA,EAC1D,EAAE,KAAK,MAAM;AACf;AAWe,SAAR,cAA+B,EAAE,oBAAoB,YAAY,GAAuB;AAE7F,QAAM,IAAI,gBAAgB,eAAe;AAGzC,QAAM,EAAE,mBAAmB,SAAS,IAAI,WAAW;AACnD,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,QAAM,mBAAmB,kBAAkB,YAAY,OAAO,kBAAkB,YAAY,cAAc,kBAAkB,YAAY;AAGxI,MAAI,oBAAoB,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,WAAQ,WAAU,mFACjB,+BAAC,WAAQ,WAAU,sDACjB;AAAA,wBAAC,eACC,+BAAC,kBACC;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,kBAAe;AAAA,OAClB,GACF;AAAA,IAEG,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,EAAE,eAAe;AAAA,QAExB,8BAAC,GAAG,MAAH,EAAQ,WAAU,WAAU;AAAA;AAAA,IAC/B;AAAA,IAIL,kBAAkB,YAAY,OAAO,oBAAC,YAAS,oBAAwC,aAA0B;AAAA,IACjH,kBAAkB,YAAY,OAAO,oBAAC,iBAAc;AAAA,IACpD,kBAAkB,YAAY,cAAc,oBAAC,gBAAa;AAAA,KAC3D,GACF;AAEJ;","names":[]}
@@ -4,7 +4,8 @@ export declare const AuthThemeContext: React.Context<"light" | "dark">;
4
4
  export declare const useAuthTheme: () => "light" | "dark";
5
5
  interface AuthPageProps {
6
6
  children: React.ReactNode;
7
+ minioBaseUrl?: string;
7
8
  }
8
- export declare function AuthPage({ children }: AuthPageProps): React.JSX.Element;
9
+ export declare function AuthPage({ children, minioBaseUrl, }: AuthPageProps): React.JSX.Element;
9
10
  export {};
10
11
  //# sourceMappingURL=AuthPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../../src/core/components/authentication/AuthPage.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAyD,MAAM,OAAO,CAAA;AAU7E,OAAO,YAAY,CAAA;AAQnB,eAAO,MAAM,gBAAgB,iCAA0C,CAAA;AACvE,eAAO,MAAM,YAAY,wBAAqC,CAAA;AAG9D,UAAU,aAAa;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,qBAmInD"}
1
+ {"version":3,"file":"AuthPage.d.ts","sourceRoot":"","sources":["../../../../src/core/components/authentication/AuthPage.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAyD,MAAM,OAAO,CAAA;AAU7E,OAAO,YAAY,CAAA;AAQnB,eAAO,MAAM,gBAAgB,iCAA0C,CAAA;AACvE,eAAO,MAAM,YAAY,wBAAqC,CAAA;AAG9D,UAAU,aAAa;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,GAAG,EAAE,aAAa,qBAmIlE"}
@@ -11,18 +11,16 @@ import { Sun, Moon } from "lucide-react";
11
11
  import AuthSimpleMap from "../viewers/map/src/SimpleMap";
12
12
  import { CdtIcon } from "../ui/Icons/CdtIcon";
13
13
  import "./auth.css";
14
- import { useAppConfigContext } from "../../store/AppConfig/context";
15
14
  const AnimatedBackground = dynamic(() => import("../ui/AnimatedBackground"), {
16
15
  ssr: false
17
16
  });
18
17
  const AuthThemeContext = createContext("dark");
19
18
  const useAuthTheme = () => useContext(AuthThemeContext);
20
- function AuthPage({ children }) {
19
+ function AuthPage({ children, minioBaseUrl }) {
21
20
  var _a;
22
21
  const params = useParams();
23
22
  const orgName = (_a = params.instance) != null ? _a : "cdt";
24
- const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext();
25
- const logo = minioUrl ? `${minioUrl}/org-logos/${orgName}-logo.png` : `/images/cdt-logo-stroke.svg`;
23
+ const logo = minioBaseUrl ? `${minioBaseUrl}/org-logos/${orgName}-logo.png` : `/images/cdt-logo-stroke.svg`;
26
24
  const brandPrefix = orgName === "cdt" ? "collab" : orgName;
27
25
  const brandSuffix = orgName === "cdt" ? "digitaltwins" : "digitaltwin";
28
26
  const title = `${brandPrefix}${brandSuffix}`;
@@ -52,7 +50,7 @@ function AuthPage({ children }) {
52
50
  className: `auth-page relative flex min-h-screen w-screen flex-col md:flex-row${theme === "dark" ? " dark" : ""}`,
53
51
  style: { background: "var(--hp-mid)" },
54
52
  children: [
55
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-0 pointer-events-none", children: /* @__PURE__ */ jsx(AnimatedBackground, { theme }) }),
53
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-0 pointer-events-none", children: /* @__PURE__ */ jsx(AnimatedBackground, { theme, assetsUrl: minioBaseUrl }) }),
56
54
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-[1] pointer-events-none", children: /* @__PURE__ */ jsx(
57
55
  AuthSimpleMap,
58
56
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/authentication/AuthPage.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 React, { useState, useEffect, createContext, useContext } from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { Logo } from '../Logo'\r\nimport { useTranslations } from 'next-intl'\r\nimport LanguageSwitch from '../LanguageSwitch'\r\nimport { useParams } from 'next/navigation'\r\nimport Link from 'next/link'\r\nimport { Sun, Moon } from 'lucide-react'\r\nimport AuthSimpleMap from '../viewers/map/src/SimpleMap'\r\nimport { CdtIcon } from '../ui/Icons/CdtIcon'\r\nimport './auth.css'\r\n\r\nimport { useAppConfigContext } from '../../store/AppConfig/context'\r\n\r\nconst AnimatedBackground = dynamic(() => import('../ui/AnimatedBackground'), {\r\n ssr: false,\r\n})\r\n\r\nexport const AuthThemeContext = createContext<'light' | 'dark'>('dark')\r\nexport const useAuthTheme = () => useContext(AuthThemeContext)\r\n\r\n\r\ninterface AuthPageProps {\r\n children: React.ReactNode\r\n}\r\n\r\nexport function AuthPage({ children }: AuthPageProps) {\r\n const params = useParams<{ instance: string }>()\r\n const orgName = params.instance ?? 'cdt'\r\n const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n const logo = minioUrl\r\n ? `${minioUrl}/org-logos/${orgName}-logo.png`\r\n : `/images/cdt-logo-stroke.svg`\r\n const brandPrefix = orgName === 'cdt' ? 'collab' : orgName\r\n const brandSuffix = orgName === 'cdt' ? 'digitaltwins' : 'digitaltwin'\r\n const title = `${brandPrefix}${brandSuffix}`\r\n const t = useTranslations('AuthPage')\r\n\r\n const [theme, setTheme] = useState<'light' | 'dark'>('dark')\r\n const [isMobile, setIsMobile] = useState(false)\r\n const [globePadding, setGlobePadding] = useState({ top: 0, bottom: 0, left: 0, right: 0 })\r\n\r\n useEffect(() => {\r\n setTheme('dark')\r\n }, [])\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n const isMd = window.innerWidth >= 768\r\n setIsMobile(!isMd)\r\n setGlobePadding({ top: 0, bottom: 0, left: isMd ? window.innerWidth / 2 : 0, right: 0 })\r\n }\r\n update()\r\n window.addEventListener('resize', update)\r\n return () => window.removeEventListener('resize', update)\r\n }, [])\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'dark' ? 'light' : 'dark')\r\n }\r\n\r\n return (\r\n <AuthThemeContext.Provider value={theme}>\r\n {/* Toggle .dark on THIS div — CSS vars cascade to all children, no global html conflict */}\r\n <div\r\n className={`auth-page relative flex min-h-screen w-screen flex-col md:flex-row${theme === 'dark' ? ' dark' : ''}`}\r\n style={{ background: 'var(--hp-mid)' }}\r\n >\r\n {/* Animated background — bottom layer */}\r\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\r\n <AnimatedBackground theme={theme} />\r\n </div>\r\n\r\n {/* Globe — on top of animated background, centered on right half */}\r\n <div className=\"absolute inset-0 z-[1] pointer-events-none\">\r\n <AuthSimpleMap\r\n width=\"100%\"\r\n height=\"100%\"\r\n mapStyleUrl={'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'}\r\n showCountryLayer={false}\r\n padding={globePadding}\r\n />\r\n </div>\r\n\r\n {/* Left — Form side (transparent — globe shows through around the card) */}\r\n <div className=\"relative z-10 w-full md:w-1/2 flex min-h-screen md:min-h-0 flex-col\">\r\n {/* Top bar: logo + language */}\r\n <div className=\"flex items-center justify-between px-8 pt-8 pb-4\">\r\n <div className=\"flex items-center gap-3\" style={{ color: 'var(--hp-on-surface)' }}>\r\n {orgName === 'cdt' ? (\r\n <CdtIcon className=\"w-8 h-8\" />\r\n ) : (\r\n <Logo image={logo} title={title} className=\"w-8 h-8\" />\r\n )}\r\n <span className=\"font-display text-xl tracking-wide max-xs:text-sm max-xs:text-nowrap lowercase transition-colors duration-200\">\r\n <span style={{ color: 'var(--hp-primary-container)' }}>{brandPrefix}</span>\r\n {brandSuffix}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {isMobile ? (\r\n <button\r\n type=\"button\"\r\n onClick={toggleTheme}\r\n className=\"auth-theme-toggle\"\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun size={14} /> : <Moon size={14} />}\r\n </button>\r\n ) : null}\r\n <LanguageSwitch variant=\"outline\" />\r\n </div>\r\n </div>\r\n\r\n {/* Form area — centered on mobile screen and desktop panel */}\r\n <div className=\"auth-form-area flex-1 flex items-center justify-center px-6 overflow-y-auto py-6\">\r\n <div className=\"auth-card p-10 w-full max-w-md space-y-6\">\r\n {children}\r\n </div>\r\n </div>\r\n\r\n {/* Footer (mobile) */}\r\n {isMobile ? (\r\n <div className=\"mt-auto px-3 pb-8 flex flex-row items-center justify-center flex-shrink-0\">\r\n <Link href=\"https://collabdt.org/\" className=\"text-xs text-center\" style={{ color: 'var(--hp-outline)' }}>\r\n {t('footerText')}\r\n </Link>\r\n </div>\r\n ) : null}\r\n </div>\r\n\r\n {/* Footer (desktop) */}\r\n {!isMobile ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={toggleTheme}\r\n className=\"auth-theme-toggle fixed bottom-8 left-6 z-30\"\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun size={14} /> : <Moon size={14} />}\r\n </button>\r\n <Link\r\n href=\"https://collabdt.org/\"\r\n className=\"fixed bottom-8 left-1/2 z-30 -translate-x-1/2 text-center text-xs\"\r\n style={{ color: 'var(--hp-outline)' }}\r\n >\r\n {t('footerText')}\r\n </Link>\r\n </>\r\n ) : null}\r\n\r\n {/* Right — transparent spacer */}\r\n <div className=\"hidden md:block md:w-1/2 md:h-screen\" />\r\n </div>\r\n </AuthThemeContext.Provider>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/authentication/AuthPage.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 React, { useState, useEffect, createContext, useContext } from 'react'\r\nimport dynamic from 'next/dynamic'\r\nimport { Logo } from '../Logo'\r\nimport { useTranslations } from 'next-intl'\r\nimport LanguageSwitch from '../LanguageSwitch'\r\nimport { useParams } from 'next/navigation'\r\nimport Link from 'next/link'\r\nimport { Sun, Moon } from 'lucide-react'\r\nimport AuthSimpleMap from '../viewers/map/src/SimpleMap'\r\nimport { CdtIcon } from '../ui/Icons/CdtIcon'\r\nimport './auth.css'\r\n\r\n//import { useAppConfigContext } from '../../store/AppConfig/context'\r\n\r\nconst AnimatedBackground = dynamic(() => import('../ui/AnimatedBackground'), {\r\n ssr: false,\r\n})\r\n\r\nexport const AuthThemeContext = createContext<'light' | 'dark'>('dark')\r\nexport const useAuthTheme = () => useContext(AuthThemeContext)\r\n\r\n\r\ninterface AuthPageProps {\r\n children: React.ReactNode\r\n minioBaseUrl?: string\r\n}\r\n\r\nexport function AuthPage({ children, minioBaseUrl, }: AuthPageProps) {\r\n const params = useParams<{ instance: string }>()\r\n const orgName = params.instance ?? 'cdt'\r\n //const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n const logo = minioBaseUrl\r\n ? `${minioBaseUrl}/org-logos/${orgName}-logo.png`\r\n : `/images/cdt-logo-stroke.svg`\r\n const brandPrefix = orgName === 'cdt' ? 'collab' : orgName\r\n const brandSuffix = orgName === 'cdt' ? 'digitaltwins' : 'digitaltwin'\r\n const title = `${brandPrefix}${brandSuffix}`\r\n const t = useTranslations('AuthPage')\r\n\r\n const [theme, setTheme] = useState<'light' | 'dark'>('dark')\r\n const [isMobile, setIsMobile] = useState(false)\r\n const [globePadding, setGlobePadding] = useState({ top: 0, bottom: 0, left: 0, right: 0 })\r\n\r\n useEffect(() => {\r\n setTheme('dark')\r\n }, [])\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n const isMd = window.innerWidth >= 768\r\n setIsMobile(!isMd)\r\n setGlobePadding({ top: 0, bottom: 0, left: isMd ? window.innerWidth / 2 : 0, right: 0 })\r\n }\r\n update()\r\n window.addEventListener('resize', update)\r\n return () => window.removeEventListener('resize', update)\r\n }, [])\r\n\r\n const toggleTheme = () => {\r\n setTheme(prev => prev === 'dark' ? 'light' : 'dark')\r\n }\r\n\r\n return (\r\n <AuthThemeContext.Provider value={theme}>\r\n {/* Toggle .dark on THIS div — CSS vars cascade to all children, no global html conflict */}\r\n <div\r\n className={`auth-page relative flex min-h-screen w-screen flex-col md:flex-row${theme === 'dark' ? ' dark' : ''}`}\r\n style={{ background: 'var(--hp-mid)' }}\r\n >\r\n {/* Animated background — bottom layer */}\r\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\r\n <AnimatedBackground theme={theme} assetsUrl={minioBaseUrl} />\r\n </div>\r\n\r\n {/* Globe — on top of animated background, centered on right half */}\r\n <div className=\"absolute inset-0 z-[1] pointer-events-none\">\r\n <AuthSimpleMap\r\n width=\"100%\"\r\n height=\"100%\"\r\n mapStyleUrl={'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'}\r\n showCountryLayer={false}\r\n padding={globePadding}\r\n />\r\n </div>\r\n\r\n {/* Left — Form side (transparent — globe shows through around the card) */}\r\n <div className=\"relative z-10 w-full md:w-1/2 flex min-h-screen md:min-h-0 flex-col\">\r\n {/* Top bar: logo + language */}\r\n <div className=\"flex items-center justify-between px-8 pt-8 pb-4\">\r\n <div className=\"flex items-center gap-3\" style={{ color: 'var(--hp-on-surface)' }}>\r\n {orgName === 'cdt' ? (\r\n <CdtIcon className=\"w-8 h-8\" />\r\n ) : (\r\n <Logo image={logo} title={title} className=\"w-8 h-8\" />\r\n )}\r\n <span className=\"font-display text-xl tracking-wide max-xs:text-sm max-xs:text-nowrap lowercase transition-colors duration-200\">\r\n <span style={{ color: 'var(--hp-primary-container)' }}>{brandPrefix}</span>\r\n {brandSuffix}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {isMobile ? (\r\n <button\r\n type=\"button\"\r\n onClick={toggleTheme}\r\n className=\"auth-theme-toggle\"\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun size={14} /> : <Moon size={14} />}\r\n </button>\r\n ) : null}\r\n <LanguageSwitch variant=\"outline\" />\r\n </div>\r\n </div>\r\n\r\n {/* Form area — centered on mobile screen and desktop panel */}\r\n <div className=\"auth-form-area flex-1 flex items-center justify-center px-6 overflow-y-auto py-6\">\r\n <div className=\"auth-card p-10 w-full max-w-md space-y-6\">\r\n {children}\r\n </div>\r\n </div>\r\n\r\n {/* Footer (mobile) */}\r\n {isMobile ? (\r\n <div className=\"mt-auto px-3 pb-8 flex flex-row items-center justify-center flex-shrink-0\">\r\n <Link href=\"https://collabdt.org/\" className=\"text-xs text-center\" style={{ color: 'var(--hp-outline)' }}>\r\n {t('footerText')}\r\n </Link>\r\n </div>\r\n ) : null}\r\n </div>\r\n\r\n {/* Footer (desktop) */}\r\n {!isMobile ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={toggleTheme}\r\n className=\"auth-theme-toggle fixed bottom-8 left-6 z-30\"\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun size={14} /> : <Moon size={14} />}\r\n </button>\r\n <Link\r\n href=\"https://collabdt.org/\"\r\n className=\"fixed bottom-8 left-1/2 z-30 -translate-x-1/2 text-center text-xs\"\r\n style={{ color: 'var(--hp-outline)' }}\r\n >\r\n {t('footerText')}\r\n </Link>\r\n </>\r\n ) : null}\r\n\r\n {/* Right — transparent spacer */}\r\n <div className=\"hidden md:block md:w-1/2 md:h-screen\" />\r\n </div>\r\n </AuthThemeContext.Provider>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,7 +1,8 @@
1
1
  import * as React from 'react';
2
2
  interface SignInProps {
3
3
  recaptchaSiteKey?: string;
4
+ minioBaseUrl?: string;
4
5
  }
5
- export declare function SignIn({ recaptchaSiteKey }: SignInProps): React.JSX.Element;
6
+ export declare function SignIn({ recaptchaSiteKey, minioBaseUrl, }: SignInProps): React.JSX.Element;
6
7
  export {};
7
8
  //# sourceMappingURL=Signin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Signin.d.ts","sourceRoot":"","sources":["../../../../src/core/components/authentication/Signin.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA6S9B,UAAU,WAAW;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,WAAW,qBAMvD"}
1
+ {"version":3,"file":"Signin.d.ts","sourceRoot":"","sources":["../../../../src/core/components/authentication/Signin.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA4S9B,UAAU,WAAW;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,gBAAgB,EAAC,YAAY,GAAG,EAAE,WAAW,qBAMrE"}
@@ -222,8 +222,8 @@ function SignInContent({ recaptchaSiteKey }) {
222
222
  ) })
223
223
  ] });
224
224
  }
225
- function SignIn({ recaptchaSiteKey }) {
226
- return /* @__PURE__ */ jsx(AuthPage, { children: /* @__PURE__ */ jsx(SignInContent, { recaptchaSiteKey }) });
225
+ function SignIn({ recaptchaSiteKey, minioBaseUrl }) {
226
+ return /* @__PURE__ */ jsx(AuthPage, { minioBaseUrl, children: /* @__PURE__ */ jsx(SignInContent, { recaptchaSiteKey }) });
227
227
  }
228
228
  export {
229
229
  SignIn
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/authentication/Signin.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 { signIn } from 'next-auth/react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast, Toaster } from 'sonner'\r\nimport { Button, GoogleIcon, Input, LoadingSpinner } from '../ui'\r\nimport { AuthPage, useAuthTheme } from './AuthPage'\r\nimport { useParams, useSearchParams } from 'next/navigation'\r\nimport ReCAPTCHA from 'react-google-recaptcha'\r\n//import { useAppConfigContext } from '../../store/AppConfig/context'\r\nimport { useAppConfigContext } from '../../store/AppConfig/context'\r\n\r\ninterface SignInContentProps {\r\n recaptchaSiteKey?: string\r\n}\r\n\r\nfunction SignInContent({ recaptchaSiteKey }) {\r\n const [step, setStep] = React.useState<'login' | 'mfa'>('login')\r\n\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [code, setCode] = React.useState('')\r\n\r\n const recaptchaRef = React.useRef<ReCAPTCHA>(null)\r\n const [captchaStatus, setCaptchaStatus] = React.useState(false)\r\n const [captchaToken, setCaptchaToken] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [error, setError] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n const searchParams = useSearchParams()\r\n const params = useParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n //Clean up the Google query error in URL, and have it only return /orgName/signin to clear frontend error responses \r\n React.useEffect(() => {\r\n if (googleError) {\r\n window.history.replaceState({}, '', `/${orgName}/signin`)\r\n }\r\n }, [googleError, orgName])\r\n\r\n const t = useTranslations('Signin')\r\n const tMfa = useTranslations('MFA')\r\n const authTheme = useAuthTheme()\r\n\r\n //const recaptchaSiteKey = `${process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY}`\r\n\r\n const resetCaptcha = () => {\r\n recaptchaRef.current?.reset()\r\n setCaptchaToken('')\r\n setCaptchaStatus(false)\r\n }\r\n\r\n const onReCaptchaSuccess = (token) => {\r\n setCaptchaToken(token)\r\n setCaptchaStatus(true)\r\n }\r\n\r\n // Initial LOGIN\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setGoogleError(null)\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const result = await signIn('credentials', {\r\n redirect: false,\r\n email,\r\n password,\r\n captchaToken,\r\n })\r\n\r\n if (result?.error) {\r\n\r\n if (result.code === 'rate_limit_error') {\r\n\r\n setIsLoading(true)\r\n setError('Too many failed login attempts. Please try again later.')\r\n return\r\n }\r\n\r\n else if (result.code === 'whitelist_invalid_credentials') {\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n\r\n else if (!captchaStatus) {\r\n setError('Captcha Verification Failed.')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n\r\n else if (result.code === 'invalid_credentials') {\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n //MFA TRIGGER\r\n else if (result.code === 'mfa_required') {\r\n setStep('mfa')\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n else { //result.code === 'expired_recaptcha_token\r\n setError('Captcha Verification Expired. Please try again later.')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n }\r\n\r\n // Completed Login + MFA - Redirect to the Platform's Organization Dashboard \r\n window.location.href = `/${orgName}`\r\n\r\n } catch (err) {\r\n setError('Unexpected error. Please try again.')\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n // VERIFY OTP for MFA\r\n const handleVerifyOTP = async () => {\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const res = await fetch('/api/mfa', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ email, code }),\r\n })\r\n\r\n if (!res.ok) {\r\n toast.error(tMfa('invalidCode'))\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n toast.success(tMfa('success'))\r\n\r\n // FINAL LOGIN after successful MFA process\r\n await signIn('credentials', {\r\n email,\r\n password,\r\n mfaVerified: true,\r\n redirect: true,\r\n redirectTo: `/${orgName}`,\r\n })\r\n\r\n } catch (err) {\r\n toast.error(tMfa('verificationFailed'))\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <Toaster richColors position=\"top-right\" />\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1 className=\"font-display font-bold\" style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n }}>\r\n {step === 'login' ? t('title') : tMfa('title')}\r\n </h1>\r\n\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {step === 'login'\r\n ? t('message')\r\n : tMfa('subtitle', { email })}\r\n </p>\r\n </div>\r\n\r\n {/* LOGIN FORM */}\r\n {step === 'login' && (\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n\r\n <Input\r\n type=\"email\"\r\n placeholder={t('placeholder1')}\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n />\r\n\r\n <div className=\"relative\">\r\n <Input\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(v => !v)}\r\n tabIndex={-1}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <LR.EyeOff size={16} /> : <LR.Eye size={16} />}\r\n </button>\r\n </div>\r\n {/* Google Not Linked Error */}\r\n {googleError === 'google_not_linked' && (\r\n <div className=\"auth-pw-error\">\r\n Your Google account is not linked. Please sign in with your credentials first, then link your Google account.\r\n </div>\r\n )}\r\n {error && <div className=\"auth-pw-error\">{error}</div>}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button type=\"submit\" disabled={isLoading} className=\"flex-1 auth-btn-primary\">\r\n {isLoading ? <LoadingSpinner /> : 'Login'}\r\n </Button>\r\n\r\n {/* Google button */}\r\n {<button\r\n type=\"button\"\r\n onClick={() => signIn('google', { redirectTo: `/${orgName}` })}\r\n disabled={isLoading}\r\n aria-label=\"Sign in with Google\"\r\n className=\"auth-google-btn\"\r\n >\r\n <GoogleIcon size={20} />\r\n </button>}\r\n\r\n </div>\r\n\r\n {/*⚠️⚠️⚠️⚠️ DISABLED FOR NOW - Password Reset link, will implement in the future when we have the flow ready */}\r\n {/* Reset Password link */}\r\n {/* <div className=\"flex justify-start\">\r\n <a\r\n href={`/${orgName}/auth/reset-password`}\r\n className=\"text-sm underline underline-offset-4 hover:opacity-80\"\r\n style={{ color: 'var(--hp-primary)' }}\r\n >\r\n Reset your password\r\n </a>\r\n </div> */}\r\n </form>\r\n )}\r\n\r\n {/* MFA FORM */}\r\n {step === 'mfa' && (\r\n <div className=\"space-y-4\">\r\n\r\n <Input\r\n placeholder={tMfa('placeholder')}\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n disabled={isLoading}\r\n />\r\n\r\n <Button onClick={handleVerifyOTP} disabled={isLoading} className=\"w-full\">\r\n {isLoading ? <LoadingSpinner /> : tMfa('verify')}\r\n </Button>\r\n\r\n {/* Back */}\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setStep('login')}\r\n className=\"w-full mt-3 inline-flex items-center justify-center gap-2\"\r\n >\r\n <LR.ArrowLeft size={16} />\r\n {tMfa('backToLogin')}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* CAPTCHA only on Credentials(Username and Password) Provider login */}\r\n \r\n {step === 'login' && (\r\n <div className=\"auth-captcha-wrapper\">\r\n <ReCAPTCHA\r\n ref={recaptchaRef}\r\n key={`recaptcha-${authTheme}`}\r\n sitekey={recaptchaSiteKey ?? ''}\r\n onChange={(token) => onReCaptchaSuccess(token)}\r\n theme={authTheme}\r\n />\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\ninterface SignInProps {\r\n recaptchaSiteKey?: string\r\n}\r\n\r\nexport function SignIn({ recaptchaSiteKey }: SignInProps) {\r\n return (\r\n <AuthPage>\r\n <SignInContent recaptchaSiteKey={recaptchaSiteKey} />\r\n </AuthPage>\r\n )\r\n}"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../src/core/components/authentication/Signin.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 { signIn } from 'next-auth/react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast, Toaster } from 'sonner'\r\nimport { Button, GoogleIcon, Input, LoadingSpinner } from '../ui'\r\nimport { AuthPage, useAuthTheme } from './AuthPage'\r\nimport { useParams, useSearchParams } from 'next/navigation'\r\nimport ReCAPTCHA from 'react-google-recaptcha'\r\n//import { useAppConfigContext } from '../../store/AppConfig/context'\r\n\r\ninterface SignInContentProps {\r\n recaptchaSiteKey?: string\r\n}\r\n\r\nfunction SignInContent({ recaptchaSiteKey, }) {\r\n const [step, setStep] = React.useState<'login' | 'mfa'>('login')\r\n\r\n const [email, setEmail] = React.useState('')\r\n const [password, setPassword] = React.useState('')\r\n const [code, setCode] = React.useState('')\r\n\r\n const recaptchaRef = React.useRef<ReCAPTCHA>(null)\r\n const [captchaStatus, setCaptchaStatus] = React.useState(false)\r\n const [captchaToken, setCaptchaToken] = React.useState('')\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [error, setError] = React.useState('')\r\n const [showPassword, setShowPassword] = React.useState(false)\r\n\r\n const searchParams = useSearchParams()\r\n const params = useParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n //Clean up the Google query error in URL, and have it only return /orgName/signin to clear frontend error responses \r\n React.useEffect(() => {\r\n if (googleError) {\r\n window.history.replaceState({}, '', `/${orgName}/signin`)\r\n }\r\n }, [googleError, orgName])\r\n\r\n const t = useTranslations('Signin')\r\n const tMfa = useTranslations('MFA')\r\n const authTheme = useAuthTheme()\r\n\r\n \r\n\r\n const resetCaptcha = () => {\r\n recaptchaRef.current?.reset()\r\n setCaptchaToken('')\r\n setCaptchaStatus(false)\r\n }\r\n\r\n const onReCaptchaSuccess = (token) => {\r\n setCaptchaToken(token)\r\n setCaptchaStatus(true)\r\n }\r\n\r\n // Initial LOGIN\r\n const handleSubmit = async (e) => {\r\n e.preventDefault()\r\n setGoogleError(null)\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const result = await signIn('credentials', {\r\n redirect: false,\r\n email,\r\n password,\r\n captchaToken,\r\n })\r\n\r\n if (result?.error) {\r\n\r\n if (result.code === 'rate_limit_error') {\r\n\r\n setIsLoading(true)\r\n setError('Too many failed login attempts. Please try again later.')\r\n return\r\n }\r\n\r\n else if (result.code === 'whitelist_invalid_credentials') {\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n\r\n else if (!captchaStatus) {\r\n setError('Captcha Verification Failed.')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n\r\n else if (result.code === 'invalid_credentials') {\r\n setError('Invalid email or password')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n //MFA TRIGGER\r\n else if (result.code === 'mfa_required') {\r\n setStep('mfa')\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n else { //result.code === 'expired_recaptcha_token\r\n setError('Captcha Verification Expired. Please try again later.')\r\n setIsLoading(false)\r\n resetCaptcha()\r\n return\r\n }\r\n }\r\n\r\n // Completed Login + MFA - Redirect to the Platform's Organization Dashboard \r\n window.location.href = `/${orgName}`\r\n\r\n } catch (err) {\r\n setError('Unexpected error. Please try again.')\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n // VERIFY OTP for MFA\r\n const handleVerifyOTP = async () => {\r\n setIsLoading(true)\r\n setError('')\r\n\r\n try {\r\n const res = await fetch('/api/mfa', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ email, code }),\r\n })\r\n\r\n if (!res.ok) {\r\n toast.error(tMfa('invalidCode'))\r\n setIsLoading(false)\r\n return\r\n }\r\n\r\n toast.success(tMfa('success'))\r\n\r\n // FINAL LOGIN after successful MFA process\r\n await signIn('credentials', {\r\n email,\r\n password,\r\n mfaVerified: true,\r\n redirect: true,\r\n redirectTo: `/${orgName}`,\r\n })\r\n\r\n } catch (err) {\r\n toast.error(tMfa('verificationFailed'))\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <Toaster richColors position=\"top-right\" />\r\n {/* Header */}\r\n <div className=\"space-y-2 text-left\">\r\n <h1 className=\"font-display font-bold\" style={{\r\n fontSize: '1.75rem',\r\n lineHeight: '1.1',\r\n letterSpacing: '-0.02em',\r\n color: 'var(--hp-on-surface)',\r\n }}>\r\n {step === 'login' ? t('title') : tMfa('title')}\r\n </h1>\r\n\r\n <p style={{ color: 'var(--hp-on-surface-variant)', fontSize: '0.9rem' }}>\r\n {step === 'login'\r\n ? t('message')\r\n : tMfa('subtitle', { email })}\r\n </p>\r\n </div>\r\n\r\n {/* LOGIN FORM */}\r\n {step === 'login' && (\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n\r\n <Input\r\n type=\"email\"\r\n placeholder={t('placeholder1')}\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n />\r\n\r\n <div className=\"relative\">\r\n <Input\r\n type={showPassword ? 'text' : 'password'}\r\n placeholder={t('placeholder2')}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n disabled={isLoading}\r\n required\r\n className=\"pr-10\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(v => !v)}\r\n tabIndex={-1}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {showPassword ? <LR.EyeOff size={16} /> : <LR.Eye size={16} />}\r\n </button>\r\n </div>\r\n {/* Google Not Linked Error */}\r\n {googleError === 'google_not_linked' && (\r\n <div className=\"auth-pw-error\">\r\n Your Google account is not linked. Please sign in with your credentials first, then link your Google account.\r\n </div>\r\n )}\r\n {error && <div className=\"auth-pw-error\">{error}</div>}\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button type=\"submit\" disabled={isLoading} className=\"flex-1 auth-btn-primary\">\r\n {isLoading ? <LoadingSpinner /> : 'Login'}\r\n </Button>\r\n\r\n {/* Google button */}\r\n {<button\r\n type=\"button\"\r\n onClick={() => signIn('google', { redirectTo: `/${orgName}` })}\r\n disabled={isLoading}\r\n aria-label=\"Sign in with Google\"\r\n className=\"auth-google-btn\"\r\n >\r\n <GoogleIcon size={20} />\r\n </button>}\r\n\r\n </div>\r\n\r\n {/*⚠️⚠️⚠️⚠️ DISABLED FOR NOW - Password Reset link, will implement in the future when we have the flow ready */}\r\n {/* Reset Password link */}\r\n {/* <div className=\"flex justify-start\">\r\n <a\r\n href={`/${orgName}/auth/reset-password`}\r\n className=\"text-sm underline underline-offset-4 hover:opacity-80\"\r\n style={{ color: 'var(--hp-primary)' }}\r\n >\r\n Reset your password\r\n </a>\r\n </div> */}\r\n </form>\r\n )}\r\n\r\n {/* MFA FORM */}\r\n {step === 'mfa' && (\r\n <div className=\"space-y-4\">\r\n\r\n <Input\r\n placeholder={tMfa('placeholder')}\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n disabled={isLoading}\r\n />\r\n\r\n <Button onClick={handleVerifyOTP} disabled={isLoading} className=\"w-full\">\r\n {isLoading ? <LoadingSpinner /> : tMfa('verify')}\r\n </Button>\r\n\r\n {/* Back */}\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setStep('login')}\r\n className=\"w-full mt-3 inline-flex items-center justify-center gap-2\"\r\n >\r\n <LR.ArrowLeft size={16} />\r\n {tMfa('backToLogin')}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* CAPTCHA only on Credentials(Username and Password) Provider login */}\r\n \r\n {step === 'login' && (\r\n <div className=\"auth-captcha-wrapper\">\r\n <ReCAPTCHA\r\n ref={recaptchaRef}\r\n key={`recaptcha-${authTheme}`}\r\n sitekey={recaptchaSiteKey ?? ''}\r\n onChange={(token) => onReCaptchaSuccess(token)}\r\n theme={authTheme}\r\n />\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\ninterface SignInProps {\r\n recaptchaSiteKey?: string\r\n minioBaseUrl?: string\r\n}\r\n\r\nexport function SignIn({ recaptchaSiteKey,minioBaseUrl, }: SignInProps) {\r\n return (\r\n <AuthPage minioBaseUrl={minioBaseUrl}>\r\n <SignInContent recaptchaSiteKey={recaptchaSiteKey} />\r\n </AuthPage>\r\n )\r\n}"],"mappings":"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","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"organizationConfigContent.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.tsx"],"names":[],"mappings":"AAeA,MAAM,CAAC,OAAO,UAAU,yBAAyB,gCAsQhD"}
1
+ {"version":3,"file":"organizationConfigContent.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.tsx"],"names":[],"mappings":"AA4DA,MAAM,CAAC,OAAO,UAAU,yBAAyB,gCA0RhD"}