@collabdt/core 0.3.1 → 0.3.3

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 (300) hide show
  1. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  2. package/dist/core/components/authentication/ForgotPassword.js +0 -1
  3. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  4. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts +12 -2
  5. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  6. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js +137 -139
  7. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  8. package/dist/core/components/ui/Comments/Comment.d.ts +18 -1
  9. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  10. package/dist/core/components/ui/Comments/Comment.js +94 -23
  11. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  12. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts +38 -0
  13. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts.map +1 -0
  14. package/dist/core/components/ui/Comments/CommentActionButtons.js +134 -0
  15. package/dist/core/components/ui/Comments/CommentActionButtons.js.map +1 -0
  16. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  17. package/dist/core/components/ui/Comments/CommentInput.js +5 -2
  18. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  19. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  20. package/dist/core/components/ui/Comments/CommentsSection.js +86 -42
  21. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  22. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  23. package/dist/core/components/ui/Comments/commentUtils.js +2 -1
  24. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  25. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  26. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js +0 -1
  27. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  28. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  29. package/dist/core/components/ui/InfoSidebar/Container.js +16 -12
  30. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  31. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts +1 -2
  32. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  33. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +66 -94
  34. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  35. package/dist/core/components/ui/Sensors/Sensor.d.ts +16 -3
  36. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  37. package/dist/core/components/ui/Sensors/Sensor.js +76 -37
  38. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  39. package/dist/core/components/ui/Sensors/SensorChart.d.ts +12 -2
  40. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  41. package/dist/core/components/ui/Sensors/SensorChart.js +49 -12
  42. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  43. package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts +9 -0
  44. package/dist/core/components/ui/Sensors/SensorDetailDialog.d.ts.map +1 -0
  45. package/dist/core/components/ui/Sensors/SensorDetailDialog.js +128 -0
  46. package/dist/core/components/ui/Sensors/SensorDetailDialog.js.map +1 -0
  47. package/dist/core/components/ui/Sensors/SensorInput.d.ts +6 -1
  48. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  49. package/dist/core/components/ui/Sensors/SensorInput.js +94 -9
  50. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  51. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts +3 -1
  52. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  53. package/dist/core/components/ui/Sensors/SensorTagsSection.js +4 -1
  54. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  55. package/dist/core/components/ui/Sensors/SensorsSection.d.ts +1 -3
  56. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  57. package/dist/core/components/ui/Sensors/SensorsSection.js +33 -10
  58. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  59. package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts +7 -0
  60. package/dist/core/components/ui/Sensors/TimeZoneSelect.d.ts.map +1 -0
  61. package/dist/core/components/ui/Sensors/TimeZoneSelect.js +56 -0
  62. package/dist/core/components/ui/Sensors/TimeZoneSelect.js.map +1 -0
  63. package/dist/core/components/ui/Sensors/sensorData.d.ts +42 -0
  64. package/dist/core/components/ui/Sensors/sensorData.d.ts.map +1 -0
  65. package/dist/core/components/ui/Sensors/sensorData.js +118 -0
  66. package/dist/core/components/ui/Sensors/sensorData.js.map +1 -0
  67. package/dist/core/components/ui/Sensors/sensorRange.d.ts +24 -0
  68. package/dist/core/components/ui/Sensors/sensorRange.d.ts.map +1 -0
  69. package/dist/core/components/ui/Sensors/sensorRange.js +34 -0
  70. package/dist/core/components/ui/Sensors/sensorRange.js.map +1 -0
  71. package/dist/core/components/ui/Sensors/useSensorSeries.d.ts +15 -0
  72. package/dist/core/components/ui/Sensors/useSensorSeries.d.ts.map +1 -0
  73. package/dist/core/components/ui/Sensors/useSensorSeries.js +63 -0
  74. package/dist/core/components/ui/Sensors/useSensorSeries.js.map +1 -0
  75. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  76. package/dist/core/components/ui/Sidebar.js +27 -4
  77. package/dist/core/components/ui/Sidebar.js.map +1 -1
  78. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  79. package/dist/core/components/ui/ToolbarButton.js +0 -1
  80. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  81. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  82. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js +0 -2
  83. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  84. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  85. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js +0 -10
  86. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  87. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  88. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js +0 -1
  89. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  90. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  91. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js +0 -1
  92. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  93. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  94. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js +0 -1
  95. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  96. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  97. package/dist/core/components/viewers/Data/utils/filterHelper.js +0 -2
  98. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  99. package/dist/core/components/viewers/Viewer.js +1 -1
  100. package/dist/core/components/viewers/Viewer.js.map +1 -1
  101. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  102. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +0 -3
  103. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  104. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  105. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +1 -7
  106. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  107. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  108. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js +1 -9
  109. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  110. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts +1 -3
  111. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  112. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js +2 -2
  113. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  114. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  115. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js +4 -3
  116. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  117. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js +1 -1
  118. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  119. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  120. package/dist/core/components/viewers/bim/src/ClippingPlane.js +0 -1
  121. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  122. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts +1 -2
  123. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  124. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +25 -2
  125. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  126. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts +16 -10
  127. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  128. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js +26 -6
  129. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  130. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts +2 -0
  131. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts.map +1 -0
  132. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js +5 -0
  133. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js.map +1 -0
  134. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts +8 -1
  135. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  136. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +15 -3
  137. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  138. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts +44 -0
  139. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map +1 -0
  140. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js +77 -0
  141. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map +1 -0
  142. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts +3 -0
  143. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts.map +1 -0
  144. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js +5 -0
  145. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js.map +1 -0
  146. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts +33 -0
  147. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.d.ts.map +1 -0
  148. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js +90 -0
  149. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.js.map +1 -0
  150. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  151. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js +2 -2
  152. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  153. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts +7 -1
  154. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  155. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js +50 -73
  156. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  157. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts +7 -1
  158. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  159. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js +39 -11
  160. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  161. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  162. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js +1 -5
  163. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  164. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  165. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js +0 -1
  166. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  167. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  168. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js +1 -2
  169. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  170. package/dist/core/components/viewers/map/MapViewer.d.ts +1 -2
  171. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  172. package/dist/core/components/viewers/map/MapViewer.js +2 -2
  173. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  174. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  175. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js +11 -14
  176. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  177. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  178. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js +2 -5
  179. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  180. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  181. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +0 -3
  182. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  183. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  184. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js +0 -11
  185. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  186. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  187. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js +0 -1
  188. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  189. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  190. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +0 -1
  191. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  192. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  193. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js +0 -1
  194. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  195. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts +1 -2
  196. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  197. package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -2
  198. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  199. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  200. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js +174 -53
  201. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  202. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  203. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js +2 -1
  204. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  205. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts +1 -3
  206. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  207. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +74 -42
  208. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  209. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  210. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js +4 -3
  211. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  212. package/dist/core/components/viewers/map/src/MapSidebar/index.js +1 -1
  213. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  214. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  215. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js +0 -1
  216. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  217. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  218. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js +1 -5
  219. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  220. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts +1 -3
  221. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  222. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js +2 -2
  223. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  224. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  225. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js +1 -3
  226. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  227. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  228. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +0 -1
  229. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  230. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  231. package/dist/core/components/viewers/map/utils/flyToEach.js +0 -1
  232. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  233. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  234. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js +0 -2
  235. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  236. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts +19 -0
  237. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.d.ts.map +1 -0
  238. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js +108 -0
  239. package/dist/core/components/viewers/shared/markers/BimMarkerCluster.js.map +1 -0
  240. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts +24 -0
  241. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.d.ts.map +1 -0
  242. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js +27 -0
  243. package/dist/core/components/viewers/shared/markers/computeMarkerLookAt.js.map +1 -0
  244. package/dist/core/components/viewers/shared/markers/types.d.ts +66 -0
  245. package/dist/core/components/viewers/shared/markers/types.d.ts.map +1 -0
  246. package/dist/core/components/viewers/shared/markers/types.js +1 -0
  247. package/dist/core/components/viewers/shared/markers/types.js.map +1 -0
  248. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts +22 -0
  249. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.d.ts.map +1 -0
  250. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js +233 -0
  251. package/dist/core/components/viewers/shared/markers/useMarkerLayerBim.js.map +1 -0
  252. package/dist/core/hooks/comments/comments.d.ts +11 -0
  253. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  254. package/dist/core/hooks/comments/comments.js +3 -1
  255. package/dist/core/hooks/comments/comments.js.map +1 -1
  256. package/dist/core/hooks/comments/createCommentHooks.d.ts +11 -0
  257. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  258. package/dist/core/hooks/comments/createCommentHooks.js +30 -1
  259. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  260. package/dist/core/hooks/files/files.d.ts.map +1 -1
  261. package/dist/core/hooks/files/files.js +0 -1
  262. package/dist/core/hooks/files/files.js.map +1 -1
  263. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts +30 -0
  264. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts.map +1 -0
  265. package/dist/core/hooks/ui/useResizableSidebarWidth.js +75 -0
  266. package/dist/core/hooks/ui/useResizableSidebarWidth.js.map +1 -0
  267. package/dist/core/i18n/messages/en.json +10 -1
  268. package/dist/core/i18n/messages/es.json +11 -2
  269. package/dist/core/i18n/messages/fr.json +11 -2
  270. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  271. package/dist/core/store/AppConfig/context.js +4 -1
  272. package/dist/core/store/AppConfig/context.js.map +1 -1
  273. package/dist/core/store/AppConfig/reducer.d.ts +10 -0
  274. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  275. package/dist/core/store/AppConfig/reducer.js +10 -0
  276. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  277. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  278. package/dist/core/store/Datasets/reducer.js +0 -2
  279. package/dist/core/store/Datasets/reducer.js.map +1 -1
  280. package/dist/core/store/Files/reducer.js +0 -1
  281. package/dist/core/store/Files/reducer.js.map +1 -1
  282. package/dist/core/store/Menus/context.d.ts.map +1 -1
  283. package/dist/core/store/Menus/context.js +8 -2
  284. package/dist/core/store/Menus/context.js.map +1 -1
  285. package/dist/core/store/Menus/reducer.d.ts +65 -1
  286. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  287. package/dist/core/store/Menus/reducer.js +39 -3
  288. package/dist/core/store/Menus/reducer.js.map +1 -1
  289. package/dist/core/utils/markerUtils.d.ts +10 -0
  290. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  291. package/dist/core/utils/markerUtils.js +9 -1
  292. package/dist/core/utils/markerUtils.js.map +1 -1
  293. package/dist/core/utils/memcache.d.ts.map +1 -1
  294. package/dist/core/utils/memcache.js +0 -7
  295. package/dist/core/utils/memcache.js.map +1 -1
  296. package/dist/core/utils/timeUtils.d.ts +24 -1
  297. package/dist/core/utils/timeUtils.d.ts.map +1 -1
  298. package/dist/core/utils/timeUtils.js +52 -3
  299. package/dist/core/utils/timeUtils.js.map +1 -1
  300. package/package.json +4 -1
