@ynput/ayon-frontend-shared 0.2.13 → 0.2.15

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 (382) hide show
  1. package/dist/DetailsPanel.cjs.js +8 -0
  2. package/dist/DetailsPanel.cjs.js.map +1 -1
  3. package/dist/DetailsPanel.es.js +8 -0
  4. package/dist/DetailsPanel.es.js.map +1 -1
  5. package/dist/ProjectTreeTable.cjs.js +5 -0
  6. package/dist/ProjectTreeTable.cjs.js.map +1 -1
  7. package/dist/ProjectTreeTable.es.js +5 -0
  8. package/dist/ProjectTreeTable.es.js.map +1 -1
  9. package/dist/Slicer.cjs.js +2 -0
  10. package/dist/Slicer.cjs.js.map +1 -1
  11. package/dist/Slicer.es.js +3 -1
  12. package/dist/Slicer.es.js.map +1 -1
  13. package/dist/_virtual/index.cjs10.js +3 -5
  14. package/dist/_virtual/index.cjs10.js.map +1 -1
  15. package/dist/_virtual/index.cjs7.js +5 -3
  16. package/dist/_virtual/index.cjs7.js.map +1 -1
  17. package/dist/_virtual/index.cjs8.js +4 -4
  18. package/dist/_virtual/index.cjs9.js +4 -4
  19. package/dist/_virtual/index.es10.js +2 -5
  20. package/dist/_virtual/index.es10.js.map +1 -1
  21. package/dist/_virtual/index.es7.js +5 -2
  22. package/dist/_virtual/index.es7.js.map +1 -1
  23. package/dist/_virtual/index.es8.js +4 -4
  24. package/dist/_virtual/index.es9.js +4 -4
  25. package/dist/api.cjs.js +2 -0
  26. package/dist/api.cjs.js.map +1 -1
  27. package/dist/api.es.js +3 -1
  28. package/dist/components.cjs.js +15 -0
  29. package/dist/components.cjs.js.map +1 -1
  30. package/dist/components.es.js +16 -1
  31. package/dist/components.es.js.map +1 -1
  32. package/dist/context.cjs.js +4 -0
  33. package/dist/context.cjs.js.map +1 -1
  34. package/dist/context.es.js +4 -0
  35. package/dist/context.es.js.map +1 -1
  36. package/dist/index.cjs.js +8 -0
  37. package/dist/index.cjs.js.map +1 -1
  38. package/dist/index.es.js +8 -0
  39. package/dist/index.es.js.map +1 -1
  40. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
  41. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  42. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  43. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  44. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  45. package/dist/node_modules/remove-accents/index.es.js +1 -1
  46. package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
  47. package/dist/node_modules/vfile/lib/index.es.js +1 -1
  48. package/dist/shared/src/api/generated/actions.cjs.js.map +1 -1
  49. package/dist/shared/src/api/generated/actions.es.js.map +1 -1
  50. package/dist/shared/src/api/generated/addons.cjs.js.map +1 -1
  51. package/dist/shared/src/api/generated/addons.es.js.map +1 -1
  52. package/dist/shared/src/api/generated/anatomy.cjs.js.map +1 -1
  53. package/dist/shared/src/api/generated/anatomy.es.js.map +1 -1
  54. package/dist/shared/src/api/generated/attributes.cjs.js.map +1 -1
  55. package/dist/shared/src/api/generated/attributes.es.js.map +1 -1
  56. package/dist/shared/src/api/generated/configuration.cjs.js.map +1 -1
  57. package/dist/shared/src/api/generated/configuration.es.js.map +1 -1
  58. package/dist/shared/src/api/generated/entityLists.cjs.js.map +1 -1
  59. package/dist/shared/src/api/generated/entityLists.es.js.map +1 -1
  60. package/dist/shared/src/api/generated/events.cjs.js.map +1 -1
  61. package/dist/shared/src/api/generated/events.es.js.map +1 -1
  62. package/dist/shared/src/api/generated/files.cjs.js +5 -0
  63. package/dist/shared/src/api/generated/files.cjs.js.map +1 -1
  64. package/dist/shared/src/api/generated/files.es.js +5 -0
  65. package/dist/shared/src/api/generated/files.es.js.map +1 -1
  66. package/dist/shared/src/api/generated/operations.cjs.js.map +1 -1
  67. package/dist/shared/src/api/generated/operations.es.js.map +1 -1
  68. package/dist/shared/src/api/generated/projects.cjs.js +16 -0
  69. package/dist/shared/src/api/generated/projects.cjs.js.map +1 -1
  70. package/dist/shared/src/api/generated/projects.es.js +16 -0
  71. package/dist/shared/src/api/generated/projects.es.js.map +1 -1
  72. package/dist/shared/src/api/generated/reviewables.cjs.js.map +1 -1
  73. package/dist/shared/src/api/generated/reviewables.es.js.map +1 -1
  74. package/dist/shared/src/api/generated/system.cjs.js.map +1 -1
  75. package/dist/shared/src/api/generated/system.es.js.map +1 -1
  76. package/dist/shared/src/api/generated/tasks.cjs.js +8 -0
  77. package/dist/shared/src/api/generated/tasks.cjs.js.map +1 -1
  78. package/dist/shared/src/api/generated/tasks.es.js +8 -0
  79. package/dist/shared/src/api/generated/tasks.es.js.map +1 -1
  80. package/dist/shared/src/api/generated/users.cjs.js.map +1 -1
  81. package/dist/shared/src/api/generated/users.es.js.map +1 -1
  82. package/dist/shared/src/api/queries/overview/getOverview.cjs.js +66 -4
  83. package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
  84. package/dist/shared/src/api/queries/overview/getOverview.es.js +66 -4
  85. package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
  86. package/dist/shared/src/components/EntityPath/SegmentProvider.cjs.js +1 -0
  87. package/dist/shared/src/components/EntityPath/SegmentProvider.cjs.js.map +1 -1
  88. package/dist/shared/src/components/EntityPath/SegmentProvider.es.js +1 -0
  89. package/dist/shared/src/components/EntityPath/SegmentProvider.es.js.map +1 -1
  90. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js +8 -0
  91. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map +1 -1
  92. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js +8 -0
  93. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map +1 -1
  94. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js +69 -0
  95. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js.map +1 -0
  96. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js +69 -0
  97. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js.map +1 -0
  98. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +48 -0
  99. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -0
  100. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +48 -0
  101. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -0
  102. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js +102 -0
  103. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js.map +1 -0
  104. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js +102 -0
  105. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js.map +1 -0
  106. package/dist/shared/src/components/Powerpack/PricingLink.cjs.js +13 -0
  107. package/dist/shared/src/components/Powerpack/PricingLink.cjs.js.map +1 -0
  108. package/dist/shared/src/components/Powerpack/PricingLink.es.js +13 -0
  109. package/dist/shared/src/components/Powerpack/PricingLink.es.js.map +1 -0
  110. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +4 -10
  111. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
  112. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +1 -7
  113. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js.map +1 -1
  114. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +5 -1
  115. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  116. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +5 -1
  117. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  118. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.cjs.js +13 -0
  119. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.cjs.js.map +1 -0
  120. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.es.js +13 -0
  121. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.es.js.map +1 -0
  122. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +50 -0
  123. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -0
  124. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +50 -0
  125. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -0
  126. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +8 -0
  127. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  128. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +8 -0
  129. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  130. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +8 -0
  131. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  132. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +8 -0
  133. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  134. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +8 -0
  135. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  136. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +8 -0
  137. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  138. package/dist/shared/src/components/SearchFilter/filterDates.cjs.js +167 -0
  139. package/dist/shared/src/components/SearchFilter/filterDates.cjs.js.map +1 -0
  140. package/dist/shared/src/components/SearchFilter/filterDates.es.js +167 -0
  141. package/dist/shared/src/components/SearchFilter/filterDates.es.js.map +1 -0
  142. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +547 -0
  143. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -0
  144. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +547 -0
  145. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -0
  146. package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js +6 -2
  147. package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js.map +1 -1
  148. package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js +6 -2
  149. package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js.map +1 -1
  150. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +19 -3
  151. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  152. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +20 -4
  153. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  154. package/dist/shared/src/components/Thumbnail/StackedThumbnails.cjs.js +1 -0
  155. package/dist/shared/src/components/Thumbnail/StackedThumbnails.cjs.js.map +1 -1
  156. package/dist/shared/src/components/Thumbnail/StackedThumbnails.es.js +1 -0
  157. package/dist/shared/src/components/Thumbnail/StackedThumbnails.es.js.map +1 -1
  158. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +8 -0
  159. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  160. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +8 -0
  161. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  162. package/dist/shared/src/containers/Actions/Actions.cjs.js +2 -0
  163. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  164. package/dist/shared/src/containers/Actions/Actions.es.js +2 -0
  165. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  166. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +8 -0
  167. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  168. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +8 -0
  169. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  170. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +8 -0
  171. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  172. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +8 -0
  173. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  174. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +8 -0
  175. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  176. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +8 -0
  177. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  178. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +8 -0
  179. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  180. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +8 -0
  181. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  182. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +9 -1
  183. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  184. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +9 -1
  185. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  186. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js +1 -0
  187. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js.map +1 -1
  188. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js +1 -0
  189. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js.map +1 -1
  190. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.cjs.js +1 -0
  191. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.cjs.js.map +1 -1
  192. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.es.js +1 -0
  193. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.es.js.map +1 -1
  194. package/dist/shared/src/containers/Feed/Feed.cjs.js +1 -0
  195. package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
  196. package/dist/shared/src/containers/Feed/Feed.es.js +1 -0
  197. package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
  198. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +2 -1
  199. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  200. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +2 -1
  201. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  202. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.cjs.js +1 -0
  203. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.cjs.js.map +1 -1
  204. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.es.js +1 -0
  205. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.es.js.map +1 -1
  206. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js +5 -1
  207. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js.map +1 -1
  208. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js +5 -1
  209. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js.map +1 -1
  210. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.cjs.js.map +1 -1
  211. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.es.js.map +1 -1
  212. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.cjs.js +1 -0
  213. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.cjs.js.map +1 -1
  214. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.es.js +1 -0
  215. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.es.js.map +1 -1
  216. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js +22 -11
  217. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js.map +1 -1
  218. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js +22 -11
  219. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js.map +1 -1
  220. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js +6 -0
  221. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js.map +1 -1
  222. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js +6 -0
  223. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js.map +1 -1
  224. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js +3 -3
  225. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js.map +1 -1
  226. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js +3 -3
  227. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js.map +1 -1
  228. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -0
  229. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
  230. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +1 -0
  231. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
  232. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +1 -0
  233. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  234. package/dist/shared/src/containers/Feed/context/FeedContext.es.js +1 -0
  235. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  236. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js +2 -1
  237. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js.map +1 -1
  238. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.es.js +2 -1
  239. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.es.js.map +1 -1
  240. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +45 -16
  241. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  242. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +45 -16
  243. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  244. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +45 -7
  245. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  246. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +45 -7
  247. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  248. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +202 -0
  249. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -0
  250. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +202 -0
  251. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -0
  252. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +14 -6
  253. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
  254. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +14 -6
  255. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
  256. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js +11 -1
  257. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js.map +1 -1
  258. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js +11 -1
  259. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js.map +1 -1
  260. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js +22 -2
  261. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  262. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js +22 -2
  263. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  264. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.cjs.js +116 -0
  265. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.cjs.js.map +1 -0
  266. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.es.js +116 -0
  267. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.es.js.map +1 -0
  268. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js +1 -0
  269. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js.map +1 -1
  270. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js +1 -0
  271. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js.map +1 -1
  272. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.cjs.js +1 -1
  273. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.cjs.js.map +1 -1
  274. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.es.js +1 -1
  275. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.es.js.map +1 -1
  276. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +137 -0
  277. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -0
  278. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +137 -0
  279. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -0
  280. package/dist/shared/src/containers/ProjectTreeTable/hooks/{useOverviewTable.cjs.js → useBuildProjectDataTable.cjs.js} +3 -3
  281. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -0
  282. package/dist/shared/src/containers/ProjectTreeTable/hooks/{useOverviewTable.es.js → useBuildProjectDataTable.es.js} +3 -3
  283. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -0
  284. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +39 -19
  285. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  286. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +39 -19
  287. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  288. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js +108 -0
  289. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js.map +1 -0
  290. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js +108 -0
  291. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js.map +1 -0
  292. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.cjs.js +29 -0
  293. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.cjs.js.map +1 -0
  294. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.es.js +30 -0
  295. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.es.js.map +1 -0
  296. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +8 -0
  297. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  298. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +8 -0
  299. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  300. package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.cjs.js +37 -0
  301. package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.cjs.js.map +1 -0
  302. package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.es.js +37 -0
  303. package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.es.js.map +1 -0
  304. package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -0
  305. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  306. package/dist/shared/src/context/DetailsPanelContext.es.js +1 -0
  307. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  308. package/dist/shared/src/context/PowerpackContext.cjs.js +65 -0
  309. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -0
  310. package/dist/shared/src/context/PowerpackContext.es.js +65 -0
  311. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -0
  312. package/dist/shared/src/hooks/useEntityUpdate.cjs.js +1 -0
  313. package/dist/shared/src/hooks/useEntityUpdate.cjs.js.map +1 -1
  314. package/dist/shared/src/hooks/useEntityUpdate.es.js +1 -0
  315. package/dist/shared/src/hooks/useEntityUpdate.es.js.map +1 -1
  316. package/dist/shared/src/util/getAttributeIcon.cjs.js +7 -1
  317. package/dist/shared/src/util/getAttributeIcon.cjs.js.map +1 -1
  318. package/dist/shared/src/util/getAttributeIcon.es.js +7 -1
  319. package/dist/shared/src/util/getAttributeIcon.es.js.map +1 -1
  320. package/dist/shared/src/util/getEntityTypeIcon.cjs.js +9 -0
  321. package/dist/shared/src/util/getEntityTypeIcon.cjs.js.map +1 -1
  322. package/dist/shared/src/util/getEntityTypeIcon.es.js +9 -0
  323. package/dist/shared/src/util/getEntityTypeIcon.es.js.map +1 -1
  324. package/dist/types/api/generated/actions.d.ts +3 -2
  325. package/dist/types/api/generated/addons.d.ts +8 -1
  326. package/dist/types/api/generated/anatomy.d.ts +1 -14
  327. package/dist/types/api/generated/attributes.d.ts +4 -2
  328. package/dist/types/api/generated/configuration.d.ts +6 -0
  329. package/dist/types/api/generated/entityLists.d.ts +2 -0
  330. package/dist/types/api/generated/events.d.ts +1 -1
  331. package/dist/types/api/generated/files.d.ts +11 -0
  332. package/dist/types/api/generated/operations.d.ts +1 -1
  333. package/dist/types/api/generated/projects.d.ts +59 -0
  334. package/dist/types/api/generated/reviewables.d.ts +1 -0
  335. package/dist/types/api/generated/system.d.ts +5 -2
  336. package/dist/types/api/generated/tasks.d.ts +48 -9
  337. package/dist/types/api/generated/users.d.ts +1 -4
  338. package/dist/types/api/queries/overview/getOverview.d.ts +350 -482
  339. package/dist/types/api/queries/project/getProject.d.ts +6 -0
  340. package/dist/types/components/Powerpack/PowerpackButton.d.ts +7 -0
  341. package/dist/types/components/Powerpack/PowerpackDialog.d.ts +4 -0
  342. package/dist/types/components/Powerpack/PowerpackDialog.styled.d.ts +8 -0
  343. package/dist/types/components/Powerpack/PricingLink.d.ts +4 -0
  344. package/dist/types/components/Powerpack/index.d.ts +3 -0
  345. package/dist/types/components/ProjectTableSettings/ProjectTableSettings.d.ts +2 -1
  346. package/dist/types/components/ProjectTableSettings/TableSettings.styled.d.ts +1 -0
  347. package/dist/types/components/ProjectTableSettings/TableSettingsFallback.d.ts +10 -0
  348. package/dist/types/components/ProjectTableSettings/index.d.ts +1 -0
  349. package/dist/types/components/SearchFilter/filterDates.d.ts +56 -0
  350. package/dist/types/components/SearchFilter/index.d.ts +2 -0
  351. package/dist/types/components/SearchFilter/useBuildFilterOptions.d.ts +30 -0
  352. package/dist/types/components/index.d.ts +2 -0
  353. package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.d.ts +1 -1
  354. package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.d.ts +1 -1
  355. package/dist/types/containers/Feed/components/FileUploadCard/FileUploadCard.d.ts +4 -3
  356. package/dist/types/containers/ProjectTreeTable/ProjectTreeTable.d.ts +5 -1
  357. package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +3 -1
  358. package/dist/types/containers/ProjectTreeTable/components/GroupSettingsFallback.d.ts +11 -0
  359. package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsContext.d.ts +7 -0
  360. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +11 -5
  361. package/dist/types/containers/ProjectTreeTable/context/ProjectTableModulesContext.d.ts +12 -0
  362. package/dist/types/containers/ProjectTreeTable/context/index.d.ts +1 -0
  363. package/dist/types/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.d.ts +25 -0
  364. package/dist/types/containers/ProjectTreeTable/hooks/{useOverviewTable.d.ts → useBuildProjectDataTable.d.ts} +3 -1
  365. package/dist/types/containers/ProjectTreeTable/hooks/useCellContextMenu.d.ts +2 -0
  366. package/dist/types/containers/ProjectTreeTable/hooks/useFolderRelationships.d.ts +1 -1
  367. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +13 -5
  368. package/dist/types/containers/ProjectTreeTable/widgets/GroupHeaderWidget.d.ts +13 -0
  369. package/dist/types/containers/ProjectTreeTable/widgets/LoadMoreWidget.d.ts +8 -0
  370. package/dist/types/containers/ProjectTreeTable/widgets/index.d.ts +1 -0
  371. package/dist/types/containers/Slicer/index.d.ts +1 -0
  372. package/dist/types/containers/Slicer/useFiltersWithHierarchy.d.ts +10 -0
  373. package/dist/types/context/PowerpackContext.d.ts +20 -0
  374. package/dist/types/context/index.d.ts +1 -0
  375. package/dist/types/util/getAttributeIcon.d.ts +1 -1
  376. package/dist/types/util/getEntityTypeIcon.d.ts +1 -0
  377. package/dist/util.cjs.js +1 -0
  378. package/dist/util.cjs.js.map +1 -1
  379. package/dist/util.es.js +2 -1
  380. package/package.json +1 -1
  381. package/dist/shared/src/containers/ProjectTreeTable/hooks/useOverviewTable.cjs.js.map +0 -1
  382. package/dist/shared/src/containers/ProjectTreeTable/hooks/useOverviewTable.es.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { j as jsxRuntimeExports } from "../../../../../_virtual/jsx-runtime.es.js";
