@collabdt/core 0.3.1 → 0.3.2

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 (196) 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 +34 -0
  13. package/dist/core/components/ui/Comments/CommentActionButtons.d.ts.map +1 -0
  14. package/dist/core/components/ui/Comments/CommentActionButtons.js +106 -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/SensorInput.d.ts.map +1 -1
  32. package/dist/core/components/ui/Sensors/SensorInput.js +0 -1
  33. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  34. package/dist/core/components/ui/Sensors/SensorsSection.js +0 -2
  35. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  36. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  37. package/dist/core/components/ui/Sidebar.js +27 -4
  38. package/dist/core/components/ui/Sidebar.js.map +1 -1
  39. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  40. package/dist/core/components/ui/ToolbarButton.js +0 -1
  41. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  42. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  43. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js +0 -2
  44. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  45. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  46. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js +0 -10
  47. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  48. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  49. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js +0 -1
  50. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  51. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  52. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js +0 -1
  53. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  54. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  55. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js +0 -1
  56. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  57. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  58. package/dist/core/components/viewers/Data/utils/filterHelper.js +0 -2
  59. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  60. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  61. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +0 -3
  62. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  63. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  64. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +1 -7
  65. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  66. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  67. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js +1 -9
  68. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  69. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  70. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js +4 -3
  71. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  72. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  73. package/dist/core/components/viewers/bim/src/ClippingPlane.js +0 -1
  74. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  75. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts +16 -10
  76. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  77. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js +26 -6
  78. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  79. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts +23 -0
  80. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.d.ts.map +1 -0
  81. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js +108 -0
  82. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimCommentCluster.js.map +1 -0
  83. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts +44 -0
  84. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.d.ts.map +1 -0
  85. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js +77 -0
  86. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/clusterMarkersByScreenSpace.js.map +1 -0
  87. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts +24 -0
  88. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.d.ts.map +1 -0
  89. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js +27 -0
  90. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/commentCameraUtils.js.map +1 -0
  91. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  92. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js +2 -2
  93. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  94. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  95. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js +242 -61
  96. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  97. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  98. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js +1 -5
  99. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  100. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  101. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js +0 -1
  102. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  103. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  104. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js +1 -2
  105. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  106. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  107. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  108. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  109. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js +11 -14
  110. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  111. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  112. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js +2 -5
  113. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  114. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  115. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +0 -3
  116. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  117. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  118. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js +0 -11
  119. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  120. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  121. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js +0 -1
  122. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  123. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  124. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +0 -1
  125. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  126. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  127. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js +0 -1
  128. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  129. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  130. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js +174 -53
  131. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  132. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  133. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js +2 -1
  134. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  135. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  136. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js +0 -3
  137. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  138. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  139. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js +4 -3
  140. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  141. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  142. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js +0 -1
  143. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  144. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  145. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js +1 -5
  146. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  147. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  148. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js +1 -3
  149. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  150. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  151. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +0 -1
  152. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  153. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  154. package/dist/core/components/viewers/map/utils/flyToEach.js +0 -1
  155. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  156. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  157. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js +0 -2
  158. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  159. package/dist/core/hooks/comments/comments.d.ts +11 -0
  160. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  161. package/dist/core/hooks/comments/comments.js +3 -1
  162. package/dist/core/hooks/comments/comments.js.map +1 -1
  163. package/dist/core/hooks/comments/createCommentHooks.d.ts +11 -0
  164. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  165. package/dist/core/hooks/comments/createCommentHooks.js +30 -1
  166. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  167. package/dist/core/hooks/files/files.d.ts.map +1 -1
  168. package/dist/core/hooks/files/files.js +0 -1
  169. package/dist/core/hooks/files/files.js.map +1 -1
  170. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts +30 -0
  171. package/dist/core/hooks/ui/useResizableSidebarWidth.d.ts.map +1 -0
  172. package/dist/core/hooks/ui/useResizableSidebarWidth.js +75 -0
  173. package/dist/core/hooks/ui/useResizableSidebarWidth.js.map +1 -0
  174. package/dist/core/i18n/messages/en.json +5 -0
  175. package/dist/core/i18n/messages/es.json +6 -1
  176. package/dist/core/i18n/messages/fr.json +6 -1
  177. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  178. package/dist/core/store/Datasets/reducer.js +0 -2
  179. package/dist/core/store/Datasets/reducer.js.map +1 -1
  180. package/dist/core/store/Files/reducer.js +0 -1
  181. package/dist/core/store/Files/reducer.js.map +1 -1
  182. package/dist/core/store/Menus/context.d.ts.map +1 -1
  183. package/dist/core/store/Menus/context.js +4 -1
  184. package/dist/core/store/Menus/context.js.map +1 -1
  185. package/dist/core/store/Menus/reducer.d.ts +20 -0
  186. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  187. package/dist/core/store/Menus/reducer.js +21 -3
  188. package/dist/core/store/Menus/reducer.js.map +1 -1
  189. package/dist/core/utils/markerUtils.d.ts +10 -0
  190. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  191. package/dist/core/utils/markerUtils.js +9 -1
  192. package/dist/core/utils/markerUtils.js.map +1 -1
  193. package/dist/core/utils/memcache.d.ts.map +1 -1
  194. package/dist/core/utils/memcache.js +0 -7
  195. package/dist/core/utils/memcache.js.map +1 -1
  196. package/package.json +4 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/hooks/comments/comments.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 { useCoreHooks } from \"../provider\";\r\n\r\n/**\r\n * Convenience wrapper so components can import hooks directly from src/core/hooks/comments\r\n * Instead of calling useCoreHooks().comments first from src/core/hooks/provider.tsx\r\n */\r\n\r\nexport const useComments = () =>\r\n useCoreHooks().comment.useComments();\r\n\r\nexport const useComment = (id: number | null) =>\r\n useCoreHooks().comment.useComment(id);\r\n\r\nexport const useCommentsByAuthor = (authorId: number | null) =>\r\n useCoreHooks().comment.useCommentsByAuthor(authorId);\r\n\r\nexport const useCommentsByBuilding = (buildingId: number | null) =>\r\n useCoreHooks().comment.useCommentsByBuilding(buildingId);\r\n\r\nexport const useCreateComment = () =>\r\n useCoreHooks().comment.useCreateComment();"],"mappings":";AAKA,SAAS,oBAAoB;AAOtB,MAAM,cAAc,MACzB,aAAa,EAAE,QAAQ,YAAY;AAE9B,MAAM,aAAa,CAAC,OACzB,aAAa,EAAE,QAAQ,WAAW,EAAE;AAE/B,MAAM,sBAAsB,CAAC,aAClC,aAAa,EAAE,QAAQ,oBAAoB,QAAQ;AAE9C,MAAM,wBAAwB,CAAC,eACpC,aAAa,EAAE,QAAQ,sBAAsB,UAAU;AAElD,MAAM,mBAAmB,MAC9B,aAAa,EAAE,QAAQ,iBAAiB;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/hooks/comments/comments.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 { useCoreHooks } from \"../provider\";\r\n\r\n/**\r\n * Convenience wrapper so components can import hooks directly from src/core/hooks/comments\r\n * Instead of calling useCoreHooks().comments first from src/core/hooks/provider.tsx\r\n */\r\n\r\nexport const useComments = () =>\r\n useCoreHooks().comment.useComments();\r\n\r\nexport const useComment = (id: number | null) =>\r\n useCoreHooks().comment.useComment(id);\r\n\r\nexport const useCommentsByAuthor = (authorId: number | null) =>\r\n useCoreHooks().comment.useCommentsByAuthor(authorId);\r\n\r\nexport const useCommentsByBuilding = (buildingId: number | null) =>\r\n useCoreHooks().comment.useCommentsByBuilding(buildingId);\r\n\r\nexport const useCreateComment = () =>\r\n useCoreHooks().comment.useCreateComment();\r\n\r\nexport const useDeleteComments = () =>\r\n useCoreHooks().comment.useDeleteComments();"],"mappings":";AAKA,SAAS,oBAAoB;AAOtB,MAAM,cAAc,MACzB,aAAa,EAAE,QAAQ,YAAY;AAE9B,MAAM,aAAa,CAAC,OACzB,aAAa,EAAE,QAAQ,WAAW,EAAE;AAE/B,MAAM,sBAAsB,CAAC,aAClC,aAAa,EAAE,QAAQ,oBAAoB,QAAQ;AAE9C,MAAM,wBAAwB,CAAC,eACpC,aAAa,EAAE,QAAQ,sBAAsB,UAAU;AAElD,MAAM,mBAAmB,MAC9B,aAAa,EAAE,QAAQ,iBAAiB;AAEnC,MAAM,oBAAoB,MAC/B,aAAa,EAAE,QAAQ,kBAAkB;","names":[]}
@@ -36,5 +36,16 @@ export declare function createCommentHooks(adapter: ApiAdapter): {
36
36
  isLoading: boolean;
37
37
  isError: any;
38
38
  };
39
+ useDeleteComments: () => {
40
+ deleteComments: import("swr/mutation").TriggerWithOptionsArgs<{
41
+ ids: number[];
42
+ buildingIds: number[];
43
+ authorIds: number[];
44
+ }, any, [string], {
45
+ ids: number[];
46
+ }>;
47
+ isDeleting: boolean;
48
+ deleteError: any;
49
+ };
39
50
  };
40
51
  //# sourceMappingURL=createCommentHooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createCommentHooks.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/comments/createCommentHooks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU;;;;;;qBA6B1B,MAAM,GAAG,IAAI;;;;;;;;;;;;oCAgFE,MAAM,GAAG,IAAI;;;;;;;yBAnBA,OAAO,CAAC,OAAO,CAAC;;;;;;wCA1EzB,MAAM,GAAG,IAAI;;;;;EAkH3D"}
1
+ {"version":3,"file":"createCommentHooks.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/comments/createCommentHooks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU;;;;;;qBA6B1B,MAAM,GAAG,IAAI;;;;;;;;;;;;oCAkHE,MAAM,GAAG,IAAI;;;;;;;yBAnBA,OAAO,CAAC,OAAO,CAAC;;;;;;wCA5GzB,MAAM,GAAG,IAAI;;;;;;;;;;;iBA6EZ,MAAM,EAAE;;;;;EAwEvD"}
@@ -76,6 +76,34 @@ function createCommentHooks(adapter) {
76
76
  deleteError
77
77
  };
78
78
  };