@@ -1,27 +1,38 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as LR from "lucide-react";
4
+ import { useSession } from "next-auth/react";
4
5
  import { useTranslations } from "next-intl";
5
6
  import * as React from "react";
6
7
  import { toast } from "sonner";
7
- import { useComment, useComments } from "../../../hooks/comments/comments";
8
+ import { useComment, useComments, useCreateComment, useDeleteComments } from "../../../hooks/comments/comments";
8
9
  import { BuildingsContext, MenusContext, ToolsContext, usePermissions } from "../../../store";
9
10
  import { CollapsibleSection } from "../CollapsibleSection";
10
11
  import { SearchInput } from "../SearchInput";
11
12
  import { CollapsibleCommentItem } from "./CollapsibleCommentItem";
12
13
  function CommentsSection() {
13
- var _a, _b;
14
+ var _a, _b, _c, _d;
14
15
  const t = useTranslations("CommentsSection");
15
16
  const { ability } = usePermissions();
16
17
  const { dispatch: toolsDispatch } = React.useContext(ToolsContext);
17
18
  const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext);
18
- const { currentViewer, commentsVisibleInViewer } = menusState.menus;
19
+ const { currentViewer, commentsVisibleInViewer, focusedCommentId, pendingCommentAction } = menusState.menus;
20
+ const focusComment = React.useCallback((commentId) => {
21
+ menusDispatch({ type: "SHOW_COMMENTS_IN_VIEWER", payload: { viewer: currentViewer } });
22
+ menusDispatch({ type: "SET_FOCUSED_COMMENT_ID", payload: { commentId } });
23
+ }, [menusDispatch, currentViewer]);
24
+ React.useEffect(() => {
25
+ if (pendingCommentAction) menusDispatch({ type: "CLEAR_PENDING_COMMENT_ACTION" });
26
+ }, [pendingCommentAction == null ? void 0 : pendingCommentAction.requestId, menusDispatch]);
19
27
  const { comments } = useComments();
20
28
  const { state: buildingsState } = React.useContext(BuildingsContext);
21
29
  const buildingId = ((_b = (_a = buildingsState == null ? void 0 : buildingsState.buildings) == null ? void 0 : _a.building) == null ? void 0 : _b.id) || -1;
22
- const [commentToDelete, setCommentToDelete] = React.useState(null);
30
+ const user = (_c = useSession().data) == null ? void 0 : _c.user;
31
+ const { createComment } = useCreateComment();
32
+ const [commentToEdit, setCommentToEdit] = React.useState(null);
23
33
  const [searchQuery, setSearchQuery] = React.useState("");
