@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
@@ -0,0 +1,33 @@
1
+ import type { BimMarkerConfig } from "../../../../../shared/markers/types";
2
+ /** A BIM comment enriched with author display fields, shaped for the marker layer. */
3
+ export interface CommentItem {
4
+ id: number;
5
+ x: number;
6
+ y: number;
7
+ z: number;
8
+ /** Omitted on the pending (being-created) placeholder — never read before a comment is real. */
9
+ authorId?: number;
10
+ authorName: string;
11
+ imageFileId: number | null;
12
+ image: number | string | null;
13
+ text: string;
14
+ createdAt: string | Date;
15
+ buildingId?: number | null;
16
+ isPending?: boolean;
17
+ }
18
+ interface CommentMarkerDeps {
19
+ currentUserId: string | null;
20
+ onRemove: (id: number) => void;
21
+ /** Reply is comment-only — the generic marker `ctx` has no reply handler, so the wrapper injects it. */
22
+ onReply: (id: number) => void;
23
+ /** Building context closed over for the pending placeholder item. */
24
+ buildingId: number;
25
+ }
26
+ /**
27
+ * Builds the comment-specific `BimMarkerConfig` consumed by `useMarkerLayerBim`. A factory
28
+ * (not a plain object) because `isAuthor`, `onRemove`, `onReply` and the pending placeholder's
29
+ * `buildingId` all need runtime values supplied by the `useCommentMarkers` wrapper.
30
+ */
31
+ export declare function makeCommentMarkerConfig(deps: CommentMarkerDeps): BimMarkerConfig<CommentItem>;
32
+ export {};
33
+ //# sourceMappingURL=commentMarkerConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentMarkerConfig.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAE1E,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,UAAU,iBAAiB;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,wGAAwG;IACxG,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,CAAC,WAAW,CAAC,CAkE7F"}
@@ -0,0 +1,90 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ import { BimMarkerCluster } from "../../../../../shared/markers/BimMarkerCluster";
21
+ import BimComment from "./BimComment";
22
+ function makeCommentMarkerConfig(deps) {
23
+ const { currentUserId, onRemove, onReply, buildingId } = deps;
24
+ return {
25
+ markerIdKey: "commentId",
26
+ sphereColor: "white",
27
+ focusDistance: 8,
28
+ component: BimComment,
29
+ clusterComponent: BimMarkerCluster,
30
+ // Exact reproduction of the pre-refactor `makeCommentPropsMapper`. Any user can select/focus/
31
+ // reply to any comment (showActions/onSelect/onFocus/onReply are NOT author-gated) — only
32
+ // canEdit/canDelete/onEdit/onRemove are, matching the original conditional structure.
33
+ propsMapper: (comment, ctx) => {
34
+ var _a, _b;
35
+ const base = {
36
+ userName: comment.authorName,
37
+ userImageFileId: (_a = comment.imageFileId) != null ? _a : null,
38
+ userImage: (_b = comment.imageFileId) != null ? _b : null,
39
+ buildingId: comment.buildingId,
40
+ timestamp: new Date(comment.createdAt),
41
+ text: comment.text,
42
+ isPending: comment.isPending || false,
43
+ highlight: ctx.highlight,
44
+ focused: ctx.focused
45
+ };
46
+ if (comment.isPending) return base;
47
+ return __spreadProps(__spreadValues({}, base), {
48
+ showActions: true,
49
+ canEdit: ctx.isAuthor,
50
+ canDelete: ctx.isAuthor,
51
+ onSelect: ctx.onSelect,
52
+ onFocus: ctx.onFocus,
53
+ onReply: () => onReply(comment.id),
54
+ onEdit: ctx.isAuthor ? ctx.onEdit : void 0,
55
+ onRemove: ctx.isAuthor ? ctx.onRemove : void 0
56
+ });
57
+ },
58
+ clusterMemberMapper: (c) => {
59
+ var _a;
60
+ return {
61
+ id: c.id,
62
+ userName: c.authorName,
63
+ imageFileId: (_a = c.imageFileId) != null ? _a : null
64
+ };
65
+ },
66
+ dataHashPart: (c) => {
67
+ var _a;
68
+ return `${c.id}:${(_a = c.text) != null ? _a : ""}:${c.isPending ? 1 : 0}`;
69
+ },
70
+ isAuthor: (c) => currentUserId != null && String(c.authorId) === currentUserId,
71
+ onRemove,
72
+ makePendingItem: (id, pos) => ({
73
+ id,
74
+ x: pos.x,
75
+ y: pos.y,
76
+ z: pos.z,
77
+ authorName: "Loading...",
78
+ imageFileId: null,
79
+ image: "",
80
+ text: "Creating comment...",
81
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
82
+ buildingId,
83
+ isPending: true
84
+ })
85
+ };
86
+ }
87
+ export {
88
+ makeCommentMarkerConfig
89
+ };
90
+ //# sourceMappingURL=commentMarkerConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/commentMarkerConfig.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { BimMarkerCluster } from \"../../../../../shared/markers/BimMarkerCluster\"\r\n\r\nimport BimComment from \"./BimComment\"\r\n\r\nimport type { BimMarkerConfig } from \"../../../../../shared/markers/types\"\r\n\r\n/** A BIM comment enriched with author display fields, shaped for the marker layer. */\r\nexport interface CommentItem {\r\n id: number\r\n x: number\r\n y: number\r\n z: number\r\n /** Omitted on the pending (being-created) placeholder — never read before a comment is real. */\r\n authorId?: number\r\n authorName: string\r\n imageFileId: number | null\r\n image: number | string | null\r\n text: string\r\n createdAt: string | Date\r\n buildingId?: number | null\r\n isPending?: boolean\r\n}\r\n\r\ninterface CommentMarkerDeps {\r\n currentUserId: string | null\r\n onRemove: (id: number) => void\r\n /** Reply is comment-only — the generic marker `ctx` has no reply handler, so the wrapper injects it. */\r\n onReply: (id: number) => void\r\n /** Building context closed over for the pending placeholder item. */\r\n buildingId: number\r\n}\r\n\r\n/**\r\n * Builds the comment-specific `BimMarkerConfig` consumed by `useMarkerLayerBim`. A factory\r\n * (not a plain object) because `isAuthor`, `onRemove`, `onReply` and the pending placeholder's\r\n * `buildingId` all need runtime values supplied by the `useCommentMarkers` wrapper.\r\n */\r\nexport function makeCommentMarkerConfig(deps: CommentMarkerDeps): BimMarkerConfig<CommentItem> {\r\n const { currentUserId, onRemove, onReply, buildingId } = deps\r\n\r\n return {\r\n markerIdKey: \"commentId\",\r\n sphereColor: \"white\",\r\n focusDistance: 8,\r\n component: BimComment,\r\n clusterComponent: BimMarkerCluster,\r\n\r\n // Exact reproduction of the pre-refactor `makeCommentPropsMapper`. Any user can select/focus/\r\n // reply to any comment (showActions/onSelect/onFocus/onReply are NOT author-gated) — only\r\n // canEdit/canDelete/onEdit/onRemove are, matching the original conditional structure.\r\n propsMapper: (comment, ctx) => {\r\n const base = {\r\n userName: comment.authorName,\r\n userImageFileId: comment.imageFileId ?? null,\r\n userImage: comment.imageFileId ?? null,\r\n buildingId: comment.buildingId,\r\n timestamp: new Date(comment.createdAt),\r\n text: comment.text,\r\n isPending: comment.isPending || false,\r\n highlight: ctx.highlight,\r\n focused: ctx.focused,\r\n }\r\n if (comment.isPending) return base\r\n\r\n return {\r\n ...base,\r\n showActions: true,\r\n canEdit: ctx.isAuthor,\r\n canDelete: ctx.isAuthor,\r\n onSelect: ctx.onSelect,\r\n onFocus: ctx.onFocus,\r\n onReply: () => onReply(comment.id),\r\n onEdit: ctx.isAuthor ? ctx.onEdit : undefined,\r\n onRemove: ctx.isAuthor ? ctx.onRemove : undefined,\r\n }\r\n },\r\n\r\n clusterMemberMapper: (c) => ({\r\n id: c.id,\r\n userName: c.authorName,\r\n imageFileId: c.imageFileId ?? null,\r\n }),\r\n\r\n dataHashPart: (c) => `${c.id}:${c.text ?? \"\"}:${c.isPending ? 1 : 0}`,\r\n\r\n isAuthor: (c) => currentUserId != null && String(c.authorId) === currentUserId,\r\n\r\n onRemove,\r\n\r\n makePendingItem: (id, pos) => ({\r\n id,\r\n x: pos.x,\r\n y: pos.y,\r\n z: pos.z,\r\n authorName: \"Loading...\",\r\n imageFileId: null,\r\n image: \"\",\r\n text: \"Creating comment...\",\r\n createdAt: new Date().toISOString(),\r\n buildingId,\r\n isPending: true,\r\n }),\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAGA,SAAS,wBAAwB;AAEjC,OAAO,gBAAgB;AAmChB,SAAS,wBAAwB,MAAuD;AAC7F,QAAM,EAAE,eAAe,UAAU,SAAS,WAAW,IAAI;AAEzD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,kBAAkB;AAAA;AAAA;AAAA;AAAA,IAKlB,aAAa,CAAC,SAAS,QAAQ;AArDnC;AAsDM,YAAM,OAAO;AAAA,QACX,UAAU,QAAQ;AAAA,QAClB,kBAAiB,aAAQ,gBAAR,YAAuB;AAAA,QACxC,YAAW,aAAQ,gBAAR,YAAuB;AAAA,QAClC,YAAY,QAAQ;AAAA,QACpB,WAAW,IAAI,KAAK,QAAQ,SAAS;AAAA,QACrC,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ,aAAa;AAAA,QAChC,WAAW,IAAI;AAAA,QACf,SAAS,IAAI;AAAA,MACf;AACA,UAAI,QAAQ,UAAW,QAAO;AAE9B,aAAO,iCACF,OADE;AAAA,QAEL,aAAa;AAAA,QACb,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,QACf,UAAU,IAAI;AAAA,QACd,SAAS,IAAI;AAAA,QACb,SAAS,MAAM,QAAQ,QAAQ,EAAE;AAAA,QACjC,QAAQ,IAAI,WAAW,IAAI,SAAS;AAAA,QACpC,UAAU,IAAI,WAAW,IAAI,WAAW;AAAA,MAC1C;AAAA,IACF;AAAA,IAEA,qBAAqB,CAAC,MAAG;AAhF7B;AAgFiC;AAAA,QAC3B,IAAI,EAAE;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,cAAa,OAAE,gBAAF,YAAiB;AAAA,MAChC;AAAA;AAAA,IAEA,cAAc,CAAC,MAAG;AAtFtB;AAsFyB,gBAAG,EAAE,EAAE,KAAI,OAAE,SAAF,YAAU,EAAE,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA;AAAA,IAEnE,UAAU,CAAC,MAAM,iBAAiB,QAAQ,OAAO,EAAE,QAAQ,MAAM;AAAA,IAEjE;AAAA,IAEA,iBAAiB,CAAC,IAAI,SAAS;AAAA,MAC7B;AAAA,MACA,GAAG,IAAI;AAAA,MACP,GAAG,IAAI;AAAA,MACP,GAAG,IAAI;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"renderCSS2DMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAErE,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AAE7E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;IACnC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,WAAW,EAAE,WAAW,GAAG,UAAU,CAAA;IACrC,+FAA+F;IAC/F,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;IACxD,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CACpC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAClH,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,IAAI,CA2FN"}
1
+ {"version":3,"file":"renderCSS2DMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAErE,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AAE7E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;IACnC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,WAAW,EAAE,WAAW,GAAG,UAAU,CAAA;IACrC,+FAA+F;IAC/F,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;IACxD,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CACpC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAClH,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,IAAI,CA6FN"}
@@ -56,13 +56,13 @@ function renderCSS2DMarkers(world, config) {
56
56
  for (const item of validItems) {
57
57
  const itemId = String(item.id);
58
58
  const existing = reg.get(itemId);
59
- const resolvedProps = __spreadProps(__spreadValues({}, propsMapper(item)), {
59
+ const resolvedProps = __spreadValues({
60
60
  worldCamera: world.camera.three,
61
61
  targetPoint: new THREE.Vector3(item.x, item.y, item.z),
62
62
  onClose: () => {
63
63
  },
64
64
  onRemove: () => onRemove(item.id)
65
- });
65
+ }, propsMapper(item));
66
66
  if (existing) {
67
67
  const markerElement2 = React.createElement(component, __spreadProps(__spreadValues({}, resolvedProps), { sphere: existing.sphere }));
68
68
  existing.root.render(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.tsx"],"sourcesContent":["// 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 { createRoot } from 'react-dom/client'\r\nimport * as THREE from 'three'\r\nimport { CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js'\r\n\r\nimport { HooksCtx, type HooksBag } from '../../../../../../../hooks/provider'\r\n\r\nexport interface MarkerRef {\r\n root: ReturnType<typeof createRoot>\r\n sphere: THREE.Mesh\r\n css2dObject: CSS2DObject\r\n}\r\n\r\nexport interface MarkerConfig<T> {\r\n items: T[]\r\n markerIdKey: 'commentId' | 'sensorId'\r\n /** Persistent registry keyed by item id — create with React.useRef(new Map()) in the caller */\r\n registry: React.MutableRefObject<Map<string, MarkerRef>>\r\n component: React.ComponentType<any>\r\n propsMapper: (item: T) => Record<string, any>\r\n sphereColor: string\r\n isVisible: boolean\r\n onRemove: (id: number) => void\r\n hooksContextValue?: HooksBag | null\r\n}\r\n\r\nexport function renderCSS2DMarkers<T extends { id: number; x?: number | null; y?: number | null; z?: number | null }>(\r\n world: any,\r\n config: MarkerConfig<T>\r\n): void {\r\n if (!world) return\r\n\r\n const { items, markerIdKey, component, propsMapper, sphereColor, isVisible, onRemove, registry, hooksContextValue } = config\r\n const reg = registry.current\r\n\r\n // Filter items to only include those with valid 3D coordinates\r\n const validItems = items.filter((item): item is T & { x: number; y: number; z: number } =>\r\n item.x != null && item.y != null && item.z != null\r\n )\r\n\r\n // Hide all markers if not visible — remove all from scene and clear registry\r\n if (!isVisible) {\r\n reg.forEach(({ sphere, css2dObject }) => {\r\n world.scene.three.remove(sphere)\r\n world.scene.three.remove(css2dObject)\r\n sphere.geometry?.dispose()\r\n if (sphere.material instanceof THREE.Material) sphere.material.dispose()\r\n })\r\n reg.clear()\r\n return\r\n }\r\n\r\n const eligibleIds = new Set(validItems.map(item => String(item.id)))\r\n\r\n // Remove markers for deleted/invisible items\r\n const toDelete: string[] = []\r\n reg.forEach(({ sphere, css2dObject }, id) => {\r\n if (!eligibleIds.has(id)) {\r\n world.scene.three.remove(sphere)\r\n world.scene.three.remove(css2dObject)\r\n sphere.geometry?.dispose()\r\n if (sphere.material instanceof THREE.Material) sphere.material.dispose()\r\n toDelete.push(id)\r\n }\r\n })\r\n toDelete.forEach(id => reg.delete(id))\r\n\r\n // Update or create markers\r\n for (const item of validItems) {\r\n const itemId = String(item.id)\r\n const existing = reg.get(itemId)\r\n\r\n const resolvedProps = {\r\n ...propsMapper(item),\r\n worldCamera: world.camera.three,\r\n targetPoint: new THREE.Vector3(item.x, item.y, item.z),\r\n onClose: () => {},\r\n onRemove: () => onRemove(item.id),\r\n }\r\n\r\n if (existing) {\r\n // Re-render with latest props (e.g. highlight change)\r\n const markerElement = React.createElement(component, { ...resolvedProps, sphere: existing.sphere })\r\n existing.root.render(\r\n hooksContextValue\r\n ? React.createElement(HooksCtx.Provider, { value: hooksContextValue }, markerElement)\r\n : markerElement\r\n )\r\n continue\r\n }\r\n\r\n // Create new marker\r\n const hitPoint = new THREE.Vector3(item.x, item.y, item.z)\r\n\r\n const sphereGeometry = new THREE.SphereGeometry(0.04, 10, 10)\r\n const sphereMaterial = new THREE.MeshBasicMaterial({ color: sphereColor })\r\n const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)\r\n sphere.position.copy(hitPoint)\r\n sphere.userData[markerIdKey] = itemId\r\n world.scene.three.add(sphere)\r\n\r\n const labelDiv = document.createElement('div')\r\n labelDiv.style.pointerEvents = 'auto'\r\n const root = createRoot(labelDiv)\r\n const markerElement = React.createElement(component, { ...resolvedProps, sphere })\r\n root.render(\r\n hooksContextValue\r\n ? React.createElement(HooksCtx.Provider, { value: hooksContextValue }, markerElement)\r\n : markerElement\r\n )\r\n\r\n const css2dObject = new CSS2DObject(labelDiv)\r\n css2dObject.position.copy(hitPoint)\r\n css2dObject.position.y += 0.2\r\n css2dObject.userData[markerIdKey] = itemId\r\n css2dObject.element.style.pointerEvents = 'auto'\r\n world.scene.three.add(css2dObject)\r\n\r\n reg.set(itemId, { root, sphere, css2dObject })\r\n }\r\n}\r\n"],"mappings":"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","names":["markerElement"]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.tsx"],"sourcesContent":["// 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 { createRoot } from 'react-dom/client'\r\nimport * as THREE from 'three'\r\nimport { CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js'\r\n\r\nimport { HooksCtx, type HooksBag } from '../../../../../../../hooks/provider'\r\n\r\nexport interface MarkerRef {\r\n root: ReturnType<typeof createRoot>\r\n sphere: THREE.Mesh\r\n css2dObject: CSS2DObject\r\n}\r\n\r\nexport interface MarkerConfig<T> {\r\n items: T[]\r\n markerIdKey: 'commentId' | 'sensorId'\r\n /** Persistent registry keyed by item id — create with React.useRef(new Map()) in the caller */\r\n registry: React.MutableRefObject<Map<string, MarkerRef>>\r\n component: React.ComponentType<any>\r\n propsMapper: (item: T) => Record<string, any>\r\n sphereColor: string\r\n isVisible: boolean\r\n onRemove: (id: number) => void\r\n hooksContextValue?: HooksBag | null\r\n}\r\n\r\nexport function renderCSS2DMarkers<T extends { id: number; x?: number | null; y?: number | null; z?: number | null }>(\r\n world: any,\r\n config: MarkerConfig<T>\r\n): void {\r\n if (!world) return\r\n\r\n const { items, markerIdKey, component, propsMapper, sphereColor, isVisible, onRemove, registry, hooksContextValue } = config\r\n const reg = registry.current\r\n\r\n // Filter items to only include those with valid 3D coordinates\r\n const validItems = items.filter((item): item is T & { x: number; y: number; z: number } =>\r\n item.x != null && item.y != null && item.z != null\r\n )\r\n\r\n // Hide all markers if not visible — remove all from scene and clear registry\r\n if (!isVisible) {\r\n reg.forEach(({ sphere, css2dObject }) => {\r\n world.scene.three.remove(sphere)\r\n world.scene.three.remove(css2dObject)\r\n sphere.geometry?.dispose()\r\n if (sphere.material instanceof THREE.Material) sphere.material.dispose()\r\n })\r\n reg.clear()\r\n return\r\n }\r\n\r\n const eligibleIds = new Set(validItems.map(item => String(item.id)))\r\n\r\n // Remove markers for deleted/invisible items\r\n const toDelete: string[] = []\r\n reg.forEach(({ sphere, css2dObject }, id) => {\r\n if (!eligibleIds.has(id)) {\r\n world.scene.three.remove(sphere)\r\n world.scene.three.remove(css2dObject)\r\n sphere.geometry?.dispose()\r\n if (sphere.material instanceof THREE.Material) sphere.material.dispose()\r\n toDelete.push(id)\r\n }\r\n })\r\n toDelete.forEach(id => reg.delete(id))\r\n\r\n // Update or create markers\r\n for (const item of validItems) {\r\n const itemId = String(item.id)\r\n const existing = reg.get(itemId)\r\n\r\n const resolvedProps = {\r\n worldCamera: world.camera.three,\r\n targetPoint: new THREE.Vector3(item.x, item.y, item.z),\r\n onClose: () => {},\r\n onRemove: () => onRemove(item.id),\r\n // propsMapper wins: it can supply richer, per-item handlers (e.g. author-gated\r\n // delete, select/focus/edit/reply) that override these generic defaults.\r\n ...propsMapper(item),\r\n }\r\n\r\n if (existing) {\r\n // Re-render with latest props (e.g. highlight change)\r\n const markerElement = React.createElement(component, { ...resolvedProps, sphere: existing.sphere })\r\n existing.root.render(\r\n hooksContextValue\r\n ? React.createElement(HooksCtx.Provider, { value: hooksContextValue }, markerElement)\r\n : markerElement\r\n )\r\n continue\r\n }\r\n\r\n // Create new marker\r\n const hitPoint = new THREE.Vector3(item.x, item.y, item.z)\r\n\r\n const sphereGeometry = new THREE.SphereGeometry(0.04, 10, 10)\r\n const sphereMaterial = new THREE.MeshBasicMaterial({ color: sphereColor })\r\n const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)\r\n sphere.position.copy(hitPoint)\r\n sphere.userData[markerIdKey] = itemId\r\n world.scene.three.add(sphere)\r\n\r\n const labelDiv = document.createElement('div')\r\n labelDiv.style.pointerEvents = 'auto'\r\n const root = createRoot(labelDiv)\r\n const markerElement = React.createElement(component, { ...resolvedProps, sphere })\r\n root.render(\r\n hooksContextValue\r\n ? React.createElement(HooksCtx.Provider, { value: hooksContextValue }, markerElement)\r\n : markerElement\r\n )\r\n\r\n const css2dObject = new CSS2DObject(labelDiv)\r\n css2dObject.position.copy(hitPoint)\r\n css2dObject.position.y += 0.2\r\n css2dObject.userData[markerIdKey] = itemId\r\n css2dObject.element.style.pointerEvents = 'auto'\r\n world.scene.three.add(css2dObject)\r\n\r\n reg.set(itemId, { root, sphere, css2dObject })\r\n }\r\n}\r\n"],"mappings":"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","names":["markerElement"]}
@@ -1,5 +1,11 @@
1
+ /**
2
+ * Thin wrapper over the generic `useMarkerLayerBim`: owns comment data fetching, the
3
+ * author-cascade delete, and the sidebar reply/edit handoff, then hands rendering off to the
4
+ * shared marker layer via `commentMarkerConfig`. Signature and return shape are unchanged —
5
+ * `AddToBim/index.tsx` consumes `{ addPendingComment, removePendingComment, commentCount }`.
6
+ */
1
7
  export declare function useCommentMarkers(world: any, buildingId: number): {
2
- addPendingComment: (position: {
8
+ addPendingComment: (pos: {
3
9
  x: number;
4
10
  y: number;
5
11
  z: number;
@@ -1 +1 @@
1
- {"version":3,"file":"useCommentMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.ts"],"names":[],"mappings":"AAgBA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM;kCA6CP;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;+BAMtC,MAAM;;EAoD3D"}
1
+ {"version":3,"file":"useCommentMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM;;;;;;;;EAmF/D"}
@@ -18,23 +18,24 @@ var __spreadValues = (a, b) => {
18
18
  return a;
19
19
  };
20
20
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ import { useSession } from "next-auth/react";
21
22
  import * as React from "react";
22
- import { useComments, useComment } from "../../../../../../../hooks/comments/comments";
23
+ import { useComments, useDeleteComments } from "../../../../../../../hooks/comments/comments";
23
24
  import { useCoreHooks } from "../../../../../../../hooks/provider";
24
25
  import { useUsers } from "../../../../../../../hooks/users/users";
25
26
  import { MenusContext } from "../../../../../../../store";
26
27
  import { ViewerNames } from "../../../../../../../types/dbTypes";
27
- import BimComment from "./BimComment";
28
- import { renderCSS2DMarkers } from "./renderCSS2DMarkers";
28
+ import { useMarkerLayerBim } from "../../../../../shared/markers/useMarkerLayerBim";
29
+ import { makeCommentMarkerConfig } from "./commentMarkerConfig";
29
30
  function useCommentMarkers(world, buildingId) {
30
- const { state: menusState } = React.useContext(MenusContext);
31
- const { commentsVisibleInViewer, currentCommentId } = menusState.menus;
32
- const registry = React.useRef(/* @__PURE__ */ new Map());
31
+ var _a, _b, _c, _d;
32
+ const { state: menusState, dispatch: menusDispatch, setIsSidebarOpen } = React.useContext(MenusContext);
33
+ const { commentsVisibleInViewer, currentCommentId, focusedCommentId, focusRequestId } = menusState.menus;
33
34
  const { comments } = useComments();
34
35
  const { users } = useUsers();
35
36
  const coreHooks = useCoreHooks();
36
- const [commentToDelete, setCommentToDelete] = React.useState(null);
37
- const { deleteComment } = useComment(commentToDelete);
37
+ const currentUserId = (_c = (_b = (_a = useSession().data) == null ? void 0 : _a.user) == null ? void 0 : _b.id) != null ? _c : null;
38
+ const { deleteComments } = useDeleteComments();
38
39
  const eligibleComments = comments.filter((comment) => {
39
40
  const { x, y, z, viewer } = comment;
40
41
  if (x == null || y == null || z == null) return false;
@@ -42,79 +43,55 @@ function useCommentMarkers(world, buildingId) {
42
43
  if (buildingId !== -1 && comment.buildingId !== buildingId) return false;
43
44
  return true;
44
45
  }).map((comment) => {
45
- var _a, _b, _c;
46
+ var _a2, _b2, _c2;
46
47
  const user = users.find((u) => u.id === comment.authorId);
47
48
  return __spreadProps(__spreadValues({}, comment), {
48
- authorName: (_a = user == null ? void 0 : user.name) != null ? _a : "Unknown User",
49
- imageFileId: (_b = user == null ? void 0 : user.imageFileId) != null ? _b : null,
50
- image: (_c = user == null ? void 0 : user.imageFileId) != null ? _c : null
49
+ authorName: (_a2 = user == null ? void 0 : user.name) != null ? _a2 : "Unknown User",
50
+ imageFileId: (_b2 = user == null ? void 0 : user.imageFileId) != null ? _b2 : null,
51
+ image: (_c2 = user == null ? void 0 : user.imageFileId) != null ? _c2 : null
51
52
  });
52
53
  });
53
- React.useEffect(() => {
54
- if (commentToDelete !== null) {
55
- deleteComment();
56
- setCommentToDelete(null);
57
- }
58
- }, [commentToDelete, deleteComment]);
59
54
  const handleRemoveComment = React.useCallback((commentId) => {
60
- setCommentToDelete(commentId);
61
- }, []);
62
- const [pendingComments, setPendingComments] = React.useState([]);
63
- const addPendingComment = React.useCallback((position) => {
64
- const id = -Date.now();
65
- setPendingComments((prev) => [...prev, __spreadValues({ id }, position)]);
66
- return id;
67
- }, []);
68
- const removePendingComment = React.useCallback((id) => {
69
- setPendingComments((prev) => prev.filter((p) => p.id !== id));
70
- }, []);
71
- React.useEffect(() => {
72
- var _a;
73
- const isVisible = (_a = commentsVisibleInViewer == null ? void 0 : commentsVisibleInViewer.includes(ViewerNames.bim)) != null ? _a : false;
74
- const allComments = [
75
- ...eligibleComments.map((c) => __spreadProps(__spreadValues({}, c), { isPending: false })),
76
- ...pendingComments.map((p) => ({
77
- id: p.id,
78
- x: p.x,
79
- y: p.y,
80
- z: p.z,
81
- authorName: "Loading...",
82
- imageFileId: null,
83
- image: "",
84
- text: "Creating comment...",
85
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
86
- buildingId,
87
- isPending: true
88
- }))
89
- ];
90
- renderCSS2DMarkers(world, {
91
- items: allComments,
92
- markerIdKey: "commentId",
93
- registry,
94
- component: BimComment,
95
- hooksContextValue: coreHooks,
96
- propsMapper: (comment) => {
97
- var _a2, _b;
98
- return {
99
- userName: comment.authorName,
100
- userImageFileId: (_a2 = comment.imageFileId) != null ? _a2 : null,
101
- userImage: (_b = comment.imageFileId) != null ? _b : null,
102
- buildingId: comment.buildingId,
103
- timestamp: new Date(comment.createdAt),
104
- text: comment.text,
105
- isPending: comment.isPending || false,
106
- highlight: currentCommentId === comment.id
107
- };
108
- },
109
- sphereColor: "white",
110
- isVisible,
111
- onRemove: handleRemoveComment
112
- });
113
- }, [world, eligibleComments, pendingComments, handleRemoveComment, commentsVisibleInViewer, buildingId, currentCommentId, coreHooks]);
55
+ const replyIds = comments.filter((c) => c.replyToId === commentId).map((c) => c.id);
56
+ void deleteComments({ ids: [commentId, ...replyIds] });
57
+ }, [comments, deleteComments]);
58
+ const requestSidebarAction = React.useCallback((commentId, action) => {
59
+ setIsSidebarOpen(true);
60
+ menusDispatch({ type: "SET_SIDEBAR_SELECTED_TAB", payload: { selectedTab: "communication" } });
61
+ menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId } });
62
+ menusDispatch({ type: "REQUEST_COMMENT_ACTION", payload: { commentId, action } });
63
+ }, [menusDispatch, setIsSidebarOpen]);
64
+ const handleReplyComment = React.useCallback((commentId) => {
65
+ requestSidebarAction(commentId, "reply");
66
+ }, [requestSidebarAction]);
67
+ const store = {
68
+ currentId: currentCommentId,
69
+ focusedId: focusedCommentId,
70
+ focusRequestId,
71
+ setCurrentId: (id) => menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: id } }),
72
+ setFocusedId: (id) => {
73
+ menusDispatch({ type: "SET_CURRENT_COMMENT_ID", payload: { commentId: id } });
74
+ menusDispatch({ type: "SET_FOCUSED_COMMENT_ID", payload: { commentId: id } });
75
+ },
76
+ requestEdit: (id) => requestSidebarAction(id, "edit")
77
+ };
78
+ const config = makeCommentMarkerConfig({
79
+ currentUserId,
80
+ onRemove: handleRemoveComment,
81
+ onReply: handleReplyComment,
82
+ buildingId
83
+ });
84
+ const itemsForLayer = eligibleComments.map((c) => __spreadProps(__spreadValues({}, c), { isPending: false }));
85
+ const { addPending, removePending } = useMarkerLayerBim(world, itemsForLayer, {
86
+ isVisible: (_d = commentsVisibleInViewer == null ? void 0 : commentsVisibleInViewer.includes(ViewerNames.bim)) != null ? _d : false,
87
+ store,
88
+ coreHooks,
89
+ config
90
+ });
114
91
  const commentCount = comments.filter(
115
92
  (c) => c.viewer === ViewerNames.bim && (!buildingId || buildingId === -1 || c.buildingId === buildingId)
116
93
  ).length;
117
- return { addPendingComment, removePendingComment, commentCount };
94
+ return { addPendingComment: addPending, removePendingComment: removePending, commentCount };
118
95
  }
119
96
  export {
120
97
  useCommentMarkers
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.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\n\r\nimport { useComments, useComment } from \"../../../../../../../hooks/comments/comments\"\r\nimport { useCoreHooks } from \"../../../../../../../hooks/provider\"\r\nimport { useUsers } from \"../../../../../../../hooks/users/users\"\r\nimport { MenusContext } from \"../../../../../../../store\"\r\nimport { ViewerNames } from \"../../../../../../../types/dbTypes\"\r\n\r\nimport BimComment from \"./BimComment\"\r\nimport { renderCSS2DMarkers, type MarkerRef } from \"./renderCSS2DMarkers\"\r\n\r\nexport function useCommentMarkers(world: any, buildingId: number) {\r\n const { state: menusState } = React.useContext(MenusContext)\r\n const { commentsVisibleInViewer, currentCommentId } = menusState.menus\r\n\r\n const registry = React.useRef<Map<string, MarkerRef>>(new Map())\r\n\r\n const { comments } = useComments()\r\n const { users } = useUsers()\r\n const coreHooks = useCoreHooks()\r\n\r\n const [commentToDelete, setCommentToDelete] = React.useState<number | null>(null)\r\n const { deleteComment } = useComment(commentToDelete)\r\n\r\n const eligibleComments = comments\r\n .filter((comment) => {\r\n const { x, y, z, viewer } = comment\r\n if (x == null || y == null || z == null) return false\r\n if (viewer !== ViewerNames.bim) return false\r\n if (buildingId !== -1 && comment.buildingId !== buildingId) return false\r\n return true\r\n })\r\n .map((comment) => {\r\n const user = users.find(u => u.id === comment.authorId)\r\n return {\r\n ...comment,\r\n authorName: user?.name ?? \"Unknown User\",\r\n imageFileId: user?.imageFileId ?? null,\r\n image: user?.imageFileId ?? null,\r\n }\r\n })\r\n\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 handleRemoveComment = React.useCallback((commentId: number) => {\r\n setCommentToDelete(commentId)\r\n }, [])\r\n\r\n // Pending markers for loading indicators while comment is being created\r\n const [pendingComments, setPendingComments] = React.useState<Array<{ id: number; x: number; y: number; z: number }>>([])\r\n\r\n const addPendingComment = React.useCallback((position: { x: number; y: number; z: number }) => {\r\n const id = -Date.now()\r\n setPendingComments(prev => [...prev, { id, ...position }])\r\n return id\r\n }, [])\r\n\r\n const removePendingComment = React.useCallback((id: number) => {\r\n setPendingComments(prev => prev.filter(p => p.id !== id))\r\n }, [])\r\n\r\n // Render comment markers (including pending)\r\n React.useEffect(() => {\r\n const isVisible = commentsVisibleInViewer?.includes(ViewerNames.bim) ?? false\r\n\r\n const allComments = [\r\n ...eligibleComments.map(c => ({ ...c, isPending: false })),\r\n ...pendingComments.map(p => ({\r\n id: p.id,\r\n x: p.x,\r\n y: p.y,\r\n z: p.z,\r\n authorName: \"Loading...\",\r\n imageFileId: null,\r\n image: \"\",\r\n text: \"Creating comment...\",\r\n createdAt: new Date().toISOString(),\r\n buildingId,\r\n isPending: true,\r\n })),\r\n ]\r\n\r\n renderCSS2DMarkers(world, {\r\n items: allComments,\r\n markerIdKey: \"commentId\",\r\n registry,\r\n component: BimComment,\r\n hooksContextValue: coreHooks,\r\n propsMapper: (comment) => ({\r\n userName: comment.authorName,\r\n userImageFileId: comment.imageFileId ?? null,\r\n userImage: comment.imageFileId ?? null,\r\n buildingId: comment.buildingId,\r\n timestamp: new Date(comment.createdAt),\r\n text: comment.text,\r\n isPending: comment.isPending || false,\r\n highlight: currentCommentId === comment.id,\r\n }),\r\n sphereColor: \"white\",\r\n isVisible,\r\n onRemove: handleRemoveComment,\r\n })\r\n }, [world, eligibleComments, pendingComments, handleRemoveComment, commentsVisibleInViewer, buildingId, currentCommentId, coreHooks])\r\n\r\n const commentCount = comments.filter(\r\n c => c.viewer === ViewerNames.bim && (!buildingId || buildingId === -1 || c.buildingId === buildingId)\r\n ).length\r\n\r\n return { addPendingComment, removePendingComment, commentCount }\r\n}\r\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.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 { useSession } from \"next-auth/react\"\r\nimport * as React from \"react\"\r\n\r\nimport { useComments, useDeleteComments } from \"../../../../../../../hooks/comments/comments\"\r\nimport { useCoreHooks } from \"../../../../../../../hooks/provider\"\r\nimport { useUsers } from \"../../../../../../../hooks/users/users\"\r\nimport { MenusContext } from \"../../../../../../../store\"\r\nimport { ViewerNames } from \"../../../../../../../types/dbTypes\"\r\nimport { useMarkerLayerBim } from \"../../../../../shared/markers/useMarkerLayerBim\"\r\n\r\nimport { makeCommentMarkerConfig, type CommentItem } from \"./commentMarkerConfig\"\r\n\r\nimport type { MarkerStoreAdapter } from \"../../../../../shared/markers/types\"\r\n\r\n/**\r\n * Thin wrapper over the generic `useMarkerLayerBim`: owns comment data fetching, the\r\n * author-cascade delete, and the sidebar reply/edit handoff, then hands rendering off to the\r\n * shared marker layer via `commentMarkerConfig`. Signature and return shape are unchanged —\r\n * `AddToBim/index.tsx` consumes `{ addPendingComment, removePendingComment, commentCount }`.\r\n */\r\nexport function useCommentMarkers(world: any, buildingId: number) {\r\n const { state: menusState, dispatch: menusDispatch, setIsSidebarOpen } = React.useContext(MenusContext)\r\n const { commentsVisibleInViewer, currentCommentId, focusedCommentId, focusRequestId } = menusState.menus\r\n\r\n const { comments } = useComments()\r\n const { users } = useUsers()\r\n const coreHooks = useCoreHooks()\r\n const currentUserId = useSession().data?.user?.id ?? null\r\n const { deleteComments } = useDeleteComments()\r\n\r\n const eligibleComments = comments\r\n .filter((comment) => {\r\n const { x, y, z, viewer } = comment\r\n if (x == null || y == null || z == null) return false\r\n if (viewer !== ViewerNames.bim) return false\r\n if (buildingId !== -1 && comment.buildingId !== buildingId) return false\r\n return true\r\n })\r\n .map((comment) => {\r\n const user = users.find((u) => u.id === comment.authorId)\r\n return {\r\n ...comment,\r\n authorName: user?.name ?? \"Unknown User\",\r\n imageFileId: user?.imageFileId ?? null,\r\n image: user?.imageFileId ?? null,\r\n }\r\n })\r\n\r\n const handleRemoveComment = React.useCallback((commentId: number) => {\r\n // Cascade: remove the comment and any replies (the DB self-relation does not cascade).\r\n const replyIds = comments.filter((c) => c.replyToId === commentId).map((c) => c.id)\r\n void deleteComments({ ids: [commentId, ...replyIds] })\r\n }, [comments, deleteComments])\r\n\r\n // Edit/reply on the 3D card open the comment's editor/reply box in the sidebar.\r\n const requestSidebarAction = React.useCallback((commentId: number, action: 'edit' | 'reply') => {\r\n setIsSidebarOpen(true)\r\n menusDispatch({ type: \"SET_SIDEBAR_SELECTED_TAB\", payload: { selectedTab: 'communication' } })\r\n menusDispatch({ type: \"SET_CURRENT_COMMENT_ID\", payload: { commentId } })\r\n menusDispatch({ type: \"REQUEST_COMMENT_ACTION\", payload: { commentId, action } })\r\n }, [menusDispatch, setIsSidebarOpen])\r\n\r\n const handleReplyComment = React.useCallback((commentId: number) => {\r\n requestSidebarAction(commentId, 'reply')\r\n }, [requestSidebarAction])\r\n\r\n const store: MarkerStoreAdapter = {\r\n currentId: currentCommentId,\r\n focusedId: focusedCommentId,\r\n focusRequestId,\r\n setCurrentId: (id) => menusDispatch({ type: \"SET_CURRENT_COMMENT_ID\", payload: { commentId: id } }),\r\n setFocusedId: (id) => {\r\n menusDispatch({ type: \"SET_CURRENT_COMMENT_ID\", payload: { commentId: id } })\r\n menusDispatch({ type: \"SET_FOCUSED_COMMENT_ID\", payload: { commentId: id } })\r\n },\r\n requestEdit: (id) => requestSidebarAction(id, 'edit'),\r\n }\r\n\r\n const config = makeCommentMarkerConfig({\r\n currentUserId,\r\n onRemove: handleRemoveComment,\r\n onReply: handleReplyComment,\r\n buildingId,\r\n })\r\n\r\n // Non-pending items eligible for clustering; pending (being-created) items are synthesized by\r\n // `config.makePendingItem` inside `useMarkerLayerBim` itself.\r\n // Cast: `eligibleComments` is filtered above to guarantee non-null x/y/z, which `CommentItem`\r\n // requires as plain numbers — not provable to tsc through the filter + map chain.\r\n const itemsForLayer = eligibleComments.map((c) => ({ ...c, isPending: false })) as CommentItem[]\r\n\r\n const { addPending, removePending } = useMarkerLayerBim(world, itemsForLayer, {\r\n isVisible: commentsVisibleInViewer?.includes(ViewerNames.bim) ?? false,\r\n store,\r\n coreHooks,\r\n config,\r\n })\r\n\r\n const commentCount = comments.filter(\r\n (c) => c.viewer === ViewerNames.bim && (!buildingId || buildingId === -1 || c.buildingId === buildingId),\r\n ).length\r\n\r\n return { addPendingComment: addPending, removePendingComment: removePending, commentCount }\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
@@ -1,4 +1,5 @@
1
- export declare function useSensorMarkers(world: any, buildingId: number, minioBaseUrl?: string): {
1
+ import { type Sensor } from "../../../../../../../types/dbTypes";
2
+ export declare function useSensorMarkers(world: any, buildingId: number): {
2
3
  addPendingSensor: (position: {
3
4
  x: number;
4
5
  y: number;
@@ -6,5 +7,10 @@ export declare function useSensorMarkers(world: any, buildingId: number, minioBa
6
7
  }) => number;
7
8
  removePendingSensor: (id: number) => void;
8
9
  sensorCount: number;
10
+ detailSensor: Sensor;
11
+ detailSensorType: import("../../../../../../..").SensorType;
12
+ closeSensorDetail: () => void;
13
+ editSensor: Sensor;
14
+ closeSensorEdit: () => void;
9
15
  };
10
16
  //# sourceMappingURL=useSensorMarkers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSensorMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.ts"],"names":[],"mappings":"AAmBA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;iCAoD9B;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;8BAMtC,MAAM;;EAsE1D"}
1
+ {"version":3,"file":"useSensorMarkers.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.ts"],"names":[],"mappings":"AAcA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAM7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM;iCA0DP;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;8BAMtC,MAAM;;;;;;;EAqF1D"}
@@ -18,19 +18,29 @@ var __spreadValues = (a, b) => {
18
18
  return a;
19
19
  };
20
20
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ import { useSession } from "next-auth/react";
22
+ import { useTranslations } from "next-intl";
21
23
  import * as React from "react";
22
24
  import { useCoreHooks } from "../../../../../../../hooks/provider";
23
25
  import { useSensors, useSensor } from "../../../../../../../hooks/sensors/sensors";
24
26
  import { useSensorTypes } from "../../../../../../../hooks/sensorTypes/sensorTypes";
25
27
  import { useUsers } from "../../../../../../../hooks/users/users";
26
- import { MenusContext } from "../../../../../../../store";
28
+ import { AppConfigContext, MenusContext } from "../../../../../../../store";
27
29
  import { ViewerNames } from "../../../../../../../types/dbTypes";
28
30
  import { UNTAGGED_TAG } from "../../../../../../ui/Sensors/SensorsSection";
29
31
  import BimSensor from "./BimSensor";
30
32
  import { renderCSS2DMarkers } from "./renderCSS2DMarkers";
31
- function useSensorMarkers(world, buildingId, minioBaseUrl) {
33
+ function useSensorMarkers(world, buildingId) {
34
+ var _a;
32
35
  const { state: menusState } = React.useContext(MenusContext);
33
36
  const { currentSensorId, visibleSensorTypes, visibleSensorTags } = menusState.menus;
37
+ const { state: appConfigState } = React.useContext(AppConfigContext);
38
+ const timeZone = appConfigState.appConfig.displayTimeZone;
39
+ const sessionUser = (_a = useSession().data) == null ? void 0 : _a.user;
40
+ const tr = useTranslations("SensorsSection");
41
+ const actionLabels = { expand: tr("expandSensor"), edit: tr("editSensor"), delete: tr("deleteSensor") };
42
+ const [detailSensor, setDetailSensor] = React.useState(null);
43
+ const [editSensor, setEditSensor] = React.useState(null);
34
44
  const registry = React.useRef(/* @__PURE__ */ new Map());
35
45
  const { sensors } = useSensors();
36
46
  const { users } = useUsers();
@@ -45,11 +55,11 @@ function useSensorMarkers(world, buildingId, minioBaseUrl) {
45
55
  if (buildingId !== -1 && sensor.buildingId !== buildingId) return false;
46
56
  return true;
47
57
  }).map((sensor) => {
48
- var _a, _b;
58
+ var _a2, _b;
49
59
  const user = users.find((u) => u.id === sensor.authorId);
50
60
  const sensorType = sensorTypes.find((t) => t.id === sensor.typeId);
51
61
  return __spreadProps(__spreadValues({}, sensor), {
52
- authorName: (_a = user == null ? void 0 : user.name) != null ? _a : "Unknown User",
62
+ authorName: (_a2 = user == null ? void 0 : user.name) != null ? _a2 : "Unknown User",
53
63
  imageFileId: (_b = user == null ? void 0 : user.imageFileId) != null ? _b : "images/default-avatar.svg",
54
64
  sensorType
55
65
  });
@@ -78,9 +88,9 @@ function useSensorMarkers(world, buildingId, minioBaseUrl) {
78
88
  const typesVisible = (visibleSensorTypes == null ? void 0 : visibleSensorTypes[ViewerNames.bim]) || [];
79
89
  const tagsVisible = (visibleSensorTags == null ? void 0 : visibleSensorTags[ViewerNames.bim]) || [];
80
90
  const visibleSensors = eligibleSensorsRef.current.filter((sensor) => {
81
- var _a, _b, _c;
91
+ var _a2, _b, _c;
82
92
  const matchesType = typesVisible.includes(sensor.typeId);
83
- const hasNoTags = !((_a = sensor.tags) == null ? void 0 : _a.length);
93
+ const hasNoTags = !((_a2 = sensor.tags) == null ? void 0 : _a2.length);
84
94
  const matchesTag = hasNoTags ? tagsVisible.includes(UNTAGGED_TAG) : (_c = (_b = sensor.tags) == null ? void 0 : _b.some((tag) => tagsVisible.includes(tag))) != null ? _c : false;
85
95
  return matchesType || matchesTag;
86
96
  });
@@ -100,6 +110,7 @@ function useSensorMarkers(world, buildingId, minioBaseUrl) {
100
110
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
101
111
  buildingId,
102
112
  tags: [],
113
+ authorId: -1,
103
114
  isPending: true
104
115
  }))
105
116
  ];
@@ -110,28 +121,45 @@ function useSensorMarkers(world, buildingId, minioBaseUrl) {
110
121
  component: BimSensor,
111
122
  hooksContextValue: coreHooks,
112
123
  propsMapper: (sensor) => {
113
- var _a;
124
+ var _a2;
114
125
  return {
115
126
  sensorName: sensor.name,
116
127
  sensorType: sensorTypes.find((t) => t.id === sensor.typeId),
117
128
  tags: sensor.tags,
118
- dataUrl: ((_a = sensor.url) == null ? void 0 : _a.startsWith("http")) ? sensor.url : minioBaseUrl ? `${minioBaseUrl}/sensors/${sensor.url}` : "",
129
+ dataUrl: (_a2 = sensor.url) != null ? _a2 : "",
119
130
  dataFormat: sensor.dataFormat,
120
131
  updateFrequency: sensor.updateFrequency,
121
132
  buildingId: sensor.buildingId,
122
133
  timestamp: new Date(sensor.createdAt),
123
- highlight: currentSensorId === sensor.id
134
+ highlight: currentSensorId === sensor.id,
135
+ timeZone,
136
+ showActions: true,
137
+ onExpand: () => setDetailSensor(sensor),
138
+ onEdit: () => setEditSensor(sensor),
139
+ actionLabels,
140
+ canEdit: (sessionUser == null ? void 0 : sessionUser.id) === String(sensor.authorId),
141
+ canDelete: (sessionUser == null ? void 0 : sessionUser.id) === String(sensor.authorId)
124
142
  };
125
143
  },
126
144
  sphereColor: "#10b981",
127
145
  isVisible: true,
128
146
  onRemove: handleRemoveSensor
129
147
  });
130
- }, [world, sensors, pendingSensors, handleRemoveSensor, visibleSensorTypes, visibleSensorTags, buildingId, currentSensorId, sensorTypes, coreHooks]);
148
+ }, [world, sensors, pendingSensors, handleRemoveSensor, visibleSensorTypes, visibleSensorTags, buildingId, currentSensorId, sensorTypes, coreHooks, timeZone, sessionUser == null ? void 0 : sessionUser.id]);
131
149
  const sensorCount = sensors.filter(
132
150
  (s) => s.viewer === ViewerNames.bim && (!buildingId || buildingId === -1 || s.buildingId === buildingId)
133
151
  ).length;
134
- return { addPendingSensor, removePendingSensor, sensorCount };
152
+ const detailSensorType = detailSensor ? sensorTypes.find((t) => t.id === detailSensor.typeId) : void 0;
153
+ return {
154
+ addPendingSensor,
155
+ removePendingSensor,
156
+ sensorCount,
157
+ detailSensor,
158
+ detailSensorType,
159
+ closeSensorDetail: () => setDetailSensor(null),
160
+ editSensor,
161
+ closeSensorEdit: () => setEditSensor(null)
162
+ };
135
163
  }
136
164
  export {
137
165
  useSensorMarkers