2
+ import { createContext, useContext } from "react";
3
+ import { useLoadModule } from "../../../hooks/useLoadModule.es.js";
4
+ import "../../../../../_virtual/runtime.es.js";
5
+ import "../../../../../_virtual/semver.es.js";
6
+ import "../../../api/base/client.es.js";
7
+ import "../../../api/generated/graphql.es.js";
8
+ import "../../../api/generated/access.es.js";
9
+ import "../../../api/generated/actions.es.js";
10
+ import "../../../api/generated/activityFeed.es.js";
11
+ import "../../../api/generated/addons.es.js";
12
+ import "../../../api/generated/anatomy.es.js";
13
+ import "../../../api/generated/attributes.es.js";
14
+ import "../../../api/generated/authentication.es.js";
15
+ import "../../../api/generated/bundles.es.js";
16
+ import "../../../api/generated/configuration.es.js";
17
+ import "../../../api/generated/desktop.es.js";
18
+ import "../../../api/generated/entityLists.es.js";
19
+ import "../../../api/generated/events.es.js";
20
+ import "../../../api/generated/files.es.js";
21
+ import "../../../api/generated/folders.es.js";
22
+ import "../../../api/generated/inbox.es.js";
23
+ import "../../../api/generated/links.es.js";
24
+ import "../../../api/generated/market.es.js";
25
+ import "../../../api/generated/onboarding.es.js";
26
+ import "../../../api/generated/operations.es.js";
27
+ import "../../../api/generated/products.es.js";
28
+ import "../../../api/generated/projectDashboard.es.js";
29
+ import "../../../api/generated/projects.es.js";
30
+ import "../../../api/generated/reviewables.es.js";
31
+ import "../../../api/generated/services.es.js";
32
+ import "../../../api/generated/system.es.js";
33
+ import "../../../api/generated/tasks.es.js";
34
+ import "../../../api/generated/teams.es.js";
35
+ import "../../../api/generated/thumbnails.es.js";
36
+ import "../../../api/generated/uRIs.es.js";
37
+ import "../../../api/generated/users.es.js";
38
+ import "../../../api/generated/versions.es.js";
39
+ import "../../../api/generated/workfiles.es.js";
40
+ import "../../../api/generated/ynputCloud.es.js";
41
+ import "../../../api/queries/actions/getActions.es.js";
42
+ import "../../../api/queries/activities/getActivities.es.js";
43
+ import "../../../api/queries/activities/updateActivities.es.js";
44
+ import "../../../api/queries/activities/updateReaction.es.js";
45
+ import "../../../api/queries/activities/getMentions.es.js";
46
+ import "../../../api/queries/addons/getAddons.es.js";
47
+ import "../../../api/queries/addons/updateAddons.es.js";
48
+ import "../../../api/queries/attributes/getAttributes.es.js";
49
+ import "../../../api/queries/attributes/updateAttributes.es.js";
50
+ import "../../../api/queries/authentication/getAuthentication.es.js";
51
+ import "../../../api/queries/entities/getEntity.es.js";
52
+ import "../../../api/queries/entities/getEntityPanel.es.js";
53
+ import "../../../api/queries/entities/updateEntity.es.js";
54
+ import "../../../api/queries/entityLists/getLists.es.js";
55
+ import "../../../api/queries/entityLists/updateLists.es.js";
56
+ import "../../../api/queries/entityLists/getListsAttributes.es.js";
57
+ import "../../../api/queries/entityLists/updateListsAttributes.es.js";
58
+ import "../../../api/queries/folders/getFolders.es.js";
59
+ import "../../../api/queries/overview/getOverview.es.js";
60
+ import "../../../api/queries/overview/updateOverview.es.js";
61
+ import "../../../api/queries/project/getProject.es.js";
62
+ import "../../../api/queries/project/updateProject.es.js";
63
+ import "../../../api/queries/review/getReview.es.js";
64
+ import "../../../api/queries/review/updateReview.es.js";
65
+ import "../../../api/queries/system/getSystem.es.js";
66
+ import "../../../api/queries/userDashboard/getUserDashboard.es.js";
67
+ import "../../../api/queries/users/getUsers.es.js";
68
+ import "../../../api/queries/users/updateUsers.es.js";
69
+ import "../../../api/queries/watchers/getWatchers.es.js";
70
+ import "../../../api/queries/permissions/getPermissions.es.js";
71
+ import "lodash";
72
+ import "react-toastify";
73
+ import "../../../context/RemoteModulesContext.es.js";
74
+ import "../../../context/DetailsPanelContext.es.js";
75
+ import "../../../context/ThumbnailUploaderContext.es.js";
76
+ import "../../../context/SettingsPanelContext.es.js";
77
+ import "../../../context/pip/PiPProvider.es.js";
78
+ import "react-dom";
79
+ import "../../../context/pip/PiPWrapper.es.js";
80
+ import "../../../context/AddonProjectContext.es.js";
81
+ import "../../../context/AddonContext.es.js";
82
+ import "../../../context/PowerpackContext.es.js";
83
+ import "react-redux";
84
+ import "custom-protocol-check";
85
+ import { GroupSettingsFallback } from "../components/GroupSettingsFallback.es.js";
86
+ const ProjectTableModuleContext = createContext(
87
+ void 0
88
+ );
89
+ const ProjectTableModuleProvider = ({
90
+ children
91
+ }) => {
92
+ const [GroupSettings, { outdated }] = useLoadModule({
93
+ addon: "powerpack",
94
+ remote: "slicer",
95
+ module: "GroupSettings",
96
+ fallback: GroupSettingsFallback,
97
+ minVersion: "1.0.6-dev"
98
+ });
99
+ const value = {
100
+ GroupSettings,
101
+ requiredVersion: outdated == null ? void 0 : outdated.required
102
+ };
103
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ProjectTableModuleContext.Provider, { value, children });
104
+ };
105
+ const useProjectTableModuleContext = () => {
106
+ const context = useContext(ProjectTableModuleContext);
107
+ if (context === void 0) {
108
+ throw new Error("useProjectTableModuleContext must be used within a ProjectTableModuleProvider");
109
+ }
110
+ return context;
111
+ };
112
+ export {
113
+ ProjectTableModuleProvider,
114
+ useProjectTableModuleContext
115
+ };
116
+ //# sourceMappingURL=ProjectTableModulesContext.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectTableModulesContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/ProjectTableModulesContext.tsx"],"sourcesContent":["import { useLoadModule } from '@shared/hooks'\nimport React, { createContext, useContext, ReactNode, FC } from 'react'\nimport { GroupSettingsFallback } from '../components/GroupSettingsFallback'\n\ninterface ProjectTableModuleContextType {\n GroupSettings: typeof GroupSettingsFallback\n requiredVersion?: string\n}\n\nconst ProjectTableModuleContext = createContext<ProjectTableModuleContextType | undefined>(\n undefined,\n)\n\ninterface ProjectTableModuleProviderProps {\n children: ReactNode\n}\n\nexport const ProjectTableModuleProvider: React.FC<ProjectTableModuleProviderProps> = ({\n children,\n}) => {\n const [GroupSettings, { outdated }] = useLoadModule({\n addon: 'powerpack',\n remote: 'slicer',\n module: 'GroupSettings',\n fallback: GroupSettingsFallback,\n minVersion: '1.0.6-dev',\n })\n\n const value = {\n GroupSettings,\n requiredVersion: outdated?.required,\n }\n\n return (\n <ProjectTableModuleContext.Provider value={value}>\n {children}\n </ProjectTableModuleContext.Provider>\n )\n}\n\nexport const useProjectTableModuleContext = (): ProjectTableModuleContextType => {\n const context = useContext(ProjectTableModuleContext)\n if (context === undefined) {\n throw new Error('useProjectTableModuleContext must be used within a ProjectTableModuleProvider')\n }\n return context\n}\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,4BAA4B;AAAA,EAChC;AACF;AAMO,MAAM,6BAAwE,CAAC;AAAA,EACpF;AACF,MAAM;AACJ,QAAM,CAAC,eAAe,EAAE,SAAU,CAAA,IAAI,cAAc;AAAA,IAClD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,EAAA,CACb;AAED,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,iBAAiB,qCAAU;AAAA,EAC7B;AAEA,SACGA,kCAAAA,IAAA,0BAA0B,UAA1B,EAAmC,OACjC,SACH,CAAA;AAEJ;AAEO,MAAM,+BAA+B,MAAqC;AACzE,QAAA,UAAU,WAAW,yBAAyB;AACpD,MAAI,YAAY,QAAW;AACnB,UAAA,IAAI,MAAM,+EAA+E;AAAA,EAAA;AAE1F,SAAA;AACT;"}
@@ -197,6 +197,7 @@ const SelectionCellsProvider = ({ children }) => {
197
197
  const clearSelection = React.useCallback(() => {
198
198
  setSelectedCells(/* @__PURE__ */ new Set());
199
199
  setAnchorCell(null);
200
+ setFocusedCellId(null);
200
201
  }, []);
201
202
  const isCellSelected = React.useCallback((cellId) => selectedCells.has(cellId), [selectedCells]);
202
203
  const isCellFocused = React.useCallback((cellId) => cellId === focusedCellId, [focusedCellId]);
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCellsContext.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n ReactNode,\n useRef,\n} from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Cell range for selections\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nconst SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":["createContext","useState","useMemo","useRef","parseCellId","useCallback","DRAG_HANDLE_COLUMN_ID","getCellId","BorderPosition","getBorderClasses","jsx","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionCellsContext.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n ReactNode,\n useRef,\n} from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Cell range for selections\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nconst SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":["createContext","useState","useMemo","useRef","parseCellId","useCallback","DRAG_HANDLE_COLUMN_ID","getCellId","BorderPosition","getBorderClasses","jsx","useContext"],"mappings":"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"}
@@ -195,6 +195,7 @@ const SelectionCellsProvider = ({ children }) => {
195
195
  const clearSelection = useCallback(() => {
196
196
  setSelectedCells(/* @__PURE__ */ new Set());
197
197
  setAnchorCell(null);
198
+ setFocusedCellId(null);
198
199
  }, []);
199
200
  const isCellSelected = useCallback((cellId) => selectedCells.has(cellId), [selectedCells]);
200
201
  const isCellFocused = useCallback((cellId) => cellId === focusedCellId, [focusedCellId]);
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCellsContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n ReactNode,\n useRef,\n} from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Cell range for selections\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nconst SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":["jsx"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionCellsContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n ReactNode,\n useRef,\n} from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Cell range for selections\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nconst SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":["jsx"],"mappings":";;;;AAqBO,MAAM,0BAA0B;AA6CvC,MAAM,wBAAwB,cAAqD,MAAS;AAErF,MAAM,yBAA4D,CAAC,EAAE,eAAe;AACzF,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAsB,oBAAI,KAAK;AACzE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,IAAI;AACtE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAkB,KAAK;AAC7E,QAAM,CAAC,YAAY,aAAa,IAAI,SAA8B,IAAI;AACtE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB;AAAA,IAC9C,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,EAAA,CACvB;AACK,QAAA,cAAc,CAAC,QAAuB;AAC1C,WAAO,KAAK,UAAU,MAAM,KAAK,IAAI,QAAA,CAAS,CAAC;AAAA,EACjD;AAEA,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,MACE,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,IAAA;AAAA,EAEpC;AAEM,QAAA,sBAAsB,OAAgB,KAAK;AAEjD,QAAM,eAAe;AAAA,IACnB,MACE,MAAM,KAAK,aAAa,EACrB;AAAA,MACC,CAAC;;AACC,kCAAY,MAAM,MAAlB,mBAAqB,WAAU,6BAA2B,iBAAY,MAAM,MAAlB,mBAAqB;AAAA;AAAA,IAAA,EAElF,IAAI,CAAC;;AAAW,+BAAY,MAAM,MAAlB,mBAAqB;AAAA,KAAK;AAAA,IAC/C,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,eAAe,YAAY,CAAC,MAAe,YAAqB;AAC9D,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AAEvC,SAAA,QAAQ,CAAC,OAAO,UAAU;AAChB,mBAAA,IAAI,OAAO,KAAK;AAChB,mBAAA,IAAI,OAAO,KAAK;AAAA,IAAA,CAC9B;AAEO,YAAA,QAAQ,CAAC,OAAO,UAAU;AACnB,mBAAA,IAAI,OAAO,KAAK;AAChB,mBAAA,IAAI,OAAO,KAAK;AAAA,IAAA,CAC9B;AAED,eAAW,EAAE,cAAc,cAAc,cAAc,cAAc;AAAA,EACvE,GAAG,EAAE;AAGL,QAAM,kBAAkB,YAAY,CAAC,WAAwB,aAA2B;AACtF,qBAAiB,CAAC,sBAAsB;AAClC,UAAA,eAAe,IAAI,IAAI,SAAS;AACpC,UAAI,SAAS,UAAU,2BAA2B,SAAS,UAAU,uBAAuB;AAC1F,cAAM,eAAe,MAAM,KAAK,iBAAiB,EAAE;AAAA,UACjD,CAAC,OAAO;;AAAA,sCAAY,EAAE,MAAd,mBAAiB,WAAU;AAAA;AAAA,QACrC;AACA,YAAI,aAAa,QAAQ;AACvB,6CAAmB,IAAI,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAAA,QAAA;AAAA,MAC3D;AAEK,aAAA;AAAA,IAAA,CACR;AAAA,EACH,GAAG,EAAE;AAGL,QAAM,kBAAkB;AAAA,IACtB,CAAC,OAAqB,KAAmB,aAAmC;AAC1E,UAAI,CAAC,UAAU;AAEG,wBAAA,oBAAI,IAAI,GAAG,KAAK;AAAA,MAAA;AAGlC,YAAM,cAAc,cAAc,aAAa,IAAI,MAAM,KAAK,KAAK;AACnE,YAAM,cAAc,cAAc,aAAa,IAAI,MAAM,KAAK,KAAK;AACnE,YAAM,YAAY,cAAc,aAAa,IAAI,IAAI,KAAK,KAAK;AAC/D,YAAM,YAAY,cAAc,aAAa,IAAI,IAAI,KAAK,KAAK;AAE/D,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AAEjD,YAAM,eAAe,IAAI,IAAI,WAAW,gBAAgB,CAAA,CAAE;AAE1D,eAAS,IAAI,WAAW,KAAK,WAAW,KAAK;AAC3C,cAAM,QAAQ,cAAc,aAAa,IAAI,CAAC;AAC9C,YAAI,CAAC,MAAO;AAEZ,iBAAS,IAAI,WAAW,KAAK,WAAW,KAAK;AAC3C,gBAAM,QAAQ,cAAc,aAAa,IAAI,CAAC;AAC9C,cAAI,CAAC,MAAO;AAEZ,uBAAa,IAAI,UAAU,OAAO,KAAK,CAAC;AAAA,QAAA;AAAA,MAC1C;AAGK,aAAA;AAAA,IACT;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAGA,QAAM,iBAAiB;AAAA,IACrB,CAAC,QAAgB,aAAsB;AAC/B,YAAA,WAAW,YAAY,MAAM;AACnC,UAAI,CAAC,SAAU;AAEf,6BAAuB,IAAI;AAEP,0BAAA,UAAU,cAAc,IAAI,MAAM;AAEtD,UAAI,UAAU;AAEZ,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC7B,cAAA,aAAa,IAAI,MAAM,GAAG;AAC5B,yBAAa,OAAO,MAAM;AAE1B,gBAAI,kBAAkB,QAAQ;AACxB,kBAAA,aAAa,OAAO,GAAG;AACR,iCAAA,MAAM,KAAK,YAAY,EAAE,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,cAAA,OACzE;AACL,iCAAiB,IAAI;AAAA,cAAA;AAAA,YACvB;AAAA,UACF,OACK;AACL,yBAAa,IAAI,MAAM;AACvB,6BAAiB,MAAM;AACvB,0BAAc,QAAQ;AAAA,UAAA;AAEjB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAIL,YACE,cAAc,SAAS,KACvB,cAAc,IAAI,MAAM,KACxB,CAAC,yBAAyB,MAAM,EAAE,SAAS,SAAS,KAAK,GACzD;AACiB,2BAAA,oBAAI,KAAK;AAC1B,wBAAc,IAAI;AAClB,2BAAiB,IAAI;AAAA,QAAA,OAChB;AACL,8CAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ;AAC3C,wBAAc,QAAQ;AACtB,2BAAiB,MAAM;AAAA,QAAA;AAAA,MACzB;AAAA,IAEJ;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAGA,QAAM,kBAAkB;AAAA,IACtB,CAAC,QAAgB,yBAAmC;AAC9C,UAAA,CAAC,uBAAuB,CAAC,WAAY;AAEnC,YAAA,kBAAkB,YAAY,MAAM;AAC1C,UAAI,CAAC,gBAAiB;AAEtB,UAAI,sBAAsB;AAExB,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC3B,gBAAA,WAAW,YAAY,MAAM;AAE/B,cAAA,CAAC,SAAiB,QAAA;AAGtB,cAAI,oBAAoB,SAAS;AAE/B,yBAAa,OAAO,MAAM;AAAA,UAAA,OACrB;AAEL,yBAAa,IAAI,MAAM;AAAA,UAAA;AAGlB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAEL,cAAM,eAAe,gBAAgB,YAAY,iBAAiB,KAAK;AACvE,wBAAgB,cAAc,eAAe;AAAA,MAAA;AAAA,IAEjD;AAAA,IACA,CAAC,qBAAqB,YAAY,eAAe;AAAA,EACnD;AAGM,QAAA,eAAe,YAAY,MAAM;AACrC,2BAAuB,KAAK;AAAA,EAC9B,GAAG,EAAE;AAGL,QAAM,aAAa;AAAA,IACjB,CAAC,QAAgB,UAAmB,UAAmB;AAC/C,YAAA,WAAW,YAAY,MAAM;AACnC,UAAI,CAAC,SAAU;AAEf,UAAI,SAAS,YAAY;AAEvB,cAAM,eAAe,gBAAgB,YAAY,UAAU,QAAQ;AACnE,wBAAgB,cAAc,QAAQ;AAAA,iBAC7B,UAAU;AAEnB,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC7B,cAAA,aAAa,IAAI,MAAM,GAAG;AAC5B,yBAAa,OAAO,MAAM;AAAA,UAAA,OACrB;AACL,yBAAa,IAAI,MAAM;AAAA,UAAA;AAElB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAEL,4CAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ;AAC3C,sBAAc,QAAQ;AAAA,MAAA;AAAA,IAE1B;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AAGM,QAAA,YAAY,YAAY,CAAC,WAA0B;AACvD,qBAAiB,MAAM;AAAA,EACzB,GAAG,EAAE;AAGC,QAAA,iBAAiB,YAAY,MAAM;AACtB,qBAAA,oBAAI,KAAK;AAC1B,kBAAc,IAAI;AAClB,qBAAiB,IAAI;AAAA,EACvB,GAAG,EAAE;AAGC,QAAA,iBAAiB,YAAY,CAAC,WAAmB,cAAc,IAAI,MAAM,GAAG,CAAC,aAAa,CAAC;AAG3F,QAAA,gBAAgB,YAAY,CAAC,WAAmB,WAAW,eAAe,CAAC,aAAa,CAAC;AAGzF,QAAA,wBAAwB,YAAY,CAAC,WAAmB,YAAY,MAAM,GAAG,EAAE;AAGrF,QAAM,uBAAuB;AAAA,IAC3B,CAAC,WAA6B;AAC5B,UAAI,CAAC,eAAe,MAAM,UAAU,CAAC;AAE/B,YAAA,WAAW,YAAY,MAAM;AAC/B,UAAA,CAAC,SAAU,QAAO,CAAC;AAEvB,YAAM,WAAW,cAAc,aAAa,IAAI,SAAS,KAAK;AAC9D,YAAM,WAAW,cAAc,aAAa,IAAI,SAAS,KAAK;AAE9D,UAAI,aAAa,UAAa,aAAa,eAAkB,CAAC;AAG9D,YAAM,MAAM,cAAc,aAAa,IAAI,WAAW,CAAC;AACvD,YAAM,QAAQ,cAAc,aAAa,IAAI,WAAW,CAAC;AACzD,YAAM,SAAS,cAAc,aAAa,IAAI,WAAW,CAAC;AAC1D,YAAM,OAAO,cAAc,aAAa,IAAI,WAAW,CAAC;AAGxD,UAAI,YAAY,eAAe;AAG3B,UAAA,CAAC,OAAO,CAAC,cAAc,IAAI,UAAU,KAAK,SAAS,KAAK,CAAC,GAAG;AAC9D,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,SAAS,CAAC,cAAc,IAAI,UAAU,SAAS,OAAO,KAAK,CAAC,GAAG;AAClE,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,UAAU,CAAC,cAAc,IAAI,UAAU,QAAQ,SAAS,KAAK,CAAC,GAAG;AACpE,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,QAAQ,CAAC,cAAc,IAAI,UAAU,SAAS,OAAO,IAAI,CAAC,GAAG;AAChE,qBAAa,eAAe;AAAA,MAAA;AAG9B,aAAO,iBAAiB,SAAS;AAAA,IACnC;AAAA,IACA,CAAC,eAAe,eAAe,cAAc;AAAA,EAC/C;AAGA,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAQA,kCAAAA,IAAA,sBAAsB,UAAtB,EAA+B,OAAe,SAAS,CAAA;AACjE;AAEO,MAAM,2BAA2B,MAAiC;AACjE,QAAA,UAAU,WAAW,qBAAqB;AAChD,MAAI,YAAY,QAAW;AACnB,UAAA,IAAI,MAAM,uEAAuE;AAAA,EAAA;AAElF,SAAA;AACT;"}
@@ -21,7 +21,7 @@ const validateClipboardData = (params) => {
21
21
  }