24
- const { deleteComment } = useComment(commentToDelete);
34
+ const { updateComment } = useComment((_d = commentToEdit == null ? void 0 : commentToEdit.id) != null ? _d : null);
35
+ const { deleteComments } = useDeleteComments();
25
36
  const handleAddComment = React.useCallback(() => {
26
37
  if (!currentViewer) return;
27
38
  toolsDispatch({
@@ -33,46 +44,72 @@ function CommentsSection() {
33
44
  }, [toolsDispatch, currentViewer]);
34
45
  const handleCommentAction = React.useCallback((action, id) => {
35
46
  switch (action) {
36
- case "view":
37
- console.log(`View comment ${id}`);
38
- break;
39
- case "edit":
40
- console.log(`Edit comment ${id}`);
41
- break;
42
- case "delete":
47
+ case "delete": {
43
48
  toast.success(t("commentDeleted"));
44
- setCommentToDelete(id);
45
- break;
46
- case "reply":
47
- console.log(`Reply to comment ${id}`);
49
+ const replyIds = comments.filter((c) => c.replyToId === id).map((c) => c.id);
50
+ void deleteComments({ ids: [id, ...replyIds] });
48
51
  break;
52
+ }
53
+ // 'view', 'edit' and 'reply' are handled inline by CollapsibleCommentItem
54
+ // (edit -> onEdit, reply -> onReply)
49
55
  default:
50
56
  break;
51
57
  }
52
- }, [t]);
58
+ }, [t, comments, deleteComments]);
53
59
  React.useEffect(() => {
54
- if (commentToDelete !== null) {
55
- deleteComment();
56
- setCommentToDelete(null);
60
+ if (commentToEdit !== null) {
61
+ void updateComment({ text: commentToEdit.text });
62
+ setCommentToEdit(null);
57
63
  }
58
- }, [commentToDelete, deleteComment]);
59
- const handleReply = React.useCallback((id, replyText) => {
60
- console.log(`Reply to ${id}: ${replyText}`);
64
+ }, [commentToEdit, updateComment]);
65
+ const handleEdit = React.useCallback((id, text) => {
66
+ setCommentToEdit({ id, text });
61
67
  }, []);
68
+ const handleReply = React.useCallback((parent, replyText) => {
69
+ var _a2;
70
+ if (!replyText.trim() || !user) return;
71
+ void createComment({
72
+ commentData: {
73
+ text: replyText,
74
+ authorId: Number(user.id),
75
+ organizationId: user.organizationId,
76
+ viewer: parent.viewer,
77
+ buildingId: parent.buildingId,
78
+ // Flat threading: a reply to a reply attaches to the top-level parent
79
+ replyToId: (_a2 = parent.replyToId) != null ? _a2 : parent.id,
80
+ visible: true
81
+ }
82
+ });
83
+ }, [createComment, user]);
62
84
  const handleFileUpload = React.useCallback((commentId, files) => {
63
- console.log(`Upload files for comment ${commentId}:`, Array.from(files).map((f) => f.name));
64
85
  }, []);
65
86
  const currentComments = comments.filter((comment) => currentViewer === comment.viewer && (!comment.buildingId || comment.buildingId === buildingId));
87
+ const repliesByParent = React.useMemo(() => {
88
+ var _a2;
89
+ const map = /* @__PURE__ */ new Map();
90
+ for (const comment of currentComments) {
91
+ if (comment.replyToId != null) {
92
+ const list = (_a2 = map.get(comment.replyToId)) != null ? _a2 : [];
93
+ list.push(comment);
94
+ map.set(comment.replyToId, list);
95
+ }
96
+ }
97
+ return map;
98
+ }, [currentComments]);
99
+ const topLevelComments = React.useMemo(
100
+ () => currentComments.filter((comment) => comment.replyToId == null),
101
+ [currentComments]
102
+ );
66
103
  const filteredComments = React.useMemo(() => {
67
- if (!searchQuery.trim()) return currentComments;
104
+ if (!searchQuery.trim()) return topLevelComments;
68
105
  const query = searchQuery.toLowerCase();
69
- return currentComments.filter(
106
+ return topLevelComments.filter(
70
107
  (comment) => {
71
108
  var _a2;
72
109
  return (_a2 = comment.text) == null ? void 0 : _a2.toLowerCase().includes(query);
73
110
  }
74
111
  );
75
- }, [currentComments, searchQuery]);
112
+ }, [topLevelComments, searchQuery]);
76
113
  const commentsVisible = commentsVisibleInViewer.includes(currentViewer);
77
114
  const toggleCommentsVisibility = React.useCallback(() => {
78
115
  menusDispatch({
@@ -104,21 +141,28 @@ function CommentsSection() {
104
141
  checked: commentsVisible,
105
142
  onCheckedChange: toggleCommentsVisibility
106
143
  },
107
- children: /* @__PURE__ */ jsx("div", { className: "space-y-2 mx-2 pr-2", children: filteredComments.map((comment) => /* @__PURE__ */ jsx(
108
- CollapsibleCommentItem,
109
- {
110
- comment,
111
- onAction: handleCommentAction,
112
- onReply: handleReply,
113
- onFileUpload: handleFileUpload,
114
- replies: [],
115
- attachments: [],
116
- isVisible: commentsVisible,
117
- onMouseEnter: () => menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: comment.id } }),
118
- onMouseLeave: () => menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: null } })
119
- },
120
- comment.id
121
- )) })
144
+ children: /* @__PURE__ */ jsx("div", { className: "space-y-2 mx-2 pr-2 pb-2", children: filteredComments.map((comment) => {
145
+ var _a2;
146
+ return /* @__PURE__ */ jsx(
147
+ CollapsibleCommentItem,
148
+ {
149
+ comment,
150
+ onAction: handleCommentAction,
151
+ onReply: handleReply,
152
+ onEdit: handleEdit,
153
+ onFileUpload: handleFileUpload,
154
+ replies: (_a2 = repliesByParent.get(comment.id)) != null ? _a2 : [],
155
+ attachments: [],
156
+ isVisible: commentsVisible,
157
+ focused: focusedCommentId === comment.id,
158
+ onFocus: () => focusComment(comment.id),
159
+ pendingAction: pendingCommentAction != null ? pendingCommentAction : void 0,
160
+ onMouseEnter: () => menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: comment.id } }),
161
+ onMouseLeave: () => menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: null } })
162
+ },
163
+ comment.id
164
+ );
165
+ }) })
122
166
  }
123
167
  )
