@ynput/ayon-frontend-shared 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/dist/_virtual/index.cjs4.js +1 -1
  2. package/dist/_virtual/index.cjs5.js +1 -1
  3. package/dist/_virtual/index.es4.js +2 -5
  4. package/dist/_virtual/index.es4.js.map +1 -1
  5. package/dist/_virtual/index.es5.js +5 -2
  6. package/dist/_virtual/index.es5.js.map +1 -1
  7. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  8. package/dist/node_modules/remove-accents/index.es.js +1 -1
  9. package/dist/node_modules/web-namespaces/index.cjs.js +1 -1
  10. package/dist/node_modules/web-namespaces/index.cjs.js.map +1 -1
  11. package/dist/node_modules/web-namespaces/index.es.js +3 -8
  12. package/dist/node_modules/web-namespaces/index.es.js.map +1 -1
  13. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
  14. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
  15. package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
  16. package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
  17. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
  18. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
  19. package/dist/shared/src/api/generated/graphql.cjs.js +12 -8
  20. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  21. package/dist/shared/src/api/generated/graphql.es.js +11 -7
  22. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  23. package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
  24. package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
  25. package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
  26. package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
  27. package/dist/shared/src/api/queries/overview/getOverview.es.js +95 -95
  28. package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
  29. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +2 -2
  30. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
  31. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +66 -61
  32. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js.map +1 -1
  33. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js +1 -1
  34. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
  35. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js +14 -11
  36. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
  37. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
  38. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  39. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +42 -41
  40. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  41. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  42. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  43. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +23 -23
  44. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  45. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.cjs.js +1 -1
  46. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.cjs.js.map +1 -1
  47. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.es.js +6 -6
  48. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.es.js.map +1 -1
  49. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  50. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  51. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +65 -64
  52. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  53. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  54. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  55. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +16 -16
  56. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  57. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +3 -3
  58. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
  59. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +142 -146
  60. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
  61. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  62. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  63. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +24 -24
  64. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  65. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
  66. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  67. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +141 -132
  68. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  69. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
  70. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  71. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +35 -28
  72. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  73. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +2 -2
  74. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
  75. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +10 -10
  76. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.cjs.js.map +1 -1
  77. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.es.js.map +1 -1
  78. package/dist/shared/src/context/AddonContext.cjs.js.map +1 -1
  79. package/dist/shared/src/context/AddonContext.es.js.map +1 -1
  80. package/dist/shared/src/context/ProjectFoldersContext.cjs.js +1 -1
  81. package/dist/shared/src/context/ProjectFoldersContext.cjs.js.map +1 -1
  82. package/dist/shared/src/context/ProjectFoldersContext.es.js +62 -49
  83. package/dist/shared/src/context/ProjectFoldersContext.es.js.map +1 -1
  84. package/dist/shared/src/hooks/useLoadModules.cjs.js +1 -1
  85. package/dist/shared/src/hooks/useLoadModules.cjs.js.map +1 -1
  86. package/dist/shared/src/hooks/useLoadModules.es.js +86 -80
  87. package/dist/shared/src/hooks/useLoadModules.es.js.map +1 -1
  88. package/dist/types/api/generated/graphql.d.ts +2 -1
  89. package/dist/types/api/generated/graphqlLinks.d.ts +1 -0
  90. package/dist/types/api/queries/overview/getOverview.d.ts +1 -0
  91. package/dist/types/components/RemotePage/RemotePageWrapper.d.ts +1 -0
  92. package/dist/types/components/SearchFilter/useBuildFilterOptions.d.ts +1 -0
  93. package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +2 -1
  94. package/dist/types/containers/ProjectTreeTable/hooks/useQueryFilters.d.ts +4 -1
  95. package/dist/types/context/AddonContext.d.ts +1 -0
  96. package/dist/types/context/ProjectFoldersContext.d.ts +1 -0
  97. package/package.json +2 -1
  98. package/dist/node_modules/@ungap/structured-clone/esm/deserialize.cjs.js +0 -2
  99. package/dist/node_modules/@ungap/structured-clone/esm/deserialize.cjs.js.map +0 -1
  100. package/dist/node_modules/@ungap/structured-clone/esm/deserialize.es.js +0 -63
  101. package/dist/node_modules/@ungap/structured-clone/esm/deserialize.es.js.map +0 -1
  102. package/dist/node_modules/@ungap/structured-clone/esm/index.cjs.js +0 -2
  103. package/dist/node_modules/@ungap/structured-clone/esm/index.cjs.js.map +0 -1
  104. package/dist/node_modules/@ungap/structured-clone/esm/index.es.js +0 -12
  105. package/dist/node_modules/@ungap/structured-clone/esm/index.es.js.map +0 -1
  106. package/dist/node_modules/@ungap/structured-clone/esm/serialize.cjs.js +0 -2
  107. package/dist/node_modules/@ungap/structured-clone/esm/serialize.cjs.js.map +0 -1
  108. package/dist/node_modules/@ungap/structured-clone/esm/serialize.es.js +0 -107
  109. package/dist/node_modules/@ungap/structured-clone/esm/serialize.es.js.map +0 -1
  110. package/dist/node_modules/@ungap/structured-clone/esm/types.cjs.js +0 -2
  111. package/dist/node_modules/@ungap/structured-clone/esm/types.cjs.js.map +0 -1
  112. package/dist/node_modules/@ungap/structured-clone/esm/types.es.js +0 -14
  113. package/dist/node_modules/@ungap/structured-clone/esm/types.es.js.map +0 -1
  114. package/dist/node_modules/devlop/lib/default.cjs.js +0 -2
  115. package/dist/node_modules/devlop/lib/default.cjs.js.map +0 -1
  116. package/dist/node_modules/devlop/lib/default.es.js +0 -6
  117. package/dist/node_modules/devlop/lib/default.es.js.map +0 -1
  118. package/dist/node_modules/entities/dist/esm/decode-codepoint.cjs.js +0 -2
  119. package/dist/node_modules/entities/dist/esm/decode-codepoint.cjs.js.map +0 -1
  120. package/dist/node_modules/entities/dist/esm/decode-codepoint.es.js +0 -39
  121. package/dist/node_modules/entities/dist/esm/decode-codepoint.es.js.map +0 -1
  122. package/dist/node_modules/entities/dist/esm/decode.cjs.js +0 -2
  123. package/dist/node_modules/entities/dist/esm/decode.cjs.js.map +0 -1
  124. package/dist/node_modules/entities/dist/esm/decode.es.js +0 -246
  125. package/dist/node_modules/entities/dist/esm/decode.es.js.map +0 -1
  126. package/dist/node_modules/entities/dist/esm/generated/decode-data-html.cjs.js +0 -2
  127. package/dist/node_modules/entities/dist/esm/generated/decode-data-html.cjs.js.map +0 -1
  128. package/dist/node_modules/entities/dist/esm/generated/decode-data-html.es.js +0 -8
  129. package/dist/node_modules/entities/dist/esm/generated/decode-data-html.es.js.map +0 -1
  130. package/dist/node_modules/hast-util-raw/lib/index.cjs.js +0 -2
  131. package/dist/node_modules/hast-util-raw/lib/index.cjs.js.map +0 -1
  132. package/dist/node_modules/hast-util-raw/lib/index.es.js +0 -218
  133. package/dist/node_modules/hast-util-raw/lib/index.es.js.map +0 -1
  134. package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.cjs.js +0 -2
  135. package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.cjs.js.map +0 -1
  136. package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.es.js +0 -146
  137. package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.es.js.map +0 -1
  138. package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.cjs.js +0 -2
  139. package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.cjs.js.map +0 -1
  140. package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.es.js +0 -21
  141. package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.es.js.map +0 -1
  142. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.cjs.js +0 -2
  143. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.cjs.js.map +0 -1
  144. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.es.js +0 -113
  145. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.es.js.map +0 -1
  146. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.cjs.js +0 -2
  147. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.cjs.js.map +0 -1
  148. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.es.js +0 -9
  149. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.es.js.map +0 -1
  150. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.cjs.js +0 -2
  151. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.cjs.js.map +0 -1
  152. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.es.js +0 -45
  153. package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.es.js.map +0 -1
  154. package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.cjs.js +0 -2
  155. package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.cjs.js.map +0 -1
  156. package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.es.js +0 -26
  157. package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.es.js.map +0 -1
  158. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.cjs.js +0 -2
  159. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.cjs.js.map +0 -1
  160. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.es.js +0 -99
  161. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.es.js.map +0 -1
  162. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.cjs.js +0 -2
  163. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.cjs.js.map +0 -1
  164. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.es.js +0 -8
  165. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.es.js.map +0 -1
  166. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.cjs.js +0 -2
  167. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.cjs.js.map +0 -1
  168. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.es.js +0 -211
  169. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.es.js.map +0 -1
  170. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.cjs.js +0 -2
  171. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.cjs.js.map +0 -1
  172. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.es.js +0 -251
  173. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.es.js.map +0 -1
  174. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.cjs.js +0 -2
  175. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.cjs.js.map +0 -1
  176. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.es.js +0 -15
  177. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.es.js.map +0 -1
  178. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.cjs.js +0 -2
  179. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.cjs.js.map +0 -1
  180. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.es.js +0 -74
  181. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.es.js.map +0 -1
  182. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.cjs.js +0 -2
  183. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.cjs.js.map +0 -1
  184. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.es.js +0 -85
  185. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.es.js.map +0 -1
  186. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.cjs.js +0 -2
  187. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.cjs.js.map +0 -1
  188. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.es.js +0 -2272
  189. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.es.js.map +0 -1
  190. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.cjs.js +0 -2
  191. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.cjs.js.map +0 -1
  192. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.es.js +0 -241
  193. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.es.js.map +0 -1
  194. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.cjs.js +0 -2
  195. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.cjs.js.map +0 -1
  196. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.es.js +0 -3
  197. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.es.js.map +0 -1
  198. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.cjs.js +0 -2
  199. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.cjs.js.map +0 -1
  200. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.es.js +0 -1941
  201. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.es.js.map +0 -1
  202. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.cjs.js +0 -2
  203. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.cjs.js.map +0 -1
  204. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.es.js +0 -89
  205. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.es.js.map +0 -1
  206. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.cjs.js +0 -2
  207. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.cjs.js.map +0 -1
  208. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.es.js +0 -163
  209. package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.es.js.map +0 -1
  210. package/dist/node_modules/hast-util-raw/node_modules/property-information/index.cjs.js +0 -2
  211. package/dist/node_modules/hast-util-raw/node_modules/property-information/index.cjs.js.map +0 -1
  212. package/dist/node_modules/hast-util-raw/node_modules/property-information/index.es.js +0 -13
  213. package/dist/node_modules/hast-util-raw/node_modules/property-information/index.es.js.map +0 -1
  214. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.cjs.js +0 -2
  215. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.cjs.js.map +0 -1
  216. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.es.js +0 -62
  217. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.es.js.map +0 -1
  218. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.cjs.js +0 -2
  219. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.cjs.js.map +0 -1
  220. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.es.js +0 -34
  221. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.es.js.map +0 -1
  222. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.cjs.js +0 -2
  223. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.cjs.js.map +0 -1
  224. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.es.js +0 -369
  225. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.es.js.map +0 -1
  226. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.cjs.js +0 -2
  227. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.cjs.js.map +0 -1
  228. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.es.js +0 -7
  229. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.es.js.map +0 -1
  230. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.cjs.js +0 -2
  231. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.cjs.js.map +0 -1
  232. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.es.js +0 -567
  233. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.es.js.map +0 -1
  234. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js +0 -2
  235. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js.map +0 -1
  236. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.es.js +0 -8
  237. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.es.js.map +0 -1
  238. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js +0 -2
  239. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js.map +0 -1
  240. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.es.js +0 -7
  241. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.es.js.map +0 -1
  242. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.cjs.js +0 -2
  243. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.cjs.js.map +0 -1
  244. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.es.js +0 -20
  245. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.es.js.map +0 -1
  246. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.cjs.js +0 -2
  247. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.cjs.js.map +0 -1
  248. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.es.js +0 -37
  249. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.es.js.map +0 -1
  250. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.cjs.js +0 -2
  251. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.cjs.js.map +0 -1
  252. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.es.js +0 -29
  253. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.es.js.map +0 -1
  254. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.cjs.js +0 -2
  255. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.cjs.js.map +0 -1
  256. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.es.js +0 -11
  257. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.es.js.map +0 -1
  258. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.cjs.js +0 -2
  259. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.cjs.js.map +0 -1
  260. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.es.js +0 -22
  261. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.es.js.map +0 -1
  262. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.cjs.js +0 -2
  263. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.cjs.js.map +0 -1
  264. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.es.js +0 -15
  265. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.es.js.map +0 -1
  266. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.cjs.js +0 -2
  267. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.cjs.js.map +0 -1
  268. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.es.js +0 -20
  269. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.es.js.map +0 -1
  270. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.cjs.js +0 -2
  271. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.cjs.js.map +0 -1
  272. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.es.js +0 -12
  273. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.es.js.map +0 -1
  274. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.cjs.js +0 -2
  275. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.cjs.js.map +0 -1
  276. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.es.js +0 -12
  277. package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.es.js.map +0 -1
  278. package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.cjs.js +0 -3
  279. package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.cjs.js.map +0 -1
  280. package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.es.js +0 -43
  281. package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.es.js.map +0 -1
  282. package/dist/node_modules/hast-util-to-parse5/lib/index.cjs.js +0 -2
  283. package/dist/node_modules/hast-util-to-parse5/lib/index.cjs.js.map +0 -1
  284. package/dist/node_modules/hast-util-to-parse5/lib/index.es.js +0 -119
  285. package/dist/node_modules/hast-util-to-parse5/lib/index.es.js.map +0 -1
  286. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.cjs.js +0 -2
  287. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.cjs.js.map +0 -1
  288. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.es.js +0 -13
  289. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.es.js.map +0 -1
  290. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.cjs.js +0 -2
  291. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.cjs.js.map +0 -1
  292. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.es.js +0 -62
  293. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.es.js.map +0 -1
  294. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.cjs.js +0 -2
  295. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.cjs.js.map +0 -1
  296. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.es.js +0 -34
  297. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.es.js.map +0 -1
  298. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.cjs.js +0 -2
  299. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.cjs.js.map +0 -1
  300. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.es.js +0 -369
  301. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.es.js.map +0 -1
  302. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.cjs.js +0 -2
  303. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.cjs.js.map +0 -1
  304. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.es.js +0 -7
  305. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.es.js.map +0 -1
  306. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.cjs.js +0 -2
  307. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.cjs.js.map +0 -1
  308. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.es.js +0 -567
  309. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.es.js.map +0 -1
  310. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js +0 -2
  311. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js.map +0 -1
  312. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.es.js +0 -8
  313. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.es.js.map +0 -1
  314. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js +0 -2
  315. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js.map +0 -1
  316. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.es.js +0 -7
  317. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.es.js.map +0 -1
  318. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.cjs.js +0 -2
  319. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.cjs.js.map +0 -1
  320. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.es.js +0 -20
  321. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.es.js.map +0 -1
  322. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.cjs.js +0 -2
  323. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.cjs.js.map +0 -1
  324. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.es.js +0 -37
  325. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.es.js.map +0 -1
  326. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.cjs.js +0 -2
  327. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.cjs.js.map +0 -1
  328. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.es.js +0 -29
  329. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.es.js.map +0 -1
  330. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.cjs.js +0 -2
  331. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.cjs.js.map +0 -1
  332. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.es.js +0 -11
  333. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.es.js.map +0 -1
  334. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.cjs.js +0 -2
  335. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.cjs.js.map +0 -1
  336. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.es.js +0 -22
  337. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.es.js.map +0 -1
  338. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.cjs.js +0 -2
  339. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.cjs.js.map +0 -1
  340. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.es.js +0 -15
  341. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.es.js.map +0 -1
  342. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.cjs.js +0 -2
  343. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.cjs.js.map +0 -1
  344. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.es.js +0 -20
  345. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.es.js.map +0 -1
  346. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.cjs.js +0 -2
  347. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.cjs.js.map +0 -1
  348. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.es.js +0 -12
  349. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.es.js.map +0 -1
  350. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.cjs.js +0 -2
  351. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.cjs.js.map +0 -1
  352. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.es.js +0 -12
  353. package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.es.js.map +0 -1
  354. package/dist/node_modules/rehype-raw/lib/index.cjs.js +0 -2
  355. package/dist/node_modules/rehype-raw/lib/index.cjs.js.map +0 -1
  356. package/dist/node_modules/rehype-raw/lib/index.es.js +0 -13
  357. package/dist/node_modules/rehype-raw/lib/index.es.js.map +0 -1
  358. package/dist/node_modules/unist-util-is/lib/index.cjs.js +0 -2
  359. package/dist/node_modules/unist-util-is/lib/index.cjs.js.map +0 -1
  360. package/dist/node_modules/unist-util-is/lib/index.es.js +0 -92
  361. package/dist/node_modules/unist-util-is/lib/index.es.js.map +0 -1
  362. package/dist/node_modules/unist-util-position/lib/index.cjs.js +0 -2
  363. package/dist/node_modules/unist-util-position/lib/index.cjs.js.map +0 -1
  364. package/dist/node_modules/unist-util-position/lib/index.es.js +0 -18
  365. package/dist/node_modules/unist-util-position/lib/index.es.js.map +0 -1
  366. package/dist/node_modules/unist-util-visit/lib/index.cjs.js +0 -2
  367. package/dist/node_modules/unist-util-visit/lib/index.cjs.js.map +0 -1
  368. package/dist/node_modules/unist-util-visit/lib/index.es.js +0 -17
  369. package/dist/node_modules/unist-util-visit/lib/index.es.js.map +0 -1
  370. package/dist/node_modules/unist-util-visit-parents/lib/color.cjs.js +0 -2
  371. package/dist/node_modules/unist-util-visit-parents/lib/color.cjs.js.map +0 -1
  372. package/dist/node_modules/unist-util-visit-parents/lib/color.es.js +0 -7
  373. package/dist/node_modules/unist-util-visit-parents/lib/color.es.js.map +0 -1
  374. package/dist/node_modules/unist-util-visit-parents/lib/index.cjs.js +0 -2
  375. package/dist/node_modules/unist-util-visit-parents/lib/index.cjs.js.map +0 -1
  376. package/dist/node_modules/unist-util-visit-parents/lib/index.es.js +0 -57
  377. package/dist/node_modules/unist-util-visit-parents/lib/index.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectTreeTable.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties, useCallback, UIEventHandler } from 'react' // Added useCallback\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n ExpandedState,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n DefaultColumns,\n isEntityExpandable,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport { RowDragHandleCellContent, ColumnHeaderMenu } from './components'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\nimport HeaderActionButton from './components/HeaderActionButton'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\nimport { useMenuContext } from '../../context/MenuContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu, {\n HeaderLabel,\n ContextMenuItemConstructors,\n} from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport useDynamicRowHeight from './hooks/useDynamicRowHeight'\n\n// EntityPickerDialog import\nimport { EntityPickerDialog } from '../EntityPickerDialog/EntityPickerDialog'\n// Move entity hook\nimport { useMoveEntities } from './hooks/useMoveEntities'\nimport { useProjectDataContext } from '@shared/containers'\n\n// Utility function imports\nimport { getCellId, parseCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { isEntityRestricted, isTargetReadOnly } from './utils/restrictedEntity'\nimport { createPortal } from 'react-dom'\nimport { Button, Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getEntityViewierIds, getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { EntityUpdate } from './hooks/useUpdateTableData'\n\n// dnd-kit imports\nimport {\n DragOverlay,\n type UniqueIdentifier,\n // Removed: DndContext, KeyboardSensor, MouseSensor, TouchSensor, closestCenter, DragEndEvent, DragStartEvent, Active, Over, useSensor, useSensors\n} from '@dnd-kit/core'\n// import { restrictToVerticalAxis } from '@dnd-kit/modifiers'\nimport { SortableContext, verticalListSortingStrategy, useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\n\nimport { useProjectContext } from '@shared/context'\nimport { EDIT_TRIGGER_CLASS } from './widgets/CellWidget'\nimport { toast } from 'react-toastify'\nimport { EntityMoveData } from '@shared/context/MoveEntityContext'\nimport { upperFirst } from 'lodash'\nimport { ColumnsConfig } from './types/columnConfig'\n\ntype CellUpdate = (\n entity: Omit<EntityUpdate, 'id'>,\n config?: { selection?: string[] },\n) => Promise<void>\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options?: BuiltInFieldOptions\n readOnly?: ProjectTreeTableProps['readOnly']\n projectName?: string\n updateEntities?: CellUpdate\n toggleExpandAll?: ToggleExpandAll\n selection?: string[]\n columnsConfig?: ColumnsConfig\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n const offset =\n column.id !== ROW_SELECTION_COLUMN_ID && column.id !== DRAG_HANDLE_COLUMN_ID ? -30 : 0\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left') + offset}px` : undefined, // Removed offset\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nconst getColumnWidth = (rowId: string, columnId: string) => {\n return `calc(var(--col-${columnId}-size) * 1px)`\n}\n// test\n\nexport const DRAG_HANDLE_COLUMN_ID = 'drag-handle'\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n onScrollBottom?: React.HTMLAttributes<HTMLDivElement>['onScroll']\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n excludedSorting?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n includeLinks?: boolean\n isLoading?: boolean\n isExpandable?: boolean // if true, show the expand/collapse icons\n clientSorting?: boolean\n sortableRows?: boolean\n onRowReorder?: (active: UniqueIdentifier, over: UniqueIdentifier | null) => void // Adjusted type for active/over if needed, or keep as Active, Over\n dndActiveId?: UniqueIdentifier | null // Added prop\n columnsConfig?: ColumnsConfig // Configure column behavior (display, styling, etc.)\n onScrollBottomGroupBy?: (groupValue: string) => void // Handle scroll to bottom for grouped data\n contextMenuItems?: ContextMenuItemConstructors // Additional context menu items to merge with defaults\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n onScroll,\n onScrollBottom, // when the user scrolls to the bottom of the table, this callback is called\n onOpenNew,\n readOnly,\n excludedColumns,\n excludedSorting,\n extraColumns,\n includeLinks,\n isLoading: isLoadingProp,\n isExpandable,\n clientSorting = false,\n sortableRows = false,\n onRowReorder,\n dndActiveId, // Destructure new prop\n columnsConfig,\n onScrollBottomGroupBy, // Destructure new prop for group-by load more\n contextMenuItems: propsContextMenuItems, // Additional context menu items from props\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnPinning,\n columnOrder,\n columnSizing,\n setAllColumns,\n sorting,\n sortingOnChange,\n columnPinningOnChange,\n columnSizingOnChange,\n columnVisibilityOnChange,\n columnOrderOnChange,\n groupBy,\n } = useColumnSettingsContext()\n const isGrouping = !!groupBy\n const { productTypes, projectName, ...projectInfo } = useProjectContext()\n\n const {\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading: isLoadingData,\n error,\n isInitialized,\n expanded,\n updateExpanded,\n toggleExpandAll,\n showHierarchy,\n fetchNextPage,\n scopes, // or entityTypes\n getEntityById,\n onResetView,\n } = useProjectTableContext()\n\n const { writableFields } = useProjectDataContext()\n\n const isLoading = isLoadingProp || isLoadingData\n\n const {\n statuses = [],\n folderTypes = [],\n taskTypes = [],\n tags = [],\n linkTypes = [],\n } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n productTypes,\n tags,\n scopes,\n }),\n [users, statuses, folderTypes, taskTypes, scopes, tags],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n // reference of how many rows are currently rendered in the table\n const tableRowsCountRef = useRef(0)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n showHierarchy && tableData.length > 0\n ? Math.min(tableRowsCount, 50)\n : groupBy\n ? Math.max(tableRowsCountRef.current, 50)\n : 50,\n )\n\n return { loadingAttrib, loadingRows }\n }, [])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, writableFields, readOnly),\n [attribFields, writableFields, readOnly],\n )\n\n const { selectedCells } = useSelectionCellsContext()\n const { updateEntities } = useCellEditing()\n\n const handleCellUpdate: CellUpdate = useCallback(\n async (entity, config) => {\n const { selection = [] } = config || {}\n const entitiesToUpdate: EntityUpdate[] = []\n if (!selection?.length) {\n entitiesToUpdate.push({ ...entity, id: entity.rowId })\n } else {\n // if includeSelection is true, update all the selected cells with the same columnId\n const { field, value, isAttrib } = entity\n for (const cellId of selectedCells) {\n const { colId, rowId } = parseCellId(cellId) || {}\n\n // ignore row selection column\n if (colId === ROW_SELECTION_COLUMN_ID) continue\n\n const entity = getEntityById(rowId || '')\n if (!entity) {\n console.warn(`Entity with ID ${rowId} not found for cell update.`)\n continue\n }\n\n if ((!colId?.includes('attrib_') || colId?.replace('attrib_', '') === field) && rowId) {\n entitiesToUpdate.push({\n field: field,\n rowId: rowId,\n id: entity.entityId,\n value: value,\n isAttrib: isAttrib,\n type: entity.entityType,\n })\n }\n }\n }\n\n if (!entitiesToUpdate.length) {\n console.warn('No entities to update, skipping updateEntities call.')\n toast.warn('No entities to update.')\n return\n }\n\n await updateEntities(entitiesToUpdate, true)\n },\n [updateEntities, getEntityById, selectedCells],\n )\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n\n const getNameLabelHeader = () => {\n if (scopes.includes('version')) return 'Product / Version'\n return scopes.map((s) => upperFirst(s)).join(' / ')\n }\n\n const columns = useMemo(() => {\n const baseColumns = buildTreeTableColumns({\n scopes,\n attribs: columnAttribs,\n links: linkTypes,\n includeLinks,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n excludedSorting,\n groupBy,\n nameLabel: getNameLabelHeader(),\n })\n\n if (sortableRows) {\n return [\n {\n id: DRAG_HANDLE_COLUMN_ID,\n header: () => null,\n cell: () => null, // Content rendered by TableBodyRow\n size: 24,\n minSize: 24,\n maxSize: 24,\n enableResizing: false,\n enableSorting: false,\n enableHiding: false,\n enablePinning: false, // Programmatically pinned\n },\n ...baseColumns,\n ]\n }\n return baseColumns\n }, [\n scopes,\n columnAttribs,\n showHierarchy,\n isExpandable,\n options,\n linkTypes,\n includeLinks,\n extraColumns,\n excludedColumns,\n excludedSorting,\n sortableRows,\n ])\n\n // Keep ColumnSettingsProvider's allColumns ref up to date\n useEffect(() => {\n const ids = columns.map((c) => c.id!).filter(Boolean)\n setAllColumns(ids)\n }, [columns, setAllColumns])\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => !!isExpandable || showHierarchy || isGrouping,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n enableSorting: true,\n getSortedRowModel: getSortedRowModel(),\n sortDescFirst: false,\n manualSorting: !clientSorting,\n onSortingChange: sortingOnChange,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningOnChange,\n onColumnSizingChange: columnSizingOnChange,\n onColumnVisibilityChange: columnVisibilityOnChange,\n onColumnOrderChange: columnOrderOnChange,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: (() => {\n const leftPins: string[] = []\n if (sortableRows) {\n leftPins.push(DRAG_HANDLE_COLUMN_ID)\n }\n leftPins.push(ROW_SELECTION_COLUMN_ID)\n\n // Add other unique pins from context, ensuring they are not the programmatic ones\n const contextLeftPins = (columnPinning.left || []).filter(\n (id) => id !== DRAG_HANDLE_COLUMN_ID && id !== ROW_SELECTION_COLUMN_ID,\n )\n leftPins.push(...contextLeftPins)\n // Remove duplicates just in case, though filter should handle it\n const uniqueLeftPins = [...new Set(leftPins)]\n\n return {\n left: uniqueLeftPins,\n right: columnPinning.right,\n }\n })(),\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities: handleCellUpdate,\n toggleExpandAll,\n loadMoreRows: fetchNextPage,\n selection: Array.from(selectedCells),\n columnsConfig,\n },\n })\n\n // TODO: when there is data (like in error) then we have infinite rendering\n\n const { rows } = table.getRowModel()\n\n // update the tableRowsCountRef with the current number of rows\n useEffect(() => {\n tableRowsCountRef.current = rows.length\n }, [rows.length])\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n if (!rows.length) return\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n columnSizing,\n columnOrder,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n // Calculate dynamic row height based on user setting from Customize panel\n const { getRowHeight, defaultRowHeight } = useDynamicRowHeight()\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n const rowOrderIds = useMemo(() => tableData.map((row) => row.id), [tableData])\n const draggedRowData = useMemo(() => {\n if (!dndActiveId || !sortableRows) return null // Use dndActiveId\n return tableData.find((r) => r.id === dndActiveId) // Use dndActiveId\n }, [dndActiveId, tableData, sortableRows])\n\n const combinedScrollHandler: UIEventHandler<HTMLDivElement> = useCallback(\n (e) => {\n // Call the original onScroll if provided\n onScroll?.(e)\n\n if (onScrollBottom) {\n const containerRefElement = e.currentTarget\n if (containerRefElement && !showHierarchy && !groupBy) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (scrollHeight - scrollTop - clientHeight < 500 && !isLoading) {\n onScrollBottom(e)\n }\n }\n }\n\n // Handle scroll-to-bottom for grouped data\n if (onScrollBottomGroupBy && groupBy) {\n const containerRefElement = e.currentTarget\n // look for a load more button\n const loadMoreButton = containerRefElement?.querySelector('.load-more')\n // get load more button id\n const loadMoreButtonId = loadMoreButton?.getAttribute('id')\n const groupValue = loadMoreButtonId?.split('-')[2] // assuming the id is in the format 'load-more-groupValue'\n if (groupValue) {\n onScrollBottomGroupBy(groupValue)\n }\n }\n },\n [onScroll, onScrollBottom, onScrollBottomGroupBy, showHierarchy, groupBy, isLoading],\n )\n\n // Get move entity functions for the dialog\n const {\n isEntityPickerOpen,\n handleMoveSubmit,\n closeMoveDialog,\n movingEntities,\n handleMoveToRoot,\n getDisabledFolderIds,\n getDisabledMessage,\n } = useMoveEntities({\n projectName,\n })\n\n const handleMoveSubmitWithExpand = (selection: string[]) => {\n handleMoveSubmit(selection)\n const folderIdToExpand = selection[0]\n\n updateExpanded((prevExpanded: ExpandedState) => {\n if (typeof prevExpanded === 'boolean') {\n if (prevExpanded) {\n return prevExpanded\n }\n return { [folderIdToExpand]: true }\n }\n\n if (prevExpanded[folderIdToExpand]) {\n return prevExpanded\n }\n\n return {\n ...prevExpanded,\n [folderIdToExpand]: true,\n }\n })\n }\n\n const tableUiContent = (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n visibleColumns={visibleColumns}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={combinedScrollHandler}\n {...pt?.container}\n className={clsx(\n 'table-container',\n {\n resizing: table.getState().columnSizingInfo.isResizingColumn,\n },\n pt?.container?.className,\n )}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n cursor: table.getState().columnSizingInfo.isResizingColumn ? 'col-resize' : undefined,\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n sortableRows={sortableRows}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n rowOrderIds={rowOrderIds}\n sortableRows={sortableRows}\n error={error}\n isLoading={isLoading}\n isGrouping={isGrouping}\n getRowHeight={getRowHeight}\n defaultRowHeight={defaultRowHeight}\n onResetView={onResetView}\n contextMenuItems={propsContextMenuItems}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n {/* Render EntityPickerDialog alongside table content */}\n {isEntityPickerOpen &&\n projectName &&\n movingEntities?.entities &&\n movingEntities.entities.length > 0 && (\n <EntityPickerDialog\n projectName={projectName}\n entityType=\"folder\"\n onSubmit={handleMoveSubmitWithExpand}\n onClose={closeMoveDialog}\n showMoveToRoot={movingEntities.entities.every(\n (entity: EntityMoveData) => entity.entityType === 'folder',\n )}\n onMoveToRoot={handleMoveToRoot}\n disabledIds={getDisabledFolderIds()}\n getDisabledMessage={getDisabledMessage}\n />\n )}\n </ClipboardProvider>\n )\n\n // Render DragOverlay if sortableRows and dndActiveId is present\n const dragOverlayPortal =\n sortableRows &&\n dndActiveId &&\n createPortal(\n <DragOverlay dropAnimation={null}>\n {draggedRowData\n ? (() => {\n const overlayRowInstance = table.getRowModel().rows.find((r) => r.id === dndActiveId)\n if (!overlayRowInstance) return null\n\n const tableWidth = table.getTotalSize()\n\n return (\n <table\n style={{\n width: tableWidth,\n borderCollapse: 'collapse',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n boxShadow: '0 0 10px rgba(0,0,0,0.2)',\n ...columnSizeVars,\n }}\n >\n <tbody>\n <Styled.TR style={{ display: 'flex', userSelect: 'none' }}>\n {virtualPaddingLeft ? (\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {columnVirtualizer.getVirtualItems().map((vc) => {\n const cell = overlayRowInstance.getVisibleCells()[vc.index]\n if (!cell) return null\n\n const cellStyleBase: CSSProperties = {\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(overlayRowInstance.id, cell.column.id),\n display: 'flex',\n alignItems: 'center',\n height: defaultRowHeight,\n }\n\n if (cell.column.id === DRAG_HANDLE_COLUMN_ID) {\n return (\n <Styled.TD\n key={`overlay-drag-${cell.id}`}\n style={{ ...cellStyleBase, justifyContent: 'center' }}\n className={clsx(cell.column.id)}\n >\n <Icon icon=\"drag_handle\" /> {/* Static icon */}\n </Styled.TD>\n )\n }\n return (\n <TD\n cell={cell}\n cellId={`overlay-${getCellId(overlayRowInstance.id, cell.column.id)}`}\n rowId={overlayRowInstance.id}\n key={`overlay-cell-${cell.id}`}\n showHierarchy={showHierarchy}\n />\n )\n })}\n {virtualPaddingRight ? (\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n </tbody>\n </table>\n )\n })()\n : null}\n </DragOverlay>,\n document.body,\n )\n\n if (sortableRows) {\n return (\n <>\n {tableUiContent}\n {dragOverlayPortal}\n </>\n )\n } else {\n return tableUiContent\n }\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n sortableRows?: boolean\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n sortableRows,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n sortableRows={sortableRows}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n sortableRows?: boolean\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n sortableRows,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n sortableRows={sortableRows}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n sortableRows?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n sortableRows,\n}: TableHeadCellProps) => {\n const { column } = header\n const sorting = column.getIsSorted()\n const menuId = `column-header-menu-${column.id}`\n const { menuOpen } = useMenuContext()\n const isOpen = menuOpen === menuId\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n resizing: column.getIsResizing(),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: getColumnWidth('', column.id),\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold', 'header')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\" $isOpen={isOpen}>\n {(canHide || canPin || canSort) && (\n <ColumnHeaderMenu\n className=\"header-menu\"\n header={header}\n canHide={canHide}\n canPin={canPin}\n canSort={canSort}\n isResizing={column.getIsResizing()}\n menuId={menuId}\n isOpen={isOpen}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon=\"sort\"\n className={clsx('sort-button', { visible: sorting })}\n style={{\n transform: sorting === 'asc' ? 'rotate(180deg) scaleX(-1)' : 'none',\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n rowOrderIds: UniqueIdentifier[]\n sortableRows: boolean\n error?: string\n isLoading: boolean\n isGrouping: boolean\n getRowHeight: (row: TableRow) => number\n defaultRowHeight: number\n onResetView?: () => void\n contextMenuItems?: ContextMenuItemConstructors\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n rowOrderIds,\n sortableRows,\n error,\n isLoading,\n isGrouping,\n getRowHeight,\n defaultRowHeight,\n onResetView,\n contextMenuItems,\n}: TableBodyProps) => {\n const headerLabels = useMemo(() => {\n const allColumns = table.getAllColumns()\n const headers = allColumns\n .map((col) => {\n const headerId = col.id\n const header = col.columnDef.header\n if (typeof header === 'string' || typeof header === 'number') {\n return { label: header, id: headerId }\n }\n return null\n })\n .filter(Boolean)\n\n return headers as HeaderLabel[]\n }, [table.getAllColumns()])\n\n const cellContextMenuHook = useCellContextMenu({\n attribs,\n onOpenNew,\n headerLabels,\n contextMenuItems,\n })\n\n const handleTableBodyContextMenu = cellContextMenuHook.handleTableBodyContextMenu\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: (index) => {\n // Calculate dynamic row height based on specific row data\n const row = rows[index]\n return row ? getRowHeight(row.original) : defaultRowHeight\n },\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n // Memoize the measureElement callback\n const measureRowElement = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (node) {\n rowVirtualizer.measureElement(node)\n }\n },\n [rowVirtualizer],\n )\n\n useKeyboardNavigation()\n\n const tbodyContent = (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow, i) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n // Add a check for row existence to prevent potential errors if data is out of sync\n if (!row) {\n console.warn('Virtualized row data not found for index:', virtualRow.index)\n return null\n }\n return (\n <TableBodyRow\n key={row.id + i.toString()} // dnd-kit needs this key to be stable and match the id in useSortable\n row={row}\n showHierarchy={showHierarchy}\n visibleCells={row.getVisibleCells()}\n virtualColumns={columnVirtualizer.getVirtualItems()}\n paddingLeft={virtualPaddingLeft}\n paddingRight={virtualPaddingRight}\n rowRef={measureRowElement}\n dataIndex={virtualRow.index}\n offsetTop={virtualRow.start}\n sortableRows={sortableRows}\n isGrouping={isGrouping}\n rowHeight={getRowHeight(row.original)}\n />\n )\n })}\n </tbody>\n )\n\n if (error) {\n return (\n tableContainerRef.current &&\n createPortal(\n <Styled.AnimatedEmptyPlaceholder>\n <EmptyPlaceholder message=\"No items found\" error={error}>\n {onResetView && (\n <Button\n variant=\"filled\"\n label=\"Reset working view\"\n icon=\"restart_alt\"\n onClick={onResetView}\n />\n )}\n </EmptyPlaceholder>\n </Styled.AnimatedEmptyPlaceholder>,\n tableContainerRef.current,\n )\n )\n }\n\n if (!rows.length && !isLoading) {\n return (\n tableContainerRef.current &&\n createPortal(\n <Styled.AnimatedEmptyPlaceholder>\n <EmptyPlaceholder message=\"No items found\">\n {onResetView && (\n <Button\n variant=\"filled\"\n label=\"Reset working view\"\n icon=\"restart_alt\"\n onClick={onResetView}\n />\n )}\n </EmptyPlaceholder>\n </Styled.AnimatedEmptyPlaceholder>,\n tableContainerRef.current,\n )\n )\n }\n\n if (sortableRows) {\n return (\n <SortableContext items={rowOrderIds} strategy={verticalListSortingStrategy}>\n {tbodyContent}\n </SortableContext>\n )\n } else {\n return tbodyContent\n }\n}\n\ninterface TableBodyRowProps {\n row: Row<TableRow>\n showHierarchy: boolean\n visibleCells: Cell<TableRow, unknown>[]\n virtualColumns: VirtualItem[]\n paddingLeft: number | undefined\n paddingRight: number | undefined\n rowRef: (node: HTMLTableRowElement | null) => void\n dataIndex: number\n offsetTop: number\n sortableRows: boolean\n isGrouping: boolean\n rowHeight: number\n}\n\nconst TableBodyRow = ({\n row,\n showHierarchy,\n visibleCells,\n virtualColumns,\n paddingLeft,\n paddingRight,\n rowRef,\n dataIndex,\n offsetTop,\n sortableRows,\n isGrouping = false,\n rowHeight,\n}: TableBodyRowProps) => {\n const sortable = sortableRows ? useSortable({ id: row.id }) : null\n\n const combinedRef = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (sortable) {\n sortable.setNodeRef(node)\n }\n // rowRef for virtualizer measurement\n // only measure if not actively being transformed by dnd-kit\n if (!(sortable && sortable.isDragging)) {\n rowRef(node)\n }\n },\n [sortable, rowRef],\n )\n\n // Attempt to combine dnd-kit transform with virtualizer's offsetTop\n const style: CSSProperties = {\n position: 'absolute', // Use absolute positioning for virtualized items\n top: offsetTop, // Position based on virtualizer's calculation (virtualRow.start)\n left: 0, // Span full width of the relative parent (tbody)\n right: 0, // Span full width\n height: rowHeight, // Use dynamic row height\n zIndex: sortable && sortable.isDragging ? 0 : 1, // Ensure dragged item is above others\n display: 'flex', // Styled.TR is display:flex\n transform:\n sortable && sortable.transform ? CSS.Transform.toString(sortable.transform) : undefined, // Apply dnd-kit's transform for drag effect\n transition: sortable && sortable.transition ? sortable.transition : undefined,\n visibility: sortable && sortable.isDragging ? 'hidden' : 'visible', // Hide the row being dragged\n }\n\n return (\n <Styled.TR\n ref={combinedRef}\n data-index={dataIndex} //needed for dynamic row height measurement\n style={style}\n className={clsx({ 'group-row': row.original.group })}\n >\n {paddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: paddingLeft }} />\n ) : null}\n {virtualColumns.map((vc, i) => {\n const cell = visibleCells[vc.index]\n if (!cell) return null // Should not happen in normal circumstances\n\n const cellId = getCellId(row.id, cell.column.id)\n\n if (cell.column.id === DRAG_HANDLE_COLUMN_ID) {\n return (\n <Styled.TD\n key={cell.id + i.toString()}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(row.id, cell.column.id),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: rowHeight,\n pointerEvents: 'all',\n cursor: 'grab',\n }}\n className={clsx(cell.column.id, {\n 'last-pinned-left':\n cell.column.getIsPinned() === 'left' && cell.column.getIsLastColumn('left'),\n })}\n onMouseDown={(e) => e.stopPropagation()} // Prevent selection interference\n onMouseOver={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <RowDragHandleCellContent\n attributes={sortable?.attributes}\n listeners={sortable?.listeners}\n />\n </Styled.TD>\n )\n }\n return (\n <TD\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id + i.toString()}\n showHierarchy={showHierarchy}\n sortableRows={sortableRows}\n rowHeight={rowHeight}\n />\n )\n })}\n\n {paddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: paddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n sortableRows?: boolean\n rowHeight?: number\n}\n\nconst TD = ({\n cell,\n rowId,\n cellId,\n className,\n showHierarchy,\n sortableRows,\n rowHeight,\n ...props\n}: TableCellProps) => {\n const { getEntityById, onOpenPlayer } = useProjectTableContext()\n\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n focusCell,\n getCellBorderClasses,\n clearSelection,\n selectedCells,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing, setEditingCellId, editingCellId } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n const isGroup = cell.row.original.entityType === 'group'\n const isMultipleSelected = selectedCells.size > 1\n\n return (\n <Styled.TD\n {...props}\n tabIndex={0}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n expandable:\n !!cell.row.originalSubRows && isEntityExpandable(cell.row.original.entityType),\n 'multiple-selected': isMultipleSelected,\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(cell.row.id, cell.column.id),\n height: rowHeight,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n const target = e.target as HTMLElement\n\n // check we are not clicking on expander\n if (target.closest('.expander')) return\n\n // check we are not clicking in a dropdown\n if (target.closest('.options')) return\n\n // only name column can be selected for group rows\n if (isGroup && cell.column.id !== 'name') return clearSelection()\n\n // check if this is a restricted entity - prevent editing\n const isRestricted = isEntityRestricted(cell.row.original.entityType)\n\n // if clicking on an edit trigger, start editing\n if (target.closest('.' + EDIT_TRIGGER_CLASS) && !isRestricted) {\n // Select the cell first if not already selected\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n focusCell(cellId)\n }\n setEditingCellId(cellId)\n return\n }\n\n // if cell is already selected, do nothing\n if (isCellSelected(cellId)) return\n\n // If there's an active edit on a different cell, blur it first to save changes\n if (editingCellId && editingCellId !== cellId) {\n // Find the currently editing input and blur it\n const editingInput = document.querySelector(\n `#${editingCellId} input, #${editingCellId} [role=\"textbox\"]`,\n ) as HTMLElement\n if (editingInput) {\n editingInput.blur()\n // Wait a tick for the blur event to process and save\n setTimeout(() => {\n proceedWithSelection()\n }, 0)\n return\n }\n }\n\n proceedWithSelection()\n\n function proceedWithSelection() {\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n startSelection(cellId, additive)\n }\n\n // Prevent default browser behavior to ensure focus stays on the cell\n e.preventDefault()\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // check not selecting am edit trigger\n const target = e.target as HTMLElement\n if (target.closest('.' + EDIT_TRIGGER_CLASS)) return\n\n // Left button is pressed during mouse move - drag selection\n // Note: extendSelection is always called to allow drag to continue through cells\n // Restricted cells will be filtered out later\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n const isReadOnly = isTargetReadOnly(e)\n if (isReadOnly) return\n\n // check if this is a restricted entity - prevent opening details/viewer\n const isRestricted = isEntityRestricted(cell.row.original.entityType)\n\n // do nothing for restricted entities\n if (isRestricted) return\n\n // do nothing for groups\n if (isGroup) return\n\n // row selection on name column double click\n // making sure it's not the expander that was clicked\n if (cell.column.id === 'name' && !(e.target as HTMLElement).closest('.expander')) {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n const additive = e.metaKey || e.ctrlKey\n\n // Select both the row-selection cell and the name cell\n if (!isCellSelected(rowSelectionCellId)) {\n selectCell(rowSelectionCellId, additive, false)\n }\n selectCell(cellId, true, false) // additive=true to keep row-selection\n }\n // open the viewer on thumbnail double click\n else if (cell.column.id === 'thumbnail') {\n if (onOpenPlayer) {\n const entity = getEntityById(cell.row.original.entityId || cell.row.id)\n if (entity) {\n const targetIds = getEntityViewierIds(entity)\n onOpenPlayer(targetIds, { quickView: true })\n }\n }\n }\n // Double click on editable cell triggers edit mode\n else {\n setEditingCellId(cellId)\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n onKeyDown={() => {\n // keyboard events are handled in useKeyboardNavigation hook\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TD>\n )\n}\n"],"names":["getCommonPinningStyles","column","isPinned","offset","ROW_SELECTION_COLUMN_ID","DRAG_HANDLE_COLUMN_ID","getColumnWidth","rowId","columnId","ProjectTreeTable","scope","sliceId","onScroll","onScrollBottom","onOpenNew","readOnly","excludedColumns","excludedSorting","extraColumns","includeLinks","isLoadingProp","isExpandable","clientSorting","sortableRows","onRowReorder","dndActiveId","columnsConfig","onScrollBottomGroupBy","propsContextMenuItems","pt","props","columnVisibility","columnPinning","columnOrder","columnSizing","setAllColumns","sorting","sortingOnChange","columnPinningOnChange","columnSizingOnChange","columnVisibilityOnChange","columnOrderOnChange","groupBy","useColumnSettingsContext","isGrouping","productTypes","projectName","projectInfo","useProjectContext","tableData","attribFields","entitiesMap","users","isLoadingData","error","isInitialized","expanded","updateExpanded","toggleExpandAll","showHierarchy","fetchNextPage","scopes","getEntityById","onResetView","useProjectTableContext","writableFields","useProjectDataContext","isLoading","statuses","folderTypes","taskTypes","tags","linkTypes","options","useMemo","getTableFieldOptions","tableContainerRef","useRef","tableRowsCountRef","registerGrid","useSelectionCellsContext","loadingAttrib","loadingRows","tableRowsCount","generateDummyAttributes","generateLoadingRows","showLoadingRows","readOnlyColumns","readOnlyAttribs","getReadOnlyLists","selectedCells","updateEntities","useCellEditing","handleCellUpdate","useCallback","entity","config","selection","entitiesToUpdate","field","value","isAttrib","cellId","colId","parseCellId","toast","columnAttribs","getNameLabelHeader","s","upperFirst","columns","baseColumns","buildTreeTableColumns","useEffect","ids","c","table","useReactTable","row","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getSortedRowModel","filterFns","leftPins","contextLeftPins","id","rows","rowIds","colIdsSortedByPinning","col","a","b","colA","colB","visibleColumns","columnVirtualizer","virtualPaddingLeft","virtualPaddingRight","useColumnVirtualization","columnSizeVars","useCustomColumnWidthVars","getRowHeight","defaultRowHeight","useDynamicRowHeight","attribByField","acc","attrib","rowOrderIds","draggedRowData","r","combinedScrollHandler","e","containerRefElement","scrollHeight","scrollTop","clientHeight","groupValue","isEntityPickerOpen","handleMoveSubmit","closeMoveDialog","movingEntities","handleMoveToRoot","getDisabledFolderIds","getDisabledMessage","useMoveEntities","handleMoveSubmitWithExpand","folderIdToExpand","prevExpanded","tableUiContent","jsxs","ClipboardProvider","jsx","Styled.TableWrapper","Styled.TableContainer","clsx","TableHead","TableBody","EntityPickerDialog","dragOverlayPortal","createPortal","DragOverlay","overlayRowInstance","tableWidth","Styled.TR","vc","cell","cellStyleBase","Styled.TD","Icon","TD","getCellId","Fragment","Styled.TableHeader","headerGroup","TableHeadRow","virtualColumns","Styled.ColumnHeader","virtualColumn","header","TableHeadCell","canFilter","canHide","canSort","canPin","canResize","isReadOnly","menuId","menuOpen","useMenuContext","isOpen","Styled.HeaderCell","Styled.TableCellContent","flexRender","Styled.HeaderButtons","ColumnHeaderMenu","HeaderActionButton","Styled.ResizedHandler","attribs","contextMenuItems","headerLabels","headerId","handleTableBodyContextMenu","useCellContextMenu","handlePreFetchTasks","usePrefetchFolderTasks","rowVirtualizer","useVirtualizer","index","element","virtualRows","measureRowElement","node","useKeyboardNavigation","tbodyContent","virtualRow","i","TableBodyRow","Styled.AnimatedEmptyPlaceholder","EmptyPlaceholder","Button","SortableContext","verticalListSortingStrategy","visibleCells","paddingLeft","paddingRight","rowRef","dataIndex","offsetTop","rowHeight","sortable","useSortable","combinedRef","style","CSS","RowDragHandleCellContent","className","onOpenPlayer","isCellSelected","isCellFocused","startSelection","extendSelection","endSelection","selectCell","focusCell","getCellBorderClasses","clearSelection","isRowSelected","useSelectedRowsContext","isEditing","setEditingCellId","editingCellId","borderClasses","isLastLeftPinnedColumn","isRowSelectionColumn","isGroup","isMultipleSelected","isEntityExpandable","target","isRestricted","isEntityRestricted","EDIT_TRIGGER_CLASS","editingInput","proceedWithSelection","additive","isTargetReadOnly","rowSelectionCellId","targetIds","getEntityViewierIds"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectTreeTable.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties, useCallback, UIEventHandler } from 'react' // Added useCallback\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n ExpandedState,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n DefaultColumns,\n isEntityExpandable,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport { RowDragHandleCellContent, ColumnHeaderMenu } from './components'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\nimport HeaderActionButton from './components/HeaderActionButton'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\nimport { useMenuContext } from '../../context/MenuContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu, {\n HeaderLabel,\n ContextMenuItemConstructors,\n} from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport useDynamicRowHeight from './hooks/useDynamicRowHeight'\n\n// EntityPickerDialog import\nimport { EntityPickerDialog } from '../EntityPickerDialog/EntityPickerDialog'\n// Move entity hook\nimport { useMoveEntities } from './hooks/useMoveEntities'\nimport { useProjectDataContext } from '@shared/containers'\n\n// Utility function imports\nimport { getCellId, parseCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { isEntityRestricted, isTargetReadOnly } from './utils/restrictedEntity'\nimport { createPortal } from 'react-dom'\nimport { Button, Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getEntityViewierIds, getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { EntityUpdate } from './hooks/useUpdateTableData'\n\n// dnd-kit imports\nimport {\n DragOverlay,\n type UniqueIdentifier,\n // Removed: DndContext, KeyboardSensor, MouseSensor, TouchSensor, closestCenter, DragEndEvent, DragStartEvent, Active, Over, useSensor, useSensors\n} from '@dnd-kit/core'\n// import { restrictToVerticalAxis } from '@dnd-kit/modifiers'\nimport { SortableContext, verticalListSortingStrategy, useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\n\nimport { useProjectContext } from '@shared/context'\nimport { EDIT_TRIGGER_CLASS } from './widgets/CellWidget'\nimport { toast } from 'react-toastify'\nimport { EntityMoveData } from '@shared/context/MoveEntityContext'\nimport { upperFirst } from 'lodash'\nimport { ColumnsConfig } from './types/columnConfig'\n\ntype CellUpdate = (\n entity: Omit<EntityUpdate, 'id'>,\n config?: { selection?: string[] },\n) => Promise<void>\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options?: BuiltInFieldOptions\n readOnly?: ProjectTreeTableProps['readOnly']\n projectName?: string\n updateEntities?: CellUpdate\n toggleExpandAll?: ToggleExpandAll\n selection?: string[]\n columnsConfig?: ColumnsConfig\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n const offset =\n column.id !== ROW_SELECTION_COLUMN_ID && column.id !== DRAG_HANDLE_COLUMN_ID ? -30 : 0\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left') + offset}px` : undefined, // Removed offset\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nconst getColumnWidth = (rowId: string, columnId: string) => {\n return `calc(var(--col-${columnId}-size) * 1px)`\n}\n// test\n\nexport const DRAG_HANDLE_COLUMN_ID = 'drag-handle'\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n onScrollBottom?: React.HTMLAttributes<HTMLDivElement>['onScroll']\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n excludedSorting?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n includeLinks?: boolean\n isLoading?: boolean\n isExpandable?: boolean // if true, show the expand/collapse icons\n clientSorting?: boolean\n sortableRows?: boolean\n onRowReorder?: (active: UniqueIdentifier, over: UniqueIdentifier | null) => void // Adjusted type for active/over if needed, or keep as Active, Over\n dndActiveId?: UniqueIdentifier | null // Added prop\n columnsConfig?: ColumnsConfig // Configure column behavior (display, styling, etc.)\n onScrollBottomGroupBy?: (groupValue: string) => void // Handle scroll to bottom for grouped data\n contextMenuItems?: ContextMenuItemConstructors // Additional context menu items to merge with defaults\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n onScroll,\n onScrollBottom, // when the user scrolls to the bottom of the table, this callback is called\n onOpenNew,\n readOnly,\n excludedColumns,\n excludedSorting,\n extraColumns,\n includeLinks,\n isLoading: isLoadingProp,\n isExpandable,\n clientSorting = false,\n sortableRows = false,\n onRowReorder,\n dndActiveId, // Destructure new prop\n columnsConfig,\n onScrollBottomGroupBy, // Destructure new prop for group-by load more\n contextMenuItems: propsContextMenuItems, // Additional context menu items from props\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnPinning,\n columnOrder,\n columnSizing,\n setAllColumns,\n sorting,\n sortingOnChange,\n columnPinningOnChange,\n columnSizingOnChange,\n columnVisibilityOnChange,\n columnOrderOnChange,\n groupBy,\n } = useColumnSettingsContext()\n const isGrouping = !!groupBy\n const { productTypes, projectName, ...projectInfo } = useProjectContext()\n\n const {\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading: isLoadingData,\n error,\n isInitialized,\n expanded,\n updateExpanded,\n toggleExpandAll,\n showHierarchy,\n fetchNextPage,\n scopes, // or entityTypes\n getEntityById,\n onResetView,\n } = useProjectTableContext()\n\n const { writableFields } = useProjectDataContext()\n\n const isLoading = isLoadingProp || isLoadingData\n\n const {\n statuses = [],\n folderTypes = [],\n taskTypes = [],\n tags = [],\n linkTypes = [],\n } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n productTypes,\n tags,\n scopes,\n }),\n [users, statuses, folderTypes, taskTypes, scopes, tags],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n // reference of how many rows are currently rendered in the table\n const tableRowsCountRef = useRef(0)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n showHierarchy && tableData.length > 0\n ? Math.min(tableRowsCount, 50)\n : groupBy\n ? Math.max(tableRowsCountRef.current, 50)\n : 50,\n )\n\n return { loadingAttrib, loadingRows }\n }, [])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, writableFields, readOnly),\n [attribFields, writableFields, readOnly],\n )\n\n const { selectedCells } = useSelectionCellsContext()\n const { updateEntities } = useCellEditing()\n\n const handleCellUpdate: CellUpdate = useCallback(\n async (entity, config) => {\n const { selection = [] } = config || {}\n const entitiesToUpdate: EntityUpdate[] = []\n if (!selection?.length) {\n entitiesToUpdate.push({ ...entity, id: entity.rowId })\n } else {\n // if includeSelection is true, update all the selected cells with the same columnId\n const { field, value, isAttrib } = entity\n for (const cellId of selectedCells) {\n const { colId, rowId } = parseCellId(cellId) || {}\n\n // ignore row selection column\n if (colId === ROW_SELECTION_COLUMN_ID) continue\n\n const entity = getEntityById(rowId || '')\n if (!entity) {\n console.warn(`Entity with ID ${rowId} not found for cell update.`)\n continue\n }\n\n if ((!colId?.includes('attrib_') || colId?.replace('attrib_', '') === field) && rowId) {\n entitiesToUpdate.push({\n field: field,\n rowId: rowId,\n id: entity.entityId,\n value: value,\n isAttrib: isAttrib,\n type: entity.entityType,\n })\n }\n }\n }\n\n if (!entitiesToUpdate.length) {\n console.warn('No entities to update, skipping updateEntities call.')\n toast.warn('No entities to update.')\n return\n }\n\n await updateEntities(entitiesToUpdate, true)\n },\n [updateEntities, getEntityById, selectedCells],\n )\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n\n const getNameLabelHeader = () => {\n if (scopes.includes('version')) return 'Product / Version'\n return scopes.map((s) => upperFirst(s)).join(' / ')\n }\n\n const columns = useMemo(() => {\n const baseColumns = buildTreeTableColumns({\n scopes,\n attribs: columnAttribs,\n links: linkTypes,\n includeLinks,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n excludedSorting,\n groupBy,\n nameLabel: getNameLabelHeader(),\n })\n\n if (sortableRows) {\n return [\n {\n id: DRAG_HANDLE_COLUMN_ID,\n header: () => null,\n cell: () => null, // Content rendered by TableBodyRow\n size: 24,\n minSize: 24,\n maxSize: 24,\n enableResizing: false,\n enableSorting: false,\n enableHiding: false,\n enablePinning: false, // Programmatically pinned\n },\n ...baseColumns,\n ]\n }\n return baseColumns\n }, [\n scopes,\n columnAttribs,\n showHierarchy,\n isExpandable,\n options,\n linkTypes,\n includeLinks,\n extraColumns,\n excludedColumns,\n excludedSorting,\n sortableRows,\n ])\n\n // Keep ColumnSettingsProvider's allColumns ref up to date\n useEffect(() => {\n const ids = columns.map((c) => c.id!).filter(Boolean)\n setAllColumns(ids)\n }, [columns, setAllColumns])\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => !!isExpandable || showHierarchy || isGrouping,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n enableSorting: true,\n getSortedRowModel: getSortedRowModel(),\n sortDescFirst: false,\n manualSorting: !clientSorting,\n onSortingChange: sortingOnChange,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningOnChange,\n onColumnSizingChange: columnSizingOnChange,\n onColumnVisibilityChange: columnVisibilityOnChange,\n onColumnOrderChange: columnOrderOnChange,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: (() => {\n const leftPins: string[] = []\n if (sortableRows) {\n leftPins.push(DRAG_HANDLE_COLUMN_ID)\n }\n leftPins.push(ROW_SELECTION_COLUMN_ID)\n\n // Add other unique pins from context, ensuring they are not the programmatic ones\n const contextLeftPins = (columnPinning.left || []).filter(\n (id) => id !== DRAG_HANDLE_COLUMN_ID && id !== ROW_SELECTION_COLUMN_ID,\n )\n leftPins.push(...contextLeftPins)\n // Remove duplicates just in case, though filter should handle it\n const uniqueLeftPins = [...new Set(leftPins)]\n\n return {\n left: uniqueLeftPins,\n right: columnPinning.right,\n }\n })(),\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities: handleCellUpdate,\n toggleExpandAll,\n loadMoreRows: fetchNextPage,\n selection: Array.from(selectedCells),\n columnsConfig,\n },\n })\n\n // TODO: when there is data (like in error) then we have infinite rendering\n\n const { rows } = table.getRowModel()\n\n // update the tableRowsCountRef with the current number of rows\n useEffect(() => {\n tableRowsCountRef.current = rows.length\n }, [rows.length])\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n if (!rows.length) return\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n columnSizing,\n columnOrder,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n // Calculate dynamic row height based on user setting from Customize panel\n const { getRowHeight, defaultRowHeight } = useDynamicRowHeight()\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n const rowOrderIds = useMemo(() => tableData.map((row) => row.id), [tableData])\n const draggedRowData = useMemo(() => {\n if (!dndActiveId || !sortableRows) return null // Use dndActiveId\n return tableData.find((r) => r.id === dndActiveId) // Use dndActiveId\n }, [dndActiveId, tableData, sortableRows])\n\n const combinedScrollHandler: UIEventHandler<HTMLDivElement> = useCallback(\n (e) => {\n // Call the original onScroll if provided\n onScroll?.(e)\n\n if (onScrollBottom) {\n const containerRefElement = e.currentTarget\n if (containerRefElement && !showHierarchy && !groupBy) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (scrollHeight - scrollTop - clientHeight < 500 && !isLoading) {\n onScrollBottom(e)\n }\n }\n }\n\n // Handle scroll-to-bottom for grouped data\n if (onScrollBottomGroupBy && groupBy) {\n const containerRefElement = e.currentTarget\n // look for a load more button\n const loadMoreButton = containerRefElement?.querySelector('.load-more')\n // get load more button id\n const loadMoreButtonId = loadMoreButton?.getAttribute('id')\n const groupValue = loadMoreButtonId?.split('-')[2] // assuming the id is in the format 'load-more-groupValue'\n if (groupValue) {\n onScrollBottomGroupBy(groupValue)\n }\n }\n },\n [onScroll, onScrollBottom, onScrollBottomGroupBy, showHierarchy, groupBy, isLoading],\n )\n\n // Get move entity functions for the dialog\n const {\n isEntityPickerOpen,\n handleMoveSubmit,\n closeMoveDialog,\n movingEntities,\n handleMoveToRoot,\n getDisabledFolderIds,\n getDisabledMessage,\n } = useMoveEntities({\n projectName,\n })\n\n const handleMoveSubmitWithExpand = (selection: string[]) => {\n handleMoveSubmit(selection)\n const folderIdToExpand = selection[0]\n\n updateExpanded((prevExpanded: ExpandedState) => {\n if (typeof prevExpanded === 'boolean') {\n if (prevExpanded) {\n return prevExpanded\n }\n return { [folderIdToExpand]: true }\n }\n\n if (prevExpanded[folderIdToExpand]) {\n return prevExpanded\n }\n\n return {\n ...prevExpanded,\n [folderIdToExpand]: true,\n }\n })\n }\n\n const tableUiContent = (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n visibleColumns={visibleColumns}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={combinedScrollHandler}\n {...pt?.container}\n className={clsx(\n 'table-container',\n {\n resizing: table.getState().columnSizingInfo.isResizingColumn,\n },\n pt?.container?.className,\n )}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n cursor: table.getState().columnSizingInfo.isResizingColumn ? 'col-resize' : undefined,\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n sortableRows={sortableRows}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n rowOrderIds={rowOrderIds}\n sortableRows={sortableRows}\n error={error}\n isLoading={isLoading}\n isGrouping={isGrouping}\n getRowHeight={getRowHeight}\n defaultRowHeight={defaultRowHeight}\n onResetView={onResetView}\n contextMenuItems={propsContextMenuItems}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n {/* Render EntityPickerDialog alongside table content */}\n {isEntityPickerOpen &&\n projectName &&\n movingEntities?.entities &&\n movingEntities.entities.length > 0 && (\n <EntityPickerDialog\n projectName={projectName}\n entityType=\"folder\"\n onSubmit={handleMoveSubmitWithExpand}\n onClose={closeMoveDialog}\n showMoveToRoot={movingEntities.entities.every(\n (entity: EntityMoveData) => entity.entityType === 'folder',\n )}\n onMoveToRoot={handleMoveToRoot}\n disabledIds={getDisabledFolderIds()}\n getDisabledMessage={getDisabledMessage}\n />\n )}\n </ClipboardProvider>\n )\n\n // Render DragOverlay if sortableRows and dndActiveId is present\n const dragOverlayPortal =\n sortableRows &&\n dndActiveId &&\n createPortal(\n <DragOverlay dropAnimation={null}>\n {draggedRowData\n ? (() => {\n const overlayRowInstance = table.getRowModel().rows.find((r) => r.id === dndActiveId)\n if (!overlayRowInstance) return null\n\n const tableWidth = table.getTotalSize()\n\n return (\n <table\n style={{\n width: tableWidth,\n borderCollapse: 'collapse',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n boxShadow: '0 0 10px rgba(0,0,0,0.2)',\n ...columnSizeVars,\n }}\n >\n <tbody>\n <Styled.TR style={{ display: 'flex', userSelect: 'none' }}>\n {virtualPaddingLeft ? (\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {columnVirtualizer.getVirtualItems().map((vc) => {\n const cell = overlayRowInstance.getVisibleCells()[vc.index]\n if (!cell) return null\n\n const cellStyleBase: CSSProperties = {\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(overlayRowInstance.id, cell.column.id),\n display: 'flex',\n alignItems: 'center',\n height: defaultRowHeight,\n }\n\n if (cell.column.id === DRAG_HANDLE_COLUMN_ID) {\n return (\n <Styled.TD\n key={`overlay-drag-${cell.id}`}\n style={{ ...cellStyleBase, justifyContent: 'center' }}\n className={clsx(cell.column.id)}\n >\n <Icon icon=\"drag_handle\" /> {/* Static icon */}\n </Styled.TD>\n )\n }\n return (\n <TD\n cell={cell}\n cellId={`overlay-${getCellId(overlayRowInstance.id, cell.column.id)}`}\n rowId={overlayRowInstance.id}\n key={`overlay-cell-${cell.id}`}\n showHierarchy={showHierarchy}\n />\n )\n })}\n {virtualPaddingRight ? (\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n </tbody>\n </table>\n )\n })()\n : null}\n </DragOverlay>,\n document.body,\n )\n\n if (sortableRows) {\n return (\n <>\n {tableUiContent}\n {dragOverlayPortal}\n </>\n )\n } else {\n return tableUiContent\n }\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n sortableRows?: boolean\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n sortableRows,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n sortableRows={sortableRows}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n sortableRows?: boolean\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n sortableRows,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n sortableRows={sortableRows}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n sortableRows?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n sortableRows,\n}: TableHeadCellProps) => {\n const { column } = header\n const sorting = column.getIsSorted()\n const menuId = `column-header-menu-${column.id}`\n const { menuOpen } = useMenuContext()\n const isOpen = menuOpen === menuId\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n resizing: column.getIsResizing(),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: getColumnWidth('', column.id),\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold', 'header')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\" $isOpen={isOpen}>\n {(canHide || canPin || canSort) && (\n <ColumnHeaderMenu\n className=\"header-menu\"\n header={header}\n canHide={canHide}\n canPin={canPin}\n canSort={canSort}\n isResizing={column.getIsResizing()}\n menuId={menuId}\n isOpen={isOpen}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon=\"sort\"\n className={clsx('sort-button', { visible: sorting })}\n style={{\n transform: sorting === 'asc' ? 'rotate(180deg) scaleX(-1)' : 'none',\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n rowOrderIds: UniqueIdentifier[]\n sortableRows: boolean\n error?: string\n isLoading: boolean\n isGrouping: boolean\n getRowHeight: (row: TableRow) => number\n defaultRowHeight: number\n onResetView?: () => void\n contextMenuItems?: ContextMenuItemConstructors\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n rowOrderIds,\n sortableRows,\n error,\n isLoading,\n isGrouping,\n getRowHeight,\n defaultRowHeight,\n onResetView,\n contextMenuItems,\n}: TableBodyProps) => {\n const headerLabels = useMemo(() => {\n const allColumns = table.getAllColumns()\n const headers = allColumns\n .map((col) => {\n const headerId = col.id\n const header = col.columnDef.header\n if (typeof header === 'string' || typeof header === 'number') {\n return { label: header, id: headerId }\n }\n return null\n })\n .filter(Boolean)\n\n return headers as HeaderLabel[]\n }, [table.getAllColumns()])\n\n const cellContextMenuHook = useCellContextMenu({\n attribs,\n onOpenNew,\n headerLabels,\n contextMenuItems,\n })\n\n const handleTableBodyContextMenu = cellContextMenuHook.handleTableBodyContextMenu\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: (index) => {\n // Calculate dynamic row height based on specific row data\n const row = rows[index]\n return row ? getRowHeight(row.original) : defaultRowHeight\n },\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n // Memoize the measureElement callback\n const measureRowElement = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (node) {\n rowVirtualizer.measureElement(node)\n }\n },\n [rowVirtualizer],\n )\n\n useKeyboardNavigation()\n\n const tbodyContent = (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow, i) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n // Add a check for row existence to prevent potential errors if data is out of sync\n if (!row) {\n console.warn('Virtualized row data not found for index:', virtualRow.index)\n return null\n }\n return (\n <TableBodyRow\n key={row.id + i.toString()} // dnd-kit needs this key to be stable and match the id in useSortable\n row={row}\n showHierarchy={showHierarchy}\n visibleCells={row.getVisibleCells()}\n virtualColumns={columnVirtualizer.getVirtualItems()}\n paddingLeft={virtualPaddingLeft}\n paddingRight={virtualPaddingRight}\n rowRef={measureRowElement}\n dataIndex={virtualRow.index}\n offsetTop={virtualRow.start}\n sortableRows={sortableRows}\n isGrouping={isGrouping}\n rowHeight={getRowHeight(row.original)}\n />\n )\n })}\n </tbody>\n )\n\n if (error) {\n return (\n tableContainerRef.current &&\n createPortal(\n <Styled.AnimatedEmptyPlaceholder>\n <EmptyPlaceholder message=\"No items found\" error={error}>\n {onResetView && (\n <Button\n variant=\"filled\"\n label=\"Reset working view\"\n icon=\"restart_alt\"\n onClick={onResetView}\n />\n )}\n </EmptyPlaceholder>\n </Styled.AnimatedEmptyPlaceholder>,\n tableContainerRef.current,\n )\n )\n }\n\n if (!rows.length && !isLoading) {\n return (\n tableContainerRef.current &&\n createPortal(\n <Styled.AnimatedEmptyPlaceholder>\n <EmptyPlaceholder message=\"No items found\">\n {onResetView && (\n <Button\n variant=\"filled\"\n label=\"Reset working view\"\n icon=\"restart_alt\"\n onClick={onResetView}\n />\n )}\n </EmptyPlaceholder>\n </Styled.AnimatedEmptyPlaceholder>,\n tableContainerRef.current,\n )\n )\n }\n\n if (sortableRows) {\n return (\n <SortableContext items={rowOrderIds} strategy={verticalListSortingStrategy}>\n {tbodyContent}\n </SortableContext>\n )\n } else {\n return tbodyContent\n }\n}\n\ninterface TableBodyRowProps {\n row: Row<TableRow>\n showHierarchy: boolean\n visibleCells: Cell<TableRow, unknown>[]\n virtualColumns: VirtualItem[]\n paddingLeft: number | undefined\n paddingRight: number | undefined\n rowRef: (node: HTMLTableRowElement | null) => void\n dataIndex: number\n offsetTop: number\n sortableRows: boolean\n isGrouping: boolean\n rowHeight: number\n}\n\nconst TableBodyRow = ({\n row,\n showHierarchy,\n visibleCells,\n virtualColumns,\n paddingLeft,\n paddingRight,\n rowRef,\n dataIndex,\n offsetTop,\n sortableRows,\n isGrouping = false,\n rowHeight,\n}: TableBodyRowProps) => {\n const sortable = sortableRows ? useSortable({ id: row.id }) : null\n\n const combinedRef = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (sortable) {\n sortable.setNodeRef(node)\n }\n // rowRef for virtualizer measurement\n // only measure if not actively being transformed by dnd-kit\n if (!(sortable && sortable.isDragging)) {\n rowRef(node)\n }\n },\n [sortable, rowRef],\n )\n\n // Attempt to combine dnd-kit transform with virtualizer's offsetTop\n const style: CSSProperties = {\n position: 'absolute', // Use absolute positioning for virtualized items\n top: offsetTop, // Position based on virtualizer's calculation (virtualRow.start)\n left: 0, // Span full width of the relative parent (tbody)\n right: 0, // Span full width\n height: rowHeight, // Use dynamic row height\n zIndex: sortable && sortable.isDragging ? 0 : 1, // Ensure dragged item is above others\n display: 'flex', // Styled.TR is display:flex\n transform:\n sortable && sortable.transform ? CSS.Transform.toString(sortable.transform) : undefined, // Apply dnd-kit's transform for drag effect\n transition: sortable && sortable.transition ? sortable.transition : undefined,\n visibility: sortable && sortable.isDragging ? 'hidden' : 'visible', // Hide the row being dragged\n }\n\n return (\n <Styled.TR\n ref={combinedRef}\n data-index={dataIndex} //needed for dynamic row height measurement\n style={style}\n className={clsx({ 'group-row': row.original.group })}\n >\n {paddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: paddingLeft }} />\n ) : null}\n {virtualColumns.map((vc, i) => {\n const cell = visibleCells[vc.index]\n if (!cell) return null // Should not happen in normal circumstances\n\n const cellId = getCellId(row.id, cell.column.id)\n\n if (cell.column.id === DRAG_HANDLE_COLUMN_ID) {\n return (\n <Styled.TD\n key={cell.id + i.toString()}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(row.id, cell.column.id),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: rowHeight,\n pointerEvents: 'all',\n cursor: 'grab',\n }}\n className={clsx(cell.column.id, {\n 'last-pinned-left':\n cell.column.getIsPinned() === 'left' && cell.column.getIsLastColumn('left'),\n })}\n onMouseDown={(e) => e.stopPropagation()} // Prevent selection interference\n onMouseOver={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <RowDragHandleCellContent\n attributes={sortable?.attributes}\n listeners={sortable?.listeners}\n />\n </Styled.TD>\n )\n }\n return (\n <TD\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id + i.toString()}\n showHierarchy={showHierarchy}\n sortableRows={sortableRows}\n rowHeight={rowHeight}\n />\n )\n })}\n\n {paddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: paddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n sortableRows?: boolean\n rowHeight?: number\n}\n\nconst TD = ({\n cell,\n rowId,\n cellId,\n className,\n showHierarchy,\n sortableRows,\n rowHeight,\n ...props\n}: TableCellProps) => {\n const { getEntityById, onOpenPlayer } = useProjectTableContext()\n\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n focusCell,\n getCellBorderClasses,\n clearSelection,\n selectedCells,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing, setEditingCellId, editingCellId } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n const isGroup = cell.row.original.entityType === 'group'\n const isMultipleSelected = selectedCells.size > 1\n\n return (\n <Styled.TD\n {...props}\n tabIndex={0}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n expandable:\n !!cell.row.originalSubRows && isEntityExpandable(cell.row.original.entityType),\n 'multiple-selected': isMultipleSelected,\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: getColumnWidth(cell.row.id, cell.column.id),\n height: rowHeight,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n const target = e.target as HTMLElement\n\n // check we are not clicking on expander\n if (target.closest('.expander')) return\n\n // check we are not clicking in a dropdown\n if (target.closest('.options')) return\n\n // only name column can be selected for group rows\n if (isGroup && cell.column.id !== 'name') return clearSelection()\n\n // check if this is a restricted entity - prevent editing\n const isRestricted = isEntityRestricted(cell.row.original.entityType)\n\n // if clicking on an edit trigger, start editing\n if (target.closest('.' + EDIT_TRIGGER_CLASS) && !isRestricted) {\n // Select the cell first if not already selected\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n focusCell(cellId)\n }\n setEditingCellId(cellId)\n return\n }\n\n // if cell is already selected and it's not the row selection column, do nothing\n if (isCellSelected(cellId) && !(e.metaKey || e.ctrlKey) && !isRowSelectionColumn) {\n return\n }\n\n // If there's an active edit on a different cell, blur it first to save changes\n if (editingCellId && editingCellId !== cellId) {\n // Find the currently editing input and blur it\n const editingInput = document.querySelector(\n `#${editingCellId} input, #${editingCellId} [role=\"textbox\"]`,\n ) as HTMLElement\n if (editingInput) {\n editingInput.blur()\n // Wait a tick for the blur event to process and save\n setTimeout(() => {\n proceedWithSelection()\n }, 0)\n return\n }\n }\n\n proceedWithSelection()\n\n function proceedWithSelection() {\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n startSelection(cellId, additive)\n }\n\n // Prevent default browser behavior to ensure focus stays on the cell\n e.preventDefault()\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // check not selecting am edit trigger\n const target = e.target as HTMLElement\n if (target.closest('.' + EDIT_TRIGGER_CLASS)) return\n\n // Left button is pressed during mouse move - drag selection\n // Note: extendSelection is always called to allow drag to continue through cells\n // Restricted cells will be filtered out later\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n const isReadOnly = isTargetReadOnly(e)\n if (isReadOnly) return\n\n // check if this is a restricted entity - prevent opening details/viewer\n const isRestricted = isEntityRestricted(cell.row.original.entityType)\n\n // do nothing for restricted entities\n if (isRestricted) return\n\n // do nothing for groups\n if (isGroup) return\n\n // row selection on name column double click\n // making sure it's not the expander that was clicked\n if (cell.column.id === 'name' && !(e.target as HTMLElement).closest('.expander')) {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n const additive = e.metaKey || e.ctrlKey\n\n // Select both the row-selection cell and the name cell\n if (!isCellSelected(rowSelectionCellId)) {\n selectCell(rowSelectionCellId, additive, false)\n }\n selectCell(cellId, true, false) // additive=true to keep row-selection\n }\n // open the viewer on thumbnail double click\n else if (cell.column.id === 'thumbnail') {\n if (onOpenPlayer) {\n const entity = getEntityById(cell.row.original.entityId || cell.row.id)\n if (entity) {\n const targetIds = getEntityViewierIds(entity)\n onOpenPlayer(targetIds, { quickView: true })\n }\n }\n }\n // Double click on editable cell triggers edit mode\n else {\n setEditingCellId(cellId)\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n onKeyDown={() => {\n // keyboard events are handled in useKeyboardNavigation hook\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TD>\n )\n}\n"],"names":["getCommonPinningStyles","column","isPinned","offset","ROW_SELECTION_COLUMN_ID","DRAG_HANDLE_COLUMN_ID","getColumnWidth","rowId","columnId","ProjectTreeTable","scope","sliceId","onScroll","onScrollBottom","onOpenNew","readOnly","excludedColumns","excludedSorting","extraColumns","includeLinks","isLoadingProp","isExpandable","clientSorting","sortableRows","onRowReorder","dndActiveId","columnsConfig","onScrollBottomGroupBy","propsContextMenuItems","pt","props","columnVisibility","columnPinning","columnOrder","columnSizing","setAllColumns","sorting","sortingOnChange","columnPinningOnChange","columnSizingOnChange","columnVisibilityOnChange","columnOrderOnChange","groupBy","useColumnSettingsContext","isGrouping","productTypes","projectName","projectInfo","useProjectContext","tableData","attribFields","entitiesMap","users","isLoadingData","error","isInitialized","expanded","updateExpanded","toggleExpandAll","showHierarchy","fetchNextPage","scopes","getEntityById","onResetView","useProjectTableContext","writableFields","useProjectDataContext","isLoading","statuses","folderTypes","taskTypes","tags","linkTypes","options","useMemo","getTableFieldOptions","tableContainerRef","useRef","tableRowsCountRef","registerGrid","useSelectionCellsContext","loadingAttrib","loadingRows","tableRowsCount","generateDummyAttributes","generateLoadingRows","showLoadingRows","readOnlyColumns","readOnlyAttribs","getReadOnlyLists","selectedCells","updateEntities","useCellEditing","handleCellUpdate","useCallback","entity","config","selection","entitiesToUpdate","field","value","isAttrib","cellId","colId","parseCellId","toast","columnAttribs","getNameLabelHeader","s","upperFirst","columns","baseColumns","buildTreeTableColumns","useEffect","ids","c","table","useReactTable","row","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getSortedRowModel","filterFns","leftPins","contextLeftPins","id","rows","rowIds","colIdsSortedByPinning","col","a","b","colA","colB","visibleColumns","columnVirtualizer","virtualPaddingLeft","virtualPaddingRight","useColumnVirtualization","columnSizeVars","useCustomColumnWidthVars","getRowHeight","defaultRowHeight","useDynamicRowHeight","attribByField","acc","attrib","rowOrderIds","draggedRowData","r","combinedScrollHandler","e","containerRefElement","scrollHeight","scrollTop","clientHeight","groupValue","isEntityPickerOpen","handleMoveSubmit","closeMoveDialog","movingEntities","handleMoveToRoot","getDisabledFolderIds","getDisabledMessage","useMoveEntities","handleMoveSubmitWithExpand","folderIdToExpand","prevExpanded","tableUiContent","jsxs","ClipboardProvider","jsx","Styled.TableWrapper","Styled.TableContainer","clsx","TableHead","TableBody","EntityPickerDialog","dragOverlayPortal","createPortal","DragOverlay","overlayRowInstance","tableWidth","Styled.TR","vc","cell","cellStyleBase","Styled.TD","Icon","TD","getCellId","Fragment","Styled.TableHeader","headerGroup","TableHeadRow","virtualColumns","Styled.ColumnHeader","virtualColumn","header","TableHeadCell","canFilter","canHide","canSort","canPin","canResize","isReadOnly","menuId","menuOpen","useMenuContext","isOpen","Styled.HeaderCell","Styled.TableCellContent","flexRender","Styled.HeaderButtons","ColumnHeaderMenu","HeaderActionButton","Styled.ResizedHandler","attribs","contextMenuItems","headerLabels","headerId","handleTableBodyContextMenu","useCellContextMenu","handlePreFetchTasks","usePrefetchFolderTasks","rowVirtualizer","useVirtualizer","index","element","virtualRows","measureRowElement","node","useKeyboardNavigation","tbodyContent","virtualRow","i","TableBodyRow","Styled.AnimatedEmptyPlaceholder","EmptyPlaceholder","Button","SortableContext","verticalListSortingStrategy","visibleCells","paddingLeft","paddingRight","rowRef","dataIndex","offsetTop","rowHeight","sortable","useSortable","combinedRef","style","CSS","RowDragHandleCellContent","className","onOpenPlayer","isCellSelected","isCellFocused","startSelection","extendSelection","endSelection","selectCell","focusCell","getCellBorderClasses","clearSelection","isRowSelected","useSelectedRowsContext","isEditing","setEditingCellId","editingCellId","borderClasses","isLastLeftPinnedColumn","isRowSelectionColumn","isGroup","isMultipleSelected","isEntityExpandable","target","isRestricted","isEntityRestricted","EDIT_TRIGGER_CLASS","editingInput","proceedWithSelection","additive","isTargetReadOnly","rowSelectionCellId","targetIds","getEntityViewierIds"],"mappings":"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"}