79
+ const useDeleteComments = () => {
80
+ const { trigger: deleteComments, isMutating: isDeleting, error: deleteError } = useSWRMutation(
81
+ ["deleteComments"],
82
+ async (_key, { arg }) => {
83
+ const buildingIds = /* @__PURE__ */ new Set();
84
+ const authorIds = /* @__PURE__ */ new Set();
85
+ for (const cid of arg.ids) {
86
+ try {
87
+ const comment = await adapter.getComment(cid);
88
+ if (comment == null ? void 0 : comment.buildingId) buildingIds.add(comment.buildingId);
89
+ if (comment == null ? void 0 : comment.authorId) authorIds.add(comment.authorId);
90
+ } catch (e) {
91
+ }
92
+ await adapter.deleteComment(cid);
93
+ }
94
+ return { ids: arg.ids, buildingIds: [...buildingIds], authorIds: [...authorIds] };
95
+ },
96
+ {
97
+ onSuccess: ({ ids, buildingIds, authorIds }) => {
98
+ ids.forEach((cid) => mutate(["comment", cid], void 0, { revalidate: false }));
99
+ mutate(["comments"]);
100
+ buildingIds.forEach((bId) => mutate(["comments", "building", bId]));
101
+ authorIds.forEach((aId) => mutate(["commentsByAuthor", aId]));
102
+ }
103
+ }
104
+ );
105
+ return { deleteComments, isDeleting, deleteError };
106
+ };
79
107
  const useCreateComment = () => {
80
108
  const { trigger: createComment, isMutating, data: createdData, error } = useSWRMutation(
81
109
  ["createComment"],
@@ -112,7 +140,8 @@ function createCommentHooks(adapter) {
112
140
  useComment,
113
141
  useCommentsByAuthor,
114
142
  useCreateComment,
115
- useCommentsByBuilding
143
+ useCommentsByBuilding,
144
+ useDeleteComments
116
145
  };
117
146
  }
118
147
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/hooks/comments/createCommentHooks.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n//needs private instance to work\r\nimport useSWR, { mutate } from \"swr\";\r\nimport useSWRMutation from \"swr/mutation\";\r\n\r\nimport type { Comment } from '../../types/dbTypes'\r\nimport type { ApiAdapter } from \"../ports/apiAdapter\";\r\n\r\nexport function createCommentHooks(adapter: ApiAdapter) {\r\n //Call adapter methods inside hooks\r\n\r\n const useComments = () => {\r\n const key = [\"comments\"]; // no endpoint string\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getComments(),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n };\r\n };\r\n\r\n const useCommentsByBuilding = (buildingId: number | null) => {\r\n const key = buildingId ? [\"comments\", \"building\", buildingId] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getCommentsByBuilding(buildingId as number),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n }\r\n };\r\n\r\n const useComment = (id: number | null) => {\r\n const key = id ? [\"comment\", id] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment>(\r\n key,\r\n () => adapter.getComment(id as number),\r\n //{ refreshInterval: 1000 }\r\n );\r\n\r\n // SWR Mutation for updating a comment\r\n const { trigger: updateComment, isMutating, data: updatedData, error: updateError } = useSWRMutation(\r\n id ? [\"updateComment\", id] : null,\r\n async (_key, { arg }: { arg: Partial<Comment> }) =>\r\n adapter.updateComment(id as number, arg),\r\n {\r\n onSuccess: (updated) => {\r\n if (!id) return;\r\n // Revalidate the same keys used above\r\n mutate([\"comment\", id]);\r\n mutate([\"comments\"]);\r\n if (updated.buildingId) mutate([\"comments\", \"building\", updated.buildingId]);\r\n if (updated.authorId) mutate([\"commentsByAuthor\", updated.authorId]);\r\n if (data?.buildingId && data.buildingId !== updated.buildingId) mutate([\"comments\", \"building\", data.buildingId]);\r\n if (data?.authorId && data.authorId !== updated.authorId) mutate([\"commentsByAuthor\", data.authorId]);\r\n },\r\n }\r\n );\r\n\r\n const { trigger: deleteComment, isMutating: isDeleting, error: deleteError } = useSWRMutation(\r\n id ? [\"deleteComment\", id] as const : null,\r\n async () => {\r\n const comment = await adapter.getComment(id as number);\r\n await adapter.deleteComment(id as number);\r\n return comment; // onSuccess context\r\n },\r\n {\r\n onSuccess: (comment) => {\r\n mutate([\"comment\", comment.id], undefined, { revalidate: false });\r\n mutate([\"comments\"]);\r\n if (comment.buildingId) mutate([\"comments\", \"building\", comment.buildingId]);\r\n if (comment.authorId) mutate([\"commentsByAuthor\", comment.authorId]);\r\n },\r\n }\r\n );\r\n\r\n return {\r\n comment: data ?? null,\r\n isLoading,\r\n isError: error,\r\n updateComment,\r\n isMutating,\r\n updateError,\r\n updatedData,\r\n deleteComment,\r\n isDeleting,\r\n deleteError\r\n };\r\n };\r\n\r\n const useCreateComment = () => {\r\n const { trigger: createComment, isMutating, data: createdData, error } = useSWRMutation(\r\n [\"createComment\"],\r\n async (_key, { arg }: { arg: { commentData: Partial<Comment> } }) =>\r\n adapter.createComment(arg),\r\n {\r\n onSuccess: (created) => {\r\n mutate([\"comments\"]);\r\n if (created.buildingId) mutate([\"comments\", \"building\", created.buildingId]);\r\n if (created.authorId) mutate([\"commentsByAuthor\", created.authorId]);\r\n },\r\n }\r\n );\r\n\r\n return {\r\n createComment,\r\n isMutating,\r\n createError: error,\r\n createdData,\r\n };\r\n };\r\n\r\n const useCommentsByAuthor = (authorId: number | null) => {\r\n const key = authorId ? [\"commentsByAuthor\", authorId] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getCommentsByAuthor(authorId as number),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n };\r\n };\r\n\r\n // Return all hooks\r\n return {\r\n useComments,\r\n useComment,\r\n useCommentsByAuthor,\r\n useCreateComment,\r\n useCommentsByBuilding\r\n };\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/hooks/comments/createCommentHooks.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n//needs private instance to work\r\nimport useSWR, { mutate } from \"swr\";\r\nimport useSWRMutation from \"swr/mutation\";\r\n\r\nimport type { Comment } from '../../types/dbTypes'\r\nimport type { ApiAdapter } from \"../ports/apiAdapter\";\r\n\r\nexport function createCommentHooks(adapter: ApiAdapter) {\r\n //Call adapter methods inside hooks\r\n\r\n const useComments = () => {\r\n const key = [\"comments\"]; // no endpoint string\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getComments(),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n };\r\n };\r\n\r\n const useCommentsByBuilding = (buildingId: number | null) => {\r\n const key = buildingId ? [\"comments\", \"building\", buildingId] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getCommentsByBuilding(buildingId as number),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n }\r\n };\r\n\r\n const useComment = (id: number | null) => {\r\n const key = id ? [\"comment\", id] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment>(\r\n key,\r\n () => adapter.getComment(id as number),\r\n //{ refreshInterval: 1000 }\r\n );\r\n\r\n // SWR Mutation for updating a comment\r\n const { trigger: updateComment, isMutating, data: updatedData, error: updateError } = useSWRMutation(\r\n id ? [\"updateComment\", id] : null,\r\n async (_key, { arg }: { arg: Partial<Comment> }) =>\r\n adapter.updateComment(id as number, arg),\r\n {\r\n onSuccess: (updated) => {\r\n if (!id) return;\r\n // Revalidate the same keys used above\r\n mutate([\"comment\", id]);\r\n mutate([\"comments\"]);\r\n if (updated.buildingId) mutate([\"comments\", \"building\", updated.buildingId]);\r\n if (updated.authorId) mutate([\"commentsByAuthor\", updated.authorId]);\r\n if (data?.buildingId && data.buildingId !== updated.buildingId) mutate([\"comments\", \"building\", data.buildingId]);\r\n if (data?.authorId && data.authorId !== updated.authorId) mutate([\"commentsByAuthor\", data.authorId]);\r\n },\r\n }\r\n );\r\n\r\n const { trigger: deleteComment, isMutating: isDeleting, error: deleteError } = useSWRMutation(\r\n id ? [\"deleteComment\", id] as const : null,\r\n async () => {\r\n const comment = await adapter.getComment(id as number);\r\n await adapter.deleteComment(id as number);\r\n return comment; // onSuccess context\r\n },\r\n {\r\n onSuccess: (comment) => {\r\n mutate([\"comment\", comment.id], undefined, { revalidate: false });\r\n mutate([\"comments\"]);\r\n if (comment.buildingId) mutate([\"comments\", \"building\", comment.buildingId]);\r\n if (comment.authorId) mutate([\"commentsByAuthor\", comment.authorId]);\r\n },\r\n }\r\n );\r\n\r\n return {\r\n comment: data ?? null,\r\n isLoading,\r\n isError: error,\r\n updateComment,\r\n isMutating,\r\n updateError,\r\n updatedData,\r\n deleteComment,\r\n isDeleting,\r\n deleteError\r\n };\r\n };\r\n\r\n // Delete one or more comments in a single call. Used to cascade-delete a comment together\r\n // with its replies (the DB self-relation is onDelete: SetNull, so replies must be removed\r\n // explicitly rather than relying on the database to cascade).\r\n const useDeleteComments = () => {\r\n const { trigger: deleteComments, isMutating: isDeleting, error: deleteError } = useSWRMutation(\r\n [\"deleteComments\"],\r\n async (_key, { arg }: { arg: { ids: number[] } }) => {\r\n const buildingIds = new Set<number>();\r\n const authorIds = new Set<number>();\r\n for (const cid of arg.ids) {\r\n try {\r\n const comment = await adapter.getComment(cid);\r\n if (comment?.buildingId) buildingIds.add(comment.buildingId);\r\n if (comment?.authorId) authorIds.add(comment.authorId);\r\n }\r\n catch {\r\n // Comment may already be gone; deletion below is still safe to attempt.\r\n }\r\n await adapter.deleteComment(cid);\r\n }\r\n return { ids: arg.ids, buildingIds: [...buildingIds], authorIds: [...authorIds] };\r\n },\r\n {\r\n onSuccess: ({ ids, buildingIds, authorIds }) => {\r\n ids.forEach((cid) => mutate([\"comment\", cid], undefined, { revalidate: false }));\r\n mutate([\"comments\"]);\r\n buildingIds.forEach((bId) => mutate([\"comments\", \"building\", bId]));\r\n authorIds.forEach((aId) => mutate([\"commentsByAuthor\", aId]));\r\n },\r\n }\r\n );\r\n return { deleteComments, isDeleting, deleteError };\r\n };\r\n\r\n const useCreateComment = () => {\r\n const { trigger: createComment, isMutating, data: createdData, error } = useSWRMutation(\r\n [\"createComment\"],\r\n async (_key, { arg }: { arg: { commentData: Partial<Comment> } }) =>\r\n adapter.createComment(arg),\r\n {\r\n onSuccess: (created) => {\r\n mutate([\"comments\"]);\r\n if (created.buildingId) mutate([\"comments\", \"building\", created.buildingId]);\r\n if (created.authorId) mutate([\"commentsByAuthor\", created.authorId]);\r\n },\r\n }\r\n );\r\n\r\n return {\r\n createComment,\r\n isMutating,\r\n createError: error,\r\n createdData,\r\n };\r\n };\r\n\r\n const useCommentsByAuthor = (authorId: number | null) => {\r\n const key = authorId ? [\"commentsByAuthor\", authorId] as const : null;\r\n const { data, error, isLoading } = useSWR<Comment[]>(\r\n key,\r\n () => adapter.getCommentsByAuthor(authorId as number),\r\n );\r\n return {\r\n comments: data ?? [],\r\n isLoading,\r\n isError: error,\r\n };\r\n };\r\n\r\n // Return all hooks\r\n return {\r\n useComments,\r\n useComment,\r\n useCommentsByAuthor,\r\n useCreateComment,\r\n useCommentsByBuilding,\r\n useDeleteComments\r\n };\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/files/files.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;CAAuC,CAAC;AAE7D,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,IAAI;;;;;;;;CAAoC,CAAC;AAE9E,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,EAAE,MAAM,MAAM;;;;CACV,CAAC;AAE5D,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,MAAM,MAAM;;;;CACV,CAAC;AAEpD,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM;;;;;;;CACD,CAAC;AAE1D,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM;;;;;;;CACD,CAAC;AAElD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM;;;;;;;CACD,CAAC;AAElD,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,EAAE,SAAS,MAAM;;;;;CACX,CAAC;AAExD,wBAAgB,eAAe;yBAIK,GAAG,aAAa,MAAM;;;EAwFzD"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/files/files.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;CAAuC,CAAC;AAE7D,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,IAAI;;;;;;;;CAAoC,CAAC;AAE9E,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,EAAE,MAAM,MAAM;;;;CACV,CAAC;AAE5D,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,MAAM,MAAM;;;;CACV,CAAC;AAEpD,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM;;;;;;;CACD,CAAC;AAE1D,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM;;;;;;;CACD,CAAC;AAElD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM;;;;;;;CACD,CAAC;AAElD,eAAO,MAAM,aAAa,GAAI,aAAa,MAAM,EAAE,SAAS,MAAM;;;;;CACX,CAAC;AAExD,wBAAgB,eAAe;yBAIK,GAAG,aAAa,MAAM;;;EAsFzD"}
@@ -28,7 +28,6 @@ function useDownloadFile() {
28
28
  if (!downloadUrl) {
29
29
  throw new Error("No download URL available for this file");
30
30
  }
31
- console.log("Attempting to download from:", downloadUrl);
32
31
  const finalFileName = fileName || file.name || ((_c = file.originalFile) == null ? void 0 : _c.name) || ((_d = file.metadata) == null ? void 0 : _d.name) || "download";
33
32
  if (downloadUrl.startsWith("http")) {
34
33
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/hooks/files/files.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 { useCoreHooks } from \"../provider\";\r\n\r\n/**\r\n * Convenience wrapper so components can import hooks directly from src/core/hooks/files\r\n * Instead of calling useCoreHooks().file first from src/core/hooks/provider.tsx\r\n */\r\nexport const useFiles = () => useCoreHooks().file.useFiles();\r\n\r\nexport const useFile = (id: number | null) => useCoreHooks().file.useFile(id);\r\n\r\nexport const useFilesByBuildingId = (buildingId: number, tag?: string) =>\r\n useCoreHooks().file.useFilesByBuildingId(buildingId, tag);\r\n\r\nexport const useFilesBySiteId = (siteId: number, tag?: string) =>\r\n useCoreHooks().file.useFilesBySiteId(siteId, tag);\r\n\r\nexport const useUploadFileToBuilding = (buildingId: number) =>\r\n useCoreHooks().file.useUploadFileToBuilding(buildingId);\r\n\r\nexport const useUploadFileToSite = (siteId: number) =>\r\n useCoreHooks().file.useUploadFileToSite(siteId);\r\n\r\nexport const useUploadFileToUser = (userId: number) =>\r\n useCoreHooks().file.useUploadFileToUser(userId);\r\n\r\nexport const useDeleteFile = (buildingId?: number, siteId?: number) =>\r\n useCoreHooks().file.useDeleteFile(buildingId, siteId);\r\n\r\nexport function useDownloadFile() {\r\n const [isDownloading, setIsDownloading] = React.useState(false)\r\n const [downloadError, setDownloadError] = React.useState<Error | null>(null)\r\n\r\n const downloadFile = async (file: any, fileName?: string) => {\r\n setIsDownloading(true)\r\n setDownloadError(null)\r\n\r\n try {\r\n let downloadUrl: string | null = null\r\n\r\n if (file.originalFile?.url) {\r\n downloadUrl = file.originalFile.url\r\n }\r\n // If we have metadata with URL\r\n else if (file.metadata?.url) {\r\n downloadUrl = file.metadata.url\r\n }\r\n else if (file.url && file.url.startsWith('http')) {\r\n downloadUrl = file.url\r\n }\r\n\r\n if (!downloadUrl) {\r\n throw new Error('No download URL available for this file')\r\n }\r\n\r\n console.log('Attempting to download from:', downloadUrl)\r\n\r\n // Determine filename\r\n const finalFileName = fileName\r\n || file.name\r\n || file.originalFile?.name\r\n || file.metadata?.name\r\n || 'download'\r\n\r\n // For presigned URLs, download as blob\r\n if (downloadUrl.startsWith('http')) {\r\n try {\r\n const response = await fetch(downloadUrl, {\r\n method: 'GET',\r\n mode: 'cors',\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`Download failed: ${response.status} ${response.statusText}`)\r\n }\r\n\r\n const blob = await response.blob()\r\n\r\n if (blob.size === 0) {\r\n throw new Error('Downloaded file is empty')\r\n }\r\n\r\n // Create download link and trigger download\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = finalFileName\r\n link.style.display = 'none'\r\n document.body.append(link)\r\n link.click()\r\n\r\n // Cleanup with a small delay\r\n setTimeout(() => {\r\n link.remove()\r\n window.URL.revokeObjectURL(url)\r\n }, 100)\r\n }\r\n catch (fetchError) {\r\n console.error('Blob download failed, trying direct link:', fetchError)\r\n window.open(downloadUrl, '_blank')\r\n }\r\n }\r\n else {\r\n window.open(downloadUrl, '_blank')\r\n }\r\n }\r\n catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Download failed'\r\n setDownloadError(new Error(errorMessage))\r\n console.error('File download error:', error)\r\n }\r\n finally {\r\n setIsDownloading(false)\r\n }\r\n }\r\n\r\n return {\r\n downloadFile,\r\n isDownloading,\r\n downloadError,\r\n }\r\n}"],"mappings":";AAKA,YAAY,WAAW;AAEvB,SAAS,oBAAoB;AAMtB,MAAM,WAAW,MAAM,aAAa,EAAE,KAAK,SAAS;AAEpD,MAAM,UAAU,CAAC,OAAsB,aAAa,EAAE,KAAK,QAAQ,EAAE;AAErE,MAAM,uBAAuB,CAAC,YAAoB,QACvD,aAAa,EAAE,KAAK,qBAAqB,YAAY,GAAG;AAEnD,MAAM,mBAAmB,CAAC,QAAgB,QAC/C,aAAa,EAAE,KAAK,iBAAiB,QAAQ,GAAG;AAE3C,MAAM,0BAA0B,CAAC,eACtC,aAAa,EAAE,KAAK,wBAAwB,UAAU;AAEjD,MAAM,sBAAsB,CAAC,WAClC,aAAa,EAAE,KAAK,oBAAoB,MAAM;AAEzC,MAAM,sBAAsB,CAAC,WAClC,aAAa,EAAE,KAAK,oBAAoB,MAAM;AAEzC,MAAM,gBAAgB,CAAC,YAAqB,WACjD,aAAa,EAAE,KAAK,cAAc,YAAY,MAAM;AAE/C,SAAS,kBAAkB;AAChC,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAuB,IAAI;AAE3E,QAAM,eAAe,OAAO,MAAW,aAAsB;AAvC/D;AAwCI,qBAAiB,IAAI;AACrB,qBAAiB,IAAI;AAErB,QAAI;AACF,UAAI,cAA6B;AAEjC,WAAI,UAAK,iBAAL,mBAAmB,KAAK;AAC1B,sBAAc,KAAK,aAAa;AAAA,MAClC,YAES,UAAK,aAAL,mBAAe,KAAK;AAC3B,sBAAc,KAAK,SAAS;AAAA,MAC9B,WACS,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM,GAAG;AAChD,sBAAc,KAAK;AAAA,MACrB;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAEA,cAAQ,IAAI,gCAAgC,WAAW;AAGvD,YAAM,gBAAgB,YACjB,KAAK,UACL,UAAK,iBAAL,mBAAmB,WACnB,UAAK,aAAL,mBAAe,SACf;AAGL,UAAI,YAAY,WAAW,MAAM,GAAG;AAClC,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,aAAa;AAAA,YACxC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAM,IAAI,MAAM,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,UAC9E;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,cAAI,KAAK,SAAS,GAAG;AACnB,kBAAM,IAAI,MAAM,0BAA0B;AAAA,UAC5C;AAGA,gBAAM,MAAM,OAAO,IAAI,gBAAgB,IAAI;AAC3C,gBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,eAAK,OAAO;AACZ,eAAK,WAAW;AAChB,eAAK,MAAM,UAAU;AACrB,mBAAS,KAAK,OAAO,IAAI;AACzB,eAAK,MAAM;AAGX,qBAAW,MAAM;AACf,iBAAK,OAAO;AACZ,mBAAO,IAAI,gBAAgB,GAAG;AAAA,UAChC,GAAG,GAAG;AAAA,QACR,SACO,YAAY;AACjB,kBAAQ,MAAM,6CAA6C,UAAU;AACrE,iBAAO,KAAK,aAAa,QAAQ;AAAA,QACnC;AAAA,MACF,OACK;AACH,eAAO,KAAK,aAAa,QAAQ;AAAA,MACnC;AAAA,IACF,SACO,OAAO;AACZ,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,uBAAiB,IAAI,MAAM,YAAY,CAAC;AACxC,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C,UACA;AACE,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/hooks/files/files.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 { useCoreHooks } from \"../provider\";\r\n\r\n/**\r\n * Convenience wrapper so components can import hooks directly from src/core/hooks/files\r\n * Instead of calling useCoreHooks().file first from src/core/hooks/provider.tsx\r\n */\r\nexport const useFiles = () => useCoreHooks().file.useFiles();\r\n\r\nexport const useFile = (id: number | null) => useCoreHooks().file.useFile(id);\r\n\r\nexport const useFilesByBuildingId = (buildingId: number, tag?: string) =>\r\n useCoreHooks().file.useFilesByBuildingId(buildingId, tag);\r\n\r\nexport const useFilesBySiteId = (siteId: number, tag?: string) =>\r\n useCoreHooks().file.useFilesBySiteId(siteId, tag);\r\n\r\nexport const useUploadFileToBuilding = (buildingId: number) =>\r\n useCoreHooks().file.useUploadFileToBuilding(buildingId);\r\n\r\nexport const useUploadFileToSite = (siteId: number) =>\r\n useCoreHooks().file.useUploadFileToSite(siteId);\r\n\r\nexport const useUploadFileToUser = (userId: number) =>\r\n useCoreHooks().file.useUploadFileToUser(userId);\r\n\r\nexport const useDeleteFile = (buildingId?: number, siteId?: number) =>\r\n useCoreHooks().file.useDeleteFile(buildingId, siteId);\r\n\r\nexport function useDownloadFile() {\r\n const [isDownloading, setIsDownloading] = React.useState(false)\r\n const [downloadError, setDownloadError] = React.useState<Error | null>(null)\r\n\r\n const downloadFile = async (file: any, fileName?: string) => {\r\n setIsDownloading(true)\r\n setDownloadError(null)\r\n\r\n try {\r\n let downloadUrl: string | null = null\r\n\r\n if (file.originalFile?.url) {\r\n downloadUrl = file.originalFile.url\r\n }\r\n // If we have metadata with URL\r\n else if (file.metadata?.url) {\r\n downloadUrl = file.metadata.url\r\n }\r\n else if (file.url && file.url.startsWith('http')) {\r\n downloadUrl = file.url\r\n }\r\n\r\n if (!downloadUrl) {\r\n throw new Error('No download URL available for this file')\r\n }\r\n\r\n // Determine filename\r\n const finalFileName = fileName\r\n || file.name\r\n || file.originalFile?.name\r\n || file.metadata?.name\r\n || 'download'\r\n\r\n // For presigned URLs, download as blob\r\n if (downloadUrl.startsWith('http')) {\r\n try {\r\n const response = await fetch(downloadUrl, {\r\n method: 'GET',\r\n mode: 'cors',\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`Download failed: ${response.status} ${response.statusText}`)\r\n }\r\n\r\n const blob = await response.blob()\r\n\r\n if (blob.size === 0) {\r\n throw new Error('Downloaded file is empty')\r\n }\r\n\r\n // Create download link and trigger download\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = finalFileName\r\n link.style.display = 'none'\r\n document.body.append(link)\r\n link.click()\r\n\r\n // Cleanup with a small delay\r\n setTimeout(() => {\r\n link.remove()\r\n window.URL.revokeObjectURL(url)\r\n }, 100)\r\n }\r\n catch (fetchError) {\r\n console.error('Blob download failed, trying direct link:', fetchError)\r\n window.open(downloadUrl, '_blank')\r\n }\r\n }\r\n else {\r\n window.open(downloadUrl, '_blank')\r\n }\r\n }\r\n catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Download failed'\r\n setDownloadError(new Error(errorMessage))\r\n console.error('File download error:', error)\r\n }\r\n finally {\r\n setIsDownloading(false)\r\n }\r\n }\r\n\r\n return {\r\n downloadFile,\r\n isDownloading,\r\n downloadError,\r\n }\r\n}"],"mappings":";AAKA,YAAY,WAAW;AAEvB,SAAS,oBAAoB;AAMtB,MAAM,WAAW,MAAM,aAAa,EAAE,KAAK,SAAS;AAEpD,MAAM,UAAU,CAAC,OAAsB,aAAa,EAAE,KAAK,QAAQ,EAAE;AAErE,MAAM,uBAAuB,CAAC,YAAoB,QACvD,aAAa,EAAE,KAAK,qBAAqB,YAAY,GAAG;AAEnD,MAAM,mBAAmB,CAAC,QAAgB,QAC/C,aAAa,EAAE,KAAK,iBAAiB,QAAQ,GAAG;AAE3C,MAAM,0BAA0B,CAAC,eACtC,aAAa,EAAE,KAAK,wBAAwB,UAAU;AAEjD,MAAM,sBAAsB,CAAC,WAClC,aAAa,EAAE,KAAK,oBAAoB,MAAM;AAEzC,MAAM,sBAAsB,CAAC,WAClC,aAAa,EAAE,KAAK,oBAAoB,MAAM;AAEzC,MAAM,gBAAgB,CAAC,YAAqB,WACjD,aAAa,EAAE,KAAK,cAAc,YAAY,MAAM;AAE/C,SAAS,kBAAkB;AAChC,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAuB,IAAI;AAE3E,QAAM,eAAe,OAAO,MAAW,aAAsB;AAvC/D;AAwCI,qBAAiB,IAAI;AACrB,qBAAiB,IAAI;AAErB,QAAI;AACF,UAAI,cAA6B;AAEjC,WAAI,UAAK,iBAAL,mBAAmB,KAAK;AAC1B,sBAAc,KAAK,aAAa;AAAA,MAClC,YAES,UAAK,aAAL,mBAAe,KAAK;AAC3B,sBAAc,KAAK,SAAS;AAAA,MAC9B,WACS,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM,GAAG;AAChD,sBAAc,KAAK;AAAA,MACrB;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAGA,YAAM,gBAAgB,YACjB,KAAK,UACL,UAAK,iBAAL,mBAAmB,WACnB,UAAK,aAAL,mBAAe,SACf;AAGL,UAAI,YAAY,WAAW,MAAM,GAAG;AAClC,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,aAAa;AAAA,YACxC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAM,IAAI,MAAM,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,UAC9E;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,cAAI,KAAK,SAAS,GAAG;AACnB,kBAAM,IAAI,MAAM,0BAA0B;AAAA,UAC5C;AAGA,gBAAM,MAAM,OAAO,IAAI,gBAAgB,IAAI;AAC3C,gBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,eAAK,OAAO;AACZ,eAAK,WAAW;AAChB,eAAK,MAAM,UAAU;AACrB,mBAAS,KAAK,OAAO,IAAI;AACzB,eAAK,MAAM;AAGX,qBAAW,MAAM;AACf,iBAAK,OAAO;AACZ,mBAAO,IAAI,gBAAgB,GAAG;AAAA,UAChC,GAAG,GAAG;AAAA,QACR,SACO,YAAY;AACjB,kBAAQ,MAAM,6CAA6C,UAAU;AACrE,iBAAO,KAAK,aAAa,QAAQ;AAAA,QACnC;AAAA,MACF,OACK;AACH,eAAO,KAAK,aAAa,QAAQ;AAAA,MACnC;AAAA,IACF,SACO,OAAO;AACZ,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,uBAAiB,IAAI,MAAM,YAAY,CAAC;AACxC,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C,UACA;AACE,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+ /** Minimum sidebar width. Equal to the previous fixed width, so it never shrinks below the old default. */
3
+ export declare const MIN_SIDEBAR_WIDTH = 410;
4
+ /** Maximum sidebar width, roughly half a laptop viewport. */
5
+ export declare const MAX_SIDEBAR_WIDTH = 720;
6
+ export declare const DEFAULT_SIDEBAR_WIDTH = 410;
7
+ export declare const SIDEBAR_WIDTH_STORAGE_KEY = "cdt:sidebar-width";
8
+ /** Clamp to [MIN, MAX]. NaN falls back to the default; ±Infinity clamps to the bounds. */
9
+ export declare function clampSidebarWidth(width: number): number;
10
+ /** SSR-safe read of the persisted width, clamped; falls back to the default on missing/corrupt values. */
11
+ export declare function readStoredSidebarWidth(): number;
12
+ /** SSR-safe persist of a clamped width. Swallows storage errors (private mode, quota). */
13
+ export declare function writeStoredSidebarWidth(width: number): void;
14
+ export interface ResizableSidebarWidth {
15
+ /** Current width in px. Only meaningful when `canResize` is true; mobile stays full-width via CSS. */
16
+ width: number;
17
+ /** True while a drag is in progress (for cursor / no-select styling). */
18
+ isResizing: boolean;
19
+ /** True on desktop only. Mobile is full-width and not resizable. */
20
+ canResize: boolean;
21
+ /** Attach to the drag handle's onPointerDown. */
22
+ startResize: (e: React.PointerEvent) => void;
23
+ }
24
+ /**
25
+ * Drives a user-resizable sidebar width on desktop. Width is restored from and persisted to
26
+ * localStorage, clamped to [MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH]. On mobile (`useIsMobile`)
27
+ * resizing is disabled and the sidebar is expected to render full-width via CSS.
28
+ */
29
+ export declare function useResizableSidebarWidth(): ResizableSidebarWidth;
30
+ //# sourceMappingURL=useResizableSidebarWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizableSidebarWidth.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/ui/useResizableSidebarWidth.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,2GAA2G;AAC3G,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,eAAO,MAAM,qBAAqB,MAAoB,CAAA;AACtD,eAAO,MAAM,yBAAyB,sBAAsB,CAAA;AAE5D,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,0GAA0G;AAC1G,wBAAgB,sBAAsB,IAAI,MAAM,CAW/C;AAED,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAO3D;AAED,MAAM,WAAW,qBAAqB;IACpC,sGAAsG;IACtG,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAA;IACnB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAA;IAClB,iDAAiD;IACjD,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAA;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,CA0ChE"}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { useIsMobile } from "./use-mobile";
4
+ const MIN_SIDEBAR_WIDTH = 410;
5
+ const MAX_SIDEBAR_WIDTH = 720;
6
+ const DEFAULT_SIDEBAR_WIDTH = MIN_SIDEBAR_WIDTH;
7
+ const SIDEBAR_WIDTH_STORAGE_KEY = "cdt:sidebar-width";
8
+ function clampSidebarWidth(width) {
9
+ if (Number.isNaN(width)) return DEFAULT_SIDEBAR_WIDTH;
10
+ return Math.min(MAX_SIDEBAR_WIDTH, Math.max(MIN_SIDEBAR_WIDTH, width));
11
+ }
12
+ function readStoredSidebarWidth() {
13
+ if (typeof window === "undefined") return DEFAULT_SIDEBAR_WIDTH;
14
+ try {
15
+ const raw = window.localStorage.getItem(SIDEBAR_WIDTH_STORAGE_KEY);
16
+ if (raw === null) return DEFAULT_SIDEBAR_WIDTH;
17
+ const parsed = Number.parseFloat(raw);
18
+ if (!Number.isFinite(parsed)) return DEFAULT_SIDEBAR_WIDTH;
19
+ return clampSidebarWidth(parsed);
20
+ } catch (e) {
21
+ return DEFAULT_SIDEBAR_WIDTH;
22
+ }
23
+ }
24
+ function writeStoredSidebarWidth(width) {
25
+ if (typeof window === "undefined") return;
26
+ try {
27
+ window.localStorage.setItem(SIDEBAR_WIDTH_STORAGE_KEY, String(clampSidebarWidth(width)));
28
+ } catch (e) {
29
+ }
30
+ }
31
+ function useResizableSidebarWidth() {
32
+ const isMobile = useIsMobile();
33
+ const canResize = !isMobile;
34
+ const [width, setWidth] = React.useState(DEFAULT_SIDEBAR_WIDTH);
35
+ const [isResizing, setIsResizing] = React.useState(false);
36
+ React.useEffect(() => {
37
+ setWidth(readStoredSidebarWidth());
38
+ }, []);
39
+ const startResize = React.useCallback(
40
+ (e) => {
41
+ if (!canResize) return;
42
+ e.preventDefault();
43
+ setIsResizing(true);
44
+ const startX = e.clientX;
45
+ const startWidth = width;
46
+ const onMove = (ev) => {
47
+ setWidth(clampSidebarWidth(startWidth + (ev.clientX - startX)));
48
+ };
49
+ const onUp = () => {
50
+ setIsResizing(false);
51
+ window.removeEventListener("pointermove", onMove);
52
+ window.removeEventListener("pointerup", onUp);
53
+ setWidth((current) => {
54
+ writeStoredSidebarWidth(current);
55
+ return current;
56
+ });
57
+ };
58
+ window.addEventListener("pointermove", onMove);
59
+ window.addEventListener("pointerup", onUp);
60
+ },
61
+ [canResize, width]
62
+ );
63
+ return { width, isResizing, canResize, startResize };
64
+ }
65
+ export {
66
+ DEFAULT_SIDEBAR_WIDTH,
67
+ MAX_SIDEBAR_WIDTH,
68
+ MIN_SIDEBAR_WIDTH,
69
+ SIDEBAR_WIDTH_STORAGE_KEY,
70
+ clampSidebarWidth,
71
+ readStoredSidebarWidth,
72
+ useResizableSidebarWidth,
73
+ writeStoredSidebarWidth
74
+ };
75
+ //# sourceMappingURL=useResizableSidebarWidth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/core/hooks/ui/useResizableSidebarWidth.tsx"],"sourcesContent":["'use client'\n\n// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2025 Collab Digital Twins\n\nimport * as React from 'react'\n\nimport { useIsMobile } from './use-mobile'\n\n/** Minimum sidebar width. Equal to the previous fixed width, so it never shrinks below the old default. */\nexport const MIN_SIDEBAR_WIDTH = 410\n/** Maximum sidebar width, roughly half a laptop viewport. */\nexport const MAX_SIDEBAR_WIDTH = 720\nexport const DEFAULT_SIDEBAR_WIDTH = MIN_SIDEBAR_WIDTH\nexport const SIDEBAR_WIDTH_STORAGE_KEY = 'cdt:sidebar-width'\n\n/** Clamp to [MIN, MAX]. NaN falls back to the default; ±Infinity clamps to the bounds. */\nexport function clampSidebarWidth(width: number): number {\n if (Number.isNaN(width)) return DEFAULT_SIDEBAR_WIDTH\n return Math.min(MAX_SIDEBAR_WIDTH, Math.max(MIN_SIDEBAR_WIDTH, width))\n}\n\n/** SSR-safe read of the persisted width, clamped; falls back to the default on missing/corrupt values. */\nexport function readStoredSidebarWidth(): number {\n if (typeof window === 'undefined') return DEFAULT_SIDEBAR_WIDTH\n try {\n const raw = window.localStorage.getItem(SIDEBAR_WIDTH_STORAGE_KEY)\n if (raw === null) return DEFAULT_SIDEBAR_WIDTH\n const parsed = Number.parseFloat(raw)\n if (!Number.isFinite(parsed)) return DEFAULT_SIDEBAR_WIDTH\n return clampSidebarWidth(parsed)\n } catch {\n return DEFAULT_SIDEBAR_WIDTH\n }\n}\n\n/** SSR-safe persist of a clamped width. Swallows storage errors (private mode, quota). */\nexport function writeStoredSidebarWidth(width: number): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(SIDEBAR_WIDTH_STORAGE_KEY, String(clampSidebarWidth(width)))\n } catch {\n // ignore: storage may be unavailable (private mode / quota)\n }\n}\n\nexport interface ResizableSidebarWidth {\n /** Current width in px. Only meaningful when `canResize` is true; mobile stays full-width via CSS. */\n width: number\n /** True while a drag is in progress (for cursor / no-select styling). */\n isResizing: boolean\n /** True on desktop only. Mobile is full-width and not resizable. */\n canResize: boolean\n /** Attach to the drag handle's onPointerDown. */\n startResize: (e: React.PointerEvent) => void\n}\n\n/**\n * Drives a user-resizable sidebar width on desktop. Width is restored from and persisted to\n * localStorage, clamped to [MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH]. On mobile (`useIsMobile`)\n * resizing is disabled and the sidebar is expected to render full-width via CSS.\n */\nexport function useResizableSidebarWidth(): ResizableSidebarWidth {\n const isMobile = useIsMobile()\n const canResize = !isMobile\n\n const [width, setWidth] = React.useState<number>(DEFAULT_SIDEBAR_WIDTH)\n const [isResizing, setIsResizing] = React.useState(false)\n\n // Hydrate from storage after mount (avoids SSR/client mismatch on first paint).\n React.useEffect(() => {\n setWidth(readStoredSidebarWidth())\n }, [])\n\n const startResize = React.useCallback(\n (e: React.PointerEvent) => {\n if (!canResize) return\n e.preventDefault()\n setIsResizing(true)\n\n const startX = e.clientX\n const startWidth = width\n\n const onMove = (ev: PointerEvent) => {\n setWidth(clampSidebarWidth(startWidth + (ev.clientX - startX)))\n }\n const onUp = () => {\n setIsResizing(false)\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n // Persist the final width; read the latest via the functional updater.\n setWidth(current => {\n writeStoredSidebarWidth(current)\n return current\n })\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n },\n [canResize, width]\n )\n\n return { width, isResizing, canResize, startResize }\n}\n"],"mappings":";AAKA,YAAY,WAAW;AAEvB,SAAS,mBAAmB;AAGrB,MAAM,oBAAoB;AAE1B,MAAM,oBAAoB;AAC1B,MAAM,wBAAwB;AAC9B,MAAM,4BAA4B;AAGlC,SAAS,kBAAkB,OAAuB;AACvD,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,mBAAmB,KAAK,IAAI,mBAAmB,KAAK,CAAC;AACvE;AAGO,SAAS,yBAAiC;AAC/C,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,yBAAyB;AACjE,QAAI,QAAQ,KAAM,QAAO;AACzB,UAAM,SAAS,OAAO,WAAW,GAAG;AACpC,QAAI,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO;AACrC,WAAO,kBAAkB,MAAM;AAAA,EACjC,SAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,wBAAwB,OAAqB;AAC3D,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,WAAO,aAAa,QAAQ,2BAA2B,OAAO,kBAAkB,KAAK,CAAC,CAAC;AAAA,EACzF,SAAQ;AAAA,EAER;AACF;AAkBO,SAAS,2BAAkD;AAChE,QAAM,WAAW,YAAY;AAC7B,QAAM,YAAY,CAAC;AAEnB,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,qBAAqB;AACtE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAGxD,QAAM,UAAU,MAAM;AACpB,aAAS,uBAAuB,CAAC;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM;AAAA,IACxB,CAAC,MAA0B;AACzB,UAAI,CAAC,UAAW;AAChB,QAAE,eAAe;AACjB,oBAAc,IAAI;AAElB,YAAM,SAAS,EAAE;AACjB,YAAM,aAAa;AAEnB,YAAM,SAAS,CAAC,OAAqB;AACnC,iBAAS,kBAAkB,cAAc,GAAG,UAAU,OAAO,CAAC;AAAA,MAChE;AACA,YAAM,OAAO,MAAM;AACjB,sBAAc,KAAK;AACnB,eAAO,oBAAoB,eAAe,MAAM;AAChD,eAAO,oBAAoB,aAAa,IAAI;AAE5C,iBAAS,aAAW;AAClB,kCAAwB,OAAO;AAC/B,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA,aAAO,iBAAiB,eAAe,MAAM;AAC7C,aAAO,iBAAiB,aAAa,IAAI;AAAA,IAC3C;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AAEA,SAAO,EAAE,OAAO,YAAY,WAAW,YAAY;AACrD;","names":[]}
@@ -239,6 +239,7 @@
239
239
  "label": "Write a comment",
240
240
  "placeholder": "Enter your comment here...",
241
241
  "close": "Close",
242
+ "clickPlusHint": "Click the + to place your comment",
242
243
  "placeHelpTextMap": "Double click anywhere on the map to add comment",
243
244
  "placeHelpTextBim": "Double click anywhere on the model to add comment"
244
245
  },