124
168
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CommentsSection.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 LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from 'react'\r\nimport { toast } from 'sonner'\r\n\r\nimport { useComment, useComments } from '../../../hooks/comments/comments';\r\nimport { BuildingsContext, MenusContext, ToolsContext, usePermissions } from '../../../store'\r\nimport { CollapsibleSection } from '../CollapsibleSection'\r\nimport { SearchInput } from '../SearchInput'\r\n\r\n\r\nimport { CollapsibleCommentItem } from './CollapsibleCommentItem'\r\n\r\n\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\nexport function CommentsSection() {\r\n // Translation\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { dispatch: toolsDispatch } = React.useContext(ToolsContext)\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { currentViewer, commentsVisibleInViewer } = menusState.menus\r\n\r\n const {comments} = useComments()\r\n const {state: buildingsState} = React.useContext(BuildingsContext)\r\n const buildingId = buildingsState?.buildings?.building?.id || -1\r\n\r\n const [commentToDelete, setCommentToDelete] = React.useState<number | null>(null)\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const { deleteComment } = useComment(commentToDelete)\r\n\r\n const handleAddComment = React.useCallback(() => {\r\n if (!currentViewer) return\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: {\r\n currentToolId:\r\n currentViewer === 'bim'\r\n ? 'bim-add-comment'\r\n : currentViewer === 'map'\r\n ? 'map-add-comment'\r\n : undefined,\r\n },\r\n })\r\n }, [toolsDispatch, currentViewer])\r\n\r\n const handleCommentAction = React.useCallback((action: CommentAction, id: number) => {\r\n switch (action) {\r\n case 'view':\r\n console.log(`View comment ${id}`)\r\n break\r\n case 'edit':\r\n console.log(`Edit comment ${id}`)\r\n break\r\n case 'delete':\r\n toast.success(t('commentDeleted'))\r\n setCommentToDelete(id)\r\n break\r\n case 'reply':\r\n console.log(`Reply to comment ${id}`)\r\n break\r\n default:\r\n break\r\n }\r\n }, [t])\r\n\r\n // Trigger deletion when commentToDelete changes\r\n React.useEffect(() => {\r\n if (commentToDelete !== null) {\r\n deleteComment()\r\n setCommentToDelete(null)\r\n }\r\n }, [commentToDelete, deleteComment])\r\n\r\n const handleReply = React.useCallback((id: number, replyText: string) => {\r\n console.log(`Reply to ${id}: ${replyText}`)\r\n // TODO: Implement reply functionality\r\n }, [])\r\n\r\n const handleFileUpload = React.useCallback((commentId: number, files: FileList) => {\r\n console.log(`Upload files for comment ${commentId}:`, Array.from(files).map(f => f.name))\r\n // TODO: Implement file upload functionality\r\n }, [])\r\n\r\n const currentComments = comments.filter((comment) => currentViewer === comment.viewer && (!comment.buildingId || comment.buildingId === buildingId))\r\n\r\n // Filter comments based on search query\r\n const filteredComments = React.useMemo(() => {\r\n if (!searchQuery.trim()) return currentComments\r\n\r\n const query = searchQuery.toLowerCase()\r\n return currentComments.filter((comment) =>\r\n comment.text?.toLowerCase().includes(query)\r\n )\r\n }, [currentComments, searchQuery])\r\n\r\n const commentsVisible = commentsVisibleInViewer.includes(currentViewer)\r\n\r\n const toggleCommentsVisibility = React.useCallback(() => {\r\n menusDispatch({\r\n type: commentsVisible ? 'HIDE_COMMENTS_IN_VIEWER' : 'SHOW_COMMENTS_IN_VIEWER',\r\n payload: {\r\n viewer: currentViewer,\r\n },\r\n })\r\n }, [currentViewer, commentsVisible, menusDispatch])\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder={t('searchComments')}\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <CollapsibleSection\r\n title={t('commentsTitle')}\r\n icon={LR.MessageCircle}\r\n className=\"overflow-y-auto\"\r\n itemCount={filteredComments.length}\r\n onAddItem={handleAddComment}\r\n addItemTitle={t('addCommentTitle')}\r\n switchVariant={{\r\n checked: commentsVisible,\r\n onCheckedChange: toggleCommentsVisibility,\r\n }}\r\n >\r\n <div className=\"space-y-2 mx-2 pr-2\">\r\n {filteredComments.map((comment) => (\r\n <CollapsibleCommentItem\r\n key={comment.id}\r\n comment={comment}\r\n onAction={handleCommentAction}\r\n onReply={handleReply}\r\n onFileUpload={handleFileUpload}\r\n replies={[]}\r\n attachments={[]}\r\n isVisible={commentsVisible}\r\n onMouseEnter={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: comment.id } })}\r\n onMouseLeave={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: null } })}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Comments/CommentsSection.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 LR from 'lucide-react'\r\nimport { useSession } from 'next-auth/react'\r\nimport { useTranslations } from 'next-intl'\r\nimport * as React from 'react'\r\nimport { toast } from 'sonner'\r\n\r\nimport { useComment, useComments, useCreateComment, useDeleteComments } from '../../../hooks/comments/comments';\r\nimport { BuildingsContext, MenusContext, ToolsContext, usePermissions } from '../../../store'\r\nimport { CollapsibleSection } from '../CollapsibleSection'\r\nimport { SearchInput } from '../SearchInput'\r\n\r\n\r\nimport { CollapsibleCommentItem } from './CollapsibleCommentItem'\r\n\r\nimport type { Comment } from '../../../types/dbTypes'\r\n\r\n\r\n\r\ntype CommentAction = 'view' | 'edit' | 'delete' | 'reply'\r\n\r\nexport function CommentsSection() {\r\n // Translation\r\n const t = useTranslations('CommentsSection')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { dispatch: toolsDispatch } = React.useContext(ToolsContext)\r\n const { state: menusState, dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { currentViewer, commentsVisibleInViewer, focusedCommentId, pendingCommentAction } = menusState.menus\r\n\r\n const focusComment = React.useCallback((commentId: number) => {\r\n // Ensure comments are visible in the active viewer so the zoom target is actually rendered.\r\n menusDispatch({ type: 'SHOW_COMMENTS_IN_VIEWER', payload: { viewer: currentViewer } })\r\n menusDispatch({ type: 'SET_FOCUSED_COMMENT_ID', payload: { commentId } })\r\n }, [menusDispatch, currentViewer])\r\n\r\n // A pending action (open editor/reply from a marker) is one-shot: child items consume it\r\n // on their mount/update effect (children run before this parent effect), then we clear it so\r\n // it does not re-fire when the sidebar remounts.\r\n React.useEffect(() => {\r\n if (pendingCommentAction) menusDispatch({ type: 'CLEAR_PENDING_COMMENT_ACTION' })\r\n }, [pendingCommentAction?.requestId, menusDispatch])\r\n\r\n const {comments} = useComments()\r\n const {state: buildingsState} = React.useContext(BuildingsContext)\r\n const buildingId = buildingsState?.buildings?.building?.id || -1\r\n\r\n const user = useSession().data?.user\r\n const { createComment } = useCreateComment()\r\n\r\n const [commentToEdit, setCommentToEdit] = React.useState<{ id: number; text: string } | null>(null)\r\n const [searchQuery, setSearchQuery] = React.useState('')\r\n const { updateComment } = useComment(commentToEdit?.id ?? null)\r\n const { deleteComments } = useDeleteComments()\r\n\r\n const handleAddComment = React.useCallback(() => {\r\n if (!currentViewer) return\r\n toolsDispatch({\r\n type: 'SET-TOOL',\r\n payload: {\r\n currentToolId:\r\n currentViewer === 'bim'\r\n ? 'bim-add-comment'\r\n : currentViewer === 'map'\r\n ? 'map-add-comment'\r\n : undefined,\r\n },\r\n })\r\n }, [toolsDispatch, currentViewer])\r\n\r\n const handleCommentAction = React.useCallback((action: CommentAction, id: number) => {\r\n switch (action) {\r\n case 'delete': {\r\n toast.success(t('commentDeleted'))\r\n // Cascade: delete the comment together with its replies (DB does not cascade).\r\n const replyIds = comments.filter((c) => c.replyToId === id).map((c) => c.id)\r\n void deleteComments({ ids: [id, ...replyIds] })\r\n break\r\n }\r\n // 'view', 'edit' and 'reply' are handled inline by CollapsibleCommentItem\r\n // (edit -> onEdit, reply -> onReply)\r\n default:\r\n break\r\n }\r\n }, [t, comments, deleteComments])\r\n\r\n // Trigger edit when commentToEdit changes\r\n React.useEffect(() => {\r\n if (commentToEdit !== null) {\r\n void updateComment({ text: commentToEdit.text })\r\n setCommentToEdit(null)\r\n }\r\n }, [commentToEdit, updateComment])\r\n\r\n const handleEdit = React.useCallback((id: number, text: string) => {\r\n setCommentToEdit({ id, text })\r\n }, [])\r\n\r\n const handleReply = React.useCallback((parent: Comment, replyText: string) => {\r\n if (!replyText.trim() || !user) return\r\n void createComment({\r\n commentData: {\r\n text: replyText,\r\n authorId: Number(user.id),\r\n organizationId: user.organizationId,\r\n viewer: parent.viewer,\r\n buildingId: parent.buildingId,\r\n // Flat threading: a reply to a reply attaches to the top-level parent\r\n replyToId: parent.replyToId ?? parent.id,\r\n visible: true,\r\n },\r\n })\r\n }, [createComment, user])\r\n\r\n const handleFileUpload = React.useCallback((commentId: number, files: FileList) => {\r\n // ⚠️ Comment file upload not implemented (files are discarded)\r\n }, [])\r\n\r\n const currentComments = comments.filter((comment) => currentViewer === comment.viewer && (!comment.buildingId || comment.buildingId === buildingId))\r\n\r\n // Group replies under their parent (flat, single level)\r\n const repliesByParent = React.useMemo(() => {\r\n const map = new Map<number, Comment[]>()\r\n for (const comment of currentComments) {\r\n if (comment.replyToId != null) {\r\n const list = map.get(comment.replyToId) ?? []\r\n list.push(comment)\r\n map.set(comment.replyToId, list)\r\n }\r\n }\r\n return map\r\n }, [currentComments])\r\n\r\n // Top-level comments only (replies are nested under their parent)\r\n const topLevelComments = React.useMemo(\r\n () => currentComments.filter((comment) => comment.replyToId == null),\r\n [currentComments]\r\n )\r\n\r\n // Filter comments based on search query\r\n const filteredComments = React.useMemo(() => {\r\n if (!searchQuery.trim()) return topLevelComments\r\n\r\n const query = searchQuery.toLowerCase()\r\n return topLevelComments.filter((comment) =>\r\n comment.text?.toLowerCase().includes(query)\r\n )\r\n }, [topLevelComments, searchQuery])\r\n\r\n const commentsVisible = commentsVisibleInViewer.includes(currentViewer)\r\n\r\n const toggleCommentsVisibility = React.useCallback(() => {\r\n menusDispatch({\r\n type: commentsVisible ? 'HIDE_COMMENTS_IN_VIEWER' : 'SHOW_COMMENTS_IN_VIEWER',\r\n payload: {\r\n viewer: currentViewer,\r\n },\r\n })\r\n }, [currentViewer, commentsVisible, menusDispatch])\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-4 overflow-hidden\">\r\n <div className=\"px-4\">\r\n <SearchInput\r\n placeholder={t('searchComments')}\r\n value={searchQuery}\r\n onChange={e => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <CollapsibleSection\r\n title={t('commentsTitle')}\r\n icon={LR.MessageCircle}\r\n className=\"overflow-y-auto\"\r\n itemCount={filteredComments.length}\r\n onAddItem={handleAddComment}\r\n addItemTitle={t('addCommentTitle')}\r\n switchVariant={{\r\n checked: commentsVisible,\r\n onCheckedChange: toggleCommentsVisibility,\r\n }}\r\n >\r\n <div className=\"space-y-2 mx-2 pr-2 pb-2\">\r\n {filteredComments.map((comment) => (\r\n <CollapsibleCommentItem\r\n key={comment.id}\r\n comment={comment}\r\n onAction={handleCommentAction}\r\n onReply={handleReply}\r\n onEdit={handleEdit}\r\n onFileUpload={handleFileUpload}\r\n replies={repliesByParent.get(comment.id) ?? []}\r\n attachments={[]}\r\n isVisible={commentsVisible}\r\n focused={focusedCommentId === comment.id}\r\n onFocus={() => focusComment(comment.id)}\r\n pendingAction={pendingCommentAction ?? undefined}\r\n onMouseEnter={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: comment.id } })}\r\n onMouseLeave={() => menusDispatch({ type: 'SET_CURRENT_COMMENT_ID', payload: { commentId: null } })}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAsKI,SAEI,KAFJ;AAjKJ,YAAY,QAAQ;AACpB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,YAAY,WAAW;AACvB,SAAS,aAAa;AAEtB,SAAS,YAAY,aAAa,kBAAkB,yBAAyB;AAC7E,SAAS,kBAAkB,cAAc,cAAc,sBAAsB;AAC7E,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAG5B,SAAS,8BAA8B;AAQhC,SAAS,kBAAkB;AAzBlC;AA2BE,QAAM,IAAI,gBAAgB,iBAAiB;AAE3C,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,EAAE,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACjE,QAAM,EAAE,OAAO,YAAY,UAAU,cAAc,IAAI,MAAM,WAAW,YAAY;AACpF,QAAM,EAAE,eAAe,yBAAyB,kBAAkB,qBAAqB,IAAI,WAAW;AAEtG,QAAM,eAAe,MAAM,YAAY,CAAC,cAAsB;AAE5D,kBAAc,EAAE,MAAM,2BAA2B,SAAS,EAAE,QAAQ,cAAc,EAAE,CAAC;AACrF,kBAAc,EAAE,MAAM,0BAA0B,SAAS,EAAE,UAAU,EAAE,CAAC;AAAA,EAC1E,GAAG,CAAC,eAAe,aAAa,CAAC;AAKjC,QAAM,UAAU,MAAM;AACpB,QAAI,qBAAsB,eAAc,EAAE,MAAM,+BAA+B,CAAC;AAAA,EAClF,GAAG,CAAC,6DAAsB,WAAW,aAAa,CAAC;AAEnD,QAAM,EAAC,SAAQ,IAAI,YAAY;AAC/B,QAAM,EAAC,OAAO,eAAc,IAAI,MAAM,WAAW,gBAAgB;AACjE,QAAM,eAAa,4DAAgB,cAAhB,mBAA2B,aAA3B,mBAAqC,OAAM;AAE9D,QAAM,QAAO,gBAAW,EAAE,SAAb,mBAAmB;AAChC,QAAM,EAAE,cAAc,IAAI,iBAAiB;AAE3C,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA8C,IAAI;AAClG,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,EAAE;AACvD,QAAM,EAAE,cAAc,IAAI,YAAW,oDAAe,OAAf,YAAqB,IAAI;AAC9D,QAAM,EAAE,eAAe,IAAI,kBAAkB;AAE7C,QAAM,mBAAmB,MAAM,YAAY,MAAM;AAC/C,QAAI,CAAC,cAAe;AAClB,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,QACP,eACE,kBAAkB,QACd,oBACA,kBAAkB,QAChB,oBACA;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,GAAG,CAAC,eAAe,aAAa,CAAC;AAEjC,QAAM,sBAAsB,MAAM,YAAY,CAAC,QAAuB,OAAe;AACnF,YAAQ,QAAQ;AAAA,MACd,KAAK,UAAU;AACb,cAAM,QAAQ,EAAE,gBAAgB,CAAC;AAEjC,cAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAC3E,aAAK,eAAe,EAAE,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;AAC9C;AAAA,MACF;AAAA;AAAA;AAAA,MAGA;AACE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,GAAG,UAAU,cAAc,CAAC;AAGhC,QAAM,UAAU,MAAM;AACpB,QAAI,kBAAkB,MAAM;AAC1B,WAAK,cAAc,EAAE,MAAM,cAAc,KAAK,CAAC;AAC/C,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,eAAe,aAAa,CAAC;AAEjC,QAAM,aAAa,MAAM,YAAY,CAAC,IAAY,SAAiB;AACjE,qBAAiB,EAAE,IAAI,KAAK,CAAC;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM,YAAY,CAAC,QAAiB,cAAsB;AAvGhF,QAAAA;AAwGI,QAAI,CAAC,UAAU,KAAK,KAAK,CAAC,KAAM;AAChC,SAAK,cAAc;AAAA,MACjB,aAAa;AAAA,QACX,MAAM;AAAA,QACN,UAAU,OAAO,KAAK,EAAE;AAAA,QACxB,gBAAgB,KAAK;AAAA,QACrB,QAAQ,OAAO;AAAA,QACf,YAAY,OAAO;AAAA;AAAA,QAEnB,YAAWA,MAAA,OAAO,cAAP,OAAAA,MAAoB,OAAO;AAAA,QACtC,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,IAAI,CAAC;AAExB,QAAM,mBAAmB,MAAM,YAAY,CAAC,WAAmB,UAAoB;AAAA,EAEnF,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,SAAS,OAAO,CAAC,YAAY,kBAAkB,QAAQ,WAAW,CAAC,QAAQ,cAAc,QAAQ,eAAe,WAAW;AAGnJ,QAAM,kBAAkB,MAAM,QAAQ,MAAM;AA9H9C,QAAAA;AA+HI,UAAM,MAAM,oBAAI,IAAuB;AACvC,eAAW,WAAW,iBAAiB;AACrC,UAAI,QAAQ,aAAa,MAAM;AAC7B,cAAM,QAAOA,MAAA,IAAI,IAAI,QAAQ,SAAS,MAAzB,OAAAA,MAA8B,CAAC;AAC5C,aAAK,KAAK,OAAO;AACjB,YAAI,IAAI,QAAQ,WAAW,IAAI;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,mBAAmB,MAAM;AAAA,IAC7B,MAAM,gBAAgB,OAAO,CAAC,YAAY,QAAQ,aAAa,IAAI;AAAA,IACnE,CAAC,eAAe;AAAA,EAClB;AAGA,QAAM,mBAAmB,MAAM,QAAQ,MAAM;AAC3C,QAAI,CAAC,YAAY,KAAK,EAAG,QAAO;AAEhC,UAAM,QAAQ,YAAY,YAAY;AACtC,WAAO,iBAAiB;AAAA,MAAO,CAAC,YAAS;AArJ7C,YAAAA;AAsJM,gBAAAA,MAAA,QAAQ,SAAR,gBAAAA,IAAc,cAAc,SAAS;AAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,kBAAkB,WAAW,CAAC;AAElC,QAAM,kBAAkB,wBAAwB,SAAS,aAAa;AAEtE,QAAM,2BAA2B,MAAM,YAAY,MAAM;AACrD,kBAAc;AAAA,MACZ,MAAM,kBAAkB,4BAA4B;AAAA,MACpD,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,GAAG,CAAC,eAAe,iBAAiB,aAAa,CAAC;AAElD,SACE,qBAAC,SAAI,WAAU,kDACb;AAAA,wBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,EAAE,gBAAgB;AAAA,QAC/B,OAAO;AAAA,QACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA;AAAA,IAC9C,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,eAAe;AAAA,QACxB,MAAM,GAAG;AAAA,QACT,WAAU;AAAA,QACV,WAAW,iBAAiB;AAAA,QAC5B,WAAW;AAAA,QACX,cAAc,EAAE,iBAAiB;AAAA,QACjC,eAAe;AAAA,UACb,SAAS;AAAA,UACT,iBAAiB;AAAA,QACnB;AAAA,QAEA,8BAAC,SAAI,WAAU,4BACZ,2BAAiB,IAAI,CAAC,YAAS;AA3L1C,cAAAA;AA4LY;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,UAAU;AAAA,cACV,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAASA,MAAA,gBAAgB,IAAI,QAAQ,EAAE,MAA9B,OAAAA,MAAmC,CAAC;AAAA,cAC7C,aAAa,CAAC;AAAA,cACd,WAAW;AAAA,cACX,SAAS,qBAAqB,QAAQ;AAAA,cACtC,SAAS,MAAM,aAAa,QAAQ,EAAE;AAAA,cACtC,eAAe,sDAAwB;AAAA,cACvC,cAAc,MAAM,cAAc,EAAE,MAAM,0BAA0B,SAAS,EAAE,WAAW,QAAQ,GAAG,EAAE,CAAC;AAAA,cACxG,cAAc,MAAM,cAAc,EAAE,MAAM,0BAA0B,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA;AAAA,YAb7F,QAAQ;AAAA,UAcf;AAAA,SACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"file":"commentUtils.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/commentUtils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAErD,KAAK,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACrE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACxD;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,CAAA;AAGlB,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzE"}
1
+ {"version":3,"file":"commentUtils.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Comments/commentUtils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAErD,KAAK,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACrE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACxD;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,CAAA;AAGlB,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBzE"}
@@ -14,7 +14,8 @@ function buildComment(params) {
14
14
  y: params.y,
15
15
  z: params.z,
16
16
  viewer: params.viewer,
17
- buildingId: params.buildingId
17
+ buildingId: params.buildingId,
18
+ replyToId: params.replyToId
18
19
  };
19
20
  }
