@collabdt/core 0.0.55 → 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 (264) 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 +8 -5
  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 +2 -3
  16. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  17. package/dist/core/components/authentication/Signin.d.ts +6 -1
  18. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  19. package/dist/core/components/authentication/Signin.js +17 -6
  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 -3
  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 -3
  53. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  54. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  55. package/dist/core/components/ui/AppSidebar.js +11 -11
  56. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  57. package/dist/core/components/ui/InfoSidebar/Container.d.ts +3 -1
  58. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  59. package/dist/core/components/ui/InfoSidebar/Container.js +4 -2
  60. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  61. package/dist/core/components/ui/InfoSidebar/Header.d.ts +3 -2
  62. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  63. package/dist/core/components/ui/InfoSidebar/Header.js +5 -6
  64. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  65. package/dist/core/components/ui/InfoSidebar/index.d.ts +7 -1
  66. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  67. package/dist/core/components/ui/InfoSidebar/index.js +4 -4
  68. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  69. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +2 -1
  70. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  71. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +3 -2
  72. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  73. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +3 -1
  74. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  75. package/dist/core/components/ui/Sensors/SensorsSection.js +3 -1
  76. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  77. package/dist/core/components/ui/Sidebar.d.ts +8 -0
  78. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  79. package/dist/core/components/ui/Sidebar.js +21 -7
  80. package/dist/core/components/ui/Sidebar.js.map +1 -1
  81. package/dist/core/components/ui/ToolbarButton.js +18 -1
  82. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  83. package/dist/core/components/viewers/Data/DataMenu.d.ts +5 -1
  84. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  85. package/dist/core/components/viewers/Data/DataMenu.js +6 -3
  86. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  87. package/dist/core/components/viewers/Data/HeaderButtons.d.ts +3 -1
  88. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  89. package/dist/core/components/viewers/Data/HeaderButtons.js +6 -2
  90. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  91. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts +3 -1
  92. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  93. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js +4 -2
  94. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  95. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts +3 -1
  96. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  97. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +3 -1
  98. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  99. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts +2 -1
  100. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  101. package/dist/core/components/viewers/Data/details/DetailHeader.js +3 -5
  102. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  103. package/dist/core/components/viewers/Viewer.d.ts +7 -1
  104. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  105. package/dist/core/components/viewers/Viewer.js +6 -6
  106. package/dist/core/components/viewers/Viewer.js.map +1 -1
  107. package/dist/core/components/viewers/bim/BimToolbar.d.ts +3 -1
  108. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  109. package/dist/core/components/viewers/bim/BimToolbar.js +2 -2
  110. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  111. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +3 -1
  112. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  113. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  114. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  115. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts +5 -1
  116. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  117. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +3 -2
  118. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  119. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +3 -1
  120. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  121. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +2 -2
  122. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  123. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +1 -1
  124. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  125. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +2 -2
  126. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  127. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts +3 -1
  128. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  129. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js +4 -2
  130. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  131. package/dist/core/components/viewers/map/MapViewer.d.ts +3 -1
  132. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  133. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  134. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  135. package/dist/core/components/viewers/map/datasets/RowActions.d.ts +2 -1
  136. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  137. package/dist/core/components/viewers/map/datasets/RowActions.js +5 -4
  138. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  139. package/dist/core/components/viewers/map/datasets/index.d.ts +5 -1
  140. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  141. package/dist/core/components/viewers/map/datasets/index.js +15 -16
  142. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  143. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  144. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  145. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +3 -5
  146. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  147. package/dist/core/components/viewers/map/src/Geocoder.d.ts +3 -1
  148. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  149. package/dist/core/components/viewers/map/src/Geocoder.js +5 -1
  150. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  151. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +6 -1
  152. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  153. package/dist/core/components/viewers/map/src/MapLayers/index.js +3 -3
  154. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  155. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts +5 -1
  156. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  157. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +6 -10
  158. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  159. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +3 -1
  160. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +2 -2
  162. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  163. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts +6 -1
  164. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  165. package/dist/core/components/viewers/map/src/MapSidebar/index.js +5 -4
  166. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  167. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts +5 -1
  168. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  169. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js +5 -8
  170. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +3 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts +3 -1
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  177. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js +2 -2
  178. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  179. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts +3 -1
  180. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  181. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js +4 -7
  182. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  183. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  184. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +8 -8
  185. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  186. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts +8 -1
  187. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  188. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js +8 -3
  189. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  190. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts +11 -1
  191. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  192. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js +5 -3
  193. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  194. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts +10 -1
  195. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  196. package/dist/core/components/viewers/map/src/tools/mapTools.js +5 -3
  197. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  198. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +14 -5
  199. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  200. package/dist/core/components/viewers/map/utils/geocoding/config.js +22 -11
  201. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  202. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  203. package/dist/core/components/viewers/map/utils/geocoding/index.js +2 -2
  204. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  205. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  206. package/dist/core/components/viewers/map/utils/geocoding/osm.js +5 -4
  207. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  208. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  209. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +7 -5
  210. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  211. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts +3 -1
  212. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  213. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +11 -12
  214. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  215. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts +3 -1
  216. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  217. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +37 -50
  218. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  219. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts +3 -1
  220. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  221. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js +5 -3
  222. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  223. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts +2 -1
  224. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  225. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js +8 -7
  226. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  227. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts +2 -1
  228. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  229. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js +22 -9
  230. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  231. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts +5 -1
  232. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  233. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js +3 -2
  234. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  235. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts +3 -1
  236. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  237. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -2
  238. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  239. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
  240. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  241. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +12 -22
  242. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  243. package/dist/core/hooks/useCaptureScreenshot.d.ts +2 -0
  244. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -0
  245. package/dist/core/hooks/useCaptureScreenshot.js +63 -0
  246. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -0
  247. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts +3 -0
  248. package/dist/core/hooks/useGeocodingRuntimeConfig.d.ts.map +1 -0
  249. package/dist/core/hooks/useGeocodingRuntimeConfig.js +17 -0
  250. package/dist/core/hooks/useGeocodingRuntimeConfig.js.map +1 -0
  251. package/dist/core/store/AppConfig/context.d.ts +15 -1
  252. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  253. package/dist/core/store/AppConfig/context.js +26 -5
  254. package/dist/core/store/AppConfig/context.js.map +1 -1
  255. package/dist/core/store/CombineProviders.d.ts +6 -1
  256. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  257. package/dist/core/store/CombineProviders.js +4 -3
  258. package/dist/core/store/CombineProviders.js.map +1 -1
  259. package/dist/core/types/tools.d.ts +2 -1
  260. package/dist/core/types/tools.d.ts.map +1 -1
  261. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  262. package/dist/core/utils/imageUtils.js +2 -1
  263. package/dist/core/utils/imageUtils.js.map +1 -1
  264. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/ui/AnimatedBackground.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 { useEffect, useRef, useState } from 'react'\r\nimport { useMotionValue, useSpring } from 'framer-motion'\r\n\r\ninterface Props {\r\n theme?: 'light' | 'dark'\r\n}\r\n\r\nexport default function AnimatedBackground({ theme }: Props = {}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null)\r\n const mouseX = useMotionValue(0)\r\n const mouseY = useMotionValue(0)\r\n const smoothMouseX = useSpring(mouseX, { stiffness: 50, damping: 20 })\r\n const smoothMouseY = useSpring(mouseY, { stiffness: 50, damping: 20 })\r\n const [isDark, setIsDark] = useState(theme !== undefined ? theme === 'dark' : true)\r\n\r\n useEffect(() => {\r\n // If theme is controlled externally, just sync and skip the observer\r\n if (theme !== undefined) {\r\n setIsDark(theme === 'dark')\r\n return\r\n }\r\n\r\n // Auto-detect from document for standalone usage (hero section)\r\n setIsDark(document.documentElement.classList.contains('dark'))\r\n const observer = new MutationObserver(() => {\r\n setIsDark(document.documentElement.classList.contains('dark'))\r\n })\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class']\r\n })\r\n return () => observer.disconnect()\r\n }, [theme])\r\n\r\n useEffect(() => {\r\n const handleMouseMove = (e: MouseEvent) => {\r\n mouseX.set(e.clientX)\r\n mouseY.set(e.clientY)\r\n }\r\n\r\n window.addEventListener('mousemove', handleMouseMove)\r\n return () => window.removeEventListener('mousemove', handleMouseMove)\r\n }, [mouseX, mouseY])\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current\r\n if (!canvas) return\r\n\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return\r\n\r\n const resize = () => {\r\n canvas.width = window.innerWidth\r\n canvas.height = window.innerHeight\r\n }\r\n resize()\r\n window.addEventListener('resize', resize)\r\n\r\n let animationFrameId: number\r\n let time = 0\r\n let offsetX = 0\r\n\r\n interface DataNode {\r\n x: number\r\n y: number\r\n baseX: number\r\n baseY: number\r\n connections: number[]\r\n pulse: number\r\n }\r\n\r\n const dataNodes: DataNode[] = []\r\n const gridSize = 100\r\n const nodeSpacing = 150\r\n // Render extra columns for seamless wrap\r\n const nodeCols = Math.ceil(canvas.width / nodeSpacing) + 2\r\n const nodeRows = Math.ceil(canvas.height / nodeSpacing)\r\n\r\n for (let row = 0; row < nodeRows; row++) {\r\n for (let col = 0; col < nodeCols; col++) {\r\n const index = row * nodeCols + col\r\n const baseX = col * nodeSpacing + nodeSpacing / 2\r\n const baseY = row * nodeSpacing + nodeSpacing / 2\r\n dataNodes.push({\r\n x: baseX,\r\n y: baseY,\r\n baseX,\r\n baseY,\r\n connections: [],\r\n pulse: (row + col) * 0.5\r\n })\r\n }\r\n }\r\n\r\n dataNodes.forEach((node, i) => {\r\n const col = i % nodeCols\r\n const row = Math.floor(i / nodeCols)\r\n if (col < nodeCols - 1) {\r\n node.connections.push(i + 1)\r\n }\r\n if (row < nodeRows - 1) {\r\n node.connections.push(i + nodeCols)\r\n }\r\n })\r\n\r\n const draw = () => {\r\n time += 0.008\r\n // Move left slowly\r\n offsetX += 0.1 // Lower for slower movement\r\n // Loop offsetX to avoid overflow and create infinite effect\r\n if (offsetX > nodeSpacing) offsetX -= nodeSpacing\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Theme-aware colors\r\n const bgGradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height)\r\n if (isDark) {\r\n bgGradient.addColorStop(0, 'rgba(239, 145, 97, 0.025)')\r\n bgGradient.addColorStop(1, 'rgba(180, 90, 40, 0.02)')\r\n } else {\r\n bgGradient.addColorStop(0, 'rgba(239, 146, 98, 0.08)')\r\n bgGradient.addColorStop(1, 'rgba(239, 146, 98, 0.06)')\r\n }\r\n ctx.fillStyle = bgGradient\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Animate node positions with floating effect\r\n dataNodes.forEach((node, i) => {\r\n const floatX = Math.sin(time * 0.3 + node.pulse) * 2\r\n const floatY = Math.cos(time * 0.2 + node.pulse) * 2\r\n // Shift node baseX by offsetX for infinite left movement\r\n let x = node.baseX - offsetX + floatX\r\n // Wrap node.x to the right if it goes off the left edge\r\n x = ((x + nodeCols * nodeSpacing) % (nodeCols * nodeSpacing))\r\n node.x = x\r\n node.y = node.baseY + floatY\r\n })\r\n\r\n // Theme-aware grid lines\r\n ctx.strokeStyle = isDark ? 'rgba(239, 145, 97, 0.08)' : 'rgba(239, 146, 98, 0.3)'\r\n ctx.lineWidth = 0.5\r\n \r\n for (let y = canvas.height; y > canvas.height * 0.3; y -= gridSize) {\r\n ctx.beginPath()\r\n ctx.moveTo(0, y)\r\n ctx.lineTo(canvas.width, y)\r\n ctx.stroke()\r\n }\r\n \r\n const verticalSpacing = gridSize * 1.5\r\n // Render extra vertical grid lines for seamless wrap\r\n const gridCols = Math.ceil(canvas.width / verticalSpacing) + 2\r\n for (let i = 0; i < gridCols; i++) {\r\n // Shift grid lines by offsetX for infinite left movement\r\n let x = i * verticalSpacing - offsetX % verticalSpacing - verticalSpacing\r\n // Wrap x for seamless effect\r\n x = ((x + gridCols * verticalSpacing) % (gridCols * verticalSpacing))\r\n ctx.beginPath()\r\n ctx.moveTo(x, canvas.height)\r\n ctx.lineTo(x + (x - canvas.width / 2) * 0.3, canvas.height * 0.3)\r\n ctx.stroke()\r\n }\r\n\r\n // Theme-aware connections with data flow\r\n ctx.lineWidth = 0.8\r\n dataNodes.forEach((node, i) => {\r\n node.connections.forEach(targetIndex => {\r\n const target = dataNodes[targetIndex]\r\n const pulse = (Math.sin(time + node.pulse) + 1) / 2\r\n \r\n ctx.beginPath()\r\n ctx.moveTo(node.x, node.y)\r\n ctx.lineTo(target.x, target.y)\r\n ctx.strokeStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.1 + pulse * 0.08})`\r\n : `rgba(239, 146, 98, ${0.35 + pulse * 0.2})`\r\n ctx.stroke()\r\n\r\n // Animated data particles flowing along connections\r\n const flowProgress = (time * 0.3 + node.pulse) % 1\r\n const particleX = node.x + (target.x - node.x) * flowProgress\r\n const particleY = node.y + (target.y - node.y) * flowProgress\r\n\r\n ctx.beginPath()\r\n ctx.arc(particleX, particleY, 1.5, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.5 + pulse * 0.3})`\r\n : `rgba(239, 146, 98, ${0.7 + pulse * 0.3})`\r\n ctx.fill()\r\n })\r\n })\r\n\r\n // Theme-aware nodes\r\n dataNodes.forEach(node => {\r\n const pulse = (Math.sin(time + node.pulse) + 1) / 2\r\n const size = 2.5 + pulse * 1\r\n \r\n ctx.beginPath()\r\n ctx.arc(node.x, node.y, size * 2, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.12 + pulse * 0.1})`\r\n : `rgba(239, 146, 98, ${0.3 + pulse * 0.15})`\r\n ctx.fill()\r\n\r\n ctx.beginPath()\r\n ctx.arc(node.x, node.y, size, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.55 + pulse * 0.25})`\r\n : `rgba(239, 146, 98, ${0.75 + pulse * 0.2})`\r\n ctx.fill()\r\n })\r\n\r\n animationFrameId = requestAnimationFrame(draw)\r\n }\r\n\r\n draw()\r\n\r\n return () => {\r\n cancelAnimationFrame(animationFrameId)\r\n window.removeEventListener('resize', resize)\r\n }\r\n }, [smoothMouseX, smoothMouseY, isDark])\r\n\r\n const assetsUrl = process.env.NEXT_PUBLIC_MINIO_BUCKET_URL || ''\r\n\r\n return (\r\n <>\r\n <div className=\"absolute top-0 right-0 inset-0 z-10 w-screen\">\r\n <img\r\n src={`${assetsUrl}/cdt-homepage/home-bg.png`}\r\n alt=\"Background\"\r\n className=\"object-cover opacity-10 w-screen\"\r\n style={{ filter: isDark ? 'invert(0)' : 'invert(1)' }}\r\n />\r\n </div>\r\n <div className=\"absolute w-screen inset-0 bg-gradient-to-br from-background/10 via-background/5 to-primary/5\" />\r\n <canvas\r\n ref={canvasRef}\r\n className=\"absolute inset-0 w-full h-full opacity-30\"\r\n style={{ mixBlendMode: isDark ? 'screen' : 'multiply' }}\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-background/30 via-background/10 to-transparent\" />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/ui/AnimatedBackground.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 { useEffect, useRef, useState } from 'react'\r\nimport { useMotionValue, useSpring } from 'framer-motion'\r\n\r\ninterface Props {\r\n theme?: 'light' | 'dark'\r\n assetsUrl?: string\r\n}\r\n\r\nexport default function AnimatedBackground({ theme, assetsUrl }: Props = {}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null)\r\n const mouseX = useMotionValue(0)\r\n const mouseY = useMotionValue(0)\r\n const smoothMouseX = useSpring(mouseX, { stiffness: 50, damping: 20 })\r\n const smoothMouseY = useSpring(mouseY, { stiffness: 50, damping: 20 })\r\n const [isDark, setIsDark] = useState(theme !== undefined ? theme === 'dark' : true)\r\n\r\n useEffect(() => {\r\n // If theme is controlled externally, just sync and skip the observer\r\n if (theme !== undefined) {\r\n setIsDark(theme === 'dark')\r\n return\r\n }\r\n\r\n // Auto-detect from document for standalone usage (hero section)\r\n setIsDark(document.documentElement.classList.contains('dark'))\r\n const observer = new MutationObserver(() => {\r\n setIsDark(document.documentElement.classList.contains('dark'))\r\n })\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class']\r\n })\r\n return () => observer.disconnect()\r\n }, [theme])\r\n\r\n useEffect(() => {\r\n const handleMouseMove = (e: MouseEvent) => {\r\n mouseX.set(e.clientX)\r\n mouseY.set(e.clientY)\r\n }\r\n\r\n window.addEventListener('mousemove', handleMouseMove)\r\n return () => window.removeEventListener('mousemove', handleMouseMove)\r\n }, [mouseX, mouseY])\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current\r\n if (!canvas) return\r\n\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return\r\n\r\n const resize = () => {\r\n canvas.width = window.innerWidth\r\n canvas.height = window.innerHeight\r\n }\r\n resize()\r\n window.addEventListener('resize', resize)\r\n\r\n let animationFrameId: number\r\n let time = 0\r\n let offsetX = 0\r\n\r\n interface DataNode {\r\n x: number\r\n y: number\r\n baseX: number\r\n baseY: number\r\n connections: number[]\r\n pulse: number\r\n }\r\n\r\n const dataNodes: DataNode[] = []\r\n const gridSize = 100\r\n const nodeSpacing = 150\r\n // Render extra columns for seamless wrap\r\n const nodeCols = Math.ceil(canvas.width / nodeSpacing) + 2\r\n const nodeRows = Math.ceil(canvas.height / nodeSpacing)\r\n\r\n for (let row = 0; row < nodeRows; row++) {\r\n for (let col = 0; col < nodeCols; col++) {\r\n const index = row * nodeCols + col\r\n const baseX = col * nodeSpacing + nodeSpacing / 2\r\n const baseY = row * nodeSpacing + nodeSpacing / 2\r\n dataNodes.push({\r\n x: baseX,\r\n y: baseY,\r\n baseX,\r\n baseY,\r\n connections: [],\r\n pulse: (row + col) * 0.5\r\n })\r\n }\r\n }\r\n\r\n dataNodes.forEach((node, i) => {\r\n const col = i % nodeCols\r\n const row = Math.floor(i / nodeCols)\r\n if (col < nodeCols - 1) {\r\n node.connections.push(i + 1)\r\n }\r\n if (row < nodeRows - 1) {\r\n node.connections.push(i + nodeCols)\r\n }\r\n })\r\n\r\n const draw = () => {\r\n time += 0.008\r\n // Move left slowly\r\n offsetX += 0.1 // Lower for slower movement\r\n // Loop offsetX to avoid overflow and create infinite effect\r\n if (offsetX > nodeSpacing) offsetX -= nodeSpacing\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Theme-aware colors\r\n const bgGradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height)\r\n if (isDark) {\r\n bgGradient.addColorStop(0, 'rgba(239, 145, 97, 0.025)')\r\n bgGradient.addColorStop(1, 'rgba(180, 90, 40, 0.02)')\r\n } else {\r\n bgGradient.addColorStop(0, 'rgba(239, 146, 98, 0.08)')\r\n bgGradient.addColorStop(1, 'rgba(239, 146, 98, 0.06)')\r\n }\r\n ctx.fillStyle = bgGradient\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n\r\n // Animate node positions with floating effect\r\n dataNodes.forEach((node, i) => {\r\n const floatX = Math.sin(time * 0.3 + node.pulse) * 2\r\n const floatY = Math.cos(time * 0.2 + node.pulse) * 2\r\n // Shift node baseX by offsetX for infinite left movement\r\n let x = node.baseX - offsetX + floatX\r\n // Wrap node.x to the right if it goes off the left edge\r\n x = ((x + nodeCols * nodeSpacing) % (nodeCols * nodeSpacing))\r\n node.x = x\r\n node.y = node.baseY + floatY\r\n })\r\n\r\n // Theme-aware grid lines\r\n ctx.strokeStyle = isDark ? 'rgba(239, 145, 97, 0.08)' : 'rgba(239, 146, 98, 0.3)'\r\n ctx.lineWidth = 0.5\r\n \r\n for (let y = canvas.height; y > canvas.height * 0.3; y -= gridSize) {\r\n ctx.beginPath()\r\n ctx.moveTo(0, y)\r\n ctx.lineTo(canvas.width, y)\r\n ctx.stroke()\r\n }\r\n \r\n const verticalSpacing = gridSize * 1.5\r\n // Render extra vertical grid lines for seamless wrap\r\n const gridCols = Math.ceil(canvas.width / verticalSpacing) + 2\r\n for (let i = 0; i < gridCols; i++) {\r\n // Shift grid lines by offsetX for infinite left movement\r\n let x = i * verticalSpacing - offsetX % verticalSpacing - verticalSpacing\r\n // Wrap x for seamless effect\r\n x = ((x + gridCols * verticalSpacing) % (gridCols * verticalSpacing))\r\n ctx.beginPath()\r\n ctx.moveTo(x, canvas.height)\r\n ctx.lineTo(x + (x - canvas.width / 2) * 0.3, canvas.height * 0.3)\r\n ctx.stroke()\r\n }\r\n\r\n // Theme-aware connections with data flow\r\n ctx.lineWidth = 0.8\r\n dataNodes.forEach((node, i) => {\r\n node.connections.forEach(targetIndex => {\r\n const target = dataNodes[targetIndex]\r\n const pulse = (Math.sin(time + node.pulse) + 1) / 2\r\n \r\n ctx.beginPath()\r\n ctx.moveTo(node.x, node.y)\r\n ctx.lineTo(target.x, target.y)\r\n ctx.strokeStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.1 + pulse * 0.08})`\r\n : `rgba(239, 146, 98, ${0.35 + pulse * 0.2})`\r\n ctx.stroke()\r\n\r\n // Animated data particles flowing along connections\r\n const flowProgress = (time * 0.3 + node.pulse) % 1\r\n const particleX = node.x + (target.x - node.x) * flowProgress\r\n const particleY = node.y + (target.y - node.y) * flowProgress\r\n\r\n ctx.beginPath()\r\n ctx.arc(particleX, particleY, 1.5, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.5 + pulse * 0.3})`\r\n : `rgba(239, 146, 98, ${0.7 + pulse * 0.3})`\r\n ctx.fill()\r\n })\r\n })\r\n\r\n // Theme-aware nodes\r\n dataNodes.forEach(node => {\r\n const pulse = (Math.sin(time + node.pulse) + 1) / 2\r\n const size = 2.5 + pulse * 1\r\n \r\n ctx.beginPath()\r\n ctx.arc(node.x, node.y, size * 2, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.12 + pulse * 0.1})`\r\n : `rgba(239, 146, 98, ${0.3 + pulse * 0.15})`\r\n ctx.fill()\r\n\r\n ctx.beginPath()\r\n ctx.arc(node.x, node.y, size, 0, Math.PI * 2)\r\n ctx.fillStyle = isDark\r\n ? `rgba(239, 145, 97, ${0.55 + pulse * 0.25})`\r\n : `rgba(239, 146, 98, ${0.75 + pulse * 0.2})`\r\n ctx.fill()\r\n })\r\n\r\n animationFrameId = requestAnimationFrame(draw)\r\n }\r\n\r\n draw()\r\n\r\n return () => {\r\n cancelAnimationFrame(animationFrameId)\r\n window.removeEventListener('resize', resize)\r\n }\r\n }, [smoothMouseX, smoothMouseY, isDark])\r\n\r\n return (\r\n <>\r\n <div className=\"absolute top-0 right-0 inset-0 z-10 w-screen\">\r\n <img\r\n src={`${assetsUrl ?? ''}/cdt-homepage/home-bg.png`}\r\n alt=\"Background\"\r\n className=\"object-cover opacity-10 w-screen\"\r\n style={{ filter: isDark ? 'invert(0)' : 'invert(1)' }}\r\n />\r\n </div>\r\n <div className=\"absolute w-screen inset-0 bg-gradient-to-br from-background/10 via-background/5 to-primary/5\" />\r\n <canvas\r\n ref={canvasRef}\r\n className=\"absolute inset-0 w-full h-full opacity-30\"\r\n style={{ mixBlendMode: isDark ? 'screen' : 'multiply' }}\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-background/30 via-background/10 to-transparent\" />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"AppSidebar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/AppSidebar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,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,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAClF;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,eAAe,qBA4FhE"}
1
+ {"version":3,"file":"AppSidebar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/AppSidebar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,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,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAClF;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,eAAe,qBAmFhE"}
@@ -50,30 +50,30 @@ function AppSidebar({ children, signOut }) {
50
50
  /* @__PURE__ */ jsxs(
51
51
  "div",
52
52
  {
53
- className: `w-full flex flex-col ${sidebarState === "expanded" ? "items-center justify-center" : "justify-center"}`,
53
+ className: `w-full flex flex-col ${sidebarState === "expanded" ? "items-center justify-center" : "justify-center pb-4"}`,
54
54
  children: [
55
55
  /* @__PURE__ */ jsx(NavUser, { signOut }),
56
- /* @__PURE__ */ jsx(
56
+ !isCollapsed ? /* @__PURE__ */ jsx(
57
57
  Link,
58
58
  {
59
59
  href: "https://collabdt.org/",
60
- className: sidebarState === "expanded" ? "w-full" : "",
61
60
  target: "_blank",
62
61
  rel: "noopener noreferrer",
63
- children: /* @__PURE__ */ jsx(
62
+ className: "w-full",
63
+ children: /* @__PURE__ */ jsxs(
64
64
  Button,
65
65
  {
66
- title: isCollapsed ? t("home") : void 0,
66
+ title: t("home"),
67
67
  variant: "ghost",
68
- className: `text-xs scale-[85%] py-0 my-0 w-full ${sidebarState === "expanded" ? "flex flex-row items-center justify-center gap-2" : "flex flex-col items-center"}`,
69
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
70
- /* @__PURE__ */ jsx("div", { className: isCollapsed ? "scale-75" : "", children: /* @__PURE__ */ jsx(CdtIcon, { monochromatic: true }) }),
71
- !isCollapsed && /* @__PURE__ */ jsx("span", { children: t("home") })
72
- ] })
68
+ className: "text-xs scale-[85%] py-0 my-0 w-full flex flex-row items-center justify-center gap-2",
69
+ children: [
70
+ /* @__PURE__ */ jsx(CdtIcon, { monochromatic: true }),
71
+ /* @__PURE__ */ jsx("span", { children: t("home") })
72
+ ]
73
73
  }
74
74
  )
75
75
  }
76
- )
76
+ ) : null
77
77
  ]
78
78
  }
79
79
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/components/ui/AppSidebar.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 { Button } from './Button'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\nimport { useTranslations } from 'next-intl'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport Link from 'next/link'\r\nimport { Sidebar, useSidebar, NavUser } from './'\r\nimport { ViewerNames } from '../../types'\r\nimport { useMenusContext } from '../../store'\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 children?: React.ReactNode\r\n signOut: (options?: { redirectTo?: string; redirect?: boolean }) => Promise<void>\r\n}\r\n\r\nexport function AppSidebar({ children, signOut }: AppSidebarProps) {\r\n // Translations\r\n const t = useTranslations('AppSidebar')\r\n\r\n const { state: menusState } = useMenusContext()\r\n\r\n const { sidebarState, isMobile, openMobile, toggleMenuSidebar } = useSidebar()\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 // Determine the collapsible type based on the current viewer\r\n const collapsibleType = currentViewer === ViewerNames.auth ? 'offcanvas' : 'icon'\r\n\r\n return (\r\n <>\r\n {/* Always show toggle button on mobile when collapsed */}\r\n {isMobile && isCollapsed && (\r\n <div id='sidebar-toggle-button-mobile' className='fixed left-0 top-1/2 -translate-y-1/2 z-[100] flex items-center justify-center pointer-events-auto'>\r\n <button\r\n onClick={toggleMenuSidebar}\r\n className=\"text-muted-foreground hover:text-primary p-[2px] rounded-r-md bg-sidebar\"\r\n style={{ border: '1px solid rgba(128,128,128,0.2)', borderLeft: 'none', boxShadow: '4px 0 8px -4px rgba(0,0,0,0.12)' }}\r\n >\r\n <LR.ChevronRight className=\"w-5\" />\r\n </button>\r\n </div>\r\n )}\r\n <Sidebar collapsible={collapsibleType} className=\"border-none z-50 shadow-md relative\" >\r\n {/* Sidebar toggle button - right side inside Sidebar */}\r\n {(sidebarState === 'expanded') && (\r\n <div id='sidebar-toggle-button' className={`absolute right-2 top-2 flex items-center justify-center pointer-events-auto z-50 ${isMobile ? '' : ''}`}>\r\n <button onClick={toggleMenuSidebar} className='text-muted-foreground hover:text-primary p-1'>\r\n <LR.X className='w-5' />\r\n </button>\r\n </div>\r\n )}\r\n {/* Show collapsed toggle only on desktop */}\r\n {!isMobile && sidebarState !== 'expanded' && (\r\n <div id='sidebar-toggle-button' className='absolute -right-1 max-h-1 top-1/2 -translate-y-1/2 flex items-center justify-center pointer-events-auto z-50'>\r\n <button\r\n onClick={toggleMenuSidebar}\r\n className=\"text-muted-foreground hover:text-primary p-0 rounded-md bg-sidebar\"\r\n style={{ borderRight: '1px solid rgba(128,128,128,0.2)', boxShadow: '4px 0 8px -4px rgba(0,0,0,0.12)' }}\r\n >\r\n <LR.ChevronRight className=\"w-4\" />\r\n </button>\r\n </div>\r\n )}\r\n {children}\r\n <div\r\n className={`w-full flex flex-col ${\r\n sidebarState === 'expanded'\r\n ? 'items-center justify-center'\r\n : 'justify-center'\r\n }`}\r\n >\r\n {/* Nav User */}\r\n <NavUser signOut={signOut} />\r\n\r\n <Link\r\n href=\"https://collabdt.org/\"\r\n className={sidebarState === 'expanded' ? 'w-full' : ''}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n <Button\r\n title={isCollapsed ? t('home') : undefined}\r\n variant=\"ghost\"\r\n className={`text-xs scale-[85%] py-0 my-0 w-full ${\r\n sidebarState === 'expanded'\r\n ? 'flex flex-row items-center justify-center gap-2'\r\n : 'flex flex-col items-center'\r\n }`}\r\n >\r\n <>\r\n <div className={isCollapsed ? 'scale-75' : ''}>\r\n <CdtIcon monochromatic />\r\n </div>\r\n\r\n {!isCollapsed && (\r\n <span>{t('home')}</span>\r\n )}\r\n </>\r\n </Button>\r\n </Link>\r\n </div>\r\n </Sidebar>\r\n </>\r\n )\r\n}"],"mappings":";AAuEY,SAmDI,UAnDJ,KAmDI,YAnDJ;AA/DZ,SAAS,cAAc;AAGvB,YAAY,QAAQ;AAEpB,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,SAAS,SAAS,YAAY,eAAe;AAC7C,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEzB,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,WAAW,EAAE,UAAU,QAAQ,GAAoB;AAEjE,QAAM,IAAI,gBAAgB,YAAY;AAEtC,QAAM,EAAE,OAAO,WAAW,IAAI,gBAAgB;AAE9C,QAAM,EAAE,cAAc,UAAU,YAAY,kBAAkB,IAAI,WAAW;AAE7E,QAAM,EAAE,cAAc,IAAI,WAAW;AAGrC,QAAM,cAAc,WAAW,CAAC,aAAa,iBAAiB;AAG9D,QAAM,kBAAkB,kBAAkB,YAAY,OAAO,cAAc;AAE3E,SACE,iCAEG;AAAA,gBAAY,eACX,oBAAC,SAAI,IAAG,gCAA+B,WAAU,sGAC/C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,mCAAmC,YAAY,QAAQ,WAAW,kCAAkC;AAAA,QAErH,8BAAC,GAAG,cAAH,EAAgB,WAAU,OAAM;AAAA;AAAA,IACnC,GACF;AAAA,IAEF,qBAAC,WAAQ,aAAa,iBAAiB,WAAU,uCAE7C;AAAA,uBAAiB,cACjB,oBAAC,SAAI,IAAG,yBAAwB,WAAW,oFAAoF,WAAW,KAAK,EAAE,IAC/I,8BAAC,YAAO,SAAS,mBAAmB,WAAU,gDAC5C,8BAAC,GAAG,GAAH,EAAK,WAAU,OAAM,GACxB,GACF;AAAA,MAGD,CAAC,YAAY,iBAAiB,cAC7B,oBAAC,SAAI,IAAG,yBAAwB,WAAU,gHACxC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,mCAAmC,WAAW,kCAAkC;AAAA,UAEtG,8BAAC,GAAG,cAAH,EAAgB,WAAU,OAAM;AAAA;AAAA,MACnC,GACF;AAAA,MAED;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACG,WAAW,wBACT,iBAAiB,aACb,gCACA,gBACN;AAAA,UAGA;AAAA,gCAAC,WAAQ,SAAkB;AAAA,YAE3B;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,iBAAiB,aAAa,WAAW;AAAA,gBACpD,QAAO;AAAA,gBACP,KAAI;AAAA,gBAEJ;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,cAAc,EAAE,MAAM,IAAI;AAAA,oBACjC,SAAQ;AAAA,oBACR,WAAW,wCACT,iBAAiB,aACb,oDACA,4BACN;AAAA,oBAEA,2CACA;AAAA,0CAAC,SAAI,WAAW,cAAc,aAAa,IACzC,8BAAC,WAAQ,eAAa,MAAC,GACzB;AAAA,sBAEC,CAAC,eACA,oBAAC,UAAM,YAAE,MAAM,GAAE;AAAA,uBAErB;AAAA;AAAA,gBACA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,OACJ;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/components/ui/AppSidebar.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 { Button } from './Button'\r\n\r\n// Icons\r\nimport * as LR from 'lucide-react'\r\n\r\nimport { useTranslations } from 'next-intl'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport Link from 'next/link'\r\nimport { Sidebar, useSidebar, NavUser } from './'\r\nimport { ViewerNames } from '../../types'\r\nimport { useMenusContext } from '../../store'\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 children?: React.ReactNode\r\n signOut: (options?: { redirectTo?: string; redirect?: boolean }) => Promise<void>\r\n}\r\n\r\nexport function AppSidebar({ children, signOut }: AppSidebarProps) {\r\n // Translations\r\n const t = useTranslations('AppSidebar')\r\n\r\n const { state: menusState } = useMenusContext()\r\n\r\n const { sidebarState, isMobile, openMobile, toggleMenuSidebar } = useSidebar()\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 // Determine the collapsible type based on the current viewer\r\n const collapsibleType = currentViewer === ViewerNames.auth ? 'offcanvas' : 'icon'\r\n\r\n return (\r\n <>\r\n {/* Always show toggle button on mobile when collapsed */}\r\n {isMobile && isCollapsed && (\r\n <div id='sidebar-toggle-button-mobile' className='fixed left-0 top-1/2 -translate-y-1/2 z-[100] flex items-center justify-center pointer-events-auto'>\r\n <button\r\n onClick={toggleMenuSidebar}\r\n className=\"text-muted-foreground hover:text-primary p-[2px] rounded-r-md bg-sidebar\"\r\n style={{ border: '1px solid rgba(128,128,128,0.2)', borderLeft: 'none', boxShadow: '4px 0 8px -4px rgba(0,0,0,0.12)' }}\r\n >\r\n <LR.ChevronRight className=\"w-5\" />\r\n </button>\r\n </div>\r\n )}\r\n <Sidebar collapsible={collapsibleType} className=\"border-none z-50 shadow-md relative\" >\r\n {/* Sidebar toggle button - right side inside Sidebar */}\r\n {(sidebarState === 'expanded') && (\r\n <div id='sidebar-toggle-button' className={`absolute right-2 top-2 flex items-center justify-center pointer-events-auto z-50 ${isMobile ? '' : ''}`}>\r\n <button onClick={toggleMenuSidebar} className='text-muted-foreground hover:text-primary p-1'>\r\n <LR.X className='w-5' />\r\n </button>\r\n </div>\r\n )}\r\n {/* Show collapsed toggle only on desktop */}\r\n {!isMobile && sidebarState !== 'expanded' && (\r\n <div id='sidebar-toggle-button' className='absolute -right-1 max-h-1 top-1/2 -translate-y-1/2 flex items-center justify-center pointer-events-auto z-50'>\r\n <button\r\n onClick={toggleMenuSidebar}\r\n className=\"text-muted-foreground hover:text-primary p-0 rounded-md bg-sidebar\"\r\n style={{ borderRight: '1px solid rgba(128,128,128,0.2)', boxShadow: '4px 0 8px -4px rgba(0,0,0,0.12)' }}\r\n >\r\n <LR.ChevronRight className=\"w-4\" />\r\n </button>\r\n </div>\r\n )}\r\n {children}\r\n <div\r\n className={`w-full flex flex-col ${\r\n sidebarState === 'expanded'\r\n ? 'items-center justify-center'\r\n : 'justify-center pb-4'\r\n }`}\r\n >\r\n {/* Nav User */}\r\n <NavUser signOut={signOut} />\r\n\r\n {!isCollapsed ? (\r\n <Link\r\n href=\"https://collabdt.org/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"w-full\"\r\n >\r\n <Button\r\n title={t('home')}\r\n variant=\"ghost\"\r\n className=\"text-xs scale-[85%] py-0 my-0 w-full flex flex-row items-center justify-center gap-2\"\r\n >\r\n <CdtIcon monochromatic />\r\n <span>{t('home')}</span>\r\n </Button>\r\n </Link>\r\n ) : null}\r\n </div>\r\n </Sidebar>\r\n </>\r\n )\r\n}"],"mappings":";AA8DI,mBASQ,KA2CI,YApDZ;AAtDJ,SAAS,cAAc;AAGvB,YAAY,QAAQ;AAEpB,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,SAAS,SAAS,YAAY,eAAe;AAC7C,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAEzB,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,WAAW,EAAE,UAAU,QAAQ,GAAoB;AAEjE,QAAM,IAAI,gBAAgB,YAAY;AAEtC,QAAM,EAAE,OAAO,WAAW,IAAI,gBAAgB;AAE9C,QAAM,EAAE,cAAc,UAAU,YAAY,kBAAkB,IAAI,WAAW;AAE7E,QAAM,EAAE,cAAc,IAAI,WAAW;AAGrC,QAAM,cAAc,WAAW,CAAC,aAAa,iBAAiB;AAG9D,QAAM,kBAAkB,kBAAkB,YAAY,OAAO,cAAc;AAE3E,SACE,iCAEG;AAAA,gBAAY,eACX,oBAAC,SAAI,IAAG,gCAA+B,WAAU,sGAC/C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,mCAAmC,YAAY,QAAQ,WAAW,kCAAkC;AAAA,QAErH,8BAAC,GAAG,cAAH,EAAgB,WAAU,OAAM;AAAA;AAAA,IACnC,GACF;AAAA,IAEF,qBAAC,WAAQ,aAAa,iBAAiB,WAAU,uCAE7C;AAAA,uBAAiB,cACjB,oBAAC,SAAI,IAAG,yBAAwB,WAAW,oFAAoF,WAAW,KAAK,EAAE,IAC/I,8BAAC,YAAO,SAAS,mBAAmB,WAAU,gDAC5C,8BAAC,GAAG,GAAH,EAAK,WAAU,OAAM,GACxB,GACF;AAAA,MAGD,CAAC,YAAY,iBAAiB,cAC7B,oBAAC,SAAI,IAAG,yBAAwB,WAAU,gHACxC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,mCAAmC,WAAW,kCAAkC;AAAA,UAEtG,8BAAC,GAAG,cAAH,EAAgB,WAAU,OAAM;AAAA;AAAA,MACnC,GACF;AAAA,MAED;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,wBACT,iBAAiB,aACb,gCACA,qBACN;AAAA,UAGE;AAAA,gCAAC,WAAQ,SAAkB;AAAA,YAE1B,CAAC,cACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBAEV;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,EAAE,MAAM;AAAA,oBACf,SAAQ;AAAA,oBACR,WAAU;AAAA,oBAEV;AAAA,0CAAC,WAAQ,eAAa,MAAC;AAAA,sBACvB,oBAAC,UAAM,YAAE,MAAM,GAAE;AAAA;AAAA;AAAA,gBACnB;AAAA;AAAA,YACF,IACE;AAAA;AAAA;AAAA,MACN;AAAA,OACJ;AAAA,KACF;AAEJ;","names":[]}
@@ -1,8 +1,10 @@
1
1
  import * as React from 'react';
2
+ import type { Organization } from '../../../types/dbTypes';
2
3
  interface InfoSidebarProps {
3
4
  children?: React.ReactNode;
4
5
  tabSelector?: React.ReactNode;
6
+ organization?: Organization;
5
7
  }
6
- export declare function InfoSidebarContainer({ children, tabSelector, }: InfoSidebarProps): React.JSX.Element;
8
+ export declare function InfoSidebarContainer({ children, tabSelector, organization, }: InfoSidebarProps): React.JSX.Element;
7
9
  export {};
8
10
  //# sourceMappingURL=Container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/Container.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,WAAW,GACZ,EAAE,gBAAgB,qBAqBlB"}
1
+ {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/Container.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB,qBAsBlB"}
@@ -5,7 +5,8 @@ import { BuildingsContext } from "../../../store";
5
5
  import { Header } from "./Header";
6
6
  function InfoSidebarContainer({
7
7
  children,
8
- tabSelector
8
+ tabSelector,
9
+ organization
9
10
  }) {
10
11
  const { state: buildingState } = React.useContext(BuildingsContext);
11
12
  const { building: currentBuilding } = buildingState.buildings;
@@ -15,7 +16,8 @@ function InfoSidebarContainer({
15
16
  Header,
16
17
  {
17
18
  currentBuilding,
18
- loadingBuildingInfo
19
+ loadingBuildingInfo,
20
+ organization
19
21
  }
20
22
  ),
21
23
  tabSelector,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/Container.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// Icons\r\nimport { BuildingsContext } from '../../../store'\r\n\r\n// New structured components\r\nimport { Header } from './Header'\r\n\r\ninterface InfoSidebarProps {\r\n children?: React.ReactNode\r\n tabSelector?: React.ReactNode\r\n}\r\n\r\nexport function InfoSidebarContainer({\r\n children,\r\n tabSelector,\r\n}: InfoSidebarProps) {\r\n const { state: buildingState } = React.useContext(BuildingsContext);\r\n const { building: currentBuilding } = buildingState.buildings;\r\n\r\n // State\r\n const [loadingBuildingInfo] = React.useState(false)\r\n\r\n return (\r\n <div className=\"w-[410px] flex flex-col h-screen bg-background border-r border-border \">\r\n <Header\r\n currentBuilding={currentBuilding}\r\n loadingBuildingInfo={loadingBuildingInfo}\r\n />\r\n\r\n {/* Tab Selector */}\r\n {tabSelector}\r\n\r\n {/* Tab Content */}\r\n {children}\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AA6BI,SACE,KADF;AAxBJ,YAAY,WAAW;AAGvB,SAAS,wBAAwB;AAGjC,SAAS,cAAc;AAOhB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,OAAO,cAAc,IAAI,MAAM,WAAW,gBAAgB;AAClE,QAAM,EAAE,UAAU,gBAAgB,IAAI,cAAc;AAGpD,QAAM,CAAC,mBAAmB,IAAI,MAAM,SAAS,KAAK;AAElD,SACE,qBAAC,SAAI,WAAU,0EACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAGC;AAAA,IAGE;AAAA,KACL;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/Container.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// Icons\r\nimport { BuildingsContext } from '../../../store'\r\n\r\n// New structured components\r\nimport { Header } from './Header'\r\nimport type { Organization } from '../../../types/dbTypes'\r\n\r\ninterface InfoSidebarProps {\r\n children?: React.ReactNode\r\n tabSelector?: React.ReactNode\r\n organization?: Organization\r\n}\r\n\r\nexport function InfoSidebarContainer({\r\n children,\r\n tabSelector,\r\n organization,\r\n}: InfoSidebarProps) {\r\n const { state: buildingState } = React.useContext(BuildingsContext);\r\n const { building: currentBuilding } = buildingState.buildings;\r\n\r\n // State\r\n const [loadingBuildingInfo] = React.useState(false)\r\n\r\n return (\r\n <div className=\"w-[410px] flex flex-col h-screen bg-background border-r border-border \">\r\n <Header\r\n currentBuilding={currentBuilding}\r\n loadingBuildingInfo={loadingBuildingInfo}\r\n organization={organization}\r\n />\r\n\r\n {/* Tab Selector */}\r\n {tabSelector}\r\n\r\n {/* Tab Content */}\r\n {children}\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAgCI,SACE,KADF;AA3BJ,YAAY,WAAW;AAGvB,SAAS,wBAAwB;AAGjC,SAAS,cAAc;AAShB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,OAAO,cAAc,IAAI,MAAM,WAAW,gBAAgB;AAClE,QAAM,EAAE,UAAU,gBAAgB,IAAI,cAAc;AAGpD,QAAM,CAAC,mBAAmB,IAAI,MAAM,SAAS,KAAK;AAElD,SACE,qBAAC,SAAI,WAAU,0EACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAGC;AAAA,IAGE;AAAA,KACL;AAEJ;","names":[]}
@@ -1,9 +1,10 @@
1
1
  import * as React from 'react';
2
- import type { Building } from '../../../types/dbTypes';
2
+ import type { Building, Organization } from '../../../types/dbTypes';
3
3
  interface HeaderProps {
4
4
  currentBuilding: Building | null;
5
5
  loadingBuildingInfo: boolean;
6
+ organization?: Organization;
6
7
  }
7
- export declare function Header({ currentBuilding, loadingBuildingInfo, }: HeaderProps): React.JSX.Element;
8
+ export declare function Header({ currentBuilding, loadingBuildingInfo, organization, }: HeaderProps): React.JSX.Element;
8
9
  export {};
9
10
  //# sourceMappingURL=Header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/Header.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAStD,UAAU,WAAW;IACnB,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAA;IAChC,mBAAmB,EAAE,OAAO,CAAA;CAC7B;AAED,wBAAgB,MAAM,CAAC,EACrB,eAAe,EACf,mBAAmB,GAEpB,EAAE,WAAW,qBA2Db"}
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/Header.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAQpE,UAAU,WAAW;IACnB,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAA;IAChC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED,wBAAgB,MAAM,CAAC,EACrB,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,EAAE,WAAW,qBA0Db"}
@@ -5,20 +5,19 @@ import { useTranslations } from "next-intl";
5
5
  import { LoadingSpinner } from "../LoadingSpinner";
6
6
  import { useSidebar } from "../Sidebar";
7
7
  import { MapContext } from "../../../store";
8
- import { useAppConfigContext } from "../../../store/AppConfig/context";
9
8
  import { Button } from "../Button";
10
9
  import * as LR from "lucide-react";
11
10
  function Header({
12
11
  currentBuilding,
13
- loadingBuildingInfo
12
+ loadingBuildingInfo,
13
+ organization
14
14
  }) {
15
- var _a, _b;
15
+ var _a;
16
16
  const t = useTranslations("SidebarHeader");
17
17
  const { setOpenInfo } = useSidebar();
18
18
  const { state: mapState } = React.useContext(MapContext);
19
- const { state: appConfigState } = useAppConfigContext();
20
- const countryCode = (_a = appConfigState.appConfig.organization) == null ? void 0 : _a.country;
21
- const countryName = countryCode ? (_b = new Intl.DisplayNames(["en"], { type: "region" }).of(countryCode.toUpperCase())) != null ? _b : countryCode : "";
19
+ const countryCode = organization == null ? void 0 : organization.country;
20
+ const countryName = countryCode ? (_a = new Intl.DisplayNames(["en"], { type: "region" }).of(countryCode.toUpperCase())) != null ? _a : countryCode : "";
22
21
  const formatSubdivision = (code) => {
23
22
  if (!code) return "";
24
23
  const normalized = code.replace("_", "-");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/Header.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 type { Building } from '../../../types/dbTypes'\r\nimport { useTranslations } from 'next-intl'\r\nimport { LoadingSpinner } from '../LoadingSpinner'\r\nimport { useSidebar } from '../Sidebar'\r\nimport { MapContext } from '../../../store'\r\nimport { useAppConfigContext } from '../../../store/AppConfig/context'\r\nimport { Button } from '../Button'\r\nimport * as LR from 'lucide-react'\r\n\r\ninterface HeaderProps {\r\n currentBuilding: Building | null\r\n loadingBuildingInfo: boolean\r\n}\r\n\r\nexport function Header({\r\n currentBuilding,\r\n loadingBuildingInfo,\r\n\r\n}: HeaderProps) {\r\n // Translation\r\n const t = useTranslations('SidebarHeader')\r\n const { setOpenInfo } = useSidebar()\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { state: appConfigState } = useAppConfigContext()\r\n const countryCode = appConfigState.appConfig.organization?.country\r\n const countryName = countryCode\r\n ? (new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode.toUpperCase()) ?? countryCode)\r\n : ''\r\n\r\n // Strip country prefix from ISO 3166-2 codes: \"CA-ON\" → \"ON\", \"CA_ON\" → \"ON\", \"CAON\" → \"ON\"\r\n const formatSubdivision = (code: string | null | undefined): string => {\r\n if (!code) return ''\r\n const normalized = code.replace('_', '-')\r\n const withDash = normalized.includes('-') ? normalized : `${normalized.slice(0, 2)}-${normalized.slice(2)}`\r\n return withDash.split('-').slice(1).join('-')\r\n }\r\n const { currentLocation } = mapState.map\r\n\r\n return (\r\n <div className=\"p-4\">\r\n <div className=\"flex items-center\">\r\n <div className=\"flex items-center gap-2 w-full justify-between\">\r\n <div className=\"space-y-1 flex justify-center\">\r\n {loadingBuildingInfo\r\n ? (\r\n <div className=\"flex items-center gap-2\">\r\n <LoadingSpinner />\r\n <span className=\"text-sm font-medium text-muted-foreground\">{t('loadingText')}</span>\r\n </div>\r\n )\r\n : (\r\n <h2 className=\"text-sm font-semibold text-foreground\">\r\n {currentBuilding?.buildingName ||\r\n (\r\n currentLocation?.municipality\r\n ? (currentLocation?.countrySubdivision\r\n ? `${currentLocation.municipality}, ${formatSubdivision(currentLocation.countrySubdivision)}`\r\n : currentLocation.municipality)\r\n : (formatSubdivision(currentLocation?.countrySubdivision) || countryName)\r\n )\r\n }\r\n </h2>\r\n )}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={() => setOpenInfo(false)}\r\n title={t('closeInfoToggle')}\r\n >\r\n <LR.PanelLeftClose className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":";AAmDgB,SACE,KADF;AA9ChB,YAAY,WAAW;AAEvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,cAAc;AACvB,YAAY,QAAQ;AAOb,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAEF,GAAgB;AAxBhB;AA0BE,QAAM,IAAI,gBAAgB,eAAe;AACzC,QAAM,EAAE,YAAY,IAAI,WAAW;AACnC,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,OAAO,eAAe,IAAI,oBAAoB;AACtD,QAAM,eAAc,oBAAe,UAAU,iBAAzB,mBAAuC;AAC3D,QAAM,cAAc,eACf,SAAI,KAAK,aAAa,CAAC,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC,EAAE,GAAG,YAAY,YAAY,CAAC,MAA9E,YAAmF,cACpF;AAGJ,QAAM,oBAAoB,CAAC,SAA4C;AACrE,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,aAAa,KAAK,QAAQ,KAAK,GAAG;AACxC,UAAM,WAAW,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC;AACzG,WAAO,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAC9C;AACA,QAAM,EAAE,gBAAgB,IAAI,SAAS;AAErC,SACE,oBAAC,SAAI,WAAU,OACb,8BAAC,SAAI,WAAU,qBACb,+BAAC,SAAI,WAAU,kDACb;AAAA,wBAAC,SAAI,WAAU,iCACZ,gCAEG,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,UAAK,WAAU,6CAA6C,YAAE,aAAa,GAAE;AAAA,OAChF,IAGA,oBAAC,QAAG,WAAU,yCACX,8DAAiB,mBAEd,mDAAiB,iBACZ,mDAAiB,sBACd,GAAG,gBAAgB,YAAY,KAAK,kBAAkB,gBAAgB,kBAAkB,CAAC,KACzF,gBAAgB,eACnB,kBAAkB,mDAAiB,kBAAkB,KAAK,cAGrE,GAEN;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,KAAK;AAAA,QAChC,OAAO,EAAE,iBAAiB;AAAA,QAE1B,8BAAC,GAAG,gBAAH,EAAkB,WAAU,WAAU;AAAA;AAAA,IACzC;AAAA,KACF,GACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/Header.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 type { Building, Organization } from '../../../types/dbTypes'\r\nimport { useTranslations } from 'next-intl'\r\nimport { LoadingSpinner } from '../LoadingSpinner'\r\nimport { useSidebar } from '../Sidebar'\r\nimport { MapContext } from '../../../store'\r\nimport { Button } from '../Button'\r\nimport * as LR from 'lucide-react'\r\n\r\ninterface HeaderProps {\r\n currentBuilding: Building | null\r\n loadingBuildingInfo: boolean\r\n organization?: Organization\r\n}\r\n\r\nexport function Header({\r\n currentBuilding,\r\n loadingBuildingInfo,\r\n organization,\r\n}: HeaderProps) {\r\n // Translation\r\n const t = useTranslations('SidebarHeader')\r\n const { setOpenInfo } = useSidebar()\r\n const { state: mapState } = React.useContext(MapContext)\r\n const countryCode = organization?.country\r\n const countryName = countryCode\r\n ? (new Intl.DisplayNames(['en'], { type: 'region' }).of(countryCode.toUpperCase()) ?? countryCode)\r\n : ''\r\n\r\n // Strip country prefix from ISO 3166-2 codes: \"CA-ON\" → \"ON\", \"CA_ON\" → \"ON\", \"CAON\" → \"ON\"\r\n const formatSubdivision = (code: string | null | undefined): string => {\r\n if (!code) return ''\r\n const normalized = code.replace('_', '-')\r\n const withDash = normalized.includes('-') ? normalized : `${normalized.slice(0, 2)}-${normalized.slice(2)}`\r\n return withDash.split('-').slice(1).join('-')\r\n }\r\n const { currentLocation } = mapState.map\r\n\r\n return (\r\n <div className=\"p-4\">\r\n <div className=\"flex items-center\">\r\n <div className=\"flex items-center gap-2 w-full justify-between\">\r\n <div className=\"space-y-1 flex justify-center\">\r\n {loadingBuildingInfo\r\n ? (\r\n <div className=\"flex items-center gap-2\">\r\n <LoadingSpinner />\r\n <span className=\"text-sm font-medium text-muted-foreground\">{t('loadingText')}</span>\r\n </div>\r\n )\r\n : (\r\n <h2 className=\"text-sm font-semibold text-foreground\">\r\n {currentBuilding?.buildingName ||\r\n (\r\n currentLocation?.municipality\r\n ? (currentLocation?.countrySubdivision\r\n ? `${currentLocation.municipality}, ${formatSubdivision(currentLocation.countrySubdivision)}`\r\n : currentLocation.municipality)\r\n : (formatSubdivision(currentLocation?.countrySubdivision) || countryName)\r\n )\r\n }\r\n </h2>\r\n )}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"group/sidebar-trigger opacity-70 hover:opacity-100 transition-opacity duration-200 hover:bg-transparent\"\r\n onClick={() => setOpenInfo(false)}\r\n title={t('closeInfoToggle')}\r\n >\r\n <LR.PanelLeftClose className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":";AAkDgB,SACE,KADF;AA7ChB,YAAY,WAAW;AAEvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,YAAY,QAAQ;AAQb,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAAgB;AAxBhB;AA0BE,QAAM,IAAI,gBAAgB,eAAe;AACzC,QAAM,EAAE,YAAY,IAAI,WAAW;AACnC,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,cAAc,6CAAc;AAClC,QAAM,cAAc,eACf,SAAI,KAAK,aAAa,CAAC,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC,EAAE,GAAG,YAAY,YAAY,CAAC,MAA9E,YAAmF,cACpF;AAGJ,QAAM,oBAAoB,CAAC,SAA4C;AACrE,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,aAAa,KAAK,QAAQ,KAAK,GAAG;AACxC,UAAM,WAAW,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC;AACzG,WAAO,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAC9C;AACA,QAAM,EAAE,gBAAgB,IAAI,SAAS;AAErC,SACE,oBAAC,SAAI,WAAU,OACb,8BAAC,SAAI,WAAU,qBACb,+BAAC,SAAI,WAAU,kDACb;AAAA,wBAAC,SAAI,WAAU,iCACZ,gCAEG,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,kBAAe;AAAA,MAChB,oBAAC,UAAK,WAAU,6CAA6C,YAAE,aAAa,GAAE;AAAA,OAChF,IAGA,oBAAC,QAAG,WAAU,yCACX,8DAAiB,mBAEd,mDAAiB,iBACZ,mDAAiB,sBACd,GAAG,gBAAgB,YAAY,KAAK,kBAAkB,gBAAgB,kBAAkB,CAAC,KACzF,gBAAgB,eACnB,kBAAkB,mDAAiB,kBAAkB,KAAK,cAGrE,GAEN;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,YAAY,KAAK;AAAA,QAChC,OAAO,EAAE,iBAAiB;AAAA,QAE1B,8BAAC,GAAG,gBAAH,EAAkB,WAAU,WAAU;AAAA;AAAA,IACzC;AAAA,KACF,GACF,GACF;AAEJ;","names":[]}
@@ -1,3 +1,9 @@
1
1
  import * as React from 'react';
2
- export declare function InfoSidebar(): React.JSX.Element;
2
+ import { Organization } from '../../../types/dbTypes';
3
+ export declare function InfoSidebar({ minioBaseUrl, martinBaseUrl, organization, pointcloudApiUrl }: {
4
+ minioBaseUrl?: string;
5
+ martinBaseUrl?: string;
6
+ organization?: Organization;
7
+ pointcloudApiUrl?: string;
8
+ }): React.JSX.Element;
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgB9B,wBAAgB,WAAW,sBAW1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/InfoSidebar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAWrD,wBAAgB,WAAW,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,qBAWrM"}
@@ -12,13 +12,13 @@ const PointCloudSidebar = dynamic(
12
12
  () => import("../../viewers/pointcloud/src/PointCloudSidebar").then((m) => ({ default: m.PointCloudSidebar })),
13
13
  { ssr: false }
14
14
  );
15
- function InfoSidebar() {
15
+ function InfoSidebar({ minioBaseUrl, martinBaseUrl, organization, pointcloudApiUrl }) {
16
16
  const { state: menusState } = React.useContext(MenusContext);
17
17
  const { currentViewer } = menusState.menus;
18
18
  return /* @__PURE__ */ jsxs(Fragment, { children: [
19
- currentViewer === "map" && /* @__PURE__ */ jsx(MapSidebar, {}),
20
- currentViewer === "bim" && /* @__PURE__ */ jsx(BimSidebar, {}),
21
- currentViewer === "pointcloud" && /* @__PURE__ */ jsx(PointCloudSidebar, {})
19
+ currentViewer === "map" && /* @__PURE__ */ jsx(MapSidebar, { minioBaseUrl, martinBaseUrl, organization }),
20
+ currentViewer === "bim" && /* @__PURE__ */ jsx(BimSidebar, { minioBaseUrl, organization }),
21
+ currentViewer === "pointcloud" && /* @__PURE__ */ jsx(PointCloudSidebar, { pointcloudApiUrl, organization })
22
22
  ] });
23
23
  }
24
24
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/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 dynamic from 'next/dynamic'\r\n\r\n// Icons\r\nimport { MenusContext } from '../../../store'\r\nimport { MapSidebar } from '../../viewers/map/src/MapSidebar'\r\n\r\nconst BimSidebar = dynamic(\r\n () => import('../../viewers/bim/src/BimSidebar/src').then(m => ({ default: m.BimSidebar })),\r\n { ssr: false },\r\n)\r\nconst PointCloudSidebar = dynamic(\r\n () => import('../../viewers/pointcloud/src/PointCloudSidebar').then(m => ({ default: m.PointCloudSidebar })),\r\n { ssr: false },\r\n)\r\n\r\nexport function InfoSidebar() {\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n return (\r\n <>\r\n {currentViewer === 'map' && <MapSidebar />}\r\n {currentViewer === 'bim' && <BimSidebar />}\r\n {currentViewer === 'pointcloud' && <PointCloudSidebar />}\r\n </>\r\n )\r\n}"],"mappings":";AA0BI,mBAC8B,KAD9B;AArBJ,YAAY,WAAW;AACvB,OAAO,aAAa;AAGpB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAE3B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,sCAAsC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC1F,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,gDAAgD,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EAC3G,EAAE,KAAK,MAAM;AACf;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,SACE,iCACG;AAAA,sBAAkB,SAAS,oBAAC,cAAW;AAAA,IACvC,kBAAkB,SAAS,oBAAC,cAAW;AAAA,IACvC,kBAAkB,gBAAgB,oBAAC,qBAAkB;AAAA,KACxD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/InfoSidebar/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 dynamic from 'next/dynamic'\r\n\r\n// Icons\r\nimport { MenusContext } from '../../../store'\r\nimport { MapSidebar } from '../../viewers/map/src/MapSidebar'\r\nimport { Organization } from '../../../types/dbTypes'\r\n\r\nconst BimSidebar = dynamic(\r\n () => import('../../viewers/bim/src/BimSidebar/src').then(m => ({ default: m.BimSidebar })),\r\n { ssr: false },\r\n)\r\nconst PointCloudSidebar = dynamic(\r\n () => import('../../viewers/pointcloud/src/PointCloudSidebar').then(m => ({ default: m.PointCloudSidebar })),\r\n { ssr: false },\r\n)\r\n\r\nexport function InfoSidebar({ minioBaseUrl, martinBaseUrl, organization, pointcloudApiUrl }: { minioBaseUrl?: string; martinBaseUrl?: string; organization?: Organization; pointcloudApiUrl?: string }) {\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { currentViewer } = menusState.menus\r\n\r\n return (\r\n <>\r\n {currentViewer === 'map' && <MapSidebar minioBaseUrl={minioBaseUrl} martinBaseUrl={martinBaseUrl} organization={organization} />}\r\n {currentViewer === 'bim' && <BimSidebar minioBaseUrl={minioBaseUrl} organization={organization} />}\r\n {currentViewer === 'pointcloud' && <PointCloudSidebar pointcloudApiUrl={pointcloudApiUrl} organization={organization} />}\r\n </>\r\n )\r\n}"],"mappings":";AA2BI,mBAC8B,KAD9B;AAtBJ,YAAY,WAAW;AACvB,OAAO,aAAa;AAGpB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAG3B,MAAM,aAAa;AAAA,EACjB,MAAM,OAAO,sCAAsC,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE;AAAA,EAC1F,EAAE,KAAK,MAAM;AACf;AACA,MAAM,oBAAoB;AAAA,EACxB,MAAM,OAAO,gDAAgD,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE;AAAA,EAC3G,EAAE,KAAK,MAAM;AACf;AAEO,SAAS,YAAY,EAAE,cAAc,eAAe,cAAc,iBAAiB,GAA8G;AACtM,QAAM,EAAE,OAAO,WAAW,IAAI,MAAM,WAAW,YAAY;AAC3D,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,SACE,iCACG;AAAA,sBAAkB,SAAS,oBAAC,cAAW,cAA4B,eAA8B,cAA4B;AAAA,IAC7H,kBAAkB,SAAS,oBAAC,cAAW,cAA4B,cAA4B;AAAA,IAC/F,kBAAkB,gBAAgB,oBAAC,qBAAkB,kBAAoC,cAA4B;AAAA,KACxH;AAEJ;","names":[]}
@@ -9,7 +9,8 @@ interface CollapsibleSensorItemProps {
9
9
  isVisible?: boolean;
10
10
  onMouseEnter?: () => void;
11
11
  onMouseLeave?: () => void;
12
+ minioBaseUrl?: string;
12
13
  }
13
- export declare function CollapsibleSensorItem({ sensor, sensorType, onAction, depth, isVisible, onMouseEnter, onMouseLeave }: CollapsibleSensorItemProps): React.JSX.Element;
14
+ export declare function CollapsibleSensorItem({ sensor, sensorType, onAction, depth, isVisible, onMouseEnter, onMouseLeave, minioBaseUrl }: CollapsibleSensorItemProps): React.JSX.Element;
14
15
  export {};
15
16
  //# sourceMappingURL=CollapsibleSensorItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollapsibleSensorItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAQ3D,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAExD,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAS,EACT,SAAgB,EAChB,YAAY,EACZ,YAAY,EACb,EAAE,0BAA0B,qBAqO5B"}
1
+ {"version":3,"file":"CollapsibleSensorItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAO3D,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAExD,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAS,EACT,SAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,EAAE,0BAA0B,qBAyO5B"}
@@ -21,7 +21,8 @@ function CollapsibleSensorItem({
21
21
  depth = 0,
22
22
  isVisible = true,
23
23
  onMouseEnter,
24
- onMouseLeave
24
+ onMouseLeave,
25
+ minioBaseUrl
25
26
  }) {
26
27
  var _a, _b, _c, _d;
27
28
  const t = useTranslations("SensorsSection");
@@ -29,7 +30,7 @@ function CollapsibleSensorItem({
29
30
  const [sensorData, setSensorData] = React.useState([]);
30
31
  const [isLoadingData, setIsLoadingData] = React.useState(false);
31
32
  const prevVisibleRef = React.useRef(isVisible);
32
- const dataPath = `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/sensors/${sensor.url}`;
33
+ const dataPath = minioBaseUrl ? `${minioBaseUrl}/sensors/${sensor.url}` : "";
33
34
  const typeIcon = (sensorType == null ? void 0 : sensorType.icon) || "Radio";
34
35
  const typeName = (_a = sensorType == null ? void 0 : sensorType.name.replace(/_/g, " ")) != null ? _a : "Unknown";
35
36
  const SensorIcon = LR[typeIcon] || LR.Radio;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.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 { Button } from '../Button'\r\nimport { Badge } from '../Badge'\r\nimport { Avatar, AvatarFallback } from '../Avatar'\r\nimport { UserAvatar } from '../UserAvatar'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { format } from 'date-fns'\r\nimport { cn } from '../../../utils/utils'\r\nimport { Sensor, SensorType } from '../../../types/dbTypes'\r\nimport { useUser } from '../../../hooks/users/users'\r\nimport { useCoreHooks } from '../../../hooks/provider'\r\nimport { useSession } from 'next-auth/react'\r\nimport { SensorChart } from './SensorChart'\r\nimport { SensorTagsSection } from './SensorTagsSection'\r\nimport type { ChartConfig } from '../chart'\r\n\r\ntype SensorAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\ninterface CollapsibleSensorItemProps {\r\n sensor: Sensor\r\n sensorType: SensorType\r\n onAction?: (action: SensorAction, id: number) => void\r\n depth?: number\r\n isVisible?: boolean\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n}\r\n\r\nexport function CollapsibleSensorItem({\r\n sensor,\r\n sensorType,\r\n onAction,\r\n depth = 0,\r\n isVisible = true,\r\n onMouseEnter,\r\n onMouseLeave\r\n}: CollapsibleSensorItemProps) {\r\n const t = useTranslations('SensorsSection')\r\n const [isExpanded, setIsExpanded] = React.useState(false)\r\n const [sensorData, setSensorData] = React.useState<{ time: string; value: number }[]>([])\r\n const [isLoadingData, setIsLoadingData] = React.useState(false)\r\n const prevVisibleRef = React.useRef(isVisible)\r\n\r\n const dataPath = `${process.env.NEXT_PUBLIC_MINIO_BUCKET_URL}/sensors/${sensor.url}`\r\n\r\n const typeIcon = sensorType?.icon || 'Radio'\r\n const typeName = sensorType?.name.replace(/_/g, ' ') ?? 'Unknown' \r\n\r\n const SensorIcon = LR[typeIcon] || LR.Radio\r\n\r\n // Auto-collapse when visibility turns off\r\n React.useEffect(() => {\r\n const prevVisible = prevVisibleRef.current\r\n \r\n if (prevVisible && !isVisible) {\r\n // Just turned invisible - collapse\r\n setIsExpanded(false)\r\n }\r\n \r\n prevVisibleRef.current = isVisible\r\n }, [isVisible])\r\n\r\n // Fetch and parse CSV data\r\n React.useEffect(() => {\r\n const fetchCSVData = async () => {\r\n setIsLoadingData(true)\r\n try {\r\n const response = await fetch(dataPath)\r\n const csvText = await response.text()\r\n \r\n // Parse CSV: format is \"time,value\" (e.g., \"0:00:00,7.4\")\r\n const lines = csvText.trim().split('\\n')\r\n const parsed = lines.map(line => {\r\n const [time, valueStr] = line.split(',')\r\n return {\r\n time: time.trim(),\r\n value: parseFloat(valueStr.trim())\r\n }\r\n }).filter(item => !isNaN(item.value)) // Filter out any invalid entries\r\n \r\n setSensorData(parsed)\r\n } catch (error) {\r\n console.error('Error fetching sensor data:', error)\r\n // Fallback to empty array on error\r\n setSensorData([])\r\n } finally {\r\n setIsLoadingData(false)\r\n }\r\n }\r\n\r\n if (isExpanded) {\r\n fetchCSVData()\r\n }\r\n }, [dataPath, isExpanded])\r\n\r\n const chartConfig = {\r\n value: {\r\n label: typeName,\r\n color: \"hsl(var(--chart-1))\",\r\n },\r\n } satisfies ChartConfig\r\n\r\n const user = useSession().data?.user\r\n\r\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 12)}` : ''\r\n\r\n const { user: author } = useUser(String(sensor.authorId))\r\n let authorName: string | undefined = author?.name ?? 'Unknown User'\r\n\r\n const { sensor: sensorHooks } = useCoreHooks()\r\n const { updateSensor } = sensorHooks.useSensor(sensor.id)\r\n\r\n const handleAddTag = async (tag: string) => {\r\n const currentTags = sensor.tags ?? []\r\n await updateSensor({ tags: [...currentTags, tag] })\r\n }\r\n\r\n const handleDeleteTag = async (tag: string) => {\r\n const currentTags = sensor.tags ?? []\r\n await updateSensor({ tags: currentTags.filter(t => t !== tag) })\r\n }\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"border rounded-md overflow-hidden transition-opacity\",\r\n indentClass,\r\n !isVisible && \"opacity-70\"\r\n )}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n {/* Sensor Header */}\r\n <div className=\"flex items-start justify-between p-3 hover:bg-accent/50 transition-colors\">\r\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-6 w-6 p-0 mt-1\", !isVisible && \"opacity-70\")}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n >\r\n <LR.ChevronRight\r\n className={cn(\r\n \"h-4 w-4 transition-transform\",\r\n isExpanded && \"rotate-90\"\r\n )}\r\n />\r\n </Button>\r\n\r\n <div className={cn(\r\n \"h-8 w-8 mt-1 rounded-full bg-primary flex items-center justify-center flex-shrink-0\",\r\n !isVisible && \"opacity-70 grayscale\"\r\n )}>\r\n <SensorIcon className={cn(\"h-4 w-4 text-primary-foreground\", !isVisible && \"opacity-70\")} />\r\n </div>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\"text-sm font-medium\", isVisible ? \"text-foreground\" : \"text-muted-foreground\")}>\r\n {sensor.name}\r\n </span>\r\n {sensor.updatedAt !== sensor.createdAt && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {t('edited')}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n {onAction && (\r\n <div className={cn(\"flex items-center gap-0 flex-shrink-0\", !isVisible && \"opacity-70\")}>\r\n {user?.id === String(sensor.authorId) && (\r\n <>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('edit', sensor.id)}\r\n title={t('editSensor')}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('delete', sensor.id)}\r\n title={t('deleteSensor')}\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Expanded Content */ }\r\n {\r\n isExpanded && (\r\n <div className=\"border-t bg-muted/30\">\r\n <div className=\"p-4 space-y-4\">\r\n {/* Sensor Information */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n {format(new Date(sensor.createdAt), 'PPp')}\r\n </span>\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {typeName}\r\n </Badge>\r\n </div>\r\n \r\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\r\n <div>\r\n <span className=\"text-muted-foreground\">Name:</span>\r\n <span className=\"ml-2 font-medium\">{sensor.name}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-muted-foreground\">Format:</span>\r\n <span className=\"ml-2 font-medium\">{sensor.dataFormat}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Author Information */}\r\n <div className=\"flex items-center gap-2 pt-2\">\r\n <span className=\"text-muted-foreground text-sm\">Author:</span>\r\n <Avatar className=\"h-5 w-5 rounded-full overflow-hidden\">\r\n <UserAvatar imageFileId={author?.imageFileId} name={authorName} />\r\n </Avatar>\r\n <span className=\"text-sm font-medium\">{authorName}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Sensor Data Chart */}\r\n <SensorChart\r\n sensorData={sensorData}\r\n isLoadingData={isLoadingData}\r\n sensorName={sensor.name}\r\n sensorType={sensorType}\r\n updateFrequency={sensor.updateFrequency}\r\n chartConfig={chartConfig}\r\n />\r\n </div>\r\n <div>\r\n <SensorTagsSection\r\n tags={sensor.tags ?? []}\r\n onAdd={handleAddTag}\r\n onDelete={handleDeleteTag}\r\n translations={{\r\n addTag: t('addTag'),\r\n removeTag: t('removeTag'),\r\n cancel: t('cancel'),\r\n newTagPlaceholder: t('newTagPlaceholder'),\r\n }}\r\n />\r\n </div>\r\n\r\n </div>\r\n )\r\n }\r\n </div >\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","t"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.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 { Button } from '../Button'\r\nimport { Badge } from '../Badge'\r\nimport { Avatar, AvatarFallback } from '../Avatar'\r\nimport { UserAvatar } from '../UserAvatar'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { format } from 'date-fns'\r\nimport { cn } from '../../../utils/utils'\r\nimport { Sensor, SensorType } from '../../../types/dbTypes'\r\nimport { useUser } from '../../../hooks/users/users'\r\nimport { useCoreHooks } from '../../../hooks/provider'\r\nimport { useSession } from 'next-auth/react'\r\nimport { SensorChart } from './SensorChart'\r\nimport { SensorTagsSection } from './SensorTagsSection'\r\nimport type { ChartConfig } from '../chart'\r\ntype SensorAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\ninterface CollapsibleSensorItemProps {\r\n sensor: Sensor\r\n sensorType: SensorType\r\n onAction?: (action: SensorAction, id: number) => void\r\n depth?: number\r\n isVisible?: boolean\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n minioBaseUrl?: string\r\n}\r\n\r\nexport function CollapsibleSensorItem({\r\n sensor,\r\n sensorType,\r\n onAction,\r\n depth = 0,\r\n isVisible = true,\r\n onMouseEnter,\r\n onMouseLeave,\r\n minioBaseUrl\r\n}: CollapsibleSensorItemProps) {\r\n const t = useTranslations('SensorsSection')\r\n const [isExpanded, setIsExpanded] = React.useState(false)\r\n const [sensorData, setSensorData] = React.useState<{ time: string; value: number }[]>([])\r\n const [isLoadingData, setIsLoadingData] = React.useState(false)\r\n const prevVisibleRef = React.useRef(isVisible)\r\n\r\n //const { state: { runtimeConfig: { minioUrl } } } = useAppConfigContext()\r\n\r\n //const dataPath = `${minioUrl ?? ''}/sensors/${sensor.url}`\r\n const dataPath = minioBaseUrl\r\n ? `${minioBaseUrl}/sensors/${sensor.url}`\r\n : ''\r\n const typeIcon = sensorType?.icon || 'Radio'\r\n const typeName = sensorType?.name.replace(/_/g, ' ') ?? 'Unknown' \r\n\r\n const SensorIcon = LR[typeIcon] || LR.Radio\r\n\r\n // Auto-collapse when visibility turns off\r\n React.useEffect(() => {\r\n const prevVisible = prevVisibleRef.current\r\n \r\n if (prevVisible && !isVisible) {\r\n // Just turned invisible - collapse\r\n setIsExpanded(false)\r\n }\r\n \r\n prevVisibleRef.current = isVisible\r\n }, [isVisible])\r\n\r\n // Fetch and parse CSV data\r\n React.useEffect(() => {\r\n const fetchCSVData = async () => {\r\n setIsLoadingData(true)\r\n try {\r\n const response = await fetch(dataPath)\r\n const csvText = await response.text()\r\n \r\n // Parse CSV: format is \"time,value\" (e.g., \"0:00:00,7.4\")\r\n const lines = csvText.trim().split('\\n')\r\n const parsed = lines.map(line => {\r\n const [time, valueStr] = line.split(',')\r\n return {\r\n time: time.trim(),\r\n value: parseFloat(valueStr.trim())\r\n }\r\n }).filter(item => !isNaN(item.value)) // Filter out any invalid entries\r\n \r\n setSensorData(parsed)\r\n } catch (error) {\r\n console.error('Error fetching sensor data:', error)\r\n // Fallback to empty array on error\r\n setSensorData([])\r\n } finally {\r\n setIsLoadingData(false)\r\n }\r\n }\r\n\r\n if (isExpanded) {\r\n fetchCSVData()\r\n }\r\n }, [dataPath, isExpanded])\r\n\r\n const chartConfig = {\r\n value: {\r\n label: typeName,\r\n color: \"hsl(var(--chart-1))\",\r\n },\r\n } satisfies ChartConfig\r\n\r\n const user = useSession().data?.user\r\n\r\n const indentClass = depth > 0 ? `ml-${Math.min(depth * 4, 12)}` : ''\r\n\r\n const { user: author } = useUser(String(sensor.authorId))\r\n let authorName: string | undefined = author?.name ?? 'Unknown User'\r\n\r\n const { sensor: sensorHooks } = useCoreHooks()\r\n const { updateSensor } = sensorHooks.useSensor(sensor.id)\r\n\r\n const handleAddTag = async (tag: string) => {\r\n const currentTags = sensor.tags ?? []\r\n await updateSensor({ tags: [...currentTags, tag] })\r\n }\r\n\r\n const handleDeleteTag = async (tag: string) => {\r\n const currentTags = sensor.tags ?? []\r\n await updateSensor({ tags: currentTags.filter(t => t !== tag) })\r\n }\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"border rounded-md overflow-hidden transition-opacity\",\r\n indentClass,\r\n !isVisible && \"opacity-70\"\r\n )}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n {/* Sensor Header */}\r\n <div className=\"flex items-start justify-between p-3 hover:bg-accent/50 transition-colors\">\r\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={cn(\"h-6 w-6 p-0 mt-1\", !isVisible && \"opacity-70\")}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n >\r\n <LR.ChevronRight\r\n className={cn(\r\n \"h-4 w-4 transition-transform\",\r\n isExpanded && \"rotate-90\"\r\n )}\r\n />\r\n </Button>\r\n\r\n <div className={cn(\r\n \"h-8 w-8 mt-1 rounded-full bg-primary flex items-center justify-center flex-shrink-0\",\r\n !isVisible && \"opacity-70 grayscale\"\r\n )}>\r\n <SensorIcon className={cn(\"h-4 w-4 text-primary-foreground\", !isVisible && \"opacity-70\")} />\r\n </div>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\"text-sm font-medium\", isVisible ? \"text-foreground\" : \"text-muted-foreground\")}>\r\n {sensor.name}\r\n </span>\r\n {sensor.updatedAt !== sensor.createdAt && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {t('edited')}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Action Buttons */}\r\n {onAction && (\r\n <div className={cn(\"flex items-center gap-0 flex-shrink-0\", !isVisible && \"opacity-70\")}>\r\n {user?.id === String(sensor.authorId) && (\r\n <>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('edit', sensor.id)}\r\n title={t('editSensor')}\r\n >\r\n <LR.Pencil className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => onAction('delete', sensor.id)}\r\n title={t('deleteSensor')}\r\n >\r\n <LR.Trash2 className=\"h-4 w-4\" />\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Expanded Content */ }\r\n {\r\n isExpanded && (\r\n <div className=\"border-t bg-muted/30\">\r\n <div className=\"p-4 space-y-4\">\r\n {/* Sensor Information */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n {format(new Date(sensor.createdAt), 'PPp')}\r\n </span>\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {typeName}\r\n </Badge>\r\n </div>\r\n \r\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\r\n <div>\r\n <span className=\"text-muted-foreground\">Name:</span>\r\n <span className=\"ml-2 font-medium\">{sensor.name}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-muted-foreground\">Format:</span>\r\n <span className=\"ml-2 font-medium\">{sensor.dataFormat}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Author Information */}\r\n <div className=\"flex items-center gap-2 pt-2\">\r\n <span className=\"text-muted-foreground text-sm\">Author:</span>\r\n <Avatar className=\"h-5 w-5 rounded-full overflow-hidden\">\r\n <UserAvatar imageFileId={author?.imageFileId} name={authorName} />\r\n </Avatar>\r\n <span className=\"text-sm font-medium\">{authorName}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Sensor Data Chart */}\r\n <SensorChart\r\n sensorData={sensorData}\r\n isLoadingData={isLoadingData}\r\n sensorName={sensor.name}\r\n sensorType={sensorType}\r\n updateFrequency={sensor.updateFrequency}\r\n chartConfig={chartConfig}\r\n />\r\n </div>\r\n <div>\r\n <SensorTagsSection\r\n tags={sensor.tags ?? []}\r\n onAdd={handleAddTag}\r\n onDelete={handleDeleteTag}\r\n translations={{\r\n addTag: t('addTag'),\r\n removeTag: t('removeTag'),\r\n cancel: t('cancel'),\r\n newTagPlaceholder: t('newTagPlaceholder'),\r\n }}\r\n />\r\n </div>\r\n\r\n </div>\r\n )\r\n }\r\n </div >\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","t"]}
@@ -1,5 +1,7 @@
1
1
  import * as React from 'react';
2
2
  /** Stable key used in state for sensors with no tags — locale-independent */
3
3
  export declare const UNTAGGED_TAG = "__untagged__";
4
- export declare function SensorsSection(): React.JSX.Element;
4
+ export declare function SensorsSection({ minioBaseUrl }: {
5
+ minioBaseUrl?: string;
6
+ }): React.JSX.Element;
5
7
  //# sourceMappingURL=SensorsSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SensorsSection.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/SensorsSection.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0B9B,6EAA6E;AAC7E,eAAO,MAAM,YAAY,iBAAiB,CAAA;AAE1C,wBAAgB,cAAc,sBAgR7B"}
1
+ {"version":3,"file":"SensorsSection.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/SensorsSection.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0B9B,6EAA6E;AAC7E,eAAO,MAAM,YAAY,iBAAiB,CAAA;AAE1C,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,qBAkRzE"}
@@ -23,7 +23,7 @@ import { useSensorTypes } from "../../../hooks/sensorTypes/sensorTypes";
23
23
  import * as LR from "lucide-react";
24
24
  import { stringToColour } from "../../viewers/map/utils/stringToColour";
25
25
  const UNTAGGED_TAG = "__untagged__";
26
- function SensorsSection() {
26
+ function SensorsSection({ minioBaseUrl }) {
27
27
  var _a, _b;
28
28
  const t = useTranslations("SensorsSection");
29
29
  const { dispatch: toolsDispatch } = React.useContext(ToolsContext);
@@ -209,6 +209,7 @@ function SensorsSection() {
209
209
  sensorType: type,
210
210
  onAction: handleSensorAction,
211
211
  isVisible: isTypeVisible,
212
+ minioBaseUrl,
212
213
  onMouseEnter: () => menusDispatch({ type: "SET_CURRENT_SENSOR_ID", payload: { currentSensorId: sensor.id } }),
213
214
  onMouseLeave: () => menusDispatch({ type: "SET_CURRENT_SENSOR_ID", payload: { currentSensorId: null } })
214
215
  },
@@ -242,6 +243,7 @@ function SensorsSection() {
242
243
  sensorType: type,
243
244
  onAction: handleSensorAction,
244
245
  isVisible: isTagVisible,
246
+ minioBaseUrl,
245
247
  onMouseEnter: () => menusDispatch({ type: "SET_CURRENT_SENSOR_ID", payload: { currentSensorId: sensor.id } }),
246
248
  onMouseLeave: () => menusDispatch({ type: "SET_CURRENT_SENSOR_ID", payload: { currentSensorId: null } })
247
249
  },