@@ -261,6 +262,7 @@
261
262
  "attachments": "Attachments",
262
263
  "addAttachment": "Add attachment",
263
264
  "writeReply": "Write a reply...",
265
+ "doubleClickZoom": "Double click to zoom to comment",
264
266
  "position": "Position",
265
267
  "lastUpdated": "Last updated"
266
268
  },
@@ -1175,6 +1177,9 @@
1175
1177
  "toastSuccessUpdate": "Site updated successfully",
1176
1178
  "toastErrorUpdate": "Failed to update Site"
1177
1179
  },
1180
+ "InfoSidebar": {
1181
+ "resizeHandleLabel": "Resize sidebar"
1182
+ },
1178
1183
  "TabSelector": {
1179
1184
  "fileLabel": "File",
1180
1185
  "layersTitle": "Layers",
@@ -239,6 +239,7 @@
239
239
  "label": "Escribir un comentario",
240
240
  "placeholder": "Ingrese su comentario aquí...",
241
241
  "close": "Cerrar",
242
+ "clickPlusHint": "Haga clic en + para colocar su comentario",
242
243
  "placeHelpTextMap": "Haga doble clic en cualquier lugar del mapa para añadir un comentario",
243
244
  "placeHelpTextBim": "Haga doble clic en cualquier lugar del modelo para añadir un comentario"
244
245
  },
