@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
@@ -4,10 +4,50 @@ import { motion } from "framer-motion";
4
4
  import { useState } from "react";
5
5
  import { useRouter } from "next/navigation";
6
6
  import { useTranslations } from "next-intl";
7
+ import { Check } from "lucide-react";
7
8
  import { Button } from "../../ui/Button";
8
9
  import { Card } from "../../ui/Card";
9
10
  import { Input } from "../../ui/Input";
10
11
  import { Textarea } from "../../ui/Textarea";
12
+ function CheckboxCard({
13
+ name,
14
+ value,
15
+ label,
16
+ defaultChecked = false,
17
+ locked = false
18
+ }) {
19
+ const [checked, setChecked] = useState(defaultChecked);
20
+ const isChecked = locked ? true : checked;
21
+ return /* @__PURE__ */ jsxs(
22
+ "label",
23
+ {
24
+ className: `flex items-center gap-2.5 rounded-md border p-3 select-none transition-colors ${locked ? "cursor-not-allowed opacity-70" : "cursor-pointer"} ${isChecked ? "border-primary bg-primary/5 text-foreground" : "border-input hover:bg-muted/50 text-muted-foreground"}`,
25
+ children: [
26
+ /* @__PURE__ */ jsx(
27
+ "input",
28
+ {
29
+ type: "checkbox",
30
+ name,
31
+ value,
32
+ checked: isChecked,
33
+ onChange: (e) => {
34
+ if (!locked) setChecked(e.target.checked);
35
+ },
36
+ className: "sr-only"
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsx(
40
+ "span",
41
+ {
42
+ className: `flex-shrink-0 w-4 h-4 rounded border flex items-center justify-center transition-colors ${isChecked ? "bg-primary border-primary" : "border-input bg-background"}`,
43
+ children: isChecked && /* @__PURE__ */ jsx(Check, { className: "h-3 w-3 text-primary-foreground", strokeWidth: 3 })
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: label })
47
+ ]
48
+ }
49
+ );
50
+ }
11
51
  function OrganizationConfigContent() {
12
52
  const t = useTranslations("OrganizationConfig");
13
53
  const router = useRouter();
@@ -24,11 +64,13 @@ function OrganizationConfigContent() {
24
64
  setLoading(true);
25
65
  const formData = new FormData(e.currentTarget);
26
66
  const orgLanguages = formData.getAll("orgLanguages").map(String);
67
+ const appContent = formData.getAll("appContent").map(String);
27
68
  const data = {
28
69
  orgName: formData.get("orgName"),
29
70
  orgTitle: formData.get("orgTitle"),
30
71
  orgDescription: formData.get("orgDescription"),
31
72
  orgLanguages,
73
+ appContent,
32
74
  adminName: formData.get("adminName"),
33
75
  adminEmail: formData.get("adminEmail"),
34
76
  adminPassword: formData.get("adminPassword")
@@ -36,9 +78,7 @@ function OrganizationConfigContent() {
36
78
  try {
37
79
  const res = await fetch("/api/setup", {
38
80
  method: "POST",
39
- headers: {
40
- "Content-Type": "application/json"
41
- },
81
+ headers: { "Content-Type": "application/json" },
42
82
  body: JSON.stringify(data)
43
83
  });
44
84
  const json = await res.json();
@@ -53,6 +93,20 @@ function OrganizationConfigContent() {
53
93
  setLoading(false);
54
94
  }
55
95
  }
96
+ const languageOptions = [
97
+ { value: "En", label: t("langEnglish"), defaultChecked: true },
98
+ { value: "Fr", label: t("langFrench") },
99
+ { value: "Es", label: t("langSpanish") }
100
+ ];
101
+ const viewerOptions = [
102
+ { value: "map", label: t("viewerMap"), defaultChecked: true, locked: true },
103
+ { value: "bim", label: t("viewerBIM"), defaultChecked: true }
104
+ ];
105
+ const dataOptions = [
106
+ { value: "sites", label: t("dataSites"), defaultChecked: true },
107
+ { value: "buildings", label: t("dataBuildings"), defaultChecked: true },
108
+ { value: "files", label: t("dataFiles"), defaultChecked: true }
109
+ ];
56
110
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("section", { className: "min-h-screen py-32 relative flex items-center z-10", children: /* @__PURE__ */ jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxs(
57
111
  motion.div,
58
112
  {
@@ -86,14 +140,7 @@ function OrganizationConfigContent() {
86
140
  ] }),
87
141
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
88
142
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Title" }),
89
- /* @__PURE__ */ jsx(
90
- Input,
91
- {
92
- name: "orgTitle",
93
- placeholder: "Organization Title",
94
- required: true
95
- }
96
- )
143
+ /* @__PURE__ */ jsx(Input, { name: "orgTitle", placeholder: "Organization Title", required: true })
97
144
  ] }),
98
145
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
99
146
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Organization Description" }),
@@ -107,37 +154,61 @@ function OrganizationConfigContent() {
107
154
  }
108
155
  )
109
156
  ] }),
110
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
111
- /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Languages" }),
112
- /* @__PURE__ */ jsxs(
113
- "select",
157
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
158
+ /* @__PURE__ */ jsxs("div", { children: [
159
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: t("languages") }),
160
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: t("languagesHint") })
161
+ ] }),
162
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-2", children: languageOptions.map((opt) => /* @__PURE__ */ jsx(
163
+ CheckboxCard,
114
164
  {
115
165
  name: "orgLanguages",
116
- multiple: true,
117
- defaultValue: ["En"],
118
- className: "w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]",
119
- children: [
120
- /* @__PURE__ */ jsx("option", { value: "En", children: "English" }),
121
- /* @__PURE__ */ jsx("option", { value: "Fr", children: "French" }),
122
- /* @__PURE__ */ jsx("option", { value: "Es", children: "Spanish" })
123
- ]
124
- }
125
- ),
126
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages" })
166
+ value: opt.value,
167
+ label: opt.label,
168
+ defaultChecked: opt.defaultChecked
169
+ },
170
+ opt.value
171
+ )) })
172
+ ] }),
173
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 border-t pt-6", children: [
174
+ /* @__PURE__ */ jsxs("div", { children: [
175
+ /* @__PURE__ */ jsx("h4", { className: "font-semibold mb-1", children: t("featuresTitle") }),
176
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("featuresDescription") })
177
+ ] }),
178
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
179
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: t("viewers3DTitle") }),
180
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-2", children: viewerOptions.map((opt) => /* @__PURE__ */ jsx(
181
+ CheckboxCard,
182
+ {
183
+ name: "appContent",
184
+ value: opt.value,
185
+ label: opt.label,
186
+ defaultChecked: opt.defaultChecked,
187
+ locked: opt.locked
188
+ },
189
+ opt.value
190
+ )) })
191
+ ] }),
192
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
193
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: t("dataTitle") }),
194
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-2", children: dataOptions.map((opt) => /* @__PURE__ */ jsx(
195
+ CheckboxCard,
196
+ {
197
+ name: "appContent",
198
+ value: opt.value,
199
+ label: opt.label,
200
+ defaultChecked: opt.defaultChecked
201
+ },
202
+ opt.value
203
+ )) })
204
+ ] })
127
205
  ] }),