22
22
  if (colId === "assignees") {
23
23
  const assigneeValues = pasteValue.split(",").map((v) => v.trim());
24
- const assigneeOptions = columnEnums["assignees"] || [];
24
+ const assigneeOptions = columnEnums["assignee"] || [];
25
25
  const validAssignees = assigneeValues.filter(
26
26
  (v) => assigneeOptions.some((opt) => opt.value === v || opt.label === v)
27
27
  );
@@ -1 +1 @@
1
- {"version":3,"file":"clipboardValidation.cjs.js","sources":["../../../../../../../src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.ts"],"sourcesContent":["import { ColumnEnums, builtInFieldMappings, ParsedClipboardData } from './clipboardTypes'\nimport { clipboardError } from './clipboardUtils'\n\n// Validate clipboard data for enum fields and handle special cases\nexport const validateClipboardData = (params: {\n colId: string\n isFolder: boolean\n pasteValue: string\n parsedData: ParsedClipboardData[]\n columnEnums: ColumnEnums\n columnReadOnly: string[]\n rowIndex: number\n colIndex: number\n isSingleCellValue: boolean\n}): boolean => {\n const {\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex,\n isSingleCellValue,\n } = params\n\n // Skip validation for empty values\n if (!pasteValue) return true\n\n // Check if the column is read-only\n if (colId.startsWith('attrib_') && columnReadOnly.includes(colId.replace('attrib_', ''))) {\n clipboardError(`This column is read-only: \"${colId}\". Paste operation cancelled.`)\n return false\n }\n\n // Special handling for assignees - filter out invalid values instead of canceling\n if (colId === 'assignees') {\n // Split assignees by comma\n const assigneeValues = pasteValue.split(',').map((v) => v.trim())\n\n // Get assignee options from columnEnums\n const assigneeOptions = columnEnums['assignees'] || []\n\n // Filter to keep only valid assignees\n const validAssignees = assigneeValues.filter((v) =>\n assigneeOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n // Update the paste value in the parsed data\n if (isSingleCellValue) {\n parsedData[0].values[0] = validAssignees.join(', ')\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n const pasteColIndex = colIndex % parsedData[pasteRowIndex].values.length\n parsedData[pasteRowIndex].values[pasteColIndex] = validAssignees.join(', ')\n }\n\n return true\n }\n\n // Map subType to the actual field name\n let fieldId = colId === 'subType' ? (isFolder ? 'folderType' : 'taskType') : colId\n // Check if fieldId has a mapping to plural enum\n fieldId = builtInFieldMappings[fieldId as keyof typeof builtInFieldMappings] || fieldId\n\n // Skip validation for fields that don't have enums\n if (!(fieldId in columnEnums)) return true\n\n // Get the enum values for this field\n const enumOptions = columnEnums[fieldId as keyof typeof columnEnums]\n\n // Skip if no enum options are available\n if (!Array.isArray(enumOptions) || enumOptions.length === 0) return true\n\n // Check if the pasted value exists in the enum options\n const enumValues = pasteValue.split(',').map((v) => v.trim())\n const valueExists = enumValues.every((v) =>\n enumOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n if (!valueExists) {\n // Get a display name for the field (folderType/taskType → Type)\n const displayName =\n fieldId === 'folderType' || fieldId === 'taskType'\n ? `${isFolder ? 'folder' : 'task'} type`\n : fieldId\n\n clipboardError(`Invalid ${displayName} value: \"${pasteValue}\". Paste operation cancelled.`)\n return false\n }\n\n return true\n}\n"],"names":["clipboardError","builtInFieldMappings"],"mappings":";;;;AAIa,MAAA,wBAAwB,CAAC,WAUvB;AACP,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGA,MAAA,CAAC,WAAmB,QAAA;AAGpB,MAAA,MAAM,WAAW,SAAS,KAAK,eAAe,SAAS,MAAM,QAAQ,WAAW,EAAE,CAAC,GAAG;AACzEA,mBAAAA,eAAA,8BAA8B,KAAK,+BAA+B;AAC1E,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,aAAa;AAEnB,UAAA,iBAAiB,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAGhE,UAAM,kBAAkB,YAAY,WAAW,KAAK,CAAC;AAGrD,UAAM,iBAAiB,eAAe;AAAA,MAAO,CAAC,MAC5C,gBAAgB,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,IAClE;AAGA,QAAI,mBAAmB;AACrB,iBAAW,CAAC,EAAE,OAAO,CAAC,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA,OAC7C;AACC,YAAA,gBAAgB,WAAW,WAAW;AAC5C,YAAM,gBAAgB,WAAW,WAAW,aAAa,EAAE,OAAO;AAClE,iBAAW,aAAa,EAAE,OAAO,aAAa,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA;AAGrE,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,UAAU,YAAa,WAAW,eAAe,aAAc;AAEnE,YAAAC,eAAAA,qBAAqB,OAA4C,KAAK;AAG5E,MAAA,EAAE,WAAW,aAAqB,QAAA;AAGhC,QAAA,cAAc,YAAY,OAAmC;AAG/D,MAAA,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,EAAU,QAAA;AAG9D,QAAA,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC5D,QAAM,cAAc,WAAW;AAAA,IAAM,CAAC,MACpC,YAAY,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa;AAEV,UAAA,cACJ,YAAY,gBAAgB,YAAY,aACpC,GAAG,WAAW,WAAW,MAAM,UAC/B;AAEND,mBAAA,eAAe,WAAW,WAAW,YAAY,UAAU,+BAA+B;AACnF,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;;"}
1
+ {"version":3,"file":"clipboardValidation.cjs.js","sources":["../../../../../../../src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.ts"],"sourcesContent":["import { ColumnEnums, builtInFieldMappings, ParsedClipboardData } from './clipboardTypes'\nimport { clipboardError } from './clipboardUtils'\n\n// Validate clipboard data for enum fields and handle special cases\nexport const validateClipboardData = (params: {\n colId: string\n isFolder: boolean\n pasteValue: string\n parsedData: ParsedClipboardData[]\n columnEnums: ColumnEnums\n columnReadOnly: string[]\n rowIndex: number\n colIndex: number\n isSingleCellValue: boolean\n}): boolean => {\n const {\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex,\n isSingleCellValue,\n } = params\n\n // Skip validation for empty values\n if (!pasteValue) return true\n\n // Check if the column is read-only\n if (colId.startsWith('attrib_') && columnReadOnly.includes(colId.replace('attrib_', ''))) {\n clipboardError(`This column is read-only: \"${colId}\". Paste operation cancelled.`)\n return false\n }\n\n // Special handling for assignees - filter out invalid values instead of canceling\n if (colId === 'assignees') {\n // Split assignees by comma\n const assigneeValues = pasteValue.split(',').map((v) => v.trim())\n\n // Get assignee options from columnEnums\n const assigneeOptions = columnEnums['assignee'] || []\n\n // Filter to keep only valid assignees\n const validAssignees = assigneeValues.filter((v) =>\n assigneeOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n // Update the paste value in the parsed data\n if (isSingleCellValue) {\n parsedData[0].values[0] = validAssignees.join(', ')\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n const pasteColIndex = colIndex % parsedData[pasteRowIndex].values.length\n parsedData[pasteRowIndex].values[pasteColIndex] = validAssignees.join(', ')\n }\n\n return true\n }\n\n // Map subType to the actual field name\n let fieldId = colId === 'subType' ? (isFolder ? 'folderType' : 'taskType') : colId\n // Check if fieldId has a mapping to plural enum\n fieldId = builtInFieldMappings[fieldId as keyof typeof builtInFieldMappings] || fieldId\n\n // Skip validation for fields that don't have enums\n if (!(fieldId in columnEnums)) return true\n\n // Get the enum values for this field\n const enumOptions = columnEnums[fieldId as keyof typeof columnEnums]\n\n // Skip if no enum options are available\n if (!Array.isArray(enumOptions) || enumOptions.length === 0) return true\n\n // Check if the pasted value exists in the enum options\n const enumValues = pasteValue.split(',').map((v) => v.trim())\n const valueExists = enumValues.every((v) =>\n enumOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n if (!valueExists) {\n // Get a display name for the field (folderType/taskType → Type)\n const displayName =\n fieldId === 'folderType' || fieldId === 'taskType'\n ? `${isFolder ? 'folder' : 'task'} type`\n : fieldId\n\n clipboardError(`Invalid ${displayName} value: \"${pasteValue}\". Paste operation cancelled.`)\n return false\n }\n\n return true\n}\n"],"names":["clipboardError","builtInFieldMappings"],"mappings":";;;;AAIa,MAAA,wBAAwB,CAAC,WAUvB;AACP,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGA,MAAA,CAAC,WAAmB,QAAA;AAGpB,MAAA,MAAM,WAAW,SAAS,KAAK,eAAe,SAAS,MAAM,QAAQ,WAAW,EAAE,CAAC,GAAG;AACzEA,mBAAAA,eAAA,8BAA8B,KAAK,+BAA+B;AAC1E,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,aAAa;AAEnB,UAAA,iBAAiB,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAGhE,UAAM,kBAAkB,YAAY,UAAU,KAAK,CAAC;AAGpD,UAAM,iBAAiB,eAAe;AAAA,MAAO,CAAC,MAC5C,gBAAgB,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,IAClE;AAGA,QAAI,mBAAmB;AACrB,iBAAW,CAAC,EAAE,OAAO,CAAC,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA,OAC7C;AACC,YAAA,gBAAgB,WAAW,WAAW;AAC5C,YAAM,gBAAgB,WAAW,WAAW,aAAa,EAAE,OAAO;AAClE,iBAAW,aAAa,EAAE,OAAO,aAAa,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA;AAGrE,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,UAAU,YAAa,WAAW,eAAe,aAAc;AAEnE,YAAAC,eAAAA,qBAAqB,OAA4C,KAAK;AAG5E,MAAA,EAAE,WAAW,aAAqB,QAAA;AAGhC,QAAA,cAAc,YAAY,OAAmC;AAG/D,MAAA,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,EAAU,QAAA;AAG9D,QAAA,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC5D,QAAM,cAAc,WAAW;AAAA,IAAM,CAAC,MACpC,YAAY,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa;AAEV,UAAA,cACJ,YAAY,gBAAgB,YAAY,aACpC,GAAG,WAAW,WAAW,MAAM,UAC/B;AAEND,mBAAA,eAAe,WAAW,WAAW,YAAY,UAAU,+BAA+B;AACnF,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;;"}
@@ -19,7 +19,7 @@ const validateClipboardData = (params) => {
19
19
  }
20
20
  if (colId === "assignees") {
21
21
  const assigneeValues = pasteValue.split(",").map((v) => v.trim());
22
- const assigneeOptions = columnEnums["assignees"] || [];
22
+ const assigneeOptions = columnEnums["assignee"] || [];
23
23
  const validAssignees = assigneeValues.filter(
24
24
  (v) => assigneeOptions.some((opt) => opt.value === v || opt.label === v)
25
25
  );
@@ -1 +1 @@
1
- {"version":3,"file":"clipboardValidation.es.js","sources":["../../../../../../../src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.ts"],"sourcesContent":["import { ColumnEnums, builtInFieldMappings, ParsedClipboardData } from './clipboardTypes'\nimport { clipboardError } from './clipboardUtils'\n\n// Validate clipboard data for enum fields and handle special cases\nexport const validateClipboardData = (params: {\n colId: string\n isFolder: boolean\n pasteValue: string\n parsedData: ParsedClipboardData[]\n columnEnums: ColumnEnums\n columnReadOnly: string[]\n rowIndex: number\n colIndex: number\n isSingleCellValue: boolean\n}): boolean => {\n const {\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex,\n isSingleCellValue,\n } = params\n\n // Skip validation for empty values\n if (!pasteValue) return true\n\n // Check if the column is read-only\n if (colId.startsWith('attrib_') && columnReadOnly.includes(colId.replace('attrib_', ''))) {\n clipboardError(`This column is read-only: \"${colId}\". Paste operation cancelled.`)\n return false\n }\n\n // Special handling for assignees - filter out invalid values instead of canceling\n if (colId === 'assignees') {\n // Split assignees by comma\n const assigneeValues = pasteValue.split(',').map((v) => v.trim())\n\n // Get assignee options from columnEnums\n const assigneeOptions = columnEnums['assignees'] || []\n\n // Filter to keep only valid assignees\n const validAssignees = assigneeValues.filter((v) =>\n assigneeOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n // Update the paste value in the parsed data\n if (isSingleCellValue) {\n parsedData[0].values[0] = validAssignees.join(', ')\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n const pasteColIndex = colIndex % parsedData[pasteRowIndex].values.length\n parsedData[pasteRowIndex].values[pasteColIndex] = validAssignees.join(', ')\n }\n\n return true\n }\n\n // Map subType to the actual field name\n let fieldId = colId === 'subType' ? (isFolder ? 'folderType' : 'taskType') : colId\n // Check if fieldId has a mapping to plural enum\n fieldId = builtInFieldMappings[fieldId as keyof typeof builtInFieldMappings] || fieldId\n\n // Skip validation for fields that don't have enums\n if (!(fieldId in columnEnums)) return true\n\n // Get the enum values for this field\n const enumOptions = columnEnums[fieldId as keyof typeof columnEnums]\n\n // Skip if no enum options are available\n if (!Array.isArray(enumOptions) || enumOptions.length === 0) return true\n\n // Check if the pasted value exists in the enum options\n const enumValues = pasteValue.split(',').map((v) => v.trim())\n const valueExists = enumValues.every((v) =>\n enumOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n if (!valueExists) {\n // Get a display name for the field (folderType/taskType → Type)\n const displayName =\n fieldId === 'folderType' || fieldId === 'taskType'\n ? `${isFolder ? 'folder' : 'task'} type`\n : fieldId\n\n clipboardError(`Invalid ${displayName} value: \"${pasteValue}\". Paste operation cancelled.`)\n return false\n }\n\n return true\n}\n"],"names":[],"mappings":";;AAIa,MAAA,wBAAwB,CAAC,WAUvB;AACP,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGA,MAAA,CAAC,WAAmB,QAAA;AAGpB,MAAA,MAAM,WAAW,SAAS,KAAK,eAAe,SAAS,MAAM,QAAQ,WAAW,EAAE,CAAC,GAAG;AACzE,mBAAA,8BAA8B,KAAK,+BAA+B;AAC1E,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,aAAa;AAEnB,UAAA,iBAAiB,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAGhE,UAAM,kBAAkB,YAAY,WAAW,KAAK,CAAC;AAGrD,UAAM,iBAAiB,eAAe;AAAA,MAAO,CAAC,MAC5C,gBAAgB,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,IAClE;AAGA,QAAI,mBAAmB;AACrB,iBAAW,CAAC,EAAE,OAAO,CAAC,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA,OAC7C;AACC,YAAA,gBAAgB,WAAW,WAAW;AAC5C,YAAM,gBAAgB,WAAW,WAAW,aAAa,EAAE,OAAO;AAClE,iBAAW,aAAa,EAAE,OAAO,aAAa,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA;AAGrE,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,UAAU,YAAa,WAAW,eAAe,aAAc;AAEnE,YAAA,qBAAqB,OAA4C,KAAK;AAG5E,MAAA,EAAE,WAAW,aAAqB,QAAA;AAGhC,QAAA,cAAc,YAAY,OAAmC;AAG/D,MAAA,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,EAAU,QAAA;AAG9D,QAAA,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC5D,QAAM,cAAc,WAAW;AAAA,IAAM,CAAC,MACpC,YAAY,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa;AAEV,UAAA,cACJ,YAAY,gBAAgB,YAAY,aACpC,GAAG,WAAW,WAAW,MAAM,UAC/B;AAEN,mBAAe,WAAW,WAAW,YAAY,UAAU,+BAA+B;AACnF,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;"}
1
+ {"version":3,"file":"clipboardValidation.es.js","sources":["../../../../../../../src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.ts"],"sourcesContent":["import { ColumnEnums, builtInFieldMappings, ParsedClipboardData } from './clipboardTypes'\nimport { clipboardError } from './clipboardUtils'\n\n// Validate clipboard data for enum fields and handle special cases\nexport const validateClipboardData = (params: {\n colId: string\n isFolder: boolean\n pasteValue: string\n parsedData: ParsedClipboardData[]\n columnEnums: ColumnEnums\n columnReadOnly: string[]\n rowIndex: number\n colIndex: number\n isSingleCellValue: boolean\n}): boolean => {\n const {\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex,\n isSingleCellValue,\n } = params\n\n // Skip validation for empty values\n if (!pasteValue) return true\n\n // Check if the column is read-only\n if (colId.startsWith('attrib_') && columnReadOnly.includes(colId.replace('attrib_', ''))) {\n clipboardError(`This column is read-only: \"${colId}\". Paste operation cancelled.`)\n return false\n }\n\n // Special handling for assignees - filter out invalid values instead of canceling\n if (colId === 'assignees') {\n // Split assignees by comma\n const assigneeValues = pasteValue.split(',').map((v) => v.trim())\n\n // Get assignee options from columnEnums\n const assigneeOptions = columnEnums['assignee'] || []\n\n // Filter to keep only valid assignees\n const validAssignees = assigneeValues.filter((v) =>\n assigneeOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n // Update the paste value in the parsed data\n if (isSingleCellValue) {\n parsedData[0].values[0] = validAssignees.join(', ')\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n const pasteColIndex = colIndex % parsedData[pasteRowIndex].values.length\n parsedData[pasteRowIndex].values[pasteColIndex] = validAssignees.join(', ')\n }\n\n return true\n }\n\n // Map subType to the actual field name\n let fieldId = colId === 'subType' ? (isFolder ? 'folderType' : 'taskType') : colId\n // Check if fieldId has a mapping to plural enum\n fieldId = builtInFieldMappings[fieldId as keyof typeof builtInFieldMappings] || fieldId\n\n // Skip validation for fields that don't have enums\n if (!(fieldId in columnEnums)) return true\n\n // Get the enum values for this field\n const enumOptions = columnEnums[fieldId as keyof typeof columnEnums]\n\n // Skip if no enum options are available\n if (!Array.isArray(enumOptions) || enumOptions.length === 0) return true\n\n // Check if the pasted value exists in the enum options\n const enumValues = pasteValue.split(',').map((v) => v.trim())\n const valueExists = enumValues.every((v) =>\n enumOptions.some((opt) => opt.value === v || opt.label === v),\n )\n\n if (!valueExists) {\n // Get a display name for the field (folderType/taskType → Type)\n const displayName =\n fieldId === 'folderType' || fieldId === 'taskType'\n ? `${isFolder ? 'folder' : 'task'} type`\n : fieldId\n\n clipboardError(`Invalid ${displayName} value: \"${pasteValue}\". Paste operation cancelled.`)\n return false\n }\n\n return true\n}\n"],"names":[],"mappings":";;AAIa,MAAA,wBAAwB,CAAC,WAUvB;AACP,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGA,MAAA,CAAC,WAAmB,QAAA;AAGpB,MAAA,MAAM,WAAW,SAAS,KAAK,eAAe,SAAS,MAAM,QAAQ,WAAW,EAAE,CAAC,GAAG;AACzE,mBAAA,8BAA8B,KAAK,+BAA+B;AAC1E,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,aAAa;AAEnB,UAAA,iBAAiB,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAGhE,UAAM,kBAAkB,YAAY,UAAU,KAAK,CAAC;AAGpD,UAAM,iBAAiB,eAAe;AAAA,MAAO,CAAC,MAC5C,gBAAgB,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,IAClE;AAGA,QAAI,mBAAmB;AACrB,iBAAW,CAAC,EAAE,OAAO,CAAC,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA,OAC7C;AACC,YAAA,gBAAgB,WAAW,WAAW;AAC5C,YAAM,gBAAgB,WAAW,WAAW,aAAa,EAAE,OAAO;AAClE,iBAAW,aAAa,EAAE,OAAO,aAAa,IAAI,eAAe,KAAK,IAAI;AAAA,IAAA;AAGrE,WAAA;AAAA,EAAA;AAIT,MAAI,UAAU,UAAU,YAAa,WAAW,eAAe,aAAc;AAEnE,YAAA,qBAAqB,OAA4C,KAAK;AAG5E,MAAA,EAAE,WAAW,aAAqB,QAAA;AAGhC,QAAA,cAAc,YAAY,OAAmC;AAG/D,MAAA,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,EAAU,QAAA;AAG9D,QAAA,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC5D,QAAM,cAAc,WAAW;AAAA,IAAM,CAAC,MACpC,YAAY,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa;AAEV,UAAA,cACJ,YAAY,gBAAgB,YAAY,aACpC,GAAG,WAAW,WAAW,MAAM,UAC/B;AAEN,mBAAe,WAAW,WAAW,YAAY,UAAU,+BAA+B;AACnF,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const useGetEntityTypeData = require("./useGetEntityTypeData.cjs.js");
4
+ const NEXT_PAGE_ID = "next-page";
5
+ const valueToStringArray = (value) => value ? Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()] : [];
6
+ const getGroupData = (groupById, groupValue, groups) => {
7
+ if (!groups)
8
+ return {
9
+ value: groupValue,
10
+ label: groupValue
11
+ };
12
+ const group = groups.find((g) => g.value === groupValue);
13
+ if (!group) {
14
+ return {
15
+ value: groupValue,
16
+ label: groupValue
17
+ };
18
+ } else {
19
+ return {
20
+ value: group.value,
21
+ label: group.label || group.value,
22
+ color: group.color,
23
+ icon: group.icon,
24
+ count: group.count,
25
+ img: groupById === "assignees" ? `/api/users/${group.value}/avatar` : void 0
26
+ };
27
+ }
28
+ };
29
+ const GROUP_BY_ID = "_GROUP_";
30
+ const buildGroupId = (value) => `${GROUP_BY_ID}${value}`;
31
+ const useBuildGroupByTableData = (props) => {
32
+ const { project, entities, entityType, groups = [] } = props;
33
+ const getEntityTypeData = useGetEntityTypeData({ projectInfo: project });
34
+ const entityToGroupRow = (task) => {
35
+ const typeData = getEntityTypeData("task", task.taskType);
36
+ return {
37
+ id: task.id,
38
+ entityType: "task",
39
+ parentId: task.folderId,
40
+ name: task.name || "",
41
+ label: task.label || task.name || "",
42
+ icon: (typeData == null ? void 0 : typeData.icon) || null,
43
+ color: (typeData == null ? void 0 : typeData.color) || null,
44
+ status: task.status,
45
+ assignees: task.assignees,
46
+ tags: task.tags,
47
+ img: null,
48
+ subRows: [],
49
+ subType: task.taskType || null,
50
+ attrib: task.attrib,
51
+ ownAttrib: task.ownAttrib,
52
+ path: task.folder.path,
53
+ updatedAt: task.updatedAt
54
+ };
55
+ };
56
+ const buildGroupByTableData = (groupBy) => {
57
+ var _a;
58
+ const groupsMap = /* @__PURE__ */ new Map();
59
+ for (const group of groups) {
60
+ const groupValue = group.value;
61
+ const groupId = buildGroupId(groupValue);
62
+ const groupData = getGroupData(groupBy.id, groupValue, groups);
63
+ groupsMap.set(groupValue, {
64
+ id: groupId,
65
+ name: groupValue,
66
+ entityType: "group",
67
+ subRows: [],
68
+ label: groupData.label,
69
+ group: groupData
70
+ });
71
+ }
72
+ const ungroupedId = GROUP_BY_ID + "__ungrouped";
73
+ const getUnGroupedGroup = () => {
74
+ let ungroupedGroup = groupsMap.get(ungroupedId);
75
+ if (!ungroupedGroup) {
76
+ ungroupedGroup = {
77
+ id: ungroupedId,
78
+ name: "Ungrouped",
79
+ entityType: "group",
80
+ subRows: [],
81
+ label: "Ungrouped",
82
+ group: { value: ungroupedId, label: "Ungrouped" }
83
+ };
84
+ groupsMap.set(ungroupedId, ungroupedGroup);
85
+ }
86
+ return ungroupedGroup;
87
+ };
88
+ for (const [id, entity] of entities) {
89
+ if (entity.entityType !== entityType) continue;
90
+ let groupValues = [];
91
+ if (groupBy.id.startsWith("attrib_")) {
92
+ const attributeId = groupBy.id.split("_")[1];
93
+ groupValues = valueToStringArray((_a = entity.attrib) == null ? void 0 : _a[attributeId]);
94
+ } else {
95
+ groupValues = valueToStringArray(entity[groupBy.id]);
96
+ }
97
+ if (groupValues.length === 0) {
98
+ const ungroupedGroup = getUnGroupedGroup();
99
+ ungroupedGroup.subRows.push(entityToGroupRow(entity));
100
+ }
101
+ for (const groupValue of groupValues) {
102
+ const groupRow = groupsMap.get(groupValue);
103
+ if (groupRow) {
104
+ groupRow.subRows.push(entityToGroupRow(entity));
105
+ } else {
106
+ const ungroupedGroup = getUnGroupedGroup();
107
+ ungroupedGroup.subRows.push(entityToGroupRow(entity));
108
+ }
109
+ }
110
+ if ("groups" in entity && Array.isArray(entity.groups)) {
111
+ for (const group of entity.groups) {
112
+ const hasNextPageGroup = group.hasNextPage;
113
+ if (hasNextPageGroup && groupsMap.has(group.value)) {
114
+ const groupRow = groupsMap.get(group.value);
115
+ if (groupRow) {
116
+ groupRow.subRows.push({
117
+ id: `${group.value}-next-page`,
118
+ name: `Load more tasks...`,
119
+ entityType: NEXT_PAGE_ID,
120
+ subRows: [],
121
+ label: `Next page for ${group.value}`,
122
+ group: { value: group.value, label: group.value }
123
+ });
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return Array.from(groupsMap.values());
130
+ };
131
+ return buildGroupByTableData;
132
+ };
133
+ exports.GROUP_BY_ID = GROUP_BY_ID;
134
+ exports.NEXT_PAGE_ID = NEXT_PAGE_ID;
135
+ exports.buildGroupId = buildGroupId;
136
+ exports.default = useBuildGroupByTableData;
137
+ //# sourceMappingURL=useBuildGroupByTableData.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBuildGroupByTableData.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.ts"],"sourcesContent":["// based on the groupBy field we take a flat list of items and group them\n// each group is a root node with subItems as the grouped items\n// any leftover items that do not match the groupBy field are added as a separate group (\"Ungrouped\")\n\nimport { ProjectModel, TaskGroup } from '@shared/api'\nimport { TableGroupBy, TableUser } from '../context'\nimport { EditorTaskNode, EntitiesMap, EntityMap, ProjectTableAttribute, TableRow } from '../types'\nimport useGetEntityTypeData from './useGetEntityTypeData'\nexport type GroupByEntityType = 'task' | 'folder' | 'version' | 'product'\n\nexport type GroupData = {\n value: string\n label: string\n color?: string\n icon?: string\n img?: string\n count?: number\n}\n\nexport const NEXT_PAGE_ID = 'next-page'\n\nconst valueToStringArray = (value?: any): string[] =>\n value ? (Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()]) : []\n\n// get group label, color and icon\nconst getGroupData = (groupById: string, groupValue: string, groups?: TaskGroup[]): GroupData => {\n if (!groups)\n return {\n value: groupValue,\n label: groupValue,\n }\n\n const group = groups.find((g) => g.value === groupValue)\n if (!group) {\n return {\n value: groupValue,\n label: groupValue,\n }\n } else {\n return {\n value: group.value,\n label: group.label || group.value,\n color: group.color,\n icon: group.icon,\n count: group.count,\n img: groupById === 'assignees' ? `/api/users/${group.value}/avatar` : undefined,\n }\n }\n}\n\nexport const GROUP_BY_ID = '_GROUP_'\nexport const buildGroupId = (value: string) => `${GROUP_BY_ID}${value}`\nexport const parseGroupId = (groupId: string): string | null => {\n if (!groupId.startsWith(GROUP_BY_ID)) return null\n return groupId.slice(GROUP_BY_ID.length) // +1 for the underscore\n}\nexport const isGroupId = (id: string): boolean => id.startsWith(GROUP_BY_ID)\n\ntype BuildGroupByTableProps = {\n project?: ProjectModel\n entities: EntitiesMap\n entityType?: GroupByEntityType\n groups?: TaskGroup[]\n}\n\nconst useBuildGroupByTableData = (props: BuildGroupByTableProps) => {\n const { project, entities, entityType, groups = [] } = props\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n const entityToGroupRow = (task: EditorTaskNode): TableRow => {\n const typeData = getEntityTypeData('task', task.taskType)\n return {\n id: task.id,\n entityType: 'task',\n parentId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n ownAttrib: task.ownAttrib,\n path: task.folder.path,\n updatedAt: task.updatedAt,\n }\n }\n\n const buildGroupByTableData = (groupBy: TableGroupBy): TableRow[] => {\n const groupsMap = new Map<string, TableRow>()\n\n for (const group of groups) {\n const groupValue = group.value\n const groupId = buildGroupId(groupValue)\n const groupData = getGroupData(groupBy.id, groupValue, groups)\n groupsMap.set(groupValue, {\n id: groupId,\n name: groupValue,\n entityType: 'group',\n subRows: [],\n label: groupData.label,\n group: groupData,\n })\n }\n\n const ungroupedId = GROUP_BY_ID + '__ungrouped'\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(ungroupedId)\n if (!ungroupedGroup) {\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: { value: ungroupedId, label: 'Ungrouped' },\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(ungroupedId, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n for (const [id, entity] of entities) {\n // if the entity is not of the specified type, skip it\n if (entity.entityType !== entityType) continue\n // add entities to specific group\n let groupValues: string[] = []\n if (groupBy.id.startsWith('attrib_')) {\n // for attribute based grouping, get the value of the attribute\n const attributeId = groupBy.id.split('_')[1]\n groupValues = valueToStringArray(entity.attrib?.[attributeId])\n } else {\n groupValues = valueToStringArray(entity[groupBy.id as keyof EntityMap])\n }\n\n // if there are no values, add to \"Ungrouped\" group\n if (groupValues.length === 0) {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows.push(entityToGroupRow(entity as EditorTaskNode))\n }\n // for each group value, find it's group and add the entity to it\n // if we can't find the group, add it to \"Ungrouped\"\n for (const groupValue of groupValues) {\n const groupRow = groupsMap.get(groupValue)\n if (groupRow) {\n groupRow.subRows.push(entityToGroupRow(entity as EditorTaskNode))\n } else {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows.push(entityToGroupRow(entity as EditorTaskNode))\n }\n }\n\n // for groups metadata on entity, check if there is a next page\n if ('groups' in entity && Array.isArray(entity.groups)) {\n for (const group of entity.groups) {\n const hasNextPageGroup = group.hasNextPage\n if (hasNextPageGroup && groupsMap.has(group.value)) {\n // add a next page row to the group\n const groupRow = groupsMap.get(group.value)\n if (groupRow) {\n groupRow.subRows.push({\n id: `${group.value}-next-page`,\n name: `Load more tasks...`,\n entityType: NEXT_PAGE_ID,\n subRows: [],\n label: `Next page for ${group.value}`,\n group: { value: group.value, label: group.value },\n })\n }\n }\n }\n }\n }\n\n return Array.from(groupsMap.values())\n }\n\n return buildGroupByTableData\n}\n\nexport default useBuildGroupByTableData\n"],"names":[],"mappings":"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"}