20
21
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/ui/Comments/commentUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Comment } from '../../../types/dbTypes'\r\n\r\ntype BuildCommentParams = Omit<Comment, 'id' | 'createdAt' | 'updatedAt'>\r\n & Partial<Pick<Comment, 'id' | 'createdAt' | 'updatedAt'>>\r\n & { now?: Date }\r\n\r\n\r\nexport function buildComment(params: BuildCommentParams): Partial<Comment> {\r\n const now = params.now ?? new Date()\r\n\r\n return {\r\n visible: true,\r\n authorId: params.authorId,\r\n organizationId: params.organizationId,\r\n image: params.image,\r\n text: params.text,\r\n longitude: params.longitude,\r\n latitude: params.latitude,\r\n elevation: params.elevation,\r\n x: params.x,\r\n y: params.y,\r\n z: params.z,\r\n viewer: params.viewer,\r\n buildingId: params.buildingId\r\n }\r\n}\r\n"],"mappings":"AAUO,SAAS,aAAa,QAA8C;AAV3E;AAWE,QAAM,OAAM,YAAO,QAAP,YAAc,oBAAI,KAAK;AAEnC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,EACrB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/core/components/ui/Comments/commentUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Comment } from '../../../types/dbTypes'\r\n\r\ntype BuildCommentParams = Omit<Comment, 'id' | 'createdAt' | 'updatedAt'>\r\n & Partial<Pick<Comment, 'id' | 'createdAt' | 'updatedAt'>>\r\n & { now?: Date }\r\n\r\n\r\nexport function buildComment(params: BuildCommentParams): Partial<Comment> {\r\n const now = params.now ?? new Date()\r\n\r\n return {\r\n visible: true,\r\n authorId: params.authorId,\r\n organizationId: params.organizationId,\r\n image: params.image,\r\n text: params.text,\r\n longitude: params.longitude,\r\n latitude: params.latitude,\r\n elevation: params.elevation,\r\n x: params.x,\r\n y: params.y,\r\n z: params.z,\r\n viewer: params.viewer,\r\n buildingId: params.buildingId,\r\n replyToId: params.replyToId\r\n }\r\n}\r\n"],"mappings":"AAUO,SAAS,aAAa,QAA8C;AAV3E;AAWE,QAAM,OAAM,YAAO,QAAP,YAAc,oBAAI,KAAK;AAEnC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,EACpB;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useFileUploadWithProgress.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadWithProgress.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,yBAAyB,CAAC,EACxC,iBAAuB,EACvB,eAAe,EACf,aAAa,EACd,GAAE,8BAAmC;;6BASoB,IAAI;;EAoG7D"}
1
+ {"version":3,"file":"useFileUploadWithProgress.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadWithProgress.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,yBAAyB,CAAC,EACxC,iBAAuB,EACvB,eAAe,EACf,aAAa,EACd,GAAE,8BAAmC;;6BASoB,IAAI;;EAkG7D"}
@@ -54,7 +54,6 @@ function useFileUploadWithProgress({
54
54
  if (!metadataResponse.ok) {
55
55
  throw new Error(`Failed to upload file: ${metadataResponse.statusText}`);
56
56
  }
57
- console.log("File successfully uploaded to API");
58
57
  mutate(["files"]);
59
58
  onUploadSuccess == null ? void 0 : onUploadSuccess();
60
59
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadWithProgress.ts"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { mutate } from 'swr'\r\n\r\nimport { uploadFileWithProgress } from '../../../viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS'\r\n\r\nfunction getFileExtension(file: File): string {\r\n const parts = file.name.split('.')\r\n if (parts.length <= 1) return ''\r\n return parts.pop()!.toLowerCase()\r\n}\r\n\r\nexport interface UseFileUploadWithProgressProps {\r\n acceptedFileTypes?: string\r\n onUploadSuccess?: () => void\r\n onUploadError?: (error: Error) => void\r\n}\r\n\r\nexport interface UploadState {\r\n uploading: boolean\r\n progress: number\r\n}\r\n\r\nexport function useFileUploadWithProgress({\r\n acceptedFileTypes = '*',\r\n onUploadSuccess,\r\n onUploadError\r\n}: UseFileUploadWithProgressProps = {}) {\r\n\r\n const [uploadState, setUploadState] = React.useState<UploadState>({\r\n uploading: false,\r\n progress: 0\r\n })\r\n\r\n const inputRef = React.useRef<HTMLInputElement | null>(null)\r\n\r\n const handleFileUpload = React.useCallback(async (file: File) => {\r\n setUploadState({ uploading: true, progress: 0 })\r\n\r\n try {\r\n // Generate a unique fileID for minio\r\n const fileId = crypto.randomUUID()\r\n\r\n // Get presigned upload URL for bucket\r\n const response = await fetch(`/api/presigned-url-upload?asset=${fileId}`)\r\n if (!response.ok) {\r\n throw new Error('Failed to fetch presigned URL')\r\n }\r\n const { presignedUrl } = await response.json()\r\n\r\n // Upload file to bucket with progress tracking\r\n await uploadFileWithProgress(presignedUrl, file,\r\n (progress: number) => {\r\n setUploadState({ uploading: true, progress })\r\n },\r\n )\r\n\r\n // Create a new file object with the unique id\r\n const newFile = {\r\n type: 'system',\r\n name: file.name,\r\n url: '',\r\n mimeType: file.type,\r\n extension: getFileExtension(file),\r\n sizeBytes: file.size,\r\n uploadedAt: new Date(),\r\n description: '',\r\n assetId: fileId,\r\n }\r\n\r\n // Upload metadata to API\r\n const metadataResponse = await fetch('/api/files/create', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(newFile),\r\n })\r\n\r\n if (!metadataResponse.ok) {\r\n throw new Error(`Failed to upload file: ${metadataResponse.statusText}`)\r\n }\r\n\r\n console.log('File successfully uploaded to API')\r\n\r\n // Revalidate files list\r\n mutate(['files'])\r\n\r\n onUploadSuccess?.()\r\n } catch (error) {\r\n console.error('Error uploading file:', error)\r\n onUploadError?.(error as Error)\r\n } finally {\r\n setUploadState({ uploading: false, progress: 0 })\r\n }\r\n }, [onUploadSuccess, onUploadError])\r\n\r\n const handleAddFile = React.useCallback(() => {\r\n if (uploadState.uploading) return\r\n\r\n // Create or use existing file input element\r\n if (!inputRef.current) {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = acceptedFileTypes\r\n input.style.display = 'none'\r\n\r\n input.addEventListener('change', async (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (!file) return\r\n await handleFileUpload(file)\r\n })\r\n\r\n inputRef.current = input\r\n document.body.appendChild(input)\r\n } else {\r\n inputRef.current.accept = acceptedFileTypes\r\n }\r\n\r\n inputRef.current.click()\r\n }, [acceptedFileTypes, handleFileUpload, uploadState.uploading])\r\n\r\n // Cleanup on unmount\r\n React.useEffect(() => {\r\n return () => {\r\n if (inputRef.current && document.body.contains(inputRef.current)) {\r\n document.body.removeChild(inputRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n return {\r\n handleAddFile,\r\n handleFileUpload,\r\n uploadState\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/ui/FilesManager/src/useFileUploadWithProgress.ts"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { mutate } from 'swr'\r\n\r\nimport { uploadFileWithProgress } from '../../../viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS'\r\n\r\nfunction getFileExtension(file: File): string {\r\n const parts = file.name.split('.')\r\n if (parts.length <= 1) return ''\r\n return parts.pop()!.toLowerCase()\r\n}\r\n\r\nexport interface UseFileUploadWithProgressProps {\r\n acceptedFileTypes?: string\r\n onUploadSuccess?: () => void\r\n onUploadError?: (error: Error) => void\r\n}\r\n\r\nexport interface UploadState {\r\n uploading: boolean\r\n progress: number\r\n}\r\n\r\nexport function useFileUploadWithProgress({\r\n acceptedFileTypes = '*',\r\n onUploadSuccess,\r\n onUploadError\r\n}: UseFileUploadWithProgressProps = {}) {\r\n\r\n const [uploadState, setUploadState] = React.useState<UploadState>({\r\n uploading: false,\r\n progress: 0\r\n })\r\n\r\n const inputRef = React.useRef<HTMLInputElement | null>(null)\r\n\r\n const handleFileUpload = React.useCallback(async (file: File) => {\r\n setUploadState({ uploading: true, progress: 0 })\r\n\r\n try {\r\n // Generate a unique fileID for minio\r\n const fileId = crypto.randomUUID()\r\n\r\n // Get presigned upload URL for bucket\r\n const response = await fetch(`/api/presigned-url-upload?asset=${fileId}`)\r\n if (!response.ok) {\r\n throw new Error('Failed to fetch presigned URL')\r\n }\r\n const { presignedUrl } = await response.json()\r\n\r\n // Upload file to bucket with progress tracking\r\n await uploadFileWithProgress(presignedUrl, file,\r\n (progress: number) => {\r\n setUploadState({ uploading: true, progress })\r\n },\r\n )\r\n\r\n // Create a new file object with the unique id\r\n const newFile = {\r\n type: 'system',\r\n name: file.name,\r\n url: '',\r\n mimeType: file.type,\r\n extension: getFileExtension(file),\r\n sizeBytes: file.size,\r\n uploadedAt: new Date(),\r\n description: '',\r\n assetId: fileId,\r\n }\r\n\r\n // Upload metadata to API\r\n const metadataResponse = await fetch('/api/files/create', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(newFile),\r\n })\r\n\r\n if (!metadataResponse.ok) {\r\n throw new Error(`Failed to upload file: ${metadataResponse.statusText}`)\r\n }\r\n\r\n // Revalidate files list\r\n mutate(['files'])\r\n\r\n onUploadSuccess?.()\r\n } catch (error) {\r\n console.error('Error uploading file:', error)\r\n onUploadError?.(error as Error)\r\n } finally {\r\n setUploadState({ uploading: false, progress: 0 })\r\n }\r\n }, [onUploadSuccess, onUploadError])\r\n\r\n const handleAddFile = React.useCallback(() => {\r\n if (uploadState.uploading) return\r\n\r\n // Create or use existing file input element\r\n if (!inputRef.current) {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = acceptedFileTypes\r\n input.style.display = 'none'\r\n\r\n input.addEventListener('change', async (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (!file) return\r\n await handleFileUpload(file)\r\n })\r\n\r\n inputRef.current = input\r\n document.body.appendChild(input)\r\n } else {\r\n inputRef.current.accept = acceptedFileTypes\r\n }\r\n\r\n inputRef.current.click()\r\n }, [acceptedFileTypes, handleFileUpload, uploadState.uploading])\r\n\r\n // Cleanup on unmount\r\n React.useEffect(() => {\r\n return () => {\r\n if (inputRef.current && document.body.contains(inputRef.current)) {\r\n document.body.removeChild(inputRef.current)\r\n }\r\n }\r\n }, [])\r\n\r\n return {\r\n handleAddFile,\r\n handleFileUpload,\r\n uploadState\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -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,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"}
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,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,qBAwBlB"}
@@ -11,18 +11,22 @@ function InfoSidebarContainer({
11
11
  const { state: buildingState } = React.useContext(BuildingsContext);
12
12
  const { building: currentBuilding } = buildingState.buildings;
13
13
  const [loadingBuildingInfo] = React.useState(false);
14
- return /* @__PURE__ */ jsxs("div", { className: "w-full sm:w-[410px] flex flex-col h-full min-h-0 bg-background border-r border-border ", children: [
15
- /* @__PURE__ */ jsx(
16
- Header,
17
- {
18
- currentBuilding,
19
- loadingBuildingInfo,
20
- organization
21
- }
22
- ),
23
- tabSelector,
24
- children
25
- ] });
14
+ return (
15
+ // Fills the InfoSidebar overlay wrapper (Sidebar.tsx), which owns the resizable width.
16
+ // pr-2 keeps a consistent right gutter so content never sits flush against the edge/handle.
17
+ /* @__PURE__ */ jsxs("div", { className: "w-full flex flex-col h-full min-h-0 bg-background border-r border-border pr-2", children: [
18
+ /* @__PURE__ */ jsx(
19
+ Header,
20
+ {
21
+ currentBuilding,
22
+ loadingBuildingInfo,
23
+ organization
24
+ }
25
+ ),
26
+ tabSelector,
27
+ children
28
+ ] })
29
+ );
26
30
  }
27
31
  export {
28
32
  InfoSidebarContainer
@@ -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\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-full sm:w-[410px] flex flex-col h-full min-h-0 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":";AAiCI,SACE,KADF;AA5BJ,YAAY,WAAW;AAGvB,SAAS,wBAAwB;AAGjC,SAAS,cAAc;AAUhB,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,0FACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;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\n\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 // Fills the InfoSidebar overlay wrapper (Sidebar.tsx), which owns the resizable width.\r\n // pr-2 keeps a consistent right gutter so content never sits flush against the edge/handle.\r\n <div className=\"w-full flex flex-col h-full min-h-0 bg-background border-r border-border pr-2\">\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":";AAmCI,SACE,KADF;AA9BJ,YAAY,WAAW;AAGvB,SAAS,wBAAwB;AAGjC,SAAS,cAAc;AAUhB,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;AAAA;AAAA;AAAA,IAGE,qBAAC,SAAI,WAAU,iFACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAGC;AAAA,MAGE;AAAA,OACL;AAAA;AAEJ;","names":[]}
@@ -9,8 +9,7 @@ interface CollapsibleSensorItemProps {
9
9
  isVisible?: boolean;
10
10
  onMouseEnter?: () => void;
11
11
  onMouseLeave?: () => void;
12
- minioBaseUrl?: string;
13
12
  }
14
- export declare function CollapsibleSensorItem({ sensor, sensorType, onAction, depth, isVisible, onMouseEnter, onMouseLeave, minioBaseUrl }: CollapsibleSensorItemProps): React.JSX.Element;
13
+ export declare function CollapsibleSensorItem({ sensor, sensorType, onAction, depth, isVisible, onMouseEnter, onMouseLeave, }: CollapsibleSensorItemProps): React.JSX.Element;
15
14
  export {};
16
15
  //# 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":"AASA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAc9B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGhE,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,qBAwO5B"}
1
+ {"version":3,"file":"CollapsibleSensorItem.d.ts","sourceRoot":"","sources":["../../../../../src/core/components/ui/Sensors/CollapsibleSensorItem.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAmB9B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGhE,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,GACb,EAAE,0BAA0B,qBAyL5B"}