128
206
  /* @__PURE__ */ jsxs("div", { className: "border-t pt-6", children: [
129
207
  /* @__PURE__ */ jsx("h4", { className: "font-semibold mb-4", children: "Administrator Account" }),
130
208
  /* @__PURE__ */ jsxs("div", { className: "grid sm:grid-cols-2 gap-4", children: [
131
209
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
132
210
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Name" }),
133
- /* @__PURE__ */ jsx(
134
- Input,
135
- {
136
- name: "adminName",
137
- placeholder: "Admin Name",
138
- required: true
139
- }
140
- )
211
+ /* @__PURE__ */ jsx(Input, { name: "adminName", placeholder: "Admin Name", required: true })
141
212
  ] }),
142
213
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
143
214
  /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Admin Email" }),
@@ -188,9 +259,11 @@ function OrganizationConfigContent() {
188
259
  /* @__PURE__ */ jsx(
189
260
  "a",
190
261
  {
191
- href: "mailto:info@collabdt.org",
262
+ href: "https://collabdt.org/En/contact",
263
+ target: "_blank",
264
+ rel: "noopener noreferrer",
192
265
  className: "text-primary hover:underline font-medium text-sm",
193
- children: "info@collabdt.org"
266
+ children: "collabdt.org/contact"
194
267
  }
195
268
  )
196
269
  ] }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.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 { motion } from 'framer-motion'\r\nimport { useState } from 'react'\r\nimport { useRouter } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { Button } from '../../ui/Button'\r\nimport { Card } from '../../ui/Card'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\n\r\nexport default function OrganizationConfigContent() {\r\n const t = useTranslations('OrganizationConfig')\r\n const router = useRouter()\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [loading, setLoading] = useState(false)\r\n\r\n function validateOrgName(name: string) {\r\n const regex = /^[a-z0-9.-]{3,63}$/\r\n return regex.test(name)\r\n }\r\n\r\n async function handleSubmit(\r\n e: React.FormEvent<HTMLFormElement>\r\n ) {\r\n e.preventDefault()\r\n\r\n setError(null)\r\n setLoading(true)\r\n \r\n \r\n const formData = new FormData(e.currentTarget)\r\n \r\n const orgLanguages = formData\r\n .getAll('orgLanguages')\r\n .map(String)\r\n\r\n const data = {\r\n orgName: formData.get('orgName'),\r\n orgTitle: formData.get('orgTitle'),\r\n orgDescription: formData.get('orgDescription'),\r\n orgLanguages,\r\n adminName: formData.get('adminName'),\r\n adminEmail: formData.get('adminEmail'),\r\n adminPassword: formData.get('adminPassword'),\r\n }\r\n\r\n try {\r\n const res = await fetch('/api/setup', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(data),\r\n })\r\n\r\n const json = await res.json()\r\n\r\n if (res.ok && json.success) {\r\n router.push(`/${data.orgName}/auth/signin`)\r\n return\r\n }\r\n\r\n setError(json.error ?? 'Failed to initialize instance.')\r\n } catch {\r\n setError('Network error. Please try again.')\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <section className=\"min-h-screen py-32 relative flex items-center z-10\">\r\n <div className=\"container mx-auto px-6\">\r\n <motion.div\r\n initial={{ opacity: 0, y: 30 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n className=\"max-w-5xl mx-auto\"\r\n >\r\n <div className=\"text-center mb-16 space-y-6\">\r\n <h1 className=\"text-4xl md:text-5xl font-bold\">\r\n {t('title')}\r\n </h1>\r\n\r\n <p className=\"text-lg text-muted-foreground max-w-3xl mx-auto\">\r\n {t('description')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid lg:grid-cols-3 gap-8\">\r\n <Card className=\"lg:col-span-2 p-8\">\r\n <h3 className=\"text-2xl font-bold mb-6\">\r\n {t('setupTitle')}\r\n </h3>\r\n\r\n <p className=\"text-muted-foreground mb-8\">\r\n {t('setupDescription')}\r\n </p>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n\r\n {/* Org Name */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Name \r\n </label>\r\n <Input\r\n name=\"orgName\"\r\n placeholder=\"my-org\"\r\n required\r\n minLength={3}\r\n maxLength={63}\r\n pattern=\"^[a-z0-9.-]+$\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n 3–63 characters. Lowercase letters, numbers, dots, and hyphens only.\r\n </p>\r\n </div>\r\n\r\n {/* Org Title */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Title\r\n </label>\r\n <Input\r\n name=\"orgTitle\"\r\n placeholder=\"Organization Title\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Org Description */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Organization Description\r\n </label>\r\n <Textarea\r\n name=\"orgDescription\"\r\n placeholder=\"Organization Description\"\r\n rows={4}\r\n required\r\n />\r\n </div>\r\n\r\n {/* Languages */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Languages\r\n </label>\r\n\r\n <select\r\n name=\"orgLanguages\"\r\n multiple\r\n defaultValue={['En']}\r\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 min-h-[100px]\"\r\n >\r\n <option value=\"En\">English</option>\r\n <option value=\"Fr\">French</option>\r\n <option value=\"Es\">Spanish</option>\r\n </select>\r\n\r\n <p className=\"text-xs text-muted-foreground\">\r\n Hold Ctrl (Windows) / Cmd (Mac) to select multiple languages\r\n </p>\r\n </div>\r\n\r\n {/* Admin Section */}\r\n <div className=\"border-t pt-6\">\r\n <h4 className=\"font-semibold mb-4\">\r\n Administrator Account\r\n </h4>\r\n\r\n <div className=\"grid sm:grid-cols-2 gap-4\">\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Name\r\n </label>\r\n <Input\r\n name=\"adminName\"\r\n placeholder=\"Admin Name\"\r\n required\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Admin Email\r\n </label>\r\n <Input\r\n name=\"adminEmail\"\r\n type=\"email\"\r\n placeholder=\"admin@example.com\"\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">\r\n Password\r\n </label>\r\n <Input\r\n name=\"adminPassword\"\r\n type=\"password\"\r\n placeholder=\"Password\"\r\n minLength={8}\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n size=\"lg\"\r\n className=\"gradient-button w-full\"\r\n disabled={loading}\r\n >\r\n {loading ? 'Initializing Instance...' : 'Initialize Instance'}\r\n </Button>\r\n </form>\r\n </Card>\r\n {/* Contact Info Card */}\r\n <div className=\"space-y-6\">\r\n <Card className=\"p-6 hover-card\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('contactInfoTitle')}</h3>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('emailLabel')}</p>\r\n <a \r\n href=\"mailto:info@collabdt.org\" \r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n info@collabdt.org\r\n </a>\r\n </div>\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('websiteLabel')}</p>\r\n <a \r\n href=\"https://collabdt.org\" \r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n collabdt.org\r\n </a>\r\n </div>\r\n </div>\r\n </Card>\r\n\r\n <Card className=\"p-6 hover-card bg-primary/5 border-primary/20\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('needHelpTitle')}</h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {t('needHelpDescription')}\r\n </p>\r\n </Card>\r\n </div>\r\n </div>\r\n </motion.div>\r\n </div>\r\n </section>\r\n\r\n \r\n </>\r\n )\r\n}"],"mappings":"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","names":["e"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/organizationConfig/src/organizationConfigContent.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 { motion } from 'framer-motion'\r\nimport { useState } from 'react'\r\nimport { useRouter } from 'next/navigation'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Check } from 'lucide-react'\r\n\r\nimport { Button } from '../../ui/Button'\r\nimport { Card } from '../../ui/Card'\r\nimport { Input } from '../../ui/Input'\r\nimport { Textarea } from '../../ui/Textarea'\r\n\r\n// Reusable checkbox card used for both languages and feature toggles\r\nfunction CheckboxCard({\r\n name,\r\n value,\r\n label,\r\n defaultChecked = false,\r\n locked = false,\r\n}: {\r\n name: string\r\n value: string\r\n label: string\r\n defaultChecked?: boolean\r\n locked?: boolean\r\n}) {\r\n const [checked, setChecked] = useState(defaultChecked)\r\n const isChecked = locked ? true : checked\r\n\r\n return (\r\n <label\r\n className={`flex items-center gap-2.5 rounded-md border p-3 select-none transition-colors ${locked ? 'cursor-not-allowed opacity-70' : 'cursor-pointer'\r\n } ${isChecked\r\n ? 'border-primary bg-primary/5 text-foreground'\r\n : 'border-input hover:bg-muted/50 text-muted-foreground'\r\n }`}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n value={value}\r\n checked={isChecked}\r\n onChange={(e) => { if (!locked) setChecked(e.target.checked) }}\r\n className=\"sr-only\"\r\n />\r\n <span\r\n className={`flex-shrink-0 w-4 h-4 rounded border flex items-center justify-center transition-colors ${isChecked ? 'bg-primary border-primary' : 'border-input bg-background'\r\n }`}\r\n >\r\n {isChecked && <Check className=\"h-3 w-3 text-primary-foreground\" strokeWidth={3} />}\r\n </span>\r\n <span className=\"text-sm font-medium\">{label}</span>\r\n </label>\r\n )\r\n}\r\n\r\nexport default function OrganizationConfigContent() {\r\n const t = useTranslations('OrganizationConfig')\r\n const router = useRouter()\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [loading, setLoading] = useState(false)\r\n\r\n function validateOrgName(name: string) {\r\n const regex = /^[a-z0-9.-]{3,63}$/\r\n return regex.test(name)\r\n }\r\n\r\n async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\r\n e.preventDefault()\r\n setError(null)\r\n setLoading(true)\r\n\r\n const formData = new FormData(e.currentTarget)\r\n\r\n const orgLanguages = formData.getAll('orgLanguages').map(String)\r\n const appContent = formData.getAll('appContent').map(String)\r\n\r\n const data = {\r\n orgName: formData.get('orgName'),\r\n orgTitle: formData.get('orgTitle'),\r\n orgDescription: formData.get('orgDescription'),\r\n orgLanguages,\r\n appContent,\r\n adminName: formData.get('adminName'),\r\n adminEmail: formData.get('adminEmail'),\r\n adminPassword: formData.get('adminPassword'),\r\n }\r\n\r\n try {\r\n const res = await fetch('/api/setup', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(data),\r\n })\r\n\r\n const json = await res.json()\r\n\r\n if (res.ok && json.success) {\r\n router.push(`/${data.orgName}/auth/signin`)\r\n return\r\n }\r\n\r\n setError(json.error ?? 'Failed to initialize instance.')\r\n } catch {\r\n setError('Network error. Please try again.')\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const languageOptions = [\r\n { value: 'En', label: t('langEnglish'), defaultChecked: true },\r\n { value: 'Fr', label: t('langFrench') },\r\n { value: 'Es', label: t('langSpanish') },\r\n ]\r\n\r\n const viewerOptions = [\r\n { value: 'map', label: t('viewerMap'), defaultChecked: true, locked: true },\r\n { value: 'bim', label: t('viewerBIM'), defaultChecked: true },\r\n ]\r\n\r\n const dataOptions = [\r\n { value: 'sites', label: t('dataSites'), defaultChecked: true },\r\n { value: 'buildings', label: t('dataBuildings'), defaultChecked: true },\r\n { value: 'files', label: t('dataFiles'), defaultChecked: true },\r\n ]\r\n\r\n\r\n return (\r\n <>\r\n <section className=\"min-h-screen py-32 relative flex items-center z-10\">\r\n <div className=\"container mx-auto px-6\">\r\n <motion.div\r\n initial={{ opacity: 0, y: 30 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n className=\"max-w-5xl mx-auto\"\r\n >\r\n <div className=\"text-center mb-16 space-y-6\">\r\n <h1 className=\"text-4xl md:text-5xl font-bold\">{t('title')}</h1>\r\n <p className=\"text-lg text-muted-foreground max-w-3xl mx-auto\">\r\n {t('description')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid lg:grid-cols-3 gap-8\">\r\n <Card className=\"lg:col-span-2 p-8\">\r\n <h3 className=\"text-2xl font-bold mb-6\">{t('setupTitle')}</h3>\r\n <p className=\"text-muted-foreground mb-8\">{t('setupDescription')}</p>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n\r\n {/* Org Name */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Organization Name</label>\r\n <Input\r\n name=\"orgName\"\r\n placeholder=\"my-org\"\r\n required\r\n minLength={3}\r\n maxLength={63}\r\n pattern=\"^[a-z0-9.-]+$\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n 3–63 characters. Lowercase letters, numbers, dots, and hyphens only.\r\n </p>\r\n </div>\r\n\r\n {/* Org Title */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Organization Title</label>\r\n <Input name=\"orgTitle\" placeholder=\"Organization Title\" required />\r\n </div>\r\n\r\n {/* Org Description */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Organization Description</label>\r\n <Textarea\r\n name=\"orgDescription\"\r\n placeholder=\"Organization Description\"\r\n rows={4}\r\n required\r\n />\r\n </div>\r\n\r\n {/* Languages — checkbox cards */}\r\n <div className=\"flex flex-col gap-3\">\r\n <div>\r\n <label className=\"text-sm font-medium\">{t('languages')}</label>\r\n <p className=\"text-xs text-muted-foreground mt-0.5\">{t('languagesHint')}</p>\r\n </div>\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\r\n {languageOptions.map((opt) => (\r\n <CheckboxCard\r\n key={opt.value}\r\n name=\"orgLanguages\"\r\n value={opt.value}\r\n label={opt.label}\r\n defaultChecked={opt.defaultChecked}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Features */}\r\n <div className=\"flex flex-col gap-5 border-t pt-6\">\r\n <div>\r\n <h4 className=\"font-semibold mb-1\">{t('featuresTitle')}</h4>\r\n <p className=\"text-xs text-muted-foreground\">{t('featuresDescription')}</p>\r\n </div>\r\n\r\n {/* 3D Viewers */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">{t('viewers3DTitle')}</label>\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\r\n {viewerOptions.map((opt) => (\r\n <CheckboxCard\r\n key={opt.value}\r\n name=\"appContent\"\r\n value={opt.value}\r\n label={opt.label}\r\n defaultChecked={opt.defaultChecked}\r\n locked={opt.locked}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Data */}\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">{t('dataTitle')}</label>\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\r\n {dataOptions.map((opt) => (\r\n <CheckboxCard\r\n key={opt.value}\r\n name=\"appContent\"\r\n value={opt.value}\r\n label={opt.label}\r\n defaultChecked={opt.defaultChecked}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Admin Section */}\r\n <div className=\"border-t pt-6\">\r\n <h4 className=\"font-semibold mb-4\">Administrator Account</h4>\r\n\r\n <div className=\"grid sm:grid-cols-2 gap-4\">\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Admin Name</label>\r\n <Input name=\"adminName\" placeholder=\"Admin Name\" required />\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Admin Email</label>\r\n <Input\r\n name=\"adminEmail\"\r\n type=\"email\"\r\n placeholder=\"admin@example.com\"\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-4 flex flex-col gap-2\">\r\n <label className=\"text-sm font-medium\">Password</label>\r\n <Input\r\n name=\"adminPassword\"\r\n type=\"password\"\r\n placeholder=\"Password\"\r\n minLength={8}\r\n required\r\n />\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"rounded-md border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-500\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n size=\"lg\"\r\n className=\"gradient-button w-full\"\r\n disabled={loading}\r\n >\r\n {loading ? 'Initializing Instance...' : 'Initialize Instance'}\r\n </Button>\r\n </form>\r\n </Card>\r\n\r\n {/* Contact Info Card */}\r\n <div className=\"space-y-6\">\r\n <Card className=\"p-6 hover-card\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('contactInfoTitle')}</h3>\r\n <div className=\"space-y-4\">\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('emailLabel')}</p>\r\n <a\r\n href=\"https://collabdt.org/En/contact\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n collabdt.org/contact\r\n </a>\r\n </div>\r\n <div>\r\n <p className=\"text-sm text-muted-foreground mb-1\">{t('websiteLabel')}</p>\r\n <a\r\n href=\"https://collabdt.org\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary hover:underline font-medium text-sm\"\r\n >\r\n collabdt.org\r\n </a>\r\n </div>\r\n </div>\r\n </Card>\r\n\r\n <Card className=\"p-6 hover-card bg-primary/5 border-primary/20\">\r\n <h3 className=\"text-lg font-bold mb-3\">{t('needHelpTitle')}</h3>\r\n <p className=\"text-sm text-muted-foreground mb-4\">\r\n {t('needHelpDescription')}\r\n </p>\r\n </Card>\r\n </div>\r\n </div>\r\n </motion.div>\r\n </div>\r\n </section>\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["e"]}
@@ -1,3 +1,5 @@
1
1
  import * as React from 'react';
2
- export declare function UserSettings(): React.JSX.Element;
2
+ export declare function UserSettings({ minioBaseUrl }: {
3
+ minioBaseUrl?: string;
4
+ }): React.JSX.Element;
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/components/settings/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,wBAAgB,YAAY,sBAmC3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/components/settings/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,wBAAgB,YAAY,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,qBAmCvE"}
@@ -6,7 +6,7 @@ import { Separator } from "../ui/";
6
6
  import SettingsHeader from "./src/SettingsHeader";
7
7
  import SettingsSidebar from "./src/SettingsSidebar";
8
8
  import SettingsContent from "./src/SettingsContent";
9
- function UserSettings() {
9
+ function UserSettings({ minioBaseUrl }) {
10
10
  const t = useTranslations("UserSettings");
11
11
  const [activeTab, setActiveTab] = React.useState("account");
12
12
  const tabs = React.useMemo(() => [
@@ -26,7 +26,7 @@ function UserSettings() {
26
26
  }
27
27
  ) }),
28
28
  /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "hidden md:!flex" }),
29
- /* @__PURE__ */ jsx(SettingsContent, { activeTab })
29
+ /* @__PURE__ */ jsx(SettingsContent, { activeTab, minioBaseUrl })
30
30
  ] })