@@ -261,6 +262,7 @@
261
262
  "attachments": "Adjuntos",
262
263
  "addAttachment": "Añadir adjunto",
263
264
  "writeReply": "Escribir una respuesta...",
265
+ "doubleClickZoom": "Doble clic para acercar al comentario",
264
266
  "position": "Posición",
265
267
  "lastUpdated": "Última actualización"
266
268
  },
@@ -1174,6 +1176,9 @@
1174
1176
  "toastSuccessUpdate": "Sitio actualizado con éxito",
1175
1177
  "toastErrorUpdate": "Error al actualizar el sitio"
1176
1178
  },
1179
+ "InfoSidebar": {
1180
+ "resizeHandleLabel": "Redimensionar la barra lateral"
1181
+ },
1177
1182
  "TabSelector": {
1178
1183
  "fileLabel": "Archivo",
1179
1184
  "layersTitle": "Capas",
@@ -1867,4 +1872,4 @@
1867
1872
  "uploadError": "Error al subir el archivo:",
1868
1873
  "unknownError": "Ocurrió un error desconocido"
1869
1874
  }
1870
- }
1875
+ }
@@ -239,6 +239,7 @@
239
239
  "label": "Écrire un commentaire",
240
240
  "placeholder": "Saisissez votre commentaire ici...",
241
241
  "close": "Fermer",
242
+ "clickPlusHint": "Cliquez sur + pour placer votre commentaire",
242
243
  "placeHelpTextMap": "Double-cliquez n’importe où sur la carte pour ajouter un commentaire",
