@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,12 +1,24 @@
1
1
  import type { ViewerNames } from '../../types/dbTypes';
2
2
  import type { ActionMap } from '../ActionMap';
3
3
  export type SidebarTabType = 'file' | 'layers' | 'communication' | 'sensors' | 'settings';
4
+ /** Request from a viewer marker to open a comment's editor/reply box in the sidebar. */
5
+ export type CommentActionRequest = {
6
+ commentId: number;
7
+ action: 'edit' | 'reply';
8
+ /** Monotonic id so the same request fires again even if the target is unchanged. */
9
+ requestId: number;
10
+ };
4
11
  interface MenusTypes {
5
12
  currentViewer: ViewerNames;
6
13
  rowsPerPage: number;
7
14
  selectedTab: SidebarTabType;
8
15
  commentsVisibleInViewer: ViewerNames[];
9
16
  currentCommentId: number | null;
17
+ /** Comment double-clicked to zoom/focus. Drives the thick focus ring + camera move. */
18
+ focusedCommentId: number | null;
19
+ /** Monotonic counter bumped on every focus dispatch so re-focusing the same comment re-zooms. */
20
+ focusRequestId: number;
21
+ pendingCommentAction: CommentActionRequest | null;
10
22
  sensorsVisibleInViewer: ViewerNames[];
11
23
  visibleSensorTypes: Partial<Record<ViewerNames, number[]>>;
12
24
  visibleSensorTags: Partial<Record<ViewerNames, string[]>>;
@@ -27,6 +39,14 @@ export type MenusPayload = {
27
39
  ['SET_CURRENT_COMMENT_ID']: {
28
40
  commentId: number | null;
29
41
  };
42
+ ['SET_FOCUSED_COMMENT_ID']: {
43
+ commentId: number | null;
44
+ };
45
+ ['REQUEST_COMMENT_ACTION']: {
46
+ commentId: number;
47
+ action: 'edit' | 'reply';
48
+ };
49
+ ['CLEAR_PENDING_COMMENT_ACTION']: undefined;
30
50
  ['TOGGLE_SENSOR_TYPE_VISIBILITY']: {
31
51
  viewer: ViewerNames;
32
52
  sensorTypeId: number;
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Menus/reducer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,eAAe,GAAI,SAAS,GAAG,UAAU,CAAA;AAE1F,UAAU,UAAU;IAClB,aAAa,EAAE,WAAW,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,cAAc,CAAA;IAC3B,uBAAuB,EAAE,WAAW,EAAE,CAAA;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,sBAAsB,EAAE,WAAW,EAAE,CAAA;IACrC,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1D,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACzD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAA;AAEnC,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;IACjD,CAAC,8BAA8B,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IACjE,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC7D,CAAC,yBAAyB,CAAC,EAAE;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,CAAA;IAClD,CAAC,yBAAyB,CAAC,EAAE;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,CAAA;IAClD,CAAC,wBAAwB,CAAC,EAAE;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAA;IACtD,CAAC,+BAA+B,CAAC,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACjG,CAAC,8BAA8B,CAAC,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IAC7F,CAAC,2BAA2B,CAAC,EAAE;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,CAAA;IACpD,CAAC,4BAA4B,CAAC,EAAE;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,CAAA;IACrD,CAAC,gCAAgC,CAAC,EAAE;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,CAAA;IACzD,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;IAC9D,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAA;CACxE,CAAA;AAED,MAAM,MAAM,YAAY,GACpB,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;AAE1D,eAAO,MAAM,YAAY,GAAI,OAAO,UAAU,EAAE,QAAQ,YAAY,eAoHnE,CAAA"}
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Menus/reducer.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ var __spreadValues = (a, b) => {
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  const MenusReducer = (state, action) => {
21
- var _a, _b;
21
+ var _a, _b, _c, _d;
22
22
  switch (action.type) {
23
23
  case "SET_VIEWER":
24
24
  return __spreadProps(__spreadValues({}, state), {
@@ -51,6 +51,24 @@ const MenusReducer = (state, action) => {
51
51
  return __spreadProps(__spreadValues({}, state), {
52
52
  currentCommentId: action.payload.commentId
53
53
  });
54
+ case "SET_FOCUSED_COMMENT_ID":
55
+ return __spreadProps(__spreadValues({}, state), {
56
+ focusedCommentId: action.payload.commentId,
57
+ focusRequestId: state.focusRequestId + 1
58
+ });
59
+ case "REQUEST_COMMENT_ACTION":
60
+ return __spreadProps(__spreadValues({}, state), {
61
+ pendingCommentAction: {
62
+ commentId: action.payload.commentId,
63
+ action: action.payload.action,
64
+ requestId: ((_b = (_a = state.pendingCommentAction) == null ? void 0 : _a.requestId) != null ? _b : 0) + 1
65
+ }
66
+ });
67
+ case "CLEAR_PENDING_COMMENT_ACTION":
68
+ if (state.pendingCommentAction === null) return state;
69
+ return __spreadProps(__spreadValues({}, state), {
70
+ pendingCommentAction: null
71
+ });
54
72
  case "SET_CURRENT_SENSOR_ID":
55
73
  return __spreadProps(__spreadValues({}, state), {
56
74
  currentSensorId: action.payload.currentSensorId
@@ -82,7 +100,7 @@ const MenusReducer = (state, action) => {
82
100
  case "TOGGLE_SENSOR_TYPE_VISIBILITY":
83
101
  const { viewer: toggleViewer, sensorTypeId, force } = action.payload;
84
102
  if (!toggleViewer || !sensorTypeId) return state;
85
- const currentTypesForViewer = ((_a = state.visibleSensorTypes) == null ? void 0 : _a[toggleViewer]) || [];
103
+ const currentTypesForViewer = ((_c = state.visibleSensorTypes) == null ? void 0 : _c[toggleViewer]) || [];
86
104
  const isCurrentlyVisible = currentTypesForViewer.includes(sensorTypeId);
87
105
  if (force && isCurrentlyVisible) return state;
88
106
  return __spreadProps(__spreadValues({}, state), {
@@ -93,7 +111,7 @@ const MenusReducer = (state, action) => {
93
111
  case "TOGGLE_SENSOR_TAG_VISIBILITY":
94
112
  const { viewer: toggleTagViewer, sensorTag, force: forceTag } = action.payload;
95
113
  if (!toggleTagViewer || !sensorTag) return state;
96
- const currentTagsForViewer = ((_b = state.visibleSensorTags) == null ? void 0 : _b[toggleTagViewer]) || [];
114
+ const currentTagsForViewer = ((_d = state.visibleSensorTags) == null ? void 0 : _d[toggleTagViewer]) || [];
97
115
  const isTagCurrentlyVisible = currentTagsForViewer.includes(sensorTag);
98
116
  if (forceTag && isTagCurrentlyVisible) return state;
99
117
  return __spreadProps(__spreadValues({}, state), {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/Menus/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { SensorType, ViewerNames } from '../../types/dbTypes'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\nexport type SidebarTabType = 'file' | 'layers' | 'communication' | 'sensors' | 'settings'\r\n\r\ninterface MenusTypes {\r\n currentViewer: ViewerNames\r\n rowsPerPage: number\r\n selectedTab: SidebarTabType\r\n commentsVisibleInViewer: ViewerNames[]\r\n currentCommentId: number | null\r\n sensorsVisibleInViewer: ViewerNames[]\r\n visibleSensorTypes: Partial<Record<ViewerNames, number[]>>\r\n visibleSensorTags: Partial<Record<ViewerNames, string[]>>\r\n currentSensorId: number | null\r\n currentSensorTypeId: number | null\r\n}\r\n\r\nexport type MenusState = MenusTypes\r\n\r\nexport type MenusPayload = {\r\n ['SET_VIEWER']: Pick<MenusTypes, 'currentViewer'>\r\n ['SET_PAGINATION_ROWS_PER_PAGE']: Pick<MenusTypes, 'rowsPerPage'>\r\n ['SET_SIDEBAR_SELECTED_TAB']: Pick<MenusTypes, 'selectedTab'>\r\n ['SHOW_COMMENTS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_COMMENTS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['SET_CURRENT_COMMENT_ID']: {commentId: number | null}\r\n ['TOGGLE_SENSOR_TYPE_VISIBILITY']: { viewer: ViewerNames; sensorTypeId: number; force?: boolean }\r\n ['TOGGLE_SENSOR_TAG_VISIBILITY']: { viewer: ViewerNames; sensorTag: string; force?: boolean }\r\n ['SHOW_ALL_SENSOR_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_ALL_SENSORS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_ALL_SENSOR_TAGS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['SET_CURRENT_SENSOR_ID']: Pick<MenusTypes, 'currentSensorId'>\r\n ['SET_CURRENT_SENSOR_TYPE_ID']: Pick<MenusTypes, 'currentSensorTypeId'>\r\n}\r\n\r\nexport type MenusActions\r\n = ActionMap<MenusPayload>[keyof ActionMap<MenusPayload>]\r\n\r\nexport const MenusReducer = (state: MenusState, action: MenusActions) => {\r\n switch (action.type) {\r\n case 'SET_VIEWER':\r\n return {\r\n ...state,\r\n currentViewer: action.payload.currentViewer,\r\n }\r\n case 'SET_PAGINATION_ROWS_PER_PAGE':\r\n return {\r\n ...state,\r\n rowsPerPage: action.payload.rowsPerPage,\r\n }\r\n case 'SET_SIDEBAR_SELECTED_TAB':\r\n return {\r\n ...state,\r\n selectedTab: action.payload.selectedTab,\r\n }\r\n case 'SHOW_COMMENTS_IN_VIEWER':\r\n const viewerToShow = action.payload.viewer\r\n if (!viewerToShow) return state\r\n const commentsCurrentlyVisible = state.commentsVisibleInViewer || []\r\n return {\r\n ...state,\r\n commentsVisibleInViewer: commentsCurrentlyVisible.includes(viewerToShow)\r\n ? commentsCurrentlyVisible\r\n : [...commentsCurrentlyVisible, viewerToShow],\r\n }\r\n case 'HIDE_COMMENTS_IN_VIEWER':\r\n const viewerToHide = action.payload.viewer\r\n if (!viewerToHide) return state\r\n return {\r\n ...state,\r\n commentsVisibleInViewer: (state.commentsVisibleInViewer || []).filter(\r\n v => v !== viewerToHide\r\n ),\r\n }\r\n case 'SET_CURRENT_COMMENT_ID':\r\n return {\r\n ...state,\r\n currentCommentId: action.payload.commentId,\r\n }\r\n case 'SET_CURRENT_SENSOR_ID':\r\n return {\r\n ...state,\r\n currentSensorId: action.payload.currentSensorId,\r\n }\r\n case 'SET_CURRENT_SENSOR_TYPE_ID':\r\n return {\r\n ...state,\r\n currentSensorTypeId: action.payload.currentSensorTypeId,\r\n }\r\n case 'HIDE_ALL_SENSORS_IN_VIEWER':\r\n const sensorViewerToHide = action.payload.viewer\r\n if (!sensorViewerToHide) return state\r\n return {\r\n ...state,\r\n sensorsVisibleInViewer: (state.sensorsVisibleInViewer || []).filter(\r\n v => v !== sensorViewerToHide\r\n ),\r\n // Also hide all sensor types for this viewer\r\n visibleSensorTypes: {\r\n ...state.visibleSensorTypes,\r\n [sensorViewerToHide]: [],\r\n },\r\n }\r\n case 'HIDE_ALL_SENSOR_TAGS_IN_VIEWER':\r\n const tagViewerToHide = action.payload.viewer\r\n if (!tagViewerToHide) return state\r\n return {\r\n ...state,\r\n visibleSensorTags: {\r\n ...state.visibleSensorTags,\r\n [tagViewerToHide]: [],\r\n },\r\n }\r\n case 'TOGGLE_SENSOR_TYPE_VISIBILITY':\r\n const { viewer: toggleViewer, sensorTypeId, force } = action.payload\r\n if (!toggleViewer || !sensorTypeId) return state\r\n const currentTypesForViewer = state.visibleSensorTypes?.[toggleViewer] || []\r\n const isCurrentlyVisible = currentTypesForViewer.includes(sensorTypeId)\r\n // force=true → only show (idempotent); force=false/undefined → toggle\r\n if (force && isCurrentlyVisible) return state\r\n return {\r\n ...state,\r\n visibleSensorTypes: {\r\n ...state.visibleSensorTypes,\r\n [toggleViewer]: (force || !isCurrentlyVisible)\r\n ? [...currentTypesForViewer, sensorTypeId]\r\n : currentTypesForViewer.filter(t => t !== sensorTypeId),\r\n },\r\n }\r\n case 'TOGGLE_SENSOR_TAG_VISIBILITY':\r\n const { viewer: toggleTagViewer, sensorTag, force: forceTag } = action.payload\r\n if (!toggleTagViewer || !sensorTag) return state\r\n const currentTagsForViewer = state.visibleSensorTags?.[toggleTagViewer] || []\r\n const isTagCurrentlyVisible = currentTagsForViewer.includes(sensorTag)\r\n if (forceTag && isTagCurrentlyVisible) return state\r\n return {\r\n ...state,\r\n visibleSensorTags: {\r\n ...state.visibleSensorTags,\r\n [toggleTagViewer]: (forceTag || !isTagCurrentlyVisible)\r\n ? [...currentTagsForViewer, sensorTag]\r\n : currentTagsForViewer.filter(t => t !== sensorTag),\r\n },\r\n }\r\n\r\n case 'SHOW_ALL_SENSOR_IN_VIEWER':\r\n const showAllViewer = action.payload.viewer\r\n if (!showAllViewer) return state\r\n // This is called when opening the add sensor tool - we don't know all types yet\r\n // So we just ensure the viewer is in sensorsVisibleInViewer\r\n return state\r\n default:\r\n return state\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/Menus/reducer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport type { ViewerNames } from '../../types/dbTypes'\r\nimport type { ActionMap } from '../ActionMap'\r\n\r\nexport type SidebarTabType = 'file' | 'layers' | 'communication' | 'sensors' | 'settings'\r\n\r\n/** Request from a viewer marker to open a comment's editor/reply box in the sidebar. */\r\nexport type CommentActionRequest = {\r\n commentId: number\r\n action: 'edit' | 'reply'\r\n /** Monotonic id so the same request fires again even if the target is unchanged. */\r\n requestId: number\r\n}\r\n\r\ninterface MenusTypes {\r\n currentViewer: ViewerNames\r\n rowsPerPage: number\r\n selectedTab: SidebarTabType\r\n commentsVisibleInViewer: ViewerNames[]\r\n currentCommentId: number | null\r\n /** Comment double-clicked to zoom/focus. Drives the thick focus ring + camera move. */\r\n focusedCommentId: number | null\r\n /** Monotonic counter bumped on every focus dispatch so re-focusing the same comment re-zooms. */\r\n focusRequestId: number\r\n pendingCommentAction: CommentActionRequest | null\r\n sensorsVisibleInViewer: ViewerNames[]\r\n visibleSensorTypes: Partial<Record<ViewerNames, number[]>>\r\n visibleSensorTags: Partial<Record<ViewerNames, string[]>>\r\n currentSensorId: number | null\r\n currentSensorTypeId: number | null\r\n}\r\n\r\nexport type MenusState = MenusTypes\r\n\r\nexport type MenusPayload = {\r\n ['SET_VIEWER']: Pick<MenusTypes, 'currentViewer'>\r\n ['SET_PAGINATION_ROWS_PER_PAGE']: Pick<MenusTypes, 'rowsPerPage'>\r\n ['SET_SIDEBAR_SELECTED_TAB']: Pick<MenusTypes, 'selectedTab'>\r\n ['SHOW_COMMENTS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_COMMENTS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['SET_CURRENT_COMMENT_ID']: {commentId: number | null}\r\n ['SET_FOCUSED_COMMENT_ID']: {commentId: number | null}\r\n ['REQUEST_COMMENT_ACTION']: {commentId: number; action: 'edit' | 'reply'}\r\n ['CLEAR_PENDING_COMMENT_ACTION']: undefined\r\n ['TOGGLE_SENSOR_TYPE_VISIBILITY']: { viewer: ViewerNames; sensorTypeId: number; force?: boolean }\r\n ['TOGGLE_SENSOR_TAG_VISIBILITY']: { viewer: ViewerNames; sensorTag: string; force?: boolean }\r\n ['SHOW_ALL_SENSOR_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_ALL_SENSORS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['HIDE_ALL_SENSOR_TAGS_IN_VIEWER']: {viewer: ViewerNames}\r\n ['SET_CURRENT_SENSOR_ID']: Pick<MenusTypes, 'currentSensorId'>\r\n ['SET_CURRENT_SENSOR_TYPE_ID']: Pick<MenusTypes, 'currentSensorTypeId'>\r\n}\r\n\r\nexport type MenusActions\r\n = ActionMap<MenusPayload>[keyof ActionMap<MenusPayload>]\r\n\r\nexport const MenusReducer = (state: MenusState, action: MenusActions) => {\r\n switch (action.type) {\r\n case 'SET_VIEWER':\r\n return {\r\n ...state,\r\n currentViewer: action.payload.currentViewer,\r\n }\r\n case 'SET_PAGINATION_ROWS_PER_PAGE':\r\n return {\r\n ...state,\r\n rowsPerPage: action.payload.rowsPerPage,\r\n }\r\n case 'SET_SIDEBAR_SELECTED_TAB':\r\n return {\r\n ...state,\r\n selectedTab: action.payload.selectedTab,\r\n }\r\n case 'SHOW_COMMENTS_IN_VIEWER':\r\n const viewerToShow = action.payload.viewer\r\n if (!viewerToShow) return state\r\n const commentsCurrentlyVisible = state.commentsVisibleInViewer || []\r\n return {\r\n ...state,\r\n commentsVisibleInViewer: commentsCurrentlyVisible.includes(viewerToShow)\r\n ? commentsCurrentlyVisible\r\n : [...commentsCurrentlyVisible, viewerToShow],\r\n }\r\n case 'HIDE_COMMENTS_IN_VIEWER':\r\n const viewerToHide = action.payload.viewer\r\n if (!viewerToHide) return state\r\n return {\r\n ...state,\r\n commentsVisibleInViewer: (state.commentsVisibleInViewer || []).filter(\r\n v => v !== viewerToHide\r\n ),\r\n }\r\n case 'SET_CURRENT_COMMENT_ID':\r\n return {\r\n ...state,\r\n currentCommentId: action.payload.commentId,\r\n }\r\n case 'SET_FOCUSED_COMMENT_ID':\r\n return {\r\n ...state,\r\n focusedCommentId: action.payload.commentId,\r\n focusRequestId: state.focusRequestId + 1,\r\n }\r\n case 'REQUEST_COMMENT_ACTION':\r\n return {\r\n ...state,\r\n pendingCommentAction: {\r\n commentId: action.payload.commentId,\r\n action: action.payload.action,\r\n requestId: (state.pendingCommentAction?.requestId ?? 0) + 1,\r\n },\r\n }\r\n case 'CLEAR_PENDING_COMMENT_ACTION':\r\n if (state.pendingCommentAction === null) return state\r\n return {\r\n ...state,\r\n pendingCommentAction: null,\r\n }\r\n case 'SET_CURRENT_SENSOR_ID':\r\n return {\r\n ...state,\r\n currentSensorId: action.payload.currentSensorId,\r\n }\r\n case 'SET_CURRENT_SENSOR_TYPE_ID':\r\n return {\r\n ...state,\r\n currentSensorTypeId: action.payload.currentSensorTypeId,\r\n }\r\n case 'HIDE_ALL_SENSORS_IN_VIEWER':\r\n const sensorViewerToHide = action.payload.viewer\r\n if (!sensorViewerToHide) return state\r\n return {\r\n ...state,\r\n sensorsVisibleInViewer: (state.sensorsVisibleInViewer || []).filter(\r\n v => v !== sensorViewerToHide\r\n ),\r\n // Also hide all sensor types for this viewer\r\n visibleSensorTypes: {\r\n ...state.visibleSensorTypes,\r\n [sensorViewerToHide]: [],\r\n },\r\n }\r\n case 'HIDE_ALL_SENSOR_TAGS_IN_VIEWER':\r\n const tagViewerToHide = action.payload.viewer\r\n if (!tagViewerToHide) return state\r\n return {\r\n ...state,\r\n visibleSensorTags: {\r\n ...state.visibleSensorTags,\r\n [tagViewerToHide]: [],\r\n },\r\n }\r\n case 'TOGGLE_SENSOR_TYPE_VISIBILITY':\r\n const { viewer: toggleViewer, sensorTypeId, force } = action.payload\r\n if (!toggleViewer || !sensorTypeId) return state\r\n const currentTypesForViewer = state.visibleSensorTypes?.[toggleViewer] || []\r\n const isCurrentlyVisible = currentTypesForViewer.includes(sensorTypeId)\r\n // force=true → only show (idempotent); force=false/undefined → toggle\r\n if (force && isCurrentlyVisible) return state\r\n return {\r\n ...state,\r\n visibleSensorTypes: {\r\n ...state.visibleSensorTypes,\r\n [toggleViewer]: (force || !isCurrentlyVisible)\r\n ? [...currentTypesForViewer, sensorTypeId]\r\n : currentTypesForViewer.filter(t => t !== sensorTypeId),\r\n },\r\n }\r\n case 'TOGGLE_SENSOR_TAG_VISIBILITY':\r\n const { viewer: toggleTagViewer, sensorTag, force: forceTag } = action.payload\r\n if (!toggleTagViewer || !sensorTag) return state\r\n const currentTagsForViewer = state.visibleSensorTags?.[toggleTagViewer] || []\r\n const isTagCurrentlyVisible = currentTagsForViewer.includes(sensorTag)\r\n if (forceTag && isTagCurrentlyVisible) return state\r\n return {\r\n ...state,\r\n visibleSensorTags: {\r\n ...state.visibleSensorTags,\r\n [toggleTagViewer]: (forceTag || !isTagCurrentlyVisible)\r\n ? [...currentTagsForViewer, sensorTag]\r\n : currentTagsForViewer.filter(t => t !== sensorTag),\r\n },\r\n }\r\n\r\n case 'SHOW_ALL_SENSOR_IN_VIEWER':\r\n const showAllViewer = action.payload.viewer\r\n if (!showAllViewer) return state\r\n // This is called when opening the add sensor tool - we don't know all types yet\r\n // So we just ensure the viewer is in sensorsVisibleInViewer\r\n return state\r\n default:\r\n return state\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,3 +1,13 @@
1
+ /** Platform highlight colour, shared by map + BIM comment/sensor markers. */
2
+ export declare const HIGHLIGHT_COLOR = "#73cee2";
1
3
  export declare const markerStyle: string;
2
4
  export declare const markerStyleHighlight: string;
5
+ /**
6
+ * `box-shadow` ring for a comment marker, shared by every surface so the ring widths stay
7
+ * consistent: 1px white (idle), 2px highlight (hover/selected), 3px focus (double-click zoom).
8
+ */
9
+ export declare function commentRingShadow({ highlight, focused }: {
10
+ highlight?: boolean;
11
+ focused?: boolean;
12
+ }): string;
3
13
  //# sourceMappingURL=markerUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markerUtils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/markerUtils.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,QAEiB,CAAC;AAG1C,eAAO,MAAM,oBAAoB,QAGQ,CAAC"}
1
+ {"version":3,"file":"markerUtils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/markerUtils.ts"],"names":[],"mappings":"AAGA,6EAA6E;AAC7E,eAAO,MAAM,eAAe,YAAY,CAAA;AAGxC,eAAO,MAAM,WAAW,QAEiB,CAAC;AAG1C,eAAO,MAAM,oBAAoB,QAGQ,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAI5G"}
@@ -1,6 +1,14 @@
1
+ const HIGHLIGHT_COLOR = "#73cee2";
1
2
  const markerStyle = "absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] translate-x-[-50%] translate-y-[-90%]";
2
- const markerStyleHighlight = "absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] shadow-[0_0_0_3px_#73cee2,0_0_16px_4px_rgba(115,206,226,0.5)] translate-x-[-50%] translate-y-[-90%]";
3
+ const markerStyleHighlight = "absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] shadow-[0_0_0_2px_#73cee2,0_0_16px_4px_rgba(115,206,226,0.5)] translate-x-[-50%] translate-y-[-90%]";
4
+ function commentRingShadow({ highlight, focused }) {
5
+ if (focused) return `0 0 0 3px ${HIGHLIGHT_COLOR}, 0 0 12px rgba(115, 206, 226, 0.6)`;
6
+ if (highlight) return `0 0 0 2px ${HIGHLIGHT_COLOR}, 0 0 8px rgba(115, 206, 226, 0.5)`;
7
+ return "0 0 0 1px white";
8
+ }
3
9
  export {
10
+ HIGHLIGHT_COLOR,
11
+ commentRingShadow,
4
12
  markerStyle,
5
13
  markerStyleHighlight
6
14
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/utils/markerUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Tailwind class string for marker highlight style\r\nexport const markerStyle =\r\n 'absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] ' +\r\n 'translate-x-[-50%] translate-y-[-90%]';\r\n\r\n// Tailwind class string for marker style\r\nexport const markerStyleHighlight =\r\n 'absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] ' +\r\n 'shadow-[0_0_0_3px_#73cee2,0_0_16px_4px_rgba(115,206,226,0.5)] ' +\r\n 'translate-x-[-50%] translate-y-[-90%]';\r\n\r\n"],"mappings":"AAIO,MAAM,cACX;AAIK,MAAM,uBACX;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/utils/markerUtils.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/** Platform highlight colour, shared by map + BIM comment/sensor markers. */\r\nexport const HIGHLIGHT_COLOR = '#73cee2'\r\n\r\n// Tailwind class string for marker highlight style\r\nexport const markerStyle =\r\n 'absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] ' +\r\n 'translate-x-[-50%] translate-y-[-90%]';\r\n\r\n// Tailwind class string for marker style\r\nexport const markerStyleHighlight =\r\n 'absolute z-[99999] pointer-events-auto rounded-[16px] transition-[box-shadow] ' +\r\n 'shadow-[0_0_0_2px_#73cee2,0_0_16px_4px_rgba(115,206,226,0.5)] ' +\r\n 'translate-x-[-50%] translate-y-[-90%]';\r\n\r\n/**\r\n * `box-shadow` ring for a comment marker, shared by every surface so the ring widths stay\r\n * consistent: 1px white (idle), 2px highlight (hover/selected), 3px focus (double-click zoom).\r\n */\r\nexport function commentRingShadow({ highlight, focused }: { highlight?: boolean; focused?: boolean }): string {\r\n if (focused) return `0 0 0 3px ${HIGHLIGHT_COLOR}, 0 0 12px rgba(115, 206, 226, 0.6)`\r\n if (highlight) return `0 0 0 2px ${HIGHLIGHT_COLOR}, 0 0 8px rgba(115, 206, 226, 0.5)`\r\n return '0 0 0 1px white'\r\n}\r\n\r\n"],"mappings":"AAIO,MAAM,kBAAkB;AAGxB,MAAM,cACX;AAIK,MAAM,uBACX;AAQK,SAAS,kBAAkB,EAAE,WAAW,QAAQ,GAAuD;AAC5G,MAAI,QAAS,QAAO,aAAa,eAAe;AAChD,MAAI,UAAW,QAAO,aAAa,eAAe;AAClD,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"memcache.d.ts","sourceRoot":"","sources":["../../../src/core/utils/memcache.ts"],"names":[],"mappings":"AAwDA,wBAAsB,WAAW,CAAC,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,UAAU,GAAE,MAAa,GACxB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAqBnE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAclE;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CActD"}
1
+ {"version":3,"file":"memcache.d.ts","sourceRoot":"","sources":["../../../src/core/utils/memcache.ts"],"names":[],"mappings":"AAqDA,wBAAsB,WAAW,CAAC,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,UAAU,GAAE,MAAa,GACxB,OAAO,CAAC,OAAO,CAAC,CAclB;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAmBnE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAalE;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAatD"}
@@ -27,14 +27,12 @@ async function getMemcacheClient() {
27
27
  return null;
28
28
  }
29
29
  const memcacheServer = process.env.MEMCACHE_SERVER;
30
- console.log(`Connecting to Memcache server: ${memcacheServer}`);
31
30
  client = memjsLib.Client.create(memcacheServer, {
32
31
  username: process.env.MEMCACHE_USERNAME,
33
32
  password: process.env.MEMCACHE_PASSWORD,
34
33
  timeout: 5,
35
34
  retries: 2
36
35
  });
37
- console.log("Memcache client initialized successfully");
38
36
  return client;
39
37
  } catch (error) {
40
38
  console.error("Failed to initialize Memcache client:", error);
@@ -49,7 +47,6 @@ async function setMemcache(key, value, ttlSeconds = 3600) {
49
47
  try {
50
48
  const serialized = JSON.stringify(value);
51
49
  await client2.set(key, serialized, { expires: ttlSeconds });
52
- console.log(`Memcache SET: ${key} (TTL: ${ttlSeconds}s)`);
53
50
  return true;
54
51
  } catch (error) {
55
52
  console.error(`Failed to set Memcache key ${key}:`, error);
@@ -64,11 +61,9 @@ async function getMemcache(key) {
64
61
  try {
65
62
  const result = await client2.get(key);
66
63
  if (!result.value) {
67
- console.log(`Memcache MISS: ${key}`);
68
64
  return null;
69
65
  }
70
66
  const deserialized = JSON.parse(result.value.toString());
71
- console.log(`Memcache HIT: ${key}`);
72
67
  return deserialized;
73
68
  } catch (error) {
74
69
  console.error(`Failed to get Memcache key ${key}:`, error);
@@ -82,7 +77,6 @@ async function deleteMemcache(key) {
82
77
  }
83
78
  try {
84
79
  await client2.delete(key);
85
- console.log(`Memcache DELETE: ${key}`);
86
80
  return true;
87
81
  } catch (error) {
88
82
  console.error(`Failed to delete Memcache key ${key}:`, error);
@@ -107,7 +101,6 @@ async function flushMemcache() {
107
101
  }
108
102
  try {
109
103
  await client2.flush();
110
- console.log("Memcache FLUSHED");
111
104
  return true;
112
105
  } catch (error) {
113
106
  console.error("Failed to flush Memcache:", error);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/utils/memcache.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nlet memjs: typeof import('memjs') | null = null\r\nlet client: any = null\r\n\r\nasync function loadMemjs() {\r\n if (typeof window !== 'undefined') {\r\n return null\r\n }\r\n\r\n if (!memjs) {\r\n try {\r\n memjs = await import('memjs')\r\n } catch (error) {\r\n console.error('Failed to load memjs:', error)\r\n return null\r\n }\r\n }\r\n return memjs\r\n}\r\n\r\nasync function getMemcacheClient() {\r\n if (typeof window !== 'undefined') {\r\n return null\r\n }\r\n\r\n if (client) {\r\n return client\r\n }\r\n\r\n try {\r\n const memjsLib = await loadMemjs()\r\n if (!memjsLib) {\r\n return null\r\n }\r\n\r\n const memcacheServer = process.env.MEMCACHE_SERVER\r\n\r\n console.log(`Connecting to Memcache server: ${memcacheServer}`)\r\n\r\n client = memjsLib.Client.create(memcacheServer, {\r\n username: process.env.MEMCACHE_USERNAME,\r\n password: process.env.MEMCACHE_PASSWORD,\r\n timeout: 5,\r\n retries: 2,\r\n })\r\n\r\n console.log('Memcache client initialized successfully')\r\n return client\r\n } catch (error) {\r\n console.error('Failed to initialize Memcache client:', error)\r\n return null\r\n }\r\n}\r\n\r\nexport async function setMemcache<T>(\r\n key: string,\r\n value: T,\r\n ttlSeconds: number = 3600\r\n): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n const serialized = JSON.stringify(value)\r\n await client.set(key, serialized, { expires: ttlSeconds })\r\n console.log(`Memcache SET: ${key} (TTL: ${ttlSeconds}s)`)\r\n return true\r\n } catch (error) {\r\n console.error(`Failed to set Memcache key ${key}:`, error)\r\n return false\r\n }\r\n}\r\n\r\nexport async function getMemcache<T>(key: string): Promise<T | null> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return null\r\n }\r\n\r\n try {\r\n const result = await client.get(key)\r\n\r\n if (!result.value) {\r\n console.log(`Memcache MISS: ${key}`)\r\n return null\r\n }\r\n\r\n const deserialized = JSON.parse(result.value.toString()) as T\r\n console.log(`Memcache HIT: ${key}`)\r\n return deserialized\r\n } catch (error) {\r\n console.error(`Failed to get Memcache key ${key}:`, error)\r\n return null\r\n }\r\n}\r\n\r\nexport async function deleteMemcache(key: string): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n await client.delete(key)\r\n console.log(`Memcache DELETE: ${key}`)\r\n return true\r\n } catch (error) {\r\n console.error(`Failed to delete Memcache key ${key}:`, error)\r\n return false\r\n }\r\n}\r\n\r\nexport async function withMemcache<T>(\r\n key: string,\r\n ttlSeconds: number,\r\n fn: () => Promise<T>\r\n): Promise<T> {\r\n const cached = await getMemcache<T>(key)\r\n if (cached !== null) {\r\n return cached\r\n }\r\n\r\n const result = await fn()\r\n\r\n setMemcache(key, result, ttlSeconds).catch(err => {\r\n console.error('Background Memcache set failed:', err)\r\n })\r\n\r\n return result\r\n}\r\n\r\nexport async function flushMemcache(): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n await client.flush()\r\n console.log('Memcache FLUSHED')\r\n return true\r\n } catch (error) {\r\n console.error('Failed to flush Memcache:', error)\r\n return false\r\n }\r\n}\r\n"],"mappings":"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","names":["client"]}
1
+ {"version":3,"sources":["../../../src/core/utils/memcache.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nlet memjs: typeof import('memjs') | null = null\r\nlet client: any = null\r\n\r\nasync function loadMemjs() {\r\n if (typeof window !== 'undefined') {\r\n return null\r\n }\r\n\r\n if (!memjs) {\r\n try {\r\n memjs = await import('memjs')\r\n } catch (error) {\r\n console.error('Failed to load memjs:', error)\r\n return null\r\n }\r\n }\r\n return memjs\r\n}\r\n\r\nasync function getMemcacheClient() {\r\n if (typeof window !== 'undefined') {\r\n return null\r\n }\r\n\r\n if (client) {\r\n return client\r\n }\r\n\r\n try {\r\n const memjsLib = await loadMemjs()\r\n if (!memjsLib) {\r\n return null\r\n }\r\n\r\n const memcacheServer = process.env.MEMCACHE_SERVER\r\n\r\n client = memjsLib.Client.create(memcacheServer, {\r\n username: process.env.MEMCACHE_USERNAME,\r\n password: process.env.MEMCACHE_PASSWORD,\r\n timeout: 5,\r\n retries: 2,\r\n })\r\n\r\n return client\r\n } catch (error) {\r\n console.error('Failed to initialize Memcache client:', error)\r\n return null\r\n }\r\n}\r\n\r\nexport async function setMemcache<T>(\r\n key: string,\r\n value: T,\r\n ttlSeconds: number = 3600\r\n): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n const serialized = JSON.stringify(value)\r\n await client.set(key, serialized, { expires: ttlSeconds })\r\n return true\r\n } catch (error) {\r\n console.error(`Failed to set Memcache key ${key}:`, error)\r\n return false\r\n }\r\n}\r\n\r\nexport async function getMemcache<T>(key: string): Promise<T | null> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return null\r\n }\r\n\r\n try {\r\n const result = await client.get(key)\r\n\r\n if (!result.value) {\r\n return null\r\n }\r\n\r\n const deserialized = JSON.parse(result.value.toString()) as T\r\n return deserialized\r\n } catch (error) {\r\n console.error(`Failed to get Memcache key ${key}:`, error)\r\n return null\r\n }\r\n}\r\n\r\nexport async function deleteMemcache(key: string): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n await client.delete(key)\r\n return true\r\n } catch (error) {\r\n console.error(`Failed to delete Memcache key ${key}:`, error)\r\n return false\r\n }\r\n}\r\n\r\nexport async function withMemcache<T>(\r\n key: string,\r\n ttlSeconds: number,\r\n fn: () => Promise<T>\r\n): Promise<T> {\r\n const cached = await getMemcache<T>(key)\r\n if (cached !== null) {\r\n return cached\r\n }\r\n\r\n const result = await fn()\r\n\r\n setMemcache(key, result, ttlSeconds).catch(err => {\r\n console.error('Background Memcache set failed:', err)\r\n })\r\n\r\n return result\r\n}\r\n\r\nexport async function flushMemcache(): Promise<boolean> {\r\n const client = await getMemcacheClient()\r\n if (!client) {\r\n return false\r\n }\r\n\r\n try {\r\n await client.flush()\r\n return true\r\n } catch (error) {\r\n console.error('Failed to flush Memcache:', error)\r\n return false\r\n }\r\n}\r\n"],"mappings":"AAGA,IAAI,QAAuC;AAC3C,IAAI,SAAc;AAElB,eAAe,YAAY;AACzB,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO;AACV,QAAI;AACF,cAAQ,MAAM,OAAO,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oBAAoB;AACjC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,UAAU;AACjC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,QAAQ,IAAI;AAEnC,aAAS,SAAS,OAAO,OAAO,gBAAgB;AAAA,MAC9C,UAAU,QAAQ,IAAI;AAAA,MACtB,UAAU,QAAQ,IAAI;AAAA,MACtB,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,yCAAyC,KAAK;AAC5D,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YACpB,KACA,OACA,aAAqB,MACH;AAClB,QAAMA,UAAS,MAAM,kBAAkB;AACvC,MAAI,CAACA,SAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,aAAa,KAAK,UAAU,KAAK;AACvC,UAAMA,QAAO,IAAI,KAAK,YAAY,EAAE,SAAS,WAAW,CAAC;AACzD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,GAAG,KAAK,KAAK;AACzD,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAe,KAAgC;AACnE,QAAMA,UAAS,MAAM,kBAAkB;AACvC,MAAI,CAACA,SAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,MAAMA,QAAO,IAAI,GAAG;AAEnC,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AACvD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,GAAG,KAAK,KAAK;AACzD,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,KAA+B;AAClE,QAAMA,UAAS,MAAM,kBAAkB;AACvC,MAAI,CAACA,SAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAMA,QAAO,OAAO,GAAG;AACvB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,GAAG,KAAK,KAAK;AAC5D,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aACpB,KACA,YACA,IACY;AACZ,QAAM,SAAS,MAAM,YAAe,GAAG;AACvC,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,GAAG;AAExB,cAAY,KAAK,QAAQ,UAAU,EAAE,MAAM,SAAO;AAChD,YAAQ,MAAM,mCAAmC,GAAG;AAAA,EACtD,CAAC;AAED,SAAO;AACT;AAEA,eAAsB,gBAAkC;AACtD,QAAMA,UAAS,MAAM,kBAAkB;AACvC,MAAI,CAACA,SAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAMA,QAAO,MAAM;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":["client"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@collabdt/core",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "CDT Core contains all the core technology for your CDT platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -180,6 +180,9 @@
180
180
  "eslint-formatter-summary": "^2.0.2",
181
181
  "eslint-import-resolver-typescript": "^3.10.1",
182
182
  "eslint-plugin-import": "^2.32.0",
183
+ "eslint-plugin-jsx-a11y": "^6.10.2",
184
+ "eslint-plugin-react": "^7.37.5",
185
+ "eslint-plugin-react-hooks": "^5.2.0",
183
186
  "eslint-plugin-sonarjs": "^3.0.4",
184
187
  "eslint-plugin-unicorn": "^60.0.0",
185
188
  "framer-motion": "^12.23.24",