31
31
  ] }) }) });
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/settings/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { Separator } from '../ui/'\r\n\r\nimport SettingsHeader from './src/SettingsHeader'\r\nimport SettingsSidebar from './src/SettingsSidebar'\r\nimport SettingsContent from './src/SettingsContent'\r\nimport type { SettingsTabKey } from './src/types'\r\n\r\nexport function UserSettings() {\r\n const t = useTranslations('UserSettings')\r\n const [activeTab, setActiveTab] = React.useState<SettingsTabKey>('account')\r\n\r\n const tabs = React.useMemo(() => (\r\n [\r\n { key: 'account' as const, label: t('account') },\r\n { key: 'users' as const, label: t('users') },\r\n { key: 'organization' as const, label: t('organization') },\r\n ]\r\n ), [t])\r\n\r\n return (\r\n <div className=\"sm:p-2 overflow-hidden bg-[#fafafa] h-full\">\r\n <div className=\"bg-background rounded-xl shadow min-h-full\">\r\n <div className=\"flex flex-col h-screen\">\r\n <SettingsHeader title={t('settings')} />\r\n\r\n <div className=\"flex flex-row gap-2 p-6 h-full overflow-hidden\">\r\n <div className=\"hidden md:!flex flex-shrink-0 pr-4 lg:w-[280px]\">\r\n <SettingsSidebar\r\n tabs={tabs}\r\n activeTab={activeTab}\r\n onTabChange={setActiveTab}\r\n />\r\n </div>\r\n\r\n <Separator orientation=\"vertical\" className=\"hidden md:!flex\" />\r\n\r\n <SettingsContent activeTab={activeTab} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA+BU,cAEA,YAFA;AA1BV,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAE1B,OAAO,oBAAoB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,qBAAqB;AAGrB,SAAS,eAAe;AAC7B,QAAM,IAAI,gBAAgB,cAAc;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAyB,SAAS;AAE1E,QAAM,OAAO,MAAM,QAAQ,MACzB;AAAA,IACE,EAAE,KAAK,WAAoB,OAAO,EAAE,SAAS,EAAE;AAAA,IAC/C,EAAE,KAAK,SAAkB,OAAO,EAAE,OAAO,EAAE;AAAA,IAC3C,EAAE,KAAK,gBAAyB,OAAO,EAAE,cAAc,EAAE;AAAA,EAC3D,GACC,CAAC,CAAC,CAAC;AAEN,SACE,oBAAC,SAAI,WAAU,8CACb,8BAAC,SAAI,WAAU,8CACb,+BAAC,SAAI,WAAU,0BACb;AAAA,wBAAC,kBAAe,OAAO,EAAE,UAAU,GAAG;AAAA,IAEtC,qBAAC,SAAI,WAAU,kDACb;AAAA,0BAAC,SAAI,WAAU,mDACb;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,aAAa;AAAA;AAAA,MACf,GACF;AAAA,MAEA,oBAAC,aAAU,aAAY,YAAW,WAAU,mBAAkB;AAAA,MAE9D,oBAAC,mBAAgB,WAAsB;AAAA,OACzC;AAAA,KACF,GACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/settings/index.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\nimport { Separator } from '../ui/'\r\n\r\nimport SettingsHeader from './src/SettingsHeader'\r\nimport SettingsSidebar from './src/SettingsSidebar'\r\nimport SettingsContent from './src/SettingsContent'\r\nimport type { SettingsTabKey } from './src/types'\r\n\r\nexport function UserSettings({ minioBaseUrl }: { minioBaseUrl?: string }) {\r\n const t = useTranslations('UserSettings')\r\n const [activeTab, setActiveTab] = React.useState<SettingsTabKey>('account')\r\n\r\n const tabs = React.useMemo(() => (\r\n [\r\n { key: 'account' as const, label: t('account') },\r\n { key: 'users' as const, label: t('users') },\r\n { key: 'organization' as const, label: t('organization') },\r\n ]\r\n ), [t])\r\n\r\n return (\r\n <div className=\"sm:p-2 overflow-hidden bg-[#fafafa] h-full\">\r\n <div className=\"bg-background rounded-xl shadow min-h-full\">\r\n <div className=\"flex flex-col h-screen\">\r\n <SettingsHeader title={t('settings')} />\r\n\r\n <div className=\"flex flex-row gap-2 p-6 h-full overflow-hidden\">\r\n <div className=\"hidden md:!flex flex-shrink-0 pr-4 lg:w-[280px]\">\r\n <SettingsSidebar\r\n tabs={tabs}\r\n activeTab={activeTab}\r\n onTabChange={setActiveTab}\r\n />\r\n </div>\r\n\r\n <Separator orientation=\"vertical\" className=\"hidden md:!flex\" />\r\n\r\n <SettingsContent activeTab={activeTab} minioBaseUrl={minioBaseUrl} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA+BU,cAEA,YAFA;AA1BV,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAE1B,OAAO,oBAAoB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,qBAAqB;AAGrB,SAAS,aAAa,EAAE,aAAa,GAA8B;AACxE,QAAM,IAAI,gBAAgB,cAAc;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAyB,SAAS;AAE1E,QAAM,OAAO,MAAM,QAAQ,MACzB;AAAA,IACE,EAAE,KAAK,WAAoB,OAAO,EAAE,SAAS,EAAE;AAAA,IAC/C,EAAE,KAAK,SAAkB,OAAO,EAAE,OAAO,EAAE;AAAA,IAC3C,EAAE,KAAK,gBAAyB,OAAO,EAAE,cAAc,EAAE;AAAA,EAC3D,GACC,CAAC,CAAC,CAAC;AAEN,SACE,oBAAC,SAAI,WAAU,8CACb,8BAAC,SAAI,WAAU,8CACb,+BAAC,SAAI,WAAU,0BACb;AAAA,wBAAC,kBAAe,OAAO,EAAE,UAAU,GAAG;AAAA,IAEtC,qBAAC,SAAI,WAAU,kDACb;AAAA,0BAAC,SAAI,WAAU,mDACb;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,aAAa;AAAA;AAAA,MACf,GACF;AAAA,MAEA,oBAAC,aAAU,aAAY,YAAW,WAAU,mBAAkB;AAAA,MAE9D,oBAAC,mBAAgB,WAAsB,cAA4B;AAAA,OACrE;AAAA,KACF,GACF,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/AccountSettingsPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqC9B,MAAM,CAAC,OAAO,UAAU,oBAAoB,sBA6c3C"}
1
+ {"version":3,"file":"AccountSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/AccountSettingsPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqC9B,MAAM,CAAC,OAAO,UAAU,oBAAoB,sBAod3C"}
@@ -75,6 +75,7 @@ function AccountSettingsPanel() {
75
75
  }, []);