243
244
  "placeHelpTextBim": "Double-cliquez sur le modèle pour ajouter un commentaire"
244
245
  },
@@ -261,6 +262,7 @@
261
262
  "attachments": "Pièces jointes",
262
263
  "addAttachment": "Ajouter une pièce jointe",
263
264
  "writeReply": "Écrire une réponse...",
265
+ "doubleClickZoom": "Double-cliquez pour zoomer sur le commentaire",
264
266
  "position": "Position",
265
267
  "lastUpdated": "Dernière mise à jour"
266
268
  },
@@ -1174,6 +1176,9 @@
1174
1176
  "toastSuccessUpdate": "Site mis à jour avec succès",
1175
1177
  "toastErrorUpdate": "Échec de la mise à jour du site"
1176
1178
  },
1179
+ "InfoSidebar": {
1180
+ "resizeHandleLabel": "Redimensionner la barre latérale"
1181
+ },
1177
1182
  "TabSelector": {
1178
1183
  "fileLabel": "Fichier",
1179
1184
  "layersTitle": "Couches",
@@ -1867,4 +1872,4 @@
1867
1872
  "uploadError": "Erreur lors du téléversement du fichier :",
1868
1873
  "unknownError": "Erreur inconnue s'est produite"
1869
1874
  }
1870
- }
1875
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Datasets/reducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,aAAa,EAAE,OAAO,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAA;AAEvC,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAChD,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IAE9C,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACvD,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAEzD,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAE5D,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAA;IAC7B,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;IAC9B,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAE9D,CAAC,eAAe,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAG,CAAA;IAElE,CAAC,oBAAoB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAC,CAAA;IAC7E,CAAC,oBAAoB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,CAAC,iBAAiB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAE,CAAA;IAExF,CAAC,kBAAkB,CAAC,EAAE;QAAE,iBAAiB,EAAE,OAAO,EAAE,CAAA;KAAE,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,cAAc,GACtB,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAE9D,eAAO,MAAM,cAAc,GAAI,OAAO,YAAY,EAAE,QAAQ,cAAc,iBAoLzE,CAAA"}
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Datasets/reducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,aAAa,EAAE,OAAO,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAA;AAEvC,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAChD,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IAE9C,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACvD,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAEzD,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAE5D,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAA;IAC7B,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;IAC9B,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAE9D,CAAC,eAAe,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAG,CAAA;IAElE,CAAC,oBAAoB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAC,CAAA;IAC7E,CAAC,oBAAoB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,CAAC,iBAAiB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,WAAW,CAAA;KAAE,CAAA;IAExF,CAAC,kBAAkB,CAAC,EAAE;QAAE,iBAAiB,EAAE,OAAO,EAAE,CAAA;KAAE,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,cAAc,GACtB,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAE9D,eAAO,MAAM,cAAc,GAAI,OAAO,YAAY,EAAE,QAAQ,cAAc,iBAmLzE,CAAA"}
@@ -139,7 +139,6 @@ const DatasetReducer = (state, action) => {
139
139
  });
140
140
  case "SET_FIELD_COLOR":
141
141
  const { datasetName: dName, fieldName: fName, layerColor: lColor } = action.payload;