76
76
  const [isEditing, setIsEditing] = React.useState(false);
77
77
  const [editValues, setEditValues] = React.useState({});
78
+ const [imageUploaded, setImageUploaded] = React.useState(false);
78
79
  const params = useParams();
79
80
  const searchParams = useSearchParams();
80
81
  const orgName = (_d = params.instance) != null ? _d : "canada";
@@ -109,6 +110,7 @@ function AccountSettingsPanel() {
109
110
  const resetEdits = React.useCallback(() => {
110
111
  setIsEditing(false);
111
112
  setEditValues({});
113
+ setImageUploaded(false);
112
114
  }, []);
113
115
  const getUpdatePayload = React.useCallback(() => {
114
116
  var _a2, _b2, _c2, _d2, _e, _f;
@@ -128,6 +130,7 @@ function AccountSettingsPanel() {
128
130
  const hasChanges = React.useCallback(() => {
129
131
  var _a2, _b2;
130
132
  if (!user) return false;
133
+ if (imageUploaded) return true;
131
134
  if (editValues.firstName && editValues.firstName !== ((_a2 = user.name) == null ? void 0 : _a2.split(" ")[0]) || editValues.lastName && editValues.lastName !== ((_b2 = user.name) == null ? void 0 : _b2.split(" ").slice(1).join(" "))) {
132
135
  return true;
133
136
  }
@@ -135,7 +138,7 @@ function AccountSettingsPanel() {
135
138
  if (key === "firstName" || key === "lastName") return false;
136
139
  return user[key] !== value;
137
140
  });
138
- }, [editValues, user]);
141
+ }, [editValues, user, imageUploaded]);
139
142
  const handleUserImageChange = async (e) => {
140
143
  var _a2;
141
144
  const file = ((_a2 = e.target.files) == null ? void 0 : _a2[0]) || null;
@@ -162,6 +165,7 @@ function AccountSettingsPanel() {
162
165
  uploadedAt: (/* @__PURE__ */ new Date()).toISOString()
163
166
  }
164
167
  });
168
+ setImageUploaded(true);
165
169
  } catch (e2) {
166
170
  toast.error(t("toastError"));
167
171
  }
@@ -291,7 +295,10 @@ function AccountSettingsPanel() {
291
295
  disabled: !hasChanges() || isMutating || !ability.can("update", "User"),
292
296
  onClick: async () => {
293
297
  try {
294
- await updateUser(getUpdatePayload());
298
+ const payload = getUpdatePayload();
299
+ if (Object.keys(payload).length > 0) {
300
+ await updateUser(payload);
301
+ }
295
302
  toast.success(t("toastSuccess"));
296
303
  resetEdits();
297
304
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/settings/src/AccountSettingsPanel.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 { useSession, signIn } from 'next-auth/react'\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast } from 'sonner'\r\n\r\nimport { Badge, Button, Input, LoadingSpinner, Separator } from '../../ui/'\r\nimport { UserAvatar } from '../../ui/UserAvatar'\r\nimport { useUploadFileToUser } from '../../../hooks/files/files'\r\nimport { getFileExtension } from '../../../utils/utils'\r\nimport { DescriptionListItem } from '../../ui/DescriptionList'\r\nimport { useParams,useSearchParams  } from 'next/navigation'\r\n\r\nimport ChangePassword from './ChangePassword'\r\nimport SettingsSkeleton from './SettingsSkeleton'\r\n\r\nimport { useUser, useUserRole, useUsers } from '../../../hooks/users/users'\r\nimport { useChangePassword, useVerifyPassword } from '../../../hooks/users/users';\r\nimport { usePermissions } from '../../../store'\r\n\r\n\r\ntype EditValues = Record<string, string | number | boolean | undefined>\r\n\r\ntype UserEntry = [string, unknown]\r\n\r\nconst FILTERED_USER_FIELDS = new Set([\r\n 'id',\r\n 'imageFileId',\r\n 'image',\r\n 'password',\r\n 'emailVerified',\r\n 'createdAt',\r\n 'updatedAt',\r\n 'organizationId',\r\n 'accounts',\r\n 'organization',\r\n])\r\n\r\nexport default function AccountSettingsPanel() {\r\n const t = useTranslations('UserSettings')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { data: session } = useSession()\r\n const userId = session?.user?.id\r\n const { user, isLoading, updateUser, isMutating } = useUser(session?.user?.id || '')\r\n const { uploadFile: uploadUserImage } = useUploadFileToUser(user?.id ?? 0)\r\n\r\n const { userRole } = useUserRole(user?.id ? String(user.id) : '')\r\n const [isGoogleLinked, setIsGoogleLinked] = React.useState(false)\r\n\r\n //EXTRA SEC LAYER\r\nconst [confirmPassword, setConfirmPassword] = React.useState('')\r\nconst [showGoogleSecurityPrompt, setShowGoogleSecurityPrompt] = React.useState(false)\r\nconst [googleAction, setGoogleAction] = React.useState<'link' | 'unlink' | null>(null)\r\nconst { verifyPassword, isLoading: isVerifying, error: verifyError, isValid } = useVerifyPassword(userId)\r\n//EXTRA SEC LAYER\r\nReact.useEffect(() => {\r\n\r\n  const fetchGoogleStatus = async () => {\r\n\r\n    try {\r\n      const res = await fetch('/api/google-link-status')\r\n\r\n      const data = await res.json()\r\n\r\n      setIsGoogleLinked(data.GoogleLinked)\r\n\r\n    } catch {\r\n      setIsGoogleLinked(false)\r\n    }\r\n  }\r\n\r\n  fetchGoogleStatus()\r\n\r\n}, [])\r\n\r\n const [isEditing, setIsEditing] = React.useState(false)\r\n const [editValues, setEditValues] = React.useState<EditValues>({})\r\n const params = useParams()\r\n const searchParams = useSearchParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n const [googleSuccess, setGoogleSuccess] = React.useState(\r\n searchParams.get('success')\r\n )\r\n\r\n React.useEffect(() => {\r\n if(googleSuccess){\r\n toast.success(\"Successfully Linked Google account\")\r\n setGoogleSuccess(null)\r\n\r\n }\r\n\r\n if (googleError) {\r\n\r\n toast.error('Your Google account has already been linked to a different user.');\r\n setGoogleError(null)\r\n }\r\n\r\n window.history.replaceState(\r\n {},\r\n '',\r\n `/${orgName}?viewer=settings`\r\n )\r\n\r\n\r\n}, [googleError, googleSuccess, orgName])\r\n\r\n const entries = React.useMemo<UserEntry[]>(() => {\r\n if (!user) return []\r\n return Object.entries(user).filter(([key]) => !FILTERED_USER_FIELDS.has(key))\r\n }, [user])\r\n\r\n const handleInputChange = React.useCallback((key: string, value: string) => {\r\n setEditValues(prev => ({ ...prev, [key]: value }))\r\n }, [])\r\n\r\n const resetEdits = React.useCallback(() => {\r\n setIsEditing(false)\r\n setEditValues({})\r\n }, [])\r\n\r\n const getUpdatePayload = React.useCallback(() => {\r\n const payload: EditValues = { ...editValues }\r\n\r\n if ('firstName' in editValues || 'lastName' in editValues) {\r\n const first = editValues.firstName ?? user?.name?.split(' ')[0] ?? ''\r\n const last = editValues.lastName ?? user?.name?.split(' ').slice(1).join(' ') ?? ''\r\n payload.name = `${first} ${last}`.trim()\r\n delete payload.firstName\r\n delete payload.lastName\r\n }\r\n\r\n for (const key of Object.keys(payload)) {\r\n if (payload[key] === undefined) delete payload[key]\r\n }\r\n\r\n return payload\r\n }, [editValues, user])\r\n\r\n const hasChanges = React.useCallback(() => {\r\n if (!user) return false\r\n\r\n if (\r\n (editValues.firstName && editValues.firstName !== user.name?.split(' ')[0])\r\n || (editValues.lastName && editValues.lastName !== user.name?.split(' ').slice(1).join(' '))\r\n ) {\r\n return true\r\n }\r\n\r\n return Object.entries(editValues).some(([key, value]) => {\r\n if (key === 'firstName' || key === 'lastName') return false\r\n return user[key as keyof typeof user] !== value\r\n })\r\n }, [editValues, user])\r\n\r\n const handleUserImageChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0] || null\r\n if (!file || !user?.id) return\r\n try {\r\n const assetId = crypto.randomUUID()\r\n const presignedRes = await fetch(`/api/presigned-url-upload?asset=${assetId}`)\r\n if (!presignedRes.ok) throw new Error('Failed to fetch presigned URL')\r\n const { presignedUrl } = await presignedRes.json()\r\n\r\n const uploadRes = await fetch(presignedUrl, {\r\n method: 'PUT',\r\n body: file,\r\n headers: { 'Content-Type': file.type },\r\n })\r\n if (!uploadRes.ok) throw new Error('Failed to upload image')\r\n\r\n await uploadUserImage({\r\n fileData: {\r\n name: file.name,\r\n mimeType: file.type,\r\n extension: getFileExtension(file),\r\n sizeBytes: file.size,\r\n tag: 'user',\r\n assetId,\r\n uploadedAt: new Date().toISOString(),\r\n },\r\n })\r\n } catch {\r\n toast.error(t('toastError'))\r\n }\r\n }\r\n\r\n const handleGoogleLink = async () => {\r\n try {\r\n const resultt=await signIn('google', {\r\n redirect:true,\r\n redirectTo: '/${orgName}?&viewer=settings&error=provider_already_linked',\r\n });\r\n\r\n }\r\n catch {\r\n toast.error('Failed to start Google linking process')\r\n }\r\n\r\n}\r\n\r\nconst handleGoogleUnlink = async () => {\r\n\r\n try {\r\n\r\n const res = await fetch('/api/google-unlink', {\r\n method: 'DELETE',\r\n }) \r\n\r\n if (!res.ok) {\r\n throw new Error()\r\n }\r\n\r\n\r\n\r\n toast.success('Google account unlinked successfully')\r\n setIsGoogleLinked(false)\r\n\r\n } catch {\r\n\r\n toast.error('Failed to unlink Google account')\r\n }\r\n}\r\n\r\nconst handleGoogleSecurityConfirm = async () => {\r\n\r\n try {\r\n\r\n const isCurrentPasswordCorrect = await verifyPassword(confirmPassword)\r\n\r\n if (!isCurrentPasswordCorrect) {\r\n toast.error('Incorrect password')\r\n return\r\n }\r\n\r\n setShowGoogleSecurityPrompt(false)\r\n\r\n if (googleAction === 'link') {\r\n await handleGoogleLink()\r\n }\r\n\r\n if (googleAction === 'unlink') {\r\n await handleGoogleUnlink()\r\n }\r\n\r\n } catch {\r\n\r\n toast.error('Verification failed')\r\n }\r\n}\r\n return (\r\n <>\r\n {isLoading ? (\r\n <SettingsSkeleton />\r\n ) : (\r\n <div className=\"w-full flex flex-col lg:flex-row lg:gap-6 overflow-hidden\">\r\n <div className=\"flex-shrink-0 pb-2 px-6 lg:w-1/2 flex flex-col gap-2\">\r\n <p className=\"text-xl text-foreground font-semibold\">{t('header')}</p>\r\n <p className=\"text-sm text-muted-foreground\">{t('subheader')}</p>\r\n </div>\r\n\r\n <div className=\"flex-1 px-6 overflow-auto lg:w-1/2\">\r\n {user && (\r\n <div className=\"w-32 h-32 float-right ml-4 mb-3 bg-muted border-2 rounded-lg relative overflow-hidden group\">\r\n <label className={`block w-full h-full ${isEditing ? 'cursor-pointer' : 'cursor-default'}`}>\r\n <UserAvatar\r\n imageFileId={user?.imageFileId}\r\n name={user?.name}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n\r\n {isEditing && (\r\n <>\r\n <div className=\"absolute inset-0 transition-opacity flex items-center justify-center\">\r\n <div\r\n className=\"rounded-full p-4 flex items-center justify-center group-hover:scale-110 transition-transform\"\r\n title={t('changeImage')}\r\n >\r\n <LR.Edit className=\"size-5 m-1 text-foreground text-primary-light\" />\r\n </div>\r\n </div>\r\n <Input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n title=\"Change image\"\r\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\r\n onChange={handleUserImageChange}\r\n />\r\n </>\r\n )}\r\n </label>\r\n </div>\r\n )}\r\n\r\n {user && entries.map(([key, value], index) => {\r\n if (key === 'name') {\r\n const nameParts = String(value).split(' ')\r\n const firstName = nameParts[0]\r\n const lastName = nameParts.slice(1).join(' ')\r\n return (\r\n <React.Fragment key={`name-${index}`}>\r\n <div className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('fName')}>\r\n {isEditing\r\n ? (\r\n <Input\r\n value={String(editValues.firstName ?? firstName)}\r\n onChange={e => handleInputChange('firstName', e.target.value)}\r\n type=\"text\"\r\n />\r\n )\r\n : (\r\n firstName\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n <div className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('lName')}>\r\n {isEditing\r\n ? (\r\n <Input\r\n value={String(editValues.lastName ?? lastName)}\r\n onChange={e => handleInputChange('lastName', e.target.value)}\r\n type=\"text\"\r\n />\r\n )\r\n : (\r\n lastName\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n </React.Fragment>\r\n )\r\n }\r\n if (key === 'roleId') {\r\n return (\r\n <div key=\"roleId\" className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('role')}>\r\n {userRole && userRole.name\r\n ? <Badge variant=\"outline\">{userRole.name}</Badge>\r\n : <Badge variant=\"outline\">{t('roleUnknown')}</Badge>}\r\n </DescriptionListItem>\r\n </div>\r\n )\r\n }\r\n\r\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value)\r\n\r\n return (\r\n <div key={key} className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={key === 'email' ? t('email') : t(key)}>\r\n {isEditing && (typeof value === 'string' || key === 'email')\r\n ? (\r\n <Input\r\n type={key === 'email' ? 'email' : 'text'}\r\n value={String(editValues[key] ?? value ?? '')}\r\n onChange={e => handleInputChange(key, e.target.value)}\r\n disabled={key === 'email'}\r\n />\r\n )\r\n : (\r\n displayValue\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n )\r\n })}\r\n\r\n {user && isEditing && (\r\n <div className=\"flex gap-2\">\r\n <Button\r\n disabled={!hasChanges() || isMutating || !ability.can('update', 'User')}\r\n onClick={async () => {\r\n try {\r\n await updateUser(getUpdatePayload())\r\n toast.success(t('toastSuccess'))\r\n resetEdits()\r\n }\r\n catch {\r\n toast.error(t('toastError'))\r\n }\r\n }}\r\n >\r\n {isMutating ? <LoadingSpinner /> : t('save')}\r\n </Button>\r\n <Button onClick={resetEdits} variant=\"outline\" disabled={!ability.can('update', 'User')}>\r\n {t('cancel')}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {user && !isEditing && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => { setIsEditing(true) }}\r\n className=\"w-fit mx-auto mt-6\"\r\n disabled={!ability.can('update', 'User')}\r\n >\r\n {t('edit')}\r\n </Button>\r\n )}\r\n\r\n {user && <Separator className={isEditing ? 'my-6' : ''} />}\r\n {user && (\r\n <div className=\"px-6 py-4 flex items-center justify-between gap-4\">\r\n <div>\r\n <p className=\"font-medium\">Google Account</p>\r\n\r\n {isGoogleLinked ? (\r\n <p className=\"text-sm text-muted-foreground\">\r\n Linked successfully\r\n </p>\r\n ) : (\r\n <p className=\"text-sm text-muted-foreground\">\r\n No Google account linked\r\n </p>\r\n )}\r\n </div>\r\n {/* {googleError === 'provider_already_linked' && (\r\n  <div className=\"auth-pw-error\">\r\n    Your Google account has already been linked to a different user.\r\n  </div>\r\n\r\n)} */}\r\n\r\n <Button\r\n\r\n // onClick={\r\n // isGoogleLinked\r\n // ? handleGoogleUnlink\r\n // : handleGoogleLink\r\n // }\r\n onClick={() => {\r\n setGoogleAction(isGoogleLinked ? 'unlink' : 'link')\r\n setShowGoogleSecurityPrompt(true)\r\n}}\r\n\r\n variant=\"outline\"\r\n>\r\n {isGoogleLinked\r\n ? 'Deactivate Google'\r\n : 'Link Google Account'}\r\n</Button>\r\n </div>\r\n)}\r\n\r\n {showGoogleSecurityPrompt && (\r\n <div className=\"fixed inset-0 bg-black/40 flex items-center justify-center z-50\">\r\n\r\n <div className=\"bg-background p-6 rounded-xl w-full max-w-md space-y-4 border\">\r\n\r\n <h2 className=\"text-lg font-semibold\">\r\n Confirm Password\r\n </h2>\r\n\r\n <p className=\"text-sm text-muted-foreground\">\r\n Please confirm your password to continue.\r\n </p>\r\n\r\n <Input\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n placeholder=\"Enter password\"\r\n />\r\n\r\n <div className=\"flex justify-end gap-2\">\r\n\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n setShowGoogleSecurityPrompt(false)\r\n setConfirmPassword('')\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n\r\n <Button\r\n onClick={handleGoogleSecurityConfirm}\r\n >\r\n Confirm\r\n </Button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n)}\r\n <ChangePassword isEditing={isEditing} />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c","_d","e"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/settings/src/AccountSettingsPanel.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 { useSession, signIn } from 'next-auth/react'\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as LR from 'lucide-react'\r\nimport { toast } from 'sonner'\r\n\r\nimport { Badge, Button, Input, LoadingSpinner, Separator } from '../../ui/'\r\nimport { UserAvatar } from '../../ui/UserAvatar'\r\nimport { useUploadFileToUser } from '../../../hooks/files/files'\r\nimport { getFileExtension } from '../../../utils/utils'\r\nimport { DescriptionListItem } from '../../ui/DescriptionList'\r\nimport { useParams,useSearchParams  } from 'next/navigation'\r\n\r\nimport ChangePassword from './ChangePassword'\r\nimport SettingsSkeleton from './SettingsSkeleton'\r\n\r\nimport { useUser, useUserRole, useUsers } from '../../../hooks/users/users'\r\nimport { useChangePassword, useVerifyPassword } from '../../../hooks/users/users';\r\nimport { usePermissions } from '../../../store'\r\n\r\n\r\ntype EditValues = Record<string, string | number | boolean | undefined>\r\n\r\ntype UserEntry = [string, unknown]\r\n\r\nconst FILTERED_USER_FIELDS = new Set([\r\n 'id',\r\n 'imageFileId',\r\n 'image',\r\n 'password',\r\n 'emailVerified',\r\n 'createdAt',\r\n 'updatedAt',\r\n 'organizationId',\r\n 'accounts',\r\n 'organization',\r\n])\r\n\r\nexport default function AccountSettingsPanel() {\r\n const t = useTranslations('UserSettings')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { data: session } = useSession()\r\n const userId = session?.user?.id\r\n const { user, isLoading, updateUser, isMutating } = useUser(session?.user?.id || '')\r\n const { uploadFile: uploadUserImage } = useUploadFileToUser(user?.id ?? 0)\r\n\r\n const { userRole } = useUserRole(user?.id ? String(user.id) : '')\r\n const [isGoogleLinked, setIsGoogleLinked] = React.useState(false)\r\n\r\n //EXTRA SEC LAYER\r\nconst [confirmPassword, setConfirmPassword] = React.useState('')\r\nconst [showGoogleSecurityPrompt, setShowGoogleSecurityPrompt] = React.useState(false)\r\nconst [googleAction, setGoogleAction] = React.useState<'link' | 'unlink' | null>(null)\r\nconst { verifyPassword, isLoading: isVerifying, error: verifyError, isValid } = useVerifyPassword(userId)\r\n//EXTRA SEC LAYER\r\nReact.useEffect(() => {\r\n\r\n  const fetchGoogleStatus = async () => {\r\n\r\n    try {\r\n      const res = await fetch('/api/google-link-status')\r\n\r\n      const data = await res.json()\r\n\r\n      setIsGoogleLinked(data.GoogleLinked)\r\n\r\n    } catch {\r\n      setIsGoogleLinked(false)\r\n    }\r\n  }\r\n\r\n  fetchGoogleStatus()\r\n\r\n}, [])\r\n\r\n const [isEditing, setIsEditing] = React.useState(false)\r\n const [editValues, setEditValues] = React.useState<EditValues>({})\r\n const [imageUploaded, setImageUploaded] = React.useState(false)\r\n const params = useParams()\r\n const searchParams = useSearchParams()\r\n const orgName = params.instance ?? 'canada'\r\n const [googleError, setGoogleError] = React.useState(\r\n searchParams.get('error')\r\n )\r\n const [googleSuccess, setGoogleSuccess] = React.useState(\r\n searchParams.get('success')\r\n )\r\n\r\n React.useEffect(() => {\r\n if(googleSuccess){\r\n toast.success(\"Successfully Linked Google account\")\r\n setGoogleSuccess(null)\r\n\r\n }\r\n\r\n if (googleError) {\r\n\r\n toast.error('Your Google account has already been linked to a different user.');\r\n setGoogleError(null)\r\n }\r\n\r\n window.history.replaceState(\r\n {},\r\n '',\r\n `/${orgName}?viewer=settings`\r\n )\r\n\r\n\r\n}, [googleError, googleSuccess, orgName])\r\n\r\n const entries = React.useMemo<UserEntry[]>(() => {\r\n if (!user) return []\r\n return Object.entries(user).filter(([key]) => !FILTERED_USER_FIELDS.has(key))\r\n }, [user])\r\n\r\n const handleInputChange = React.useCallback((key: string, value: string) => {\r\n setEditValues(prev => ({ ...prev, [key]: value }))\r\n }, [])\r\n\r\n const resetEdits = React.useCallback(() => {\r\n setIsEditing(false)\r\n setEditValues({})\r\n setImageUploaded(false)\r\n }, [])\r\n\r\n const getUpdatePayload = React.useCallback(() => {\r\n const payload: EditValues = { ...editValues }\r\n\r\n if ('firstName' in editValues || 'lastName' in editValues) {\r\n const first = editValues.firstName ?? user?.name?.split(' ')[0] ?? ''\r\n const last = editValues.lastName ?? user?.name?.split(' ').slice(1).join(' ') ?? ''\r\n payload.name = `${first} ${last}`.trim()\r\n delete payload.firstName\r\n delete payload.lastName\r\n }\r\n\r\n for (const key of Object.keys(payload)) {\r\n if (payload[key] === undefined) delete payload[key]\r\n }\r\n\r\n return payload\r\n }, [editValues, user])\r\n\r\n const hasChanges = React.useCallback(() => {\r\n if (!user) return false\r\n if (imageUploaded) return true\r\n\r\n if (\r\n (editValues.firstName && editValues.firstName !== user.name?.split(' ')[0])\r\n || (editValues.lastName && editValues.lastName !== user.name?.split(' ').slice(1).join(' '))\r\n ) {\r\n return true\r\n }\r\n\r\n return Object.entries(editValues).some(([key, value]) => {\r\n if (key === 'firstName' || key === 'lastName') return false\r\n return user[key as keyof typeof user] !== value\r\n })\r\n }, [editValues, user, imageUploaded])\r\n\r\n const handleUserImageChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0] || null\r\n if (!file || !user?.id) return\r\n try {\r\n const assetId = crypto.randomUUID()\r\n const presignedRes = await fetch(`/api/presigned-url-upload?asset=${assetId}`)\r\n if (!presignedRes.ok) throw new Error('Failed to fetch presigned URL')\r\n const { presignedUrl } = await presignedRes.json()\r\n\r\n const uploadRes = await fetch(presignedUrl, {\r\n method: 'PUT',\r\n body: file,\r\n headers: { 'Content-Type': file.type },\r\n })\r\n if (!uploadRes.ok) throw new Error('Failed to upload image')\r\n\r\n await uploadUserImage({\r\n fileData: {\r\n name: file.name,\r\n mimeType: file.type,\r\n extension: getFileExtension(file),\r\n sizeBytes: file.size,\r\n tag: 'user',\r\n assetId,\r\n uploadedAt: new Date().toISOString(),\r\n },\r\n })\r\n setImageUploaded(true)\r\n } catch {\r\n toast.error(t('toastError'))\r\n }\r\n }\r\n\r\n const handleGoogleLink = async () => {\r\n try {\r\n const resultt=await signIn('google', {\r\n redirect:true,\r\n redirectTo: '/${orgName}?&viewer=settings&error=provider_already_linked',\r\n });\r\n\r\n }\r\n catch {\r\n toast.error('Failed to start Google linking process')\r\n }\r\n\r\n}\r\n\r\nconst handleGoogleUnlink = async () => {\r\n\r\n try {\r\n\r\n const res = await fetch('/api/google-unlink', {\r\n method: 'DELETE',\r\n }) \r\n\r\n if (!res.ok) {\r\n throw new Error()\r\n }\r\n\r\n\r\n\r\n toast.success('Google account unlinked successfully')\r\n setIsGoogleLinked(false)\r\n\r\n } catch {\r\n\r\n toast.error('Failed to unlink Google account')\r\n }\r\n}\r\n\r\nconst handleGoogleSecurityConfirm = async () => {\r\n\r\n try {\r\n\r\n const isCurrentPasswordCorrect = await verifyPassword(confirmPassword)\r\n\r\n if (!isCurrentPasswordCorrect) {\r\n toast.error('Incorrect password')\r\n return\r\n }\r\n\r\n setShowGoogleSecurityPrompt(false)\r\n\r\n if (googleAction === 'link') {\r\n await handleGoogleLink()\r\n }\r\n\r\n if (googleAction === 'unlink') {\r\n await handleGoogleUnlink()\r\n }\r\n\r\n } catch {\r\n\r\n toast.error('Verification failed')\r\n }\r\n}\r\n return (\r\n <>\r\n {isLoading ? (\r\n <SettingsSkeleton />\r\n ) : (\r\n <div className=\"w-full flex flex-col lg:flex-row lg:gap-6 overflow-hidden\">\r\n <div className=\"flex-shrink-0 pb-2 px-6 lg:w-1/2 flex flex-col gap-2\">\r\n <p className=\"text-xl text-foreground font-semibold\">{t('header')}</p>\r\n <p className=\"text-sm text-muted-foreground\">{t('subheader')}</p>\r\n </div>\r\n\r\n <div className=\"flex-1 px-6 overflow-auto lg:w-1/2\">\r\n {user && (\r\n <div className=\"w-32 h-32 float-right ml-4 mb-3 bg-muted border-2 rounded-lg relative overflow-hidden group\">\r\n <label className={`block w-full h-full ${isEditing ? 'cursor-pointer' : 'cursor-default'}`}>\r\n <UserAvatar\r\n imageFileId={user?.imageFileId}\r\n name={user?.name}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n\r\n {isEditing && (\r\n <>\r\n <div className=\"absolute inset-0 transition-opacity flex items-center justify-center\">\r\n <div\r\n className=\"rounded-full p-4 flex items-center justify-center group-hover:scale-110 transition-transform\"\r\n title={t('changeImage')}\r\n >\r\n <LR.Edit className=\"size-5 m-1 text-foreground text-primary-light\" />\r\n </div>\r\n </div>\r\n <Input\r\n type=\"file\"\r\n accept=\"image/*\"\r\n title=\"Change image\"\r\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\r\n onChange={handleUserImageChange}\r\n />\r\n </>\r\n )}\r\n </label>\r\n </div>\r\n )}\r\n\r\n {user && entries.map(([key, value], index) => {\r\n if (key === 'name') {\r\n const nameParts = String(value).split(' ')\r\n const firstName = nameParts[0]\r\n const lastName = nameParts.slice(1).join(' ')\r\n return (\r\n <React.Fragment key={`name-${index}`}>\r\n <div className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('fName')}>\r\n {isEditing\r\n ? (\r\n <Input\r\n value={String(editValues.firstName ?? firstName)}\r\n onChange={e => handleInputChange('firstName', e.target.value)}\r\n type=\"text\"\r\n />\r\n )\r\n : (\r\n firstName\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n <div className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('lName')}>\r\n {isEditing\r\n ? (\r\n <Input\r\n value={String(editValues.lastName ?? lastName)}\r\n onChange={e => handleInputChange('lastName', e.target.value)}\r\n type=\"text\"\r\n />\r\n )\r\n : (\r\n lastName\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n </React.Fragment>\r\n )\r\n }\r\n if (key === 'roleId') {\r\n return (\r\n <div key=\"roleId\" className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={t('role')}>\r\n {userRole && userRole.name\r\n ? <Badge variant=\"outline\">{userRole.name}</Badge>\r\n : <Badge variant=\"outline\">{t('roleUnknown')}</Badge>}\r\n </DescriptionListItem>\r\n </div>\r\n )\r\n }\r\n\r\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value)\r\n\r\n return (\r\n <div key={key} className={`grid grid-cols-1 gap-3 py-3 w-full ${!isEditing ? 'border-b border-border' : ''}`}>\r\n <DescriptionListItem label={key === 'email' ? t('email') : t(key)}>\r\n {isEditing && (typeof value === 'string' || key === 'email')\r\n ? (\r\n <Input\r\n type={key === 'email' ? 'email' : 'text'}\r\n value={String(editValues[key] ?? value ?? '')}\r\n onChange={e => handleInputChange(key, e.target.value)}\r\n disabled={key === 'email'}\r\n />\r\n )\r\n : (\r\n displayValue\r\n )}\r\n </DescriptionListItem>\r\n </div>\r\n )\r\n })}\r\n\r\n {user && isEditing && (\r\n <div className=\"flex gap-2\">\r\n <Button\r\n disabled={!hasChanges() || isMutating || !ability.can('update', 'User')}\r\n onClick={async () => {\r\n try {\r\n const payload = getUpdatePayload()\r\n if (Object.keys(payload).length > 0) {\r\n await updateUser(payload)\r\n }\r\n toast.success(t('toastSuccess'))\r\n resetEdits()\r\n }\r\n catch {\r\n toast.error(t('toastError'))\r\n }\r\n }}\r\n >\r\n {isMutating ? <LoadingSpinner /> : t('save')}\r\n </Button>\r\n <Button onClick={resetEdits} variant=\"outline\" disabled={!ability.can('update', 'User')}>\r\n {t('cancel')}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {user && !isEditing && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => { setIsEditing(true) }}\r\n className=\"w-fit mx-auto mt-6\"\r\n disabled={!ability.can('update', 'User')}\r\n >\r\n {t('edit')}\r\n </Button>\r\n )}\r\n\r\n {user && <Separator className={isEditing ? 'my-6' : ''} />}\r\n {user && (\r\n <div className=\"px-6 py-4 flex items-center justify-between gap-4\">\r\n <div>\r\n <p className=\"font-medium\">Google Account</p>\r\n\r\n {isGoogleLinked ? (\r\n <p className=\"text-sm text-muted-foreground\">\r\n Linked successfully\r\n </p>\r\n ) : (\r\n <p className=\"text-sm text-muted-foreground\">\r\n No Google account linked\r\n </p>\r\n )}\r\n </div>\r\n {/* {googleError === 'provider_already_linked' && (\r\n  <div className=\"auth-pw-error\">\r\n    Your Google account has already been linked to a different user.\r\n  </div>\r\n\r\n)} */}\r\n\r\n <Button\r\n\r\n // onClick={\r\n // isGoogleLinked\r\n // ? handleGoogleUnlink\r\n // : handleGoogleLink\r\n // }\r\n onClick={() => {\r\n setGoogleAction(isGoogleLinked ? 'unlink' : 'link')\r\n setShowGoogleSecurityPrompt(true)\r\n}}\r\n\r\n variant=\"outline\"\r\n>\r\n {isGoogleLinked\r\n ? 'Deactivate Google'\r\n : 'Link Google Account'}\r\n</Button>\r\n </div>\r\n)}\r\n\r\n {showGoogleSecurityPrompt && (\r\n <div className=\"fixed inset-0 bg-black/40 flex items-center justify-center z-50\">\r\n\r\n <div className=\"bg-background p-6 rounded-xl w-full max-w-md space-y-4 border\">\r\n\r\n <h2 className=\"text-lg font-semibold\">\r\n Confirm Password\r\n </h2>\r\n\r\n <p className=\"text-sm text-muted-foreground\">\r\n Please confirm your password to continue.\r\n </p>\r\n\r\n <Input\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n placeholder=\"Enter password\"\r\n />\r\n\r\n <div className=\"flex justify-end gap-2\">\r\n\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n setShowGoogleSecurityPrompt(false)\r\n setConfirmPassword('')\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n\r\n <Button\r\n onClick={handleGoogleSecurityConfirm}\r\n >\r\n Confirm\r\n </Button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n)}\r\n <ChangePassword isEditing={isEditing} />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c","_d","e"]}
@@ -1,3 +1,7 @@
1
1
  import * as React from 'react';
2
- export default function OrganizationSettingsPanel(): React.JSX.Element;
2
+ interface OrganizationSettingsPanelProps {
3
+ minioBaseUrl?: string;
4
+ }
5
+ export default function OrganizationSettingsPanel({ minioBaseUrl, }: OrganizationSettingsPanelProps): React.JSX.Element;
6
+ export {};
3
7
  //# sourceMappingURL=OrganizationSettingsPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrganizationSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAyB9B,MAAM,CAAC,OAAO,UAAU,yBAAyB,sBA8chD"}
1
+ {"version":3,"file":"OrganizationSettingsPanel.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/settings/src/OrganizationSettingsPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0B9B,UAAU,8BAA8B;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,YAAY,GACb,EAAE,8BAA8B,qBA+chC"}
@@ -22,6 +22,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
22
  import * as React from "react";
23
23
  import { useSession } from "next-auth/react";
24
24
  import { toast } from "sonner";
25
+ import { mutate } from "swr";
25
26
  import { useTranslations } from "next-intl";
26
27
  import { MapContext, usePermissions } from "../../../store";
27
28
  import * as LR from "lucide-react";
@@ -39,8 +40,9 @@ import {
39
40
  import { uploadOrganizationLogoToPublicBucket } from "../../../utils/imageUtils";
40
41
  import { useOrganization } from "../../../hooks/organizations/organizations";
41
42
  import OrganizationSkeleton from "./OrganizationSkeleton";
42
- import { useAppConfigContext } from "../../../store/AppConfig/context";
43
- function OrganizationSettingsPanel() {
43
+ function OrganizationSettingsPanel({
44
+ minioBaseUrl
45
+ }) {
44
46
  var _a, _b, _c, _d, _e, _f;
45
47
  const t = useTranslations("OrganizationSettings");
46
48
  const { ability } = usePermissions();
@@ -95,6 +97,7 @@ function OrganizationSettingsPanel() {
95
97
  const responseData = await res.json();
96
98
  const updatedOrg = (_a2 = responseData == null ? void 0 : responseData.organization) != null ? _a2 : responseData;
97
99
  setOrganization(updatedOrg);
100
+ mutate(["organization", String(userOrganizationId)], updatedOrg, { revalidate: false });
98
101
  setEditingValues({});
99
102
  setIsEditing(false);
100
103
  setHasChanges(false);
@@ -112,9 +115,8 @@ function OrganizationSettingsPanel() {
112
115
  setSelectedLogoFile(null);
113
116
  setSelectedFaviconFile(null);
114
117
  };
115
- const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext();
116
- const logoUrl = selectedLogoFile ? URL.createObjectURL(selectedLogoFile) : (organization == null ? void 0 : organization.logoKey) && minioUrl ? `${minioUrl}/org-logos/${organization.logoKey}` : null;
117
- const faviconUrl = selectedFaviconFile ? URL.createObjectURL(selectedFaviconFile) : (organization == null ? void 0 : organization.faviconKey) && minioUrl ? `${minioUrl}/org-logos/${organization.faviconKey}` : null;
118
+ const logoUrl = selectedLogoFile ? URL.createObjectURL(selectedLogoFile) : getFieldValue("logoKey") && minioBaseUrl ? `${minioBaseUrl}/org-logos/${getFieldValue("logoKey")}` : null;
119
+ const faviconUrl = selectedFaviconFile ? URL.createObjectURL(selectedFaviconFile) : getFieldValue("faviconKey") && minioBaseUrl ? `${minioBaseUrl}/org-logos/${getFieldValue("faviconKey")}` : null;
118
120
  if (isOrganizationLoading) {
119
121
  return /* @__PURE__ */ jsx(OrganizationSkeleton, {});
120
122
  }