142
- console.log("SETTING FIELD COLOR IN REDUCER FOR DATASET:", dName, "FIELD:", fName, "TO COLOR:", lColor);
143
142
  return __spreadProps(__spreadValues({}, state), {
144
143
  addedDatasets: state.addedDatasets.map((dataset2) => {
145
144
  if (dataset2.name === dName) {
@@ -163,7 +162,6 @@ const DatasetReducer = (state, action) => {
163
162
  addedDatasets: reorderedDatasets
164
163
  });
165
164
  default:
166
- console.log("THIS FILE ACTION HASN'T BEEN IMPLEMENTED YET.");
167
165
  return state;
168
166
  }
169
167
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/Datasets/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset, DatasetField, LayerColors } from '../../types/datasetTypes'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\ninterface DatasetsType {\r\n dataset: Dataset | null\r\n datasetId: string | null\r\n datasets: Dataset[]\r\n addedDatasets: Dataset[]\r\n orgRefreshNonce: number\r\n}\r\n\r\nexport type DatasetState = DatasetsType\r\n\r\nexport type DatasetPayload = {\r\n ['SET_DATASETS']: Pick<DatasetState, 'datasets'>\r\n ['ADD_DATASET']: Pick<DatasetState, 'dataset'>\r\n\r\n ['HIDE_DATASET_BY_ID']: Pick<DatasetState, 'datasetId'>\r\n ['UNHIDE_DATASET_BY_ID']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['ADD_DATASET_TO_MAP']: Pick<DatasetState, 'dataset'>\r\n ['REMOVE_DATASET_FROM_MAP']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['REMOVE_ALL_DATASETS']: void\r\n ['REFRESH_ORG_DATASETS']: void\r\n ['TOGGLE_DATASET_VISIBILITY']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['DATASET_COLOR']: { datasetId: string, layerColor: LayerColors }\r\n\r\n ['SET_DATASET_FIELDS']: { datasetName: string, datasetFields: DatasetField[]}\r\n ['SET_SELECTED_FIELD']: { datasetName: string, fieldName: string }\r\n ['SET_FIELD_COLOR']: { datasetName: string, fieldName: string, layerColor: LayerColors }\r\n\r\n ['REORDER_DATASETS']: { reorderedDatasets: Dataset[] }\r\n}\r\n\r\nexport type DatasetActions\r\n = ActionMap<DatasetPayload>[keyof ActionMap<DatasetPayload>]\r\n\r\nexport const DatasetReducer = (state: DatasetState, action: DatasetActions) => {\r\n switch (action.type) {\r\n // system or map or bim viewer file action\r\n case 'SET_DATASETS':\r\n const { datasets } = action.payload\r\n return {\r\n ...state,\r\n datasets: datasets,\r\n }\r\n case 'ADD_DATASET':\r\n const { dataset } = action.payload\r\n return {\r\n ...state,\r\n datasets: [...state.datasets, dataset],\r\n }\r\n case 'HIDE_DATASET_BY_ID':\r\n const { datasetId: datasetIdToHide } = action.payload\r\n return {\r\n ...state,\r\n datasets: state.datasets.map((dataset) => {\r\n return dataset.id == datasetIdToHide\r\n ? {\r\n ...dataset,\r\n visible: false,\r\n }\r\n : dataset\r\n }),\r\n }\r\n case 'UNHIDE_DATASET_BY_ID':\r\n const { datasetId: datasetIdToShow } = action.payload\r\n return {\r\n ...state,\r\n datasets: state.datasets.map((dataset) => {\r\n return dataset.id == datasetIdToShow\r\n ? {\r\n ...dataset,\r\n visible: true,\r\n }\r\n : dataset\r\n }),\r\n }\r\n\r\n case 'ADD_DATASET_TO_MAP':\r\n const { dataset: datasetToAdd } = action.payload\r\n const datasetAlreadyAdded = state.addedDatasets.some(\r\n d => d?.name === datasetToAdd.name,\r\n )\r\n\r\n const addedDatasets = datasetAlreadyAdded\r\n ? state.addedDatasets\r\n : (() => {\r\n const maxOrder = state.addedDatasets.reduce<number>((max, current) => {\r\n const order = current.order ?? -1\r\n return order > max ? order : max\r\n }, -1)\r\n\r\n const nextOrder = maxOrder + 1\r\n\r\n return [...state.addedDatasets, { ...datasetToAdd, order: nextOrder }]\r\n })()\r\n return {\r\n ...state,\r\n dataset: datasetToAdd,\r\n addedDatasets,\r\n }\r\n case 'REMOVE_DATASET_FROM_MAP':\r\n const datasetIdToRemove = action.payload.datasetId\r\n const remaining = state.addedDatasets.filter(dataset => dataset.id !== datasetIdToRemove)\r\n const sorted = remaining.sort((a, b) => (b.order ?? 0) - (a.order ?? 0))\r\n const maxOrder = sorted.length - 1\r\n const updatedAddedDatasets = sorted.map((dataset, index) => ({\r\n ...dataset,\r\n order: maxOrder - index\r\n }))\r\n return {\r\n ...state,\r\n addedDatasets: updatedAddedDatasets,\r\n }\r\n case 'REMOVE_ALL_DATASETS':\r\n return {\r\n ...state,\r\n addedDatasets: [],\r\n }\r\n case 'REFRESH_ORG_DATASETS':\r\n return {\r\n ...state,\r\n orgRefreshNonce: (state.orgRefreshNonce ?? 0) + 1,\r\n }\r\n case 'TOGGLE_DATASET_VISIBILITY': {\r\n const datasetId = action.payload.datasetId\r\n const updatedDatasets = state.addedDatasets.map((dataset) => {\r\n if (dataset.id === datasetId) {\r\n return { ...dataset, visible: dataset.visible === false ? true : false }\r\n }\r\n return dataset\r\n })\r\n return {\r\n ...state,\r\n addedDatasets: updatedDatasets,\r\n }\r\n }\r\n\r\n case 'DATASET_COLOR':\r\n const { datasetId, layerColor } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map((dataset) => {\r\n if (dataset.id === datasetId) {\r\n return {\r\n ...dataset,\r\n layerColor,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n\r\n case 'SET_DATASET_FIELDS':\r\n const { datasetName, datasetFields } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === datasetName) {\r\n return {\r\n ...dataset,\r\n fields: datasetFields,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n case 'SET_SELECTED_FIELD':\r\n const { datasetName: dsName, fieldName } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === dsName) {\r\n return {\r\n ...dataset,\r\n selectedFieldName: fieldName,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n case 'SET_FIELD_COLOR':\r\n const { datasetName: dName, fieldName: fName, layerColor: lColor } = action.payload\r\n console.log('SETTING FIELD COLOR IN REDUCER FOR DATASET:', dName, 'FIELD:', fName, 'TO COLOR:', lColor)\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === dName) {\r\n return {\r\n ...dataset,\r\n fields: dataset.fields.map(field => {\r\n if (field.name === fName) {\r\n return {\r\n ...field,\r\n layerColor: lColor,\r\n }\r\n }\r\n return field\r\n }),\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n\r\n case 'REORDER_DATASETS':\r\n const { reorderedDatasets } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: reorderedDatasets,\r\n }\r\n\r\n default:\r\n console.log('THIS FILE ACTION HASN\\'T BEEN IMPLEMENTED YET.')\r\n return state\r\n }\r\n}\r\n"],"mappings":"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","names":["dataset","maxOrder","_a","datasetId"]}
1
+ {"version":3,"sources":["../../../../src/core/store/Datasets/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { Dataset, DatasetField, LayerColors } from '../../types/datasetTypes'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\ninterface DatasetsType {\r\n dataset: Dataset | null\r\n datasetId: string | null\r\n datasets: Dataset[]\r\n addedDatasets: Dataset[]\r\n orgRefreshNonce: number\r\n}\r\n\r\nexport type DatasetState = DatasetsType\r\n\r\nexport type DatasetPayload = {\r\n ['SET_DATASETS']: Pick<DatasetState, 'datasets'>\r\n ['ADD_DATASET']: Pick<DatasetState, 'dataset'>\r\n\r\n ['HIDE_DATASET_BY_ID']: Pick<DatasetState, 'datasetId'>\r\n ['UNHIDE_DATASET_BY_ID']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['ADD_DATASET_TO_MAP']: Pick<DatasetState, 'dataset'>\r\n ['REMOVE_DATASET_FROM_MAP']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['REMOVE_ALL_DATASETS']: void\r\n ['REFRESH_ORG_DATASETS']: void\r\n ['TOGGLE_DATASET_VISIBILITY']: Pick<DatasetState, 'datasetId'>\r\n\r\n ['DATASET_COLOR']: { datasetId: string, layerColor: LayerColors }\r\n\r\n ['SET_DATASET_FIELDS']: { datasetName: string, datasetFields: DatasetField[]}\r\n ['SET_SELECTED_FIELD']: { datasetName: string, fieldName: string }\r\n ['SET_FIELD_COLOR']: { datasetName: string, fieldName: string, layerColor: LayerColors }\r\n\r\n ['REORDER_DATASETS']: { reorderedDatasets: Dataset[] }\r\n}\r\n\r\nexport type DatasetActions\r\n = ActionMap<DatasetPayload>[keyof ActionMap<DatasetPayload>]\r\n\r\nexport const DatasetReducer = (state: DatasetState, action: DatasetActions) => {\r\n switch (action.type) {\r\n // system or map or bim viewer file action\r\n case 'SET_DATASETS':\r\n const { datasets } = action.payload\r\n return {\r\n ...state,\r\n datasets: datasets,\r\n }\r\n case 'ADD_DATASET':\r\n const { dataset } = action.payload\r\n return {\r\n ...state,\r\n datasets: [...state.datasets, dataset],\r\n }\r\n case 'HIDE_DATASET_BY_ID':\r\n const { datasetId: datasetIdToHide } = action.payload\r\n return {\r\n ...state,\r\n datasets: state.datasets.map((dataset) => {\r\n return dataset.id == datasetIdToHide\r\n ? {\r\n ...dataset,\r\n visible: false,\r\n }\r\n : dataset\r\n }),\r\n }\r\n case 'UNHIDE_DATASET_BY_ID':\r\n const { datasetId: datasetIdToShow } = action.payload\r\n return {\r\n ...state,\r\n datasets: state.datasets.map((dataset) => {\r\n return dataset.id == datasetIdToShow\r\n ? {\r\n ...dataset,\r\n visible: true,\r\n }\r\n : dataset\r\n }),\r\n }\r\n\r\n case 'ADD_DATASET_TO_MAP':\r\n const { dataset: datasetToAdd } = action.payload\r\n const datasetAlreadyAdded = state.addedDatasets.some(\r\n d => d?.name === datasetToAdd.name,\r\n )\r\n\r\n const addedDatasets = datasetAlreadyAdded\r\n ? state.addedDatasets\r\n : (() => {\r\n const maxOrder = state.addedDatasets.reduce<number>((max, current) => {\r\n const order = current.order ?? -1\r\n return order > max ? order : max\r\n }, -1)\r\n\r\n const nextOrder = maxOrder + 1\r\n\r\n return [...state.addedDatasets, { ...datasetToAdd, order: nextOrder }]\r\n })()\r\n return {\r\n ...state,\r\n dataset: datasetToAdd,\r\n addedDatasets,\r\n }\r\n case 'REMOVE_DATASET_FROM_MAP':\r\n const datasetIdToRemove = action.payload.datasetId\r\n const remaining = state.addedDatasets.filter(dataset => dataset.id !== datasetIdToRemove)\r\n const sorted = remaining.sort((a, b) => (b.order ?? 0) - (a.order ?? 0))\r\n const maxOrder = sorted.length - 1\r\n const updatedAddedDatasets = sorted.map((dataset, index) => ({\r\n ...dataset,\r\n order: maxOrder - index\r\n }))\r\n return {\r\n ...state,\r\n addedDatasets: updatedAddedDatasets,\r\n }\r\n case 'REMOVE_ALL_DATASETS':\r\n return {\r\n ...state,\r\n addedDatasets: [],\r\n }\r\n case 'REFRESH_ORG_DATASETS':\r\n return {\r\n ...state,\r\n orgRefreshNonce: (state.orgRefreshNonce ?? 0) + 1,\r\n }\r\n case 'TOGGLE_DATASET_VISIBILITY': {\r\n const datasetId = action.payload.datasetId\r\n const updatedDatasets = state.addedDatasets.map((dataset) => {\r\n if (dataset.id === datasetId) {\r\n return { ...dataset, visible: dataset.visible === false ? true : false }\r\n }\r\n return dataset\r\n })\r\n return {\r\n ...state,\r\n addedDatasets: updatedDatasets,\r\n }\r\n }\r\n\r\n case 'DATASET_COLOR':\r\n const { datasetId, layerColor } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map((dataset) => {\r\n if (dataset.id === datasetId) {\r\n return {\r\n ...dataset,\r\n layerColor,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n\r\n case 'SET_DATASET_FIELDS':\r\n const { datasetName, datasetFields } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === datasetName) {\r\n return {\r\n ...dataset,\r\n fields: datasetFields,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n case 'SET_SELECTED_FIELD':\r\n const { datasetName: dsName, fieldName } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === dsName) {\r\n return {\r\n ...dataset,\r\n selectedFieldName: fieldName,\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n case 'SET_FIELD_COLOR':\r\n const { datasetName: dName, fieldName: fName, layerColor: lColor } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: state.addedDatasets.map(dataset => {\r\n if (dataset.name === dName) {\r\n return {\r\n ...dataset,\r\n fields: dataset.fields.map(field => {\r\n if (field.name === fName) {\r\n return {\r\n ...field,\r\n layerColor: lColor,\r\n }\r\n }\r\n return field\r\n }),\r\n }\r\n }\r\n return dataset\r\n }),\r\n }\r\n\r\n case 'REORDER_DATASETS':\r\n const { reorderedDatasets } = action.payload\r\n return {\r\n ...state,\r\n addedDatasets: reorderedDatasets,\r\n }\r\n\r\n default:\r\n // ⚠️ Unhandled dataset action type is silently ignored (was logged as \"not implemented yet\")\r\n return state\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA0CO,MAAM,iBAAiB,CAAC,OAAqB,WAA2B;AA1C/E;AA2CE,UAAQ,OAAO,MAAM;AAAA;AAAA,IAEnB,KAAK;AACH,YAAM,EAAE,SAAS,IAAI,OAAO;AAC5B,aAAO,iCACF,QADE;AAAA,QAEL;AAAA,MACF;AAAA,IACF,KAAK;AACH,YAAM,EAAE,QAAQ,IAAI,OAAO;AAC3B,aAAO,iCACF,QADE;AAAA,QAEL,UAAU,CAAC,GAAG,MAAM,UAAU,OAAO;AAAA,MACvC;AAAA,IACF,KAAK;AACH,YAAM,EAAE,WAAW,gBAAgB,IAAI,OAAO;AAC9C,aAAO,iCACF,QADE;AAAA,QAEL,UAAU,MAAM,SAAS,IAAI,CAACA,aAAY;AACxC,iBAAOA,SAAQ,MAAM,kBACjB,iCACKA,WADL;AAAA,YAEE,SAAS;AAAA,UACX,KACAA;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,YAAM,EAAE,WAAW,gBAAgB,IAAI,OAAO;AAC9C,aAAO,iCACF,QADE;AAAA,QAEL,UAAU,MAAM,SAAS,IAAI,CAACA,aAAY;AACxC,iBAAOA,SAAQ,MAAM,kBACjB,iCACKA,WADL;AAAA,YAEE,SAAS;AAAA,UACX,KACAA;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IAEF,KAAK;AACH,YAAM,EAAE,SAAS,aAAa,IAAI,OAAO;AACzC,YAAM,sBAAsB,MAAM,cAAc;AAAA,QAC9C,QAAK,uBAAG,UAAS,aAAa;AAAA,MAChC;AAEA,YAAM,gBAAgB,sBAClB,MAAM,iBACL,MAAM;AACL,cAAMC,YAAW,MAAM,cAAc,OAAe,CAAC,KAAK,YAAY;AA7FlF,cAAAC;AA8Fc,gBAAM,SAAQA,MAAA,QAAQ,UAAR,OAAAA,MAAiB;AAC/B,iBAAO,QAAQ,MAAM,QAAQ;AAAA,QAC/B,GAAG,EAAE;AAEL,cAAM,YAAYD,YAAW;AAE7B,eAAO,CAAC,GAAG,MAAM,eAAe,iCAAK,eAAL,EAAmB,OAAO,UAAU,EAAC;AAAA,MACvE,GAAG;AACP,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF,KAAK;AACH,YAAM,oBAAoB,OAAO,QAAQ;AACzC,YAAM,YAAY,MAAM,cAAc,OAAO,CAAAD,aAAWA,SAAQ,OAAO,iBAAiB;AACxF,YAAM,SAAS,UAAU,KAAK,CAAC,GAAG,MAAG;AA9G3C,YAAAE,KAAA;AA8G+C,iBAAAA,MAAA,EAAE,UAAF,OAAAA,MAAW,OAAM,OAAE,UAAF,YAAW;AAAA,OAAE;AACvE,YAAM,WAAW,OAAO,SAAS;AACjC,YAAM,uBAAuB,OAAO,IAAI,CAACF,UAAS,UAAW,iCACxDA,WADwD;AAAA,QAE3D,OAAO,WAAW;AAAA,MACpB,EAAE;AACF,aAAO,iCACF,QADE;AAAA,QAEL,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO,iCACF,QADE;AAAA,QAEL,eAAe,CAAC;AAAA,MAClB;AAAA,IACF,KAAK;AACH,aAAO,iCACF,QADE;AAAA,QAEL,mBAAkB,WAAM,oBAAN,YAAyB,KAAK;AAAA,MAClD;AAAA,IACF,KAAK,6BAA6B;AAChC,YAAMG,aAAY,OAAO,QAAQ;AACjC,YAAM,kBAAkB,MAAM,cAAc,IAAI,CAACH,aAAY;AAC3D,YAAIA,SAAQ,OAAOG,YAAW;AAC5B,iBAAO,iCAAKH,WAAL,EAAc,SAASA,SAAQ,YAAY,QAAQ,OAAO,MAAM;AAAA,QACzE;AACA,eAAOA;AAAA,MACT,CAAC;AACD,aAAO,iCACF,QADE;AAAA,QAEL,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,IAEE,KAAK;AACH,YAAM,EAAE,WAAW,WAAW,IAAI,OAAO;AACzC,aAAO,iCACF,QADE;AAAA,QAEL,eAAe,MAAM,cAAc,IAAI,CAACA,aAAY;AAClD,cAAIA,SAAQ,OAAO,WAAW;AAC5B,mBAAO,iCACFA,WADE;AAAA,cAEL;AAAA,YACF;AAAA,UACF;AACA,iBAAOA;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IAEJ,KAAK;AACH,YAAM,EAAE,aAAa,cAAc,IAAI,OAAO;AAC9C,aAAO,iCACF,QADE;AAAA,QAEL,eAAe,MAAM,cAAc,IAAI,CAAAA,aAAW;AAChD,cAAIA,SAAQ,SAAS,aAAa;AAChC,mBAAO,iCACFA,WADE;AAAA,cAEL,QAAQ;AAAA,YACV;AAAA,UACF;AACA,iBAAOA;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,YAAM,EAAE,aAAa,QAAQ,UAAU,IAAI,OAAO;AAClD,aAAO,iCACF,QADE;AAAA,QAEL,eAAe,MAAM,cAAc,IAAI,CAAAA,aAAW;AAChD,cAAIA,SAAQ,SAAS,QAAQ;AAC3B,mBAAO,iCACFA,WADE;AAAA,cAEL,mBAAmB;AAAA,YACrB;AAAA,UACF;AACA,iBAAOA;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,YAAM,EAAE,aAAa,OAAO,WAAW,OAAO,YAAY,OAAO,IAAI,OAAO;AAC5E,aAAO,iCACF,QADE;AAAA,QAEL,eAAe,MAAM,cAAc,IAAI,CAAAA,aAAW;AAChD,cAAIA,SAAQ,SAAS,OAAO;AAC1B,mBAAO,iCACFA,WADE;AAAA,cAEL,QAAQA,SAAQ,OAAO,IAAI,WAAS;AAClC,oBAAI,MAAM,SAAS,OAAO;AACxB,yBAAO,iCACF,QADE;AAAA,oBAEL,YAAY;AAAA,kBACd;AAAA,gBACF;AACA,uBAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AACA,iBAAOA;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IAEF,KAAK;AACH,YAAM,EAAE,kBAAkB,IAAI,OAAO;AACrC,aAAO,iCACF,QADE;AAAA,QAEL,eAAe;AAAA,MACjB;AAAA,IAEF;AAEE,aAAO;AAAA,EACX;AACF;","names":["dataset","maxOrder","_a","datasetId"]}
@@ -92,7 +92,6 @@ const FilesReducer = (state, action) => {
92
92
  )
93
93
  });
94
94
  default:
95
- console.log("THIS FILE ACTION HASN'T BEEN IMPLEMENTED YET.");
96
95
  return state;
97
96
  }
98
97
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/Files/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { FileType } from '../../types/files'\r\n\r\nimport type { DbFile } from '../../types/dbTypes'\r\nimport type { FileAction } from '../../types/global'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\ninterface FilesTypes {\r\n files: DbFile[]\r\n currentFile: DbFile | null\r\n mapFileIds: number[]\r\n isMapFileManagerOpen: boolean\r\n actionMode: FileAction | null\r\n editingFile: DbFile | null\r\n}\r\n\r\nexport type FilesState = FilesTypes\r\n\r\nexport type FilesPayload = {\r\n // system/map/model file action\r\n ['SET_FILES']: { files: DbFile[] }\r\n ['ADD_FILE']: { file: DbFile }\r\n ['ADD_FILES']: { files: DbFile[] }\r\n ['REMOVE_FILE']: { id: number }\r\n ['REMOVE_ALL_FILE']: { id: number }\r\n ['SET_CURRENT_FILE']: { currentFile: DbFile | null }\r\n ['SE_CURRENT_FILE']: { currentFile: DbFile | null }\r\n\r\n // map visibility — which files are currently shown on the map\r\n ['ADD_TO_MAP']: { id: number }\r\n ['REMOVE_FROM_MAP']: { id: number }\r\n ['ADD_ALL_TO_MAP']: { ids: number[] }\r\n ['REMOVE_ALL_FROM_MAP']: void\r\n\r\n // kept for legacy callers outside the map viewer\r\n ['HIDE_FILE_BY_ID']: { id: number }\r\n ['UNHIDE_FILE_BY_ID']: { id: number }\r\n ['TOGGLE_FILE_BY_ID']: { id: number }\r\n\r\n // file manager\r\n ['HIDE_MAP_FILE_MANAGER']: void\r\n ['SHOW_MAP_FILE_MANAGER']: void\r\n\r\n // map specific action (legacy)\r\n ['HIDE_ALL_MAP_FILES']: void\r\n ['UNHIDE_ALL_MAP_FILES']: void\r\n\r\n // model specific action\r\n ['HIDE_ALL_MODEL_FILES']: void\r\n ['UNHIDE_ALL_MODEL_FILES']: void\r\n\r\n ['SET_ACTION_MODE']: { actionMode: FileAction | null }\r\n ['EDIT_FILE']: { file: DbFile | null }\r\n ['UPDATE_FILE_COORDS']: { id: number; lat: number; lng: number; elevation?: number; rotation?: number; type?: string }\r\n}\r\n\r\nexport type FilesActions\r\n = ActionMap<FilesPayload>[keyof ActionMap<FilesPayload>]\r\n\r\nexport const FilesReducer = (state: FilesState, action: FilesActions) => {\r\n switch (action.type) {\r\n case 'SET_FILES': {\r\n // Also prune mapFileIds for any file that no longer exists (e.g. deleted via API)\r\n const incomingIds = new Set(action.payload.files.map(f => f.id))\r\n return {\r\n ...state,\r\n files: action.payload.files,\r\n mapFileIds: state.mapFileIds.filter(id => incomingIds.has(id)),\r\n }\r\n }\r\n\r\n case 'ADD_FILE':\r\n return { ...state, files: [...state.files, action.payload.file] }\r\n\r\n case 'ADD_FILES':\r\n return { ...state, files: [...state.files, ...action.payload.files] }\r\n\r\n case 'SET_CURRENT_FILE':\r\n case 'SE_CURRENT_FILE':\r\n return { ...state, currentFile: action.payload.currentFile }\r\n\r\n case 'REMOVE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.filter(f => f.id !== action.payload.id),\r\n currentFile: state.currentFile?.id === action.payload.id ? null : state.currentFile,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n // ── Map visibility ────────────────────────────────────────────────────────\r\n case 'ADD_TO_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.includes(action.payload.id)\r\n ? state.mapFileIds\r\n : [...state.mapFileIds, action.payload.id],\r\n }\r\n\r\n case 'REMOVE_FROM_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n case 'ADD_ALL_TO_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: [...new Set([...state.mapFileIds, ...action.payload.ids])],\r\n }\r\n\r\n case 'REMOVE_ALL_FROM_MAP':\r\n return { ...state, mapFileIds: [] }\r\n\r\n // ── Legacy visibility (kept for non-map callers) ──────────────────────────\r\n case 'HIDE_FILE_BY_ID':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n case 'UNHIDE_FILE_BY_ID':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.includes(action.payload.id)\r\n ? state.mapFileIds\r\n : [...state.mapFileIds, action.payload.id],\r\n }\r\n\r\n case 'HIDE_ALL_MAP_FILES':\r\n return { ...state, mapFileIds: [] }\r\n\r\n case 'UNHIDE_ALL_MAP_FILES':\r\n return {\r\n ...state,\r\n mapFileIds: [...new Set([\r\n ...state.mapFileIds,\r\n ...state.files.filter(f => f.type === 'map-file').map(f => f.id),\r\n ])],\r\n }\r\n\r\n // ── File manager ──────────────────────────────────────────────────────────\r\n case 'HIDE_MAP_FILE_MANAGER':\r\n return { ...state, isMapFileManagerOpen: false }\r\n\r\n case 'SHOW_MAP_FILE_MANAGER':\r\n return { ...state, isMapFileManagerOpen: true }\r\n\r\n case 'SET_ACTION_MODE':\r\n return { ...state, actionMode: action.payload.actionMode }\r\n\r\n case 'EDIT_FILE':\r\n return { ...state, editingFile: action.payload.file }\r\n\r\n case 'UPDATE_FILE_COORDS':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.id\r\n ? {\r\n ...f,\r\n lat: action.payload.lat,\r\n lng: action.payload.lng,\r\n ...(action.payload.elevation !== undefined && { elevation: action.payload.elevation }),\r\n ...(action.payload.rotation !== undefined && { rotation: action.payload.rotation }),\r\n ...(action.payload.type !== undefined && { type: action.payload.type }),\r\n }\r\n : f\r\n ),\r\n }\r\n\r\n default:\r\n console.log('THIS FILE ACTION HASN\\'T BEEN IMPLEMENTED YET.')\r\n return state\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/Files/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { FileType } from '../../types/files'\r\n\r\nimport type { DbFile } from '../../types/dbTypes'\r\nimport type { FileAction } from '../../types/global'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\ninterface FilesTypes {\r\n files: DbFile[]\r\n currentFile: DbFile | null\r\n mapFileIds: number[]\r\n isMapFileManagerOpen: boolean\r\n actionMode: FileAction | null\r\n editingFile: DbFile | null\r\n}\r\n\r\nexport type FilesState = FilesTypes\r\n\r\nexport type FilesPayload = {\r\n // system/map/model file action\r\n ['SET_FILES']: { files: DbFile[] }\r\n ['ADD_FILE']: { file: DbFile }\r\n ['ADD_FILES']: { files: DbFile[] }\r\n ['REMOVE_FILE']: { id: number }\r\n ['REMOVE_ALL_FILE']: { id: number }\r\n ['SET_CURRENT_FILE']: { currentFile: DbFile | null }\r\n ['SE_CURRENT_FILE']: { currentFile: DbFile | null }\r\n\r\n // map visibility — which files are currently shown on the map\r\n ['ADD_TO_MAP']: { id: number }\r\n ['REMOVE_FROM_MAP']: { id: number }\r\n ['ADD_ALL_TO_MAP']: { ids: number[] }\r\n ['REMOVE_ALL_FROM_MAP']: void\r\n\r\n // kept for legacy callers outside the map viewer\r\n ['HIDE_FILE_BY_ID']: { id: number }\r\n ['UNHIDE_FILE_BY_ID']: { id: number }\r\n ['TOGGLE_FILE_BY_ID']: { id: number }\r\n\r\n // file manager\r\n ['HIDE_MAP_FILE_MANAGER']: void\r\n ['SHOW_MAP_FILE_MANAGER']: void\r\n\r\n // map specific action (legacy)\r\n ['HIDE_ALL_MAP_FILES']: void\r\n ['UNHIDE_ALL_MAP_FILES']: void\r\n\r\n // model specific action\r\n ['HIDE_ALL_MODEL_FILES']: void\r\n ['UNHIDE_ALL_MODEL_FILES']: void\r\n\r\n ['SET_ACTION_MODE']: { actionMode: FileAction | null }\r\n ['EDIT_FILE']: { file: DbFile | null }\r\n ['UPDATE_FILE_COORDS']: { id: number; lat: number; lng: number; elevation?: number; rotation?: number; type?: string }\r\n}\r\n\r\nexport type FilesActions\r\n = ActionMap<FilesPayload>[keyof ActionMap<FilesPayload>]\r\n\r\nexport const FilesReducer = (state: FilesState, action: FilesActions) => {\r\n switch (action.type) {\r\n case 'SET_FILES': {\r\n // Also prune mapFileIds for any file that no longer exists (e.g. deleted via API)\r\n const incomingIds = new Set(action.payload.files.map(f => f.id))\r\n return {\r\n ...state,\r\n files: action.payload.files,\r\n mapFileIds: state.mapFileIds.filter(id => incomingIds.has(id)),\r\n }\r\n }\r\n\r\n case 'ADD_FILE':\r\n return { ...state, files: [...state.files, action.payload.file] }\r\n\r\n case 'ADD_FILES':\r\n return { ...state, files: [...state.files, ...action.payload.files] }\r\n\r\n case 'SET_CURRENT_FILE':\r\n case 'SE_CURRENT_FILE':\r\n return { ...state, currentFile: action.payload.currentFile }\r\n\r\n case 'REMOVE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.filter(f => f.id !== action.payload.id),\r\n currentFile: state.currentFile?.id === action.payload.id ? null : state.currentFile,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n // ── Map visibility ────────────────────────────────────────────────────────\r\n case 'ADD_TO_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.includes(action.payload.id)\r\n ? state.mapFileIds\r\n : [...state.mapFileIds, action.payload.id],\r\n }\r\n\r\n case 'REMOVE_FROM_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n case 'ADD_ALL_TO_MAP':\r\n return {\r\n ...state,\r\n mapFileIds: [...new Set([...state.mapFileIds, ...action.payload.ids])],\r\n }\r\n\r\n case 'REMOVE_ALL_FROM_MAP':\r\n return { ...state, mapFileIds: [] }\r\n\r\n // ── Legacy visibility (kept for non-map callers) ──────────────────────────\r\n case 'HIDE_FILE_BY_ID':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.filter(id => id !== action.payload.id),\r\n }\r\n\r\n case 'UNHIDE_FILE_BY_ID':\r\n return {\r\n ...state,\r\n mapFileIds: state.mapFileIds.includes(action.payload.id)\r\n ? state.mapFileIds\r\n : [...state.mapFileIds, action.payload.id],\r\n }\r\n\r\n case 'HIDE_ALL_MAP_FILES':\r\n return { ...state, mapFileIds: [] }\r\n\r\n case 'UNHIDE_ALL_MAP_FILES':\r\n return {\r\n ...state,\r\n mapFileIds: [...new Set([\r\n ...state.mapFileIds,\r\n ...state.files.filter(f => f.type === 'map-file').map(f => f.id),\r\n ])],\r\n }\r\n\r\n // ── File manager ──────────────────────────────────────────────────────────\r\n case 'HIDE_MAP_FILE_MANAGER':\r\n return { ...state, isMapFileManagerOpen: false }\r\n\r\n case 'SHOW_MAP_FILE_MANAGER':\r\n return { ...state, isMapFileManagerOpen: true }\r\n\r\n case 'SET_ACTION_MODE':\r\n return { ...state, actionMode: action.payload.actionMode }\r\n\r\n case 'EDIT_FILE':\r\n return { ...state, editingFile: action.payload.file }\r\n\r\n case 'UPDATE_FILE_COORDS':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.id\r\n ? {\r\n ...f,\r\n lat: action.payload.lat,\r\n lng: action.payload.lng,\r\n ...(action.payload.elevation !== undefined && { elevation: action.payload.elevation }),\r\n ...(action.payload.rotation !== undefined && { rotation: action.payload.rotation }),\r\n ...(action.payload.type !== undefined && { type: action.payload.type }),\r\n }\r\n : f\r\n ),\r\n }\r\n\r\n default:\r\n // ⚠️ Unhandled file action type is silently ignored (was logged as \"not implemented yet\")\r\n return state\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Menus/context.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Menus/context.tsx"],"names":[],"mappings":"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"}
@@ -18,6 +18,9 @@ const getInitialState = (pathname) => {
18
18
  selectedTab: "file",
19
19
  commentsVisibleInViewer: [],
20
20
  currentCommentId: null,
21
+ focusedCommentId: null,
22
+ focusRequestId: 0,
23
+ pendingCommentAction: null,
21
24
  sensorsVisibleInViewer: [],
22
25
  visibleSensorTypes: {},
23
26
  visibleSensorTags: {},
@@ -30,7 +33,7 @@ const reducer = ({ menus }, action) => ({
30
33
  menus: MenusReducer(menus, action)
31
34
  });
32
35
  const MenusContext = React.createContext({
33
- state: { menus: { currentViewer: ViewerNames.map, rowsPerPage: 10, selectedTab: "file", commentsVisibleInViewer: [], currentCommentId: null, sensorsVisibleInViewer: [], visibleSensorTypes: {}, visibleSensorTags: {}, currentSensorId: null, currentSensorTypeId: null } },
36
+ state: { menus: { currentViewer: ViewerNames.map, rowsPerPage: 10, selectedTab: "file", commentsVisibleInViewer: [], currentCommentId: null, focusedCommentId: null, focusRequestId: 0, pendingCommentAction: null, sensorsVisibleInViewer: [], visibleSensorTypes: {}, visibleSensorTags: {}, currentSensorId: null, currentSensorTypeId: null } },
34
37
  dispatch: () => null,
35
38
  isSidebarOpen: false,
36
39
  setIsSidebarOpen: () => null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/Menus/context.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 { usePathname } from 'next/navigation'\r\nimport * as React from \"react\";\r\n\r\nimport { ViewerNames } from '../../types/dbTypes'\r\n\r\nimport { MenusReducer } from './reducer'\r\n\r\nimport type { MenusActions, MenusState } from './reducer';\r\nimport type { Building, Site, User, Infrastructure } from '../../types/dbTypes'\r\nimport type { FileRow } from '../../types/files'\r\n\r\ntype InitialStateType = {\r\n menus: MenusState\r\n}\r\n\r\n// Function to determine if path is an auth page\r\nconst isAuthPath = (pathname?: string): boolean => {\r\n if (!pathname) return false\r\n return pathname.includes('/auth/')\r\n}\r\n\r\n// Get initial state based on current path\r\nconst getInitialState = (pathname?: string): InitialStateType => {\r\n const isAuth = isAuthPath(pathname)\r\n return {\r\n menus: {\r\n currentViewer: isAuth ? ViewerNames.auth : ViewerNames.map,\r\n rowsPerPage: 10, // Default rows per page\r\n selectedTab: 'file',\r\n commentsVisibleInViewer: [],\r\n currentCommentId: null,\r\n sensorsVisibleInViewer: [],\r\n visibleSensorTypes: {},\r\n visibleSensorTags: {},\r\n currentSensorId: null,\r\n currentSensorTypeId: null,\r\n },\r\n }\r\n}\r\n\r\nconst reducer = ({ menus }: InitialStateType, action: MenusActions) => ({\r\n menus: MenusReducer(menus, action),\r\n})\r\n\r\nexport const MenusContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<MenusActions>\r\n isSidebarOpen: boolean\r\n setIsSidebarOpen: React.Dispatch<React.SetStateAction<boolean>>\r\n view: 'table' | 'detail'\r\n setView: React.Dispatch<React.SetStateAction<'table' | 'detail'>>\r\n selectedItem: Building | null\r\n setSelectedItem: React.Dispatch<React.SetStateAction<Building | null>>\r\n selectedSite: Site | null\r\n setSelectedSite: React.Dispatch<React.SetStateAction<Site | null>>\r\n selectedInfrastructure: Infrastructure | null\r\n setSelectedInfrastructure: React.Dispatch<React.SetStateAction<Infrastructure | null>>\r\n selectedFile: FileRow | null\r\n setSelectedFile: React.Dispatch<React.SetStateAction<FileRow | null>>\r\n selectedUser: Partial<User> | null\r\n setSelectedUser: React.Dispatch<React.SetStateAction<Partial<User> | null>>\r\n isDatasetMenuOpen: boolean\r\n setIsDatasetMenuOpen: React.Dispatch<React.SetStateAction<boolean>>\r\n isAuthPage?: boolean\r\n}>({\r\n state: { menus: { currentViewer: ViewerNames.map, rowsPerPage: 10, selectedTab: 'file', commentsVisibleInViewer: [], currentCommentId: null, sensorsVisibleInViewer: [], visibleSensorTypes: {}, visibleSensorTags: {}, currentSensorId: null, currentSensorTypeId: null } },\r\n dispatch: () => null,\r\n isSidebarOpen: false,\r\n setIsSidebarOpen: () => null,\r\n view: 'table',\r\n setView: () => null,\r\n selectedItem: null,\r\n setSelectedItem: () => null,\r\n selectedSite: null,\r\n setSelectedSite: () => null,\r\n selectedInfrastructure: null,\r\n setSelectedInfrastructure: () => null,\r\n selectedFile: null,\r\n setSelectedFile: () => null,\r\n selectedUser: null,\r\n setSelectedUser: () => null,\r\n isDatasetMenuOpen: false,\r\n setIsDatasetMenuOpen: () => null,\r\n isAuthPage: true,\r\n})\r\n\r\nexport const MenusProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const pathname = usePathname()\r\n const [state, dispatch] = React.useReducer(reducer, getInitialState(pathname))\r\n\r\n const [isSidebarOpen, setIsSidebarOpen] = React.useState(false)\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedItem, setSelectedItem] = React.useState<Building | null>(null)\r\n const [selectedSite, setSelectedSite] = React.useState<Site | null>(null)\r\n const [selectedInfrastructure, setSelectedInfrastructure] = React.useState<Infrastructure | null>(null)\r\n const [selectedFile, setSelectedFile] = React.useState<FileRow | null>(null)\r\n const [selectedUser, setSelectedUser] = React.useState<Partial<User> | null>(null)\r\n const [isDatasetMenuOpen, setIsDatasetMenuOpen] = React.useState(false)\r\n // Check if current path is an authentication page\r\n const isAuthPage = isAuthPath(pathname)\r\n\r\n // Update state if pathname changes and auth state changes\r\n React.useEffect(() => {\r\n if (isAuthPage && state.menus.currentViewer !== ViewerNames.auth) {\r\n dispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.auth },\r\n })\r\n setIsSidebarOpen(false)\r\n }\r\n else if (!isAuthPage && state.menus.currentViewer === ViewerNames.auth) {\r\n dispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n }\r\n }, [pathname, isAuthPage, state.menus.currentViewer])\r\n\r\n const value = React.useMemo(() => ({\r\n state,\r\n dispatch,\r\n isSidebarOpen,\r\n setIsSidebarOpen,\r\n view,\r\n setView,\r\n selectedItem,\r\n setSelectedItem,\r\n selectedSite,\r\n setSelectedSite,\r\n selectedInfrastructure,\r\n setSelectedInfrastructure,\r\n selectedFile,\r\n setSelectedFile,\r\n selectedUser,\r\n setSelectedUser,\r\n isDatasetMenuOpen,\r\n setIsDatasetMenuOpen,\r\n }), [\r\n state, isSidebarOpen, view, selectedItem, selectedSite,\r\n selectedInfrastructure, selectedFile, selectedUser, isDatasetMenuOpen,\r\n ])\r\n\r\n return (\r\n <MenusContext.Provider value={value}>\r\n { children }\r\n </MenusContext.Provider>\r\n )\r\n}\r\n\r\nexport const useMenusContext = () => React.useContext(MenusContext)\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/Menus/context.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 { usePathname } from 'next/navigation'\r\nimport * as React from \"react\";\r\n\r\nimport { ViewerNames } from '../../types/dbTypes'\r\n\r\nimport { MenusReducer } from './reducer'\r\n\r\nimport type { MenusActions, MenusState } from './reducer';\r\nimport type { Building, Site, User, Infrastructure } from '../../types/dbTypes'\r\nimport type { FileRow } from '../../types/files'\r\n\r\ntype InitialStateType = {\r\n menus: MenusState\r\n}\r\n\r\n// Function to determine if path is an auth page\r\nconst isAuthPath = (pathname?: string): boolean => {\r\n if (!pathname) return false\r\n return pathname.includes('/auth/')\r\n}\r\n\r\n// Get initial state based on current path\r\nconst getInitialState = (pathname?: string): InitialStateType => {\r\n const isAuth = isAuthPath(pathname)\r\n return {\r\n menus: {\r\n currentViewer: isAuth ? ViewerNames.auth : ViewerNames.map,\r\n rowsPerPage: 10, // Default rows per page\r\n selectedTab: 'file',\r\n commentsVisibleInViewer: [],\r\n currentCommentId: null,\r\n focusedCommentId: null,\r\n focusRequestId: 0,\r\n pendingCommentAction: null,\r\n sensorsVisibleInViewer: [],\r\n visibleSensorTypes: {},\r\n visibleSensorTags: {},\r\n currentSensorId: null,\r\n currentSensorTypeId: null,\r\n },\r\n }\r\n}\r\n\r\nconst reducer = ({ menus }: InitialStateType, action: MenusActions) => ({\r\n menus: MenusReducer(menus, action),\r\n})\r\n\r\nexport const MenusContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<MenusActions>\r\n isSidebarOpen: boolean\r\n setIsSidebarOpen: React.Dispatch<React.SetStateAction<boolean>>\r\n view: 'table' | 'detail'\r\n setView: React.Dispatch<React.SetStateAction<'table' | 'detail'>>\r\n selectedItem: Building | null\r\n setSelectedItem: React.Dispatch<React.SetStateAction<Building | null>>\r\n selectedSite: Site | null\r\n setSelectedSite: React.Dispatch<React.SetStateAction<Site | null>>\r\n selectedInfrastructure: Infrastructure | null\r\n setSelectedInfrastructure: React.Dispatch<React.SetStateAction<Infrastructure | null>>\r\n selectedFile: FileRow | null\r\n setSelectedFile: React.Dispatch<React.SetStateAction<FileRow | null>>\r\n selectedUser: Partial<User> | null\r\n setSelectedUser: React.Dispatch<React.SetStateAction<Partial<User> | null>>\r\n isDatasetMenuOpen: boolean\r\n setIsDatasetMenuOpen: React.Dispatch<React.SetStateAction<boolean>>\r\n isAuthPage?: boolean\r\n}>({\r\n state: { menus: { currentViewer: ViewerNames.map, rowsPerPage: 10, selectedTab: 'file', commentsVisibleInViewer: [], currentCommentId: null, focusedCommentId: null, focusRequestId: 0, pendingCommentAction: null, sensorsVisibleInViewer: [], visibleSensorTypes: {}, visibleSensorTags: {}, currentSensorId: null, currentSensorTypeId: null } },\r\n dispatch: () => null,\r\n isSidebarOpen: false,\r\n setIsSidebarOpen: () => null,\r\n view: 'table',\r\n setView: () => null,\r\n selectedItem: null,\r\n setSelectedItem: () => null,\r\n selectedSite: null,\r\n setSelectedSite: () => null,\r\n selectedInfrastructure: null,\r\n setSelectedInfrastructure: () => null,\r\n selectedFile: null,\r\n setSelectedFile: () => null,\r\n selectedUser: null,\r\n setSelectedUser: () => null,\r\n isDatasetMenuOpen: false,\r\n setIsDatasetMenuOpen: () => null,\r\n isAuthPage: true,\r\n})\r\n\r\nexport const MenusProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const pathname = usePathname()\r\n const [state, dispatch] = React.useReducer(reducer, getInitialState(pathname))\r\n\r\n const [isSidebarOpen, setIsSidebarOpen] = React.useState(false)\r\n const [view, setView] = React.useState<'table' | 'detail'>('table')\r\n const [selectedItem, setSelectedItem] = React.useState<Building | null>(null)\r\n const [selectedSite, setSelectedSite] = React.useState<Site | null>(null)\r\n const [selectedInfrastructure, setSelectedInfrastructure] = React.useState<Infrastructure | null>(null)\r\n const [selectedFile, setSelectedFile] = React.useState<FileRow | null>(null)\r\n const [selectedUser, setSelectedUser] = React.useState<Partial<User> | null>(null)\r\n const [isDatasetMenuOpen, setIsDatasetMenuOpen] = React.useState(false)\r\n // Check if current path is an authentication page\r\n const isAuthPage = isAuthPath(pathname)\r\n\r\n // Update state if pathname changes and auth state changes\r\n React.useEffect(() => {\r\n if (isAuthPage && state.menus.currentViewer !== ViewerNames.auth) {\r\n dispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.auth },\r\n })\r\n setIsSidebarOpen(false)\r\n }\r\n else if (!isAuthPage && state.menus.currentViewer === ViewerNames.auth) {\r\n dispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n }\r\n }, [pathname, isAuthPage, state.menus.currentViewer])\r\n\r\n const value = React.useMemo(() => ({\r\n state,\r\n dispatch,\r\n isSidebarOpen,\r\n setIsSidebarOpen,\r\n view,\r\n setView,\r\n selectedItem,\r\n setSelectedItem,\r\n selectedSite,\r\n setSelectedSite,\r\n selectedInfrastructure,\r\n setSelectedInfrastructure,\r\n selectedFile,\r\n setSelectedFile,\r\n selectedUser,\r\n setSelectedUser,\r\n isDatasetMenuOpen,\r\n setIsDatasetMenuOpen,\r\n }), [\r\n state, isSidebarOpen, view, selectedItem, selectedSite,\r\n selectedInfrastructure, selectedFile, selectedUser, isDatasetMenuOpen,\r\n ])\r\n\r\n return (\r\n <MenusContext.Provider value={value}>\r\n { children }\r\n </MenusContext.Provider>\r\n )\r\n}\r\n\r\nexport const useMenusContext = () => React.useContext(MenusContext)\r\n"],"mappings":";AAuJQ;AAlJR,SAAS,mBAAmB;AAC5B,YAAY,WAAW;AAEvB,SAAS,mBAAmB;AAE5B,SAAS,oBAAoB;AAW7B,MAAM,aAAa,CAAC,aAA+B;AAC/C,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS,SAAS,QAAQ;AACrC;AAGA,MAAM,kBAAkB,CAAC,aAAwC;AAC7D,QAAM,SAAS,WAAW,QAAQ;AAClC,SAAO;AAAA,IACH,OAAO;AAAA,MACH,eAAe,SAAS,YAAY,OAAO,YAAY;AAAA,MACvD,aAAa;AAAA;AAAA,MACb,aAAa;AAAA,MACb,yBAAyB,CAAC;AAAA,MAC1B,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,wBAAwB,CAAC;AAAA,MACzB,oBAAoB,CAAC;AAAA,MACrB,mBAAmB,CAAC;AAAA,MACpB,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IACzB;AAAA,EACJ;AACJ;AAEA,MAAM,UAAU,CAAC,EAAE,MAAM,GAAqB,YAA0B;AAAA,EACpE,OAAO,aAAa,OAAO,MAAM;AACrC;AAEO,MAAM,eAAe,MAAM,cAoB/B;AAAA,EACC,OAAO,EAAE,OAAO,EAAE,eAAe,YAAY,KAAK,aAAa,IAAI,aAAa,QAAQ,yBAAyB,CAAC,GAAG,kBAAkB,MAAM,kBAAkB,MAAM,gBAAgB,GAAG,sBAAsB,MAAM,wBAAwB,CAAC,GAAG,oBAAoB,CAAC,GAAG,mBAAmB,CAAC,GAAG,iBAAiB,MAAM,qBAAqB,KAAK,EAAE;AAAA,EAClV,UAAU,MAAM;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB,MAAM;AAAA,EACxB,MAAM;AAAA,EACN,SAAS,MAAM;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EACvB,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B,MAAM;AAAA,EACjC,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EACvB,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EACvB,mBAAmB;AAAA,EACnB,sBAAsB,MAAM;AAAA,EAC5B,YAAY;AAChB,CAAC;AAEM,MAAM,gBAAmD,CAAC,EAAE,SAAS,MAAM;AAC9E,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,WAAW,SAAS,gBAAgB,QAAQ,CAAC;AAE7E,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAA6B,OAAO;AAClE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAA0B,IAAI;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAsB,IAAI;AACxE,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,MAAM,SAAgC,IAAI;AACtG,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAyB,IAAI;AAC3E,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAA+B,IAAI;AACjF,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AAEtE,QAAM,aAAa,WAAW,QAAQ;AAGtC,QAAM,UAAU,MAAM;AAClB,QAAI,cAAc,MAAM,MAAM,kBAAkB,YAAY,MAAM;AAC9D,eAAS;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,eAAe,YAAY,KAAK;AAAA,MAC/C,CAAC;AACD,uBAAiB,KAAK;AAAA,IAC1B,WACS,CAAC,cAAc,MAAM,MAAM,kBAAkB,YAAY,MAAM;AACpE,eAAS;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,eAAe,YAAY,IAAI;AAAA,MAC9C,CAAC;AAAA,IACL;AAAA,EACJ,GAAG,CAAC,UAAU,YAAY,MAAM,MAAM,aAAa,CAAC;AAEpD,QAAM,QAAQ,MAAM,QAAQ,OAAO;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IAAO;AAAA,IAAe;AAAA,IAAM;AAAA,IAAc;AAAA,IAC1C;AAAA,IAAwB;AAAA,IAAc;AAAA,IAAc;AAAA,EACxD,CAAC;AAED,SACI,oBAAC,aAAa,UAAb,EAAsB,OACzB,UACF;AAEJ;AAEO,MAAM,kBAAkB,MAAM,MAAM,WAAW,YAAY;","names":[]}