@payloadcms/ui 3.80.0-internal.8d9ec7c → 3.80.0-internal.cdd7ef7

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 (286) hide show
  1. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  2. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +4 -2
  3. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  4. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +157 -0
  5. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -1
  6. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.d.ts.map +1 -0
  7. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.js +5 -5
  8. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js.map +1 -0
  9. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.scss +1 -1
  10. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.d.ts.map +1 -0
  11. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.js +3 -3
  12. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.js.map +1 -0
  13. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.scss +1 -1
  14. package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts.map +1 -0
  15. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.js +6 -6
  16. package/dist/elements/Hierarchy/ColumnBrowser/index.js.map +1 -0
  17. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -0
  18. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -0
  19. package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts.map +1 -0
  20. package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.js +6 -6
  21. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -0
  22. package/dist/elements/Hierarchy/DocHeaderButton/index.server.d.ts.map +1 -0
  23. package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.js +3 -3
  24. package/dist/elements/Hierarchy/DocHeaderButton/index.server.js.map +1 -0
  25. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts.map +1 -0
  26. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js.map +1 -0
  27. package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.d.ts +2 -2
  28. package/dist/elements/Hierarchy/Drawer/index.d.ts.map +1 -0
  29. package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.js +2 -2
  30. package/dist/elements/Hierarchy/Drawer/index.js.map +1 -0
  31. package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.d.ts +1 -1
  32. package/dist/elements/Hierarchy/Drawer/types.d.ts.map +1 -0
  33. package/dist/elements/Hierarchy/Drawer/types.js.map +1 -0
  34. package/dist/elements/{HierarchyDrawer/index.d.ts → Hierarchy/Drawer/useHierarchyDrawer.d.ts} +1 -1
  35. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts.map +1 -0
  36. package/dist/elements/{HierarchyDrawer/index.js → Hierarchy/Drawer/useHierarchyDrawer.js} +6 -6
  37. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js.map +1 -0
  38. package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts.map +1 -0
  39. package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.js +7 -16
  40. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js.map +1 -0
  41. package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.scss +1 -1
  42. package/dist/elements/Hierarchy/Field/index.client.d.ts.map +1 -0
  43. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.js +17 -29
  44. package/dist/elements/Hierarchy/Field/index.client.js.map +1 -0
  45. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.scss +1 -1
  46. package/dist/elements/Hierarchy/Field/index.server.d.ts.map +1 -0
  47. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.js +2 -2
  48. package/dist/elements/Hierarchy/Field/index.server.js.map +1 -0
  49. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts +4 -0
  50. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts.map +1 -0
  51. package/dist/elements/{HydrateHierarchyProvider → Hierarchy/HydrateProvider}/index.js +1 -1
  52. package/dist/elements/Hierarchy/HydrateProvider/index.js.map +1 -0
  53. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.d.ts +3 -3
  54. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -0
  55. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.js +10 -10
  56. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -0
  57. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.scss +1 -1
  58. package/dist/elements/Hierarchy/Search/HierarchySearchInput.d.ts.map +1 -0
  59. package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.js +5 -5
  60. package/dist/elements/Hierarchy/Search/HierarchySearchInput.js.map +1 -0
  61. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.d.ts.map +1 -0
  62. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.js.map +1 -0
  63. package/dist/elements/Hierarchy/Search/HierarchySearchResults.d.ts.map +1 -0
  64. package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.js +2 -2
  65. package/dist/elements/Hierarchy/Search/HierarchySearchResults.js.map +1 -0
  66. package/dist/elements/Hierarchy/Search/index.d.ts.map +1 -0
  67. package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.js +2 -2
  68. package/dist/elements/Hierarchy/Search/index.js.map +1 -0
  69. package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.scss +1 -1
  70. package/dist/elements/Hierarchy/Search/types.d.ts.map +1 -0
  71. package/dist/elements/Hierarchy/Search/types.js.map +1 -0
  72. package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -0
  73. package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.js +2 -2
  74. package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -0
  75. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -0
  76. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.js +43 -48
  77. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -0
  78. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -0
  79. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.js +6 -5
  80. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -0
  81. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.d.ts.map +1 -0
  82. package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/LoadMoreButton.js +1 -1
  83. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.js.map +1 -0
  84. package/dist/elements/Hierarchy/Tree/LoadMore/index.d.ts.map +1 -0
  85. package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.js +1 -1
  86. package/dist/elements/Hierarchy/Tree/LoadMore/index.js.map +1 -0
  87. package/dist/elements/Hierarchy/Tree/TreeConnector.d.ts.map +1 -0
  88. package/dist/elements/Hierarchy/Tree/TreeConnector.js.map +1 -0
  89. package/dist/elements/Hierarchy/Tree/TreeFocusContext.d.ts.map +1 -0
  90. package/dist/elements/Hierarchy/Tree/TreeFocusContext.js.map +1 -0
  91. package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts.map +1 -0
  92. package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.js +8 -4
  93. package/dist/elements/Hierarchy/Tree/TreeNode/index.js.map +1 -0
  94. package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.scss +1 -1
  95. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/index.d.ts +1 -0
  96. package/dist/elements/Hierarchy/Tree/index.d.ts.map +1 -0
  97. package/dist/elements/{Tree → Hierarchy/Tree}/index.js +72 -72
  98. package/dist/elements/Hierarchy/Tree/index.js.map +1 -0
  99. package/dist/elements/{Tree → Hierarchy/Tree}/index.scss +2 -5
  100. package/dist/elements/{Tree → Hierarchy/Tree}/types.d.ts +30 -24
  101. package/dist/elements/Hierarchy/Tree/types.d.ts.map +1 -0
  102. package/dist/elements/Hierarchy/Tree/types.js.map +1 -0
  103. package/dist/elements/{Tree → Hierarchy/Tree}/useChildren.d.ts +5 -1
  104. package/dist/elements/Hierarchy/Tree/useChildren.d.ts.map +1 -0
  105. package/dist/elements/{Tree → Hierarchy/Tree}/useChildren.js +41 -25
  106. package/dist/elements/Hierarchy/Tree/useChildren.js.map +1 -0
  107. package/dist/elements/LoadMoreRow/index.js +1 -1
  108. package/dist/elements/LoadMoreRow/index.js.map +1 -1
  109. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  110. package/dist/elements/RelationshipTable/index.js +14 -9
  111. package/dist/elements/RelationshipTable/index.js.map +1 -1
  112. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +1 -1
  113. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
  114. package/dist/exports/client/index.d.ts +11 -15
  115. package/dist/exports/client/index.d.ts.map +1 -1
  116. package/dist/exports/client/index.js +26 -26
  117. package/dist/exports/client/index.js.map +4 -4
  118. package/dist/exports/rsc/index.d.ts +3 -3
  119. package/dist/exports/rsc/index.d.ts.map +1 -1
  120. package/dist/exports/rsc/index.js +3 -3
  121. package/dist/exports/rsc/index.js.map +1 -1
  122. package/dist/forms/Form/mergeServerFormState.d.ts.map +1 -1
  123. package/dist/forms/Form/mergeServerFormState.js +101 -24
  124. package/dist/forms/Form/mergeServerFormState.js.map +1 -1
  125. package/dist/icons/TableView/index.d.ts +3 -0
  126. package/dist/icons/TableView/index.d.ts.map +1 -0
  127. package/dist/icons/TableView/index.js +16 -0
  128. package/dist/icons/TableView/index.js.map +1 -0
  129. package/dist/providers/Hierarchy/index.d.ts.map +1 -1
  130. package/dist/providers/Hierarchy/index.js +5 -1
  131. package/dist/providers/Hierarchy/index.js.map +1 -1
  132. package/dist/providers/Hierarchy/types.d.ts +1 -0
  133. package/dist/providers/Hierarchy/types.d.ts.map +1 -1
  134. package/dist/providers/Hierarchy/types.js.map +1 -1
  135. package/dist/providers/SidebarTabs/index.d.ts +19 -0
  136. package/dist/providers/SidebarTabs/index.d.ts.map +1 -0
  137. package/dist/providers/SidebarTabs/index.js +24 -0
  138. package/dist/providers/SidebarTabs/index.js.map +1 -0
  139. package/dist/styles.css +1 -1
  140. package/dist/views/Edit/index.d.ts.map +1 -1
  141. package/dist/views/Edit/index.js +11 -2
  142. package/dist/views/Edit/index.js.map +1 -1
  143. package/dist/views/HierarchyList/DocumentListSelection/index.d.ts.map +1 -1
  144. package/dist/views/HierarchyList/DocumentListSelection/index.js +145 -86
  145. package/dist/views/HierarchyList/DocumentListSelection/index.js.map +1 -1
  146. package/dist/views/HierarchyList/HierarchyTable/index.d.ts +1 -1
  147. package/dist/views/HierarchyList/HierarchyTable/index.d.ts.map +1 -1
  148. package/dist/views/HierarchyList/HierarchyTable/index.js.map +1 -1
  149. package/package.json +4 -4
  150. package/dist/elements/HierarchyButton/index.d.ts.map +0 -1
  151. package/dist/elements/HierarchyButton/index.js.map +0 -1
  152. package/dist/elements/HierarchyButton/index.server.d.ts.map +0 -1
  153. package/dist/elements/HierarchyButton/index.server.js.map +0 -1
  154. package/dist/elements/HierarchyColumnBrowser/Column/index.d.ts.map +0 -1
  155. package/dist/elements/HierarchyColumnBrowser/Column/index.js.map +0 -1
  156. package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.d.ts.map +0 -1
  157. package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.js.map +0 -1
  158. package/dist/elements/HierarchyColumnBrowser/index.d.ts.map +0 -1
  159. package/dist/elements/HierarchyColumnBrowser/index.js.map +0 -1
  160. package/dist/elements/HierarchyColumnBrowser/types.d.ts.map +0 -1
  161. package/dist/elements/HierarchyColumnBrowser/types.js.map +0 -1
  162. package/dist/elements/HierarchyDrawer/Drawer/index.d.ts.map +0 -1
  163. package/dist/elements/HierarchyDrawer/Drawer/index.js.map +0 -1
  164. package/dist/elements/HierarchyDrawer/fetchAncestorPath.d.ts.map +0 -1
  165. package/dist/elements/HierarchyDrawer/fetchAncestorPath.js.map +0 -1
  166. package/dist/elements/HierarchyDrawer/index.d.ts.map +0 -1
  167. package/dist/elements/HierarchyDrawer/index.js.map +0 -1
  168. package/dist/elements/HierarchyDrawer/types.d.ts.map +0 -1
  169. package/dist/elements/HierarchyDrawer/types.js.map +0 -1
  170. package/dist/elements/HierarchyField/SelectedHierarchies.d.ts.map +0 -1
  171. package/dist/elements/HierarchyField/SelectedHierarchies.js.map +0 -1
  172. package/dist/elements/HierarchyField/index.client.d.ts.map +0 -1
  173. package/dist/elements/HierarchyField/index.client.js.map +0 -1
  174. package/dist/elements/HierarchyField/index.server.d.ts.map +0 -1
  175. package/dist/elements/HierarchyField/index.server.js.map +0 -1
  176. package/dist/elements/HierarchySearch/HierarchySearchInput.d.ts.map +0 -1
  177. package/dist/elements/HierarchySearch/HierarchySearchInput.js.map +0 -1
  178. package/dist/elements/HierarchySearch/HierarchySearchResultItem.d.ts.map +0 -1
  179. package/dist/elements/HierarchySearch/HierarchySearchResultItem.js.map +0 -1
  180. package/dist/elements/HierarchySearch/HierarchySearchResults.d.ts.map +0 -1
  181. package/dist/elements/HierarchySearch/HierarchySearchResults.js.map +0 -1
  182. package/dist/elements/HierarchySearch/index.d.ts.map +0 -1
  183. package/dist/elements/HierarchySearch/index.js.map +0 -1
  184. package/dist/elements/HierarchySearch/types.d.ts.map +0 -1
  185. package/dist/elements/HierarchySearch/types.js.map +0 -1
  186. package/dist/elements/HierarchySearch/useHierarchySearch.d.ts.map +0 -1
  187. package/dist/elements/HierarchySearch/useHierarchySearch.js.map +0 -1
  188. package/dist/elements/HierarchyTree/HierarchySidebarTab.d.ts.map +0 -1
  189. package/dist/elements/HierarchyTree/HierarchySidebarTab.js.map +0 -1
  190. package/dist/elements/HierarchyTree/HierarchySidebarTab.server.d.ts.map +0 -1
  191. package/dist/elements/HierarchyTree/HierarchySidebarTab.server.js.map +0 -1
  192. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.d.ts.map +0 -1
  193. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js +0 -36
  194. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js.map +0 -1
  195. package/dist/elements/HierarchyTree/LoadMore/index.d.ts.map +0 -1
  196. package/dist/elements/HierarchyTree/LoadMore/index.js +0 -29
  197. package/dist/elements/HierarchyTree/LoadMore/index.js.map +0 -1
  198. package/dist/elements/HierarchyTree/LoadMore/index.scss +0 -26
  199. package/dist/elements/HierarchyTree/TreeConnector.d.ts.map +0 -1
  200. package/dist/elements/HierarchyTree/TreeConnector.js.map +0 -1
  201. package/dist/elements/HierarchyTree/TreeFocusContext.d.ts.map +0 -1
  202. package/dist/elements/HierarchyTree/TreeFocusContext.js.map +0 -1
  203. package/dist/elements/HierarchyTree/TreeNode/index.d.ts +0 -5
  204. package/dist/elements/HierarchyTree/TreeNode/index.d.ts.map +0 -1
  205. package/dist/elements/HierarchyTree/TreeNode/index.js +0 -201
  206. package/dist/elements/HierarchyTree/TreeNode/index.js.map +0 -1
  207. package/dist/elements/HierarchyTree/TreeNode/index.scss +0 -99
  208. package/dist/elements/HierarchyTree/index.d.ts.map +0 -1
  209. package/dist/elements/HierarchyTree/index.js +0 -66
  210. package/dist/elements/HierarchyTree/index.js.map +0 -1
  211. package/dist/elements/HierarchyTree/index.scss +0 -42
  212. package/dist/elements/HierarchyTree/types.d.ts +0 -57
  213. package/dist/elements/HierarchyTree/types.d.ts.map +0 -1
  214. package/dist/elements/HierarchyTree/types.js.map +0 -1
  215. package/dist/elements/HierarchyTree/useChildren.d.ts +0 -26
  216. package/dist/elements/HierarchyTree/useChildren.d.ts.map +0 -1
  217. package/dist/elements/HierarchyTree/useChildren.js +0 -150
  218. package/dist/elements/HierarchyTree/useChildren.js.map +0 -1
  219. package/dist/elements/HierarchyTree/useTreeState.d.ts +0 -9
  220. package/dist/elements/HierarchyTree/useTreeState.d.ts.map +0 -1
  221. package/dist/elements/HierarchyTree/useTreeState.js +0 -50
  222. package/dist/elements/HierarchyTree/useTreeState.js.map +0 -1
  223. package/dist/elements/HydrateHierarchyProvider/index.d.ts +0 -4
  224. package/dist/elements/HydrateHierarchyProvider/index.d.ts.map +0 -1
  225. package/dist/elements/HydrateHierarchyProvider/index.js.map +0 -1
  226. package/dist/elements/MoveMany/index.d.ts.map +0 -1
  227. package/dist/elements/MoveMany/index.js.map +0 -1
  228. package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts +0 -8
  229. package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts.map +0 -1
  230. package/dist/elements/Tree/LoadMore/LoadMoreButton.js.map +0 -1
  231. package/dist/elements/Tree/LoadMore/index.d.ts +0 -12
  232. package/dist/elements/Tree/LoadMore/index.d.ts.map +0 -1
  233. package/dist/elements/Tree/LoadMore/index.js.map +0 -1
  234. package/dist/elements/Tree/TreeConnector.d.ts +0 -7
  235. package/dist/elements/Tree/TreeConnector.d.ts.map +0 -1
  236. package/dist/elements/Tree/TreeConnector.js +0 -23
  237. package/dist/elements/Tree/TreeConnector.js.map +0 -1
  238. package/dist/elements/Tree/TreeFocusContext.d.ts +0 -28
  239. package/dist/elements/Tree/TreeFocusContext.d.ts.map +0 -1
  240. package/dist/elements/Tree/TreeFocusContext.js +0 -140
  241. package/dist/elements/Tree/TreeFocusContext.js.map +0 -1
  242. package/dist/elements/Tree/TreeNode/index.d.ts.map +0 -1
  243. package/dist/elements/Tree/TreeNode/index.js.map +0 -1
  244. package/dist/elements/Tree/index.d.ts +0 -5
  245. package/dist/elements/Tree/index.d.ts.map +0 -1
  246. package/dist/elements/Tree/index.js.map +0 -1
  247. package/dist/elements/Tree/types.d.ts.map +0 -1
  248. package/dist/elements/Tree/types.js +0 -2
  249. package/dist/elements/Tree/types.js.map +0 -1
  250. package/dist/elements/Tree/useChildren.d.ts.map +0 -1
  251. package/dist/elements/Tree/useChildren.js.map +0 -1
  252. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.d.ts +0 -0
  253. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.d.ts +0 -0
  254. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.d.ts +0 -0
  255. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.scss +0 -0
  256. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.d.ts +0 -0
  257. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.js +0 -0
  258. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.d.ts +0 -0
  259. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.scss +0 -0
  260. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.d.ts +0 -0
  261. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.d.ts +0 -0
  262. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.js +0 -0
  263. /package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.scss +0 -0
  264. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.js +0 -0
  265. /package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.d.ts +0 -0
  266. /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.d.ts +0 -0
  267. /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.d.ts +0 -0
  268. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.d.ts +0 -0
  269. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.d.ts +0 -0
  270. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.js +0 -0
  271. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.d.ts +0 -0
  272. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.d.ts +0 -0
  273. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.d.ts +0 -0
  274. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.js +0 -0
  275. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.d.ts +0 -0
  276. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.d.ts +0 -0
  277. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.d.ts +0 -0
  278. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/LoadMoreButton.d.ts +0 -0
  279. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/index.d.ts +0 -0
  280. /package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.scss +0 -0
  281. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.d.ts +0 -0
  282. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.js +0 -0
  283. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.d.ts +0 -0
  284. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.js +0 -0
  285. /package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.d.ts +0 -0
  286. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/types.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,8BAyBA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,iBAAiB,EAAE,aAAa,EAChC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,aAwIA"}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,8BAyBA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,iBAAiB,EAAE,aAAa,EAChC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,aA0IA"}
@@ -86,8 +86,10 @@ export function mergeFormStateFromClipboard({
86
86
  // Map to track old IDs to new IDs for regenerating nested IDs
87
87
  const idReplacements = new Map();
88
88
  for (const clipboardPath in dataFromClipboard) {
89
- // Pasting a row id, skip overwriting
90
- if (!pasteIntoField && clipboardPath.endsWith('.id') || !clipboardPath.startsWith(pathToReplace)) {
89
+ // When pasting into a specific row, skip only the direct row ID to avoid overwriting
90
+ // the target row's identity. Nested IDs (array item IDs within the block) should
91
+ // still be processed so they get regenerated below, preventing server-side duplication.
92
+ if (!pasteIntoField && clipboardPath === `${pathToReplace}.id` || !clipboardPath.startsWith(pathToReplace)) {
91
93
  continue;
92
94
  }
93
95
  const newPath = clipboardPath.replace(pathToReplace, targetSegment);
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.js","names":["ObjectIdImport","ObjectId","default","reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","idReplacements","Map","clipboardPath","endsWith","newPath","replace","undefined","oldID","isValid","newID","toHexString","set","relativePath","segments","split","parseInt","parentFieldPath","slice","join","fullParentPath","parentRows","isNaN","targetParts","lastPart","rowIndexFromTarget"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\n\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n // Map to track old IDs to new IDs for regenerating nested IDs\n const idReplacements: Map<string, string> = new Map()\n\n for (const clipboardPath in dataFromClipboard) {\n // Pasting a row id, skip overwriting\n if (\n (!pasteIntoField && clipboardPath.endsWith('.id')) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n // If this is an ID field, generate a new ID to prevent duplicates\n if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {\n const oldID = dataFromClipboard[clipboardPath].value as string\n if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {\n const newID = new ObjectId().toHexString()\n idReplacements.set(clipboardPath, newID)\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n initialValue: newID,\n value: newID,\n }\n continue\n }\n }\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n // Update parent field rows with new IDs\n for (const [clipboardPath, newID] of idReplacements) {\n const relativePath = clipboardPath.replace(`${pathToReplace}.`, '')\n const segments = relativePath.split('.')\n\n if (segments.length >= 2) {\n const rowIndex = parseInt(segments[segments.length - 2], 10)\n const parentFieldPath = segments.slice(0, segments.length - 2).join('.')\n const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment\n\n if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {\n const parentRows = formState[fullParentPath].rows\n if (!isNaN(rowIndex) && parentRows[rowIndex]) {\n parentRows[rowIndex].id = newID\n }\n }\n } else if (segments.length === 1 && segments[0] === 'id') {\n // Top-level block ID - extract field path and row index from targetSegment\n const targetParts = targetSegment.split('.')\n const lastPart = targetParts[targetParts.length - 1]\n const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0\n const fieldPath = !isNaN(parseInt(lastPart, 10))\n ? targetParts.slice(0, -1).join('.')\n : targetSegment\n\n if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {\n const rows = formState[fieldPath].rows\n if (rows[rowIndexFromTarget]) {\n rows[rowIndexFromTarget].id = newID\n }\n }\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.js","names":["ObjectIdImport","ObjectId","default","reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","idReplacements","Map","clipboardPath","newPath","replace","undefined","endsWith","oldID","isValid","newID","toHexString","set","relativePath","segments","split","parseInt","parentFieldPath","slice","join","fullParentPath","parentRows","isNaN","targetParts","lastPart","rowIndexFromTarget"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\n\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n // Map to track old IDs to new IDs for regenerating nested IDs\n const idReplacements: Map<string, string> = new Map()\n\n for (const clipboardPath in dataFromClipboard) {\n // When pasting into a specific row, skip only the direct row ID to avoid overwriting\n // the target row's identity. Nested IDs (array item IDs within the block) should\n // still be processed so they get regenerated below, preventing server-side duplication.\n if (\n (!pasteIntoField && clipboardPath === `${pathToReplace}.id`) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n // If this is an ID field, generate a new ID to prevent duplicates\n if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {\n const oldID = dataFromClipboard[clipboardPath].value as string\n if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {\n const newID = new ObjectId().toHexString()\n idReplacements.set(clipboardPath, newID)\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n initialValue: newID,\n value: newID,\n }\n continue\n }\n }\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n // Update parent field rows with new IDs\n for (const [clipboardPath, newID] of idReplacements) {\n const relativePath = clipboardPath.replace(`${pathToReplace}.`, '')\n const segments = relativePath.split('.')\n\n if (segments.length >= 2) {\n const rowIndex = parseInt(segments[segments.length - 2], 10)\n const parentFieldPath = segments.slice(0, segments.length - 2).join('.')\n const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment\n\n if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {\n const parentRows = formState[fullParentPath].rows\n if (!isNaN(rowIndex) && parentRows[rowIndex]) {\n parentRows[rowIndex].id = newID\n }\n }\n } else if (segments.length === 1 && segments[0] === 'id') {\n // Top-level block ID - extract field path and row index from targetSegment\n const targetParts = targetSegment.split('.')\n const lastPart = targetParts[targetParts.length - 1]\n const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0\n const fieldPath = !isNaN(parseInt(lastPart, 10))\n ? targetParts.slice(0, -1).join('.')\n : targetSegment\n\n if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {\n const rows = formState[fieldPath].rows\n if (rows[rowIndexFromTarget]) {\n rows[rowIndexFromTarget].id = newID\n }\n }\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
@@ -198,6 +198,163 @@ describe('mergeFormStateFromClipboard', () => {
198
198
  expect(result['duplicate.0.number'].value).toEqual(342);
199
199
  });
200
200
  });
201
+ describe('block row paste with nested array', () => {
202
+ it('should regenerate nested array item IDs when pasting a block row', () => {
203
+ const copiedBlockID = new ObjectId().toHexString();
204
+ const copiedArrayItemID1 = new ObjectId().toHexString();
205
+ const copiedArrayItemID2 = new ObjectId().toHexString();
206
+ const copiedArrayItemID3 = new ObjectId().toHexString();
207
+ const targetBlockID = new ObjectId().toHexString();
208
+ // Target form state: block at index 1 with empty buttons array
209
+ const formState = {
210
+ ctas: {
211
+ valid: true,
212
+ value: 2,
213
+ initialValue: 2,
214
+ rows: [{
215
+ id: copiedBlockID,
216
+ blockType: 'callToAction',
217
+ isLoading: false
218
+ }, {
219
+ id: targetBlockID,
220
+ blockType: 'callToAction',
221
+ isLoading: false
222
+ }]
223
+ },
224
+ 'ctas.0': {
225
+ value: 'callToAction',
226
+ valid: true
227
+ },
228
+ 'ctas.0.id': {
229
+ value: copiedBlockID,
230
+ valid: true
231
+ },
232
+ 'ctas.0.buttons': {
233
+ valid: true,
234
+ value: 3,
235
+ rows: [{
236
+ id: copiedArrayItemID1,
237
+ isLoading: false
238
+ }, {
239
+ id: copiedArrayItemID2,
240
+ isLoading: false
241
+ }, {
242
+ id: copiedArrayItemID3,
243
+ isLoading: false
244
+ }]
245
+ },
246
+ 'ctas.0.buttons.0.id': {
247
+ value: copiedArrayItemID1,
248
+ valid: true
249
+ },
250
+ 'ctas.0.buttons.1.id': {
251
+ value: copiedArrayItemID2,
252
+ valid: true
253
+ },
254
+ 'ctas.0.buttons.2.id': {
255
+ value: copiedArrayItemID3,
256
+ valid: true
257
+ },
258
+ 'ctas.1': {
259
+ value: 'callToAction',
260
+ valid: true
261
+ },
262
+ 'ctas.1.id': {
263
+ value: targetBlockID,
264
+ valid: true
265
+ },
266
+ 'ctas.1.buttons': {
267
+ valid: true,
268
+ value: 0,
269
+ rows: []
270
+ }
271
+ };
272
+ // Clipboard: block row 0 (source) with 3 buttons
273
+ const clipboardData = {
274
+ type: 'blocks',
275
+ path: 'ctas',
276
+ blocks: [],
277
+ rowIndex: 0,
278
+ data: {
279
+ 'ctas.0': {
280
+ value: 'callToAction',
281
+ valid: true
282
+ },
283
+ 'ctas.0.id': {
284
+ value: copiedBlockID,
285
+ valid: true
286
+ },
287
+ 'ctas.0.buttons': {
288
+ valid: true,
289
+ value: 3,
290
+ rows: [{
291
+ id: copiedArrayItemID1,
292
+ isLoading: false
293
+ }, {
294
+ id: copiedArrayItemID2,
295
+ isLoading: false
296
+ }, {
297
+ id: copiedArrayItemID3,
298
+ isLoading: false
299
+ }]
300
+ },
301
+ 'ctas.0.buttons.0.id': {
302
+ value: copiedArrayItemID1,
303
+ valid: true
304
+ },
305
+ 'ctas.0.buttons.0.label': {
306
+ value: 'Button 1',
307
+ valid: true
308
+ },
309
+ 'ctas.0.buttons.1.id': {
310
+ value: copiedArrayItemID2,
311
+ valid: true
312
+ },
313
+ 'ctas.0.buttons.1.label': {
314
+ value: 'Button 2',
315
+ valid: true
316
+ },
317
+ 'ctas.0.buttons.2.id': {
318
+ value: copiedArrayItemID3,
319
+ valid: true
320
+ },
321
+ 'ctas.0.buttons.2.label': {
322
+ value: 'Button 3',
323
+ valid: true
324
+ }
325
+ }
326
+ };
327
+ // Paste into block row 1 (target)
328
+ const result = mergeFormStateFromClipboard({
329
+ dataFromClipboard: clipboardData,
330
+ formState,
331
+ path: 'ctas',
332
+ rowIndex: 1
333
+ });
334
+ // Target block ID should NOT be overwritten
335
+ expect(result['ctas.1.id'].value).toEqual(targetBlockID);
336
+ // Nested array items should have NEW IDs (not the source IDs)
337
+ expect(result['ctas.1.buttons.0.id']).toBeDefined();
338
+ expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1);
339
+ expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value)).toBe(true);
340
+ expect(result['ctas.1.buttons.1.id']).toBeDefined();
341
+ expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2);
342
+ expect(result['ctas.1.buttons.2.id']).toBeDefined();
343
+ expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3);
344
+ // The rows metadata in ctas.1.buttons should have the new IDs
345
+ expect(result['ctas.1.buttons'].rows).toHaveLength(3);
346
+ expect(result['ctas.1.buttons'].rows[0].id).toEqual(result['ctas.1.buttons.0.id'].value);
347
+ expect(result['ctas.1.buttons'].rows[1].id).toEqual(result['ctas.1.buttons.1.id'].value);
348
+ expect(result['ctas.1.buttons'].rows[2].id).toEqual(result['ctas.1.buttons.2.id'].value);
349
+ // Field values should be copied
350
+ expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1');
351
+ expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2');
352
+ expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3');
353
+ // Source block should be untouched
354
+ expect(result['ctas.0.id'].value).toEqual(copiedBlockID);
355
+ expect(result['ctas.0.buttons'].rows).toHaveLength(3);
356
+ });
357
+ });
201
358
  describe('array ID regeneration', () => {
202
359
  it('should generate new IDs when pasting arrays to prevent duplicates', () => {
203
360
  const copiedArrayID = new ObjectId().toHexString();
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.spec.js","names":["ObjectIdImport","describe","expect","it","mergeFormStateFromClipboard","ObjectId","default","copiedBlockID","toHexString","formState","layout","valid","value","initialValue","rows","clipboardData","type","path","blocks","data","rowIndex","result","dataFromClipboard","toBeDefined","not","toEqual","isValid","toBe","toHaveLength","id","copiedNestedBlockID","duplicate","copiedArrayID","items","fields","copiedNestedArrayID","disableSort"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.spec.ts"],"sourcesContent":["import type { FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js'\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = (\n 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n) as typeof ObjectIdImport\n\ndescribe('mergeFormStateFromClipboard', () => {\n describe('block ID regeneration', () => {\n it('should generate new IDs when pasting blocks to prevent duplicates', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that a new ID was generated\n expect(result['layout.0.id']).toBeDefined()\n expect(result['layout.0.id'].value).toBeDefined()\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.layout.rows).toHaveLength(1)\n expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID)\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n })\n\n it('should generate new IDs for nested blocks', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedNestedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'container',\n valid: true,\n },\n 'layout.0.subBlocks': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedBlockID }],\n },\n 'layout.0.subBlocks.0.id': {\n value: copiedNestedBlockID,\n valid: true,\n },\n 'layout.0.subBlocks.0.blockType': {\n value: 'content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that parent block got new ID\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that nested block got new ID\n expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID)\n expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(\n result['layout.0.subBlocks.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'preserved text content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Non-ID fields should be preserved\n expect(result['layout.0.blockType'].value).toEqual('content')\n expect(result['layout.0.text'].value).toEqual('preserved text content')\n })\n\n it('should generate new ID when pasting from row to field', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n duplicate: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from blocks.1 and pasting into duplicate field\n const clipboardData = {\n type: 'blocks' as const,\n path: 'blocks',\n blocks: [],\n data: {\n 'blocks.1.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'blocks.1.blockType': {\n value: 'number',\n valid: true,\n },\n 'blocks.1.number': {\n value: 342,\n valid: true,\n },\n },\n rowIndex: 1,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'duplicate',\n })\n\n // Check that a new ID was generated\n expect(result['duplicate.0.id']).toBeDefined()\n expect(result['duplicate.0.id'].value).toBeDefined()\n expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['duplicate.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.duplicate.rows).toBeDefined()\n expect(result.duplicate.rows).toHaveLength(1)\n expect(result.duplicate.rows![0].id).not.toEqual(copiedBlockID)\n expect(result.duplicate.rows![0].id).toEqual(result['duplicate.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['duplicate.0.number'].value).toEqual(342)\n })\n })\n\n describe('array ID regeneration', () => {\n it('should generate new IDs when pasting arrays to prevent duplicates', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that a new ID was generated\n expect(result['items.0.id']).toBeDefined()\n expect(result['items.0.id'].value).toBeDefined()\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.items.rows).toHaveLength(1)\n expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID)\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n })\n\n it('should generate new IDs for nested arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n const copiedNestedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'parent array',\n valid: true,\n },\n 'items.0.subArray': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedArrayID }],\n },\n 'items.0.subArray.0.id': {\n value: copiedNestedArrayID,\n valid: true,\n },\n 'items.0.subArray.0.text': {\n value: 'nested array',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that parent array got new ID\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that nested array got new ID\n expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID)\n expect(ObjectId.isValid(result['items.0.subArray.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(\n result['items.0.subArray.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'preserved array text',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Non-ID fields should be preserved\n expect(result['items.0.text'].value).toEqual('preserved array text')\n })\n\n it('should generate new ID when pasting from array row to field', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n disableSort: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from items.0 and pasting into disableSort field\n const clipboardData = {\n type: 'array' as const,\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'row one',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'disableSort',\n })\n\n // Check that a new ID was generated\n expect(result['disableSort.0.id']).toBeDefined()\n expect(result['disableSort.0.id'].value).toBeDefined()\n expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['disableSort.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.disableSort.rows).toBeDefined()\n expect(result.disableSort.rows).toHaveLength(1)\n expect(result.disableSort.rows![0].id).not.toEqual(copiedArrayID)\n expect(result.disableSort.rows![0].id).toEqual(result['disableSort.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['disableSort.0.text'].value).toEqual('row one')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.spec.js","names":["ObjectIdImport","describe","expect","it","mergeFormStateFromClipboard","ObjectId","default","copiedBlockID","toHexString","formState","layout","valid","value","initialValue","rows","clipboardData","type","path","blocks","data","rowIndex","result","dataFromClipboard","toBeDefined","not","toEqual","isValid","toBe","toHaveLength","id","copiedNestedBlockID","duplicate","copiedArrayItemID1","copiedArrayItemID2","copiedArrayItemID3","targetBlockID","ctas","blockType","isLoading","copiedArrayID","items","fields","copiedNestedArrayID","disableSort"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.spec.ts"],"sourcesContent":["import type { FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js'\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = (\n 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n) as typeof ObjectIdImport\n\ndescribe('mergeFormStateFromClipboard', () => {\n describe('block ID regeneration', () => {\n it('should generate new IDs when pasting blocks to prevent duplicates', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that a new ID was generated\n expect(result['layout.0.id']).toBeDefined()\n expect(result['layout.0.id'].value).toBeDefined()\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.layout.rows).toHaveLength(1)\n expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID)\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n })\n\n it('should generate new IDs for nested blocks', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedNestedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'container',\n valid: true,\n },\n 'layout.0.subBlocks': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedBlockID }],\n },\n 'layout.0.subBlocks.0.id': {\n value: copiedNestedBlockID,\n valid: true,\n },\n 'layout.0.subBlocks.0.blockType': {\n value: 'content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that parent block got new ID\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that nested block got new ID\n expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID)\n expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(\n result['layout.0.subBlocks.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'preserved text content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Non-ID fields should be preserved\n expect(result['layout.0.blockType'].value).toEqual('content')\n expect(result['layout.0.text'].value).toEqual('preserved text content')\n })\n\n it('should generate new ID when pasting from row to field', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n duplicate: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from blocks.1 and pasting into duplicate field\n const clipboardData = {\n type: 'blocks' as const,\n path: 'blocks',\n blocks: [],\n data: {\n 'blocks.1.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'blocks.1.blockType': {\n value: 'number',\n valid: true,\n },\n 'blocks.1.number': {\n value: 342,\n valid: true,\n },\n },\n rowIndex: 1,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'duplicate',\n })\n\n // Check that a new ID was generated\n expect(result['duplicate.0.id']).toBeDefined()\n expect(result['duplicate.0.id'].value).toBeDefined()\n expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['duplicate.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.duplicate.rows).toBeDefined()\n expect(result.duplicate.rows).toHaveLength(1)\n expect(result.duplicate.rows![0].id).not.toEqual(copiedBlockID)\n expect(result.duplicate.rows![0].id).toEqual(result['duplicate.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['duplicate.0.number'].value).toEqual(342)\n })\n })\n\n describe('block row paste with nested array', () => {\n it('should regenerate nested array item IDs when pasting a block row', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedArrayItemID1 = new ObjectId().toHexString()\n const copiedArrayItemID2 = new ObjectId().toHexString()\n const copiedArrayItemID3 = new ObjectId().toHexString()\n const targetBlockID = new ObjectId().toHexString()\n\n // Target form state: block at index 1 with empty buttons array\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 2,\n initialValue: 2,\n rows: [\n { id: copiedBlockID, blockType: 'callToAction', isLoading: false },\n { id: targetBlockID, blockType: 'callToAction', isLoading: false },\n ],\n },\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.1': { value: 'callToAction', valid: true },\n 'ctas.1.id': { value: targetBlockID, valid: true },\n 'ctas.1.buttons': {\n valid: true,\n value: 0,\n rows: [],\n },\n }\n\n // Clipboard: block row 0 (source) with 3 buttons\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'ctas',\n blocks: [],\n rowIndex: 0,\n data: {\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.0.label': { value: 'Button 1', valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.1.label': { value: 'Button 2', valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.0.buttons.2.label': { value: 'Button 3', valid: true },\n },\n }\n\n // Paste into block row 1 (target)\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'ctas',\n rowIndex: 1,\n })\n\n // Target block ID should NOT be overwritten\n expect(result['ctas.1.id'].value).toEqual(targetBlockID)\n\n // Nested array items should have NEW IDs (not the source IDs)\n expect(result['ctas.1.buttons.0.id']).toBeDefined()\n expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1)\n expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value as string)).toBe(true)\n\n expect(result['ctas.1.buttons.1.id']).toBeDefined()\n expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2)\n\n expect(result['ctas.1.buttons.2.id']).toBeDefined()\n expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3)\n\n // The rows metadata in ctas.1.buttons should have the new IDs\n expect(result['ctas.1.buttons'].rows).toHaveLength(3)\n expect(result['ctas.1.buttons'].rows![0].id).toEqual(result['ctas.1.buttons.0.id'].value)\n expect(result['ctas.1.buttons'].rows![1].id).toEqual(result['ctas.1.buttons.1.id'].value)\n expect(result['ctas.1.buttons'].rows![2].id).toEqual(result['ctas.1.buttons.2.id'].value)\n\n // Field values should be copied\n expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1')\n expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2')\n expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3')\n\n // Source block should be untouched\n expect(result['ctas.0.id'].value).toEqual(copiedBlockID)\n expect(result['ctas.0.buttons'].rows).toHaveLength(3)\n })\n })\n\n describe('array ID regeneration', () => {\n it('should generate new IDs when pasting arrays to prevent duplicates', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that a new ID was generated\n expect(result['items.0.id']).toBeDefined()\n expect(result['items.0.id'].value).toBeDefined()\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.items.rows).toHaveLength(1)\n expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID)\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n })\n\n it('should generate new IDs for nested arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n const copiedNestedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'parent array',\n valid: true,\n },\n 'items.0.subArray': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedArrayID }],\n },\n 'items.0.subArray.0.id': {\n value: copiedNestedArrayID,\n valid: true,\n },\n 'items.0.subArray.0.text': {\n value: 'nested array',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that parent array got new ID\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that nested array got new ID\n expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID)\n expect(ObjectId.isValid(result['items.0.subArray.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(\n result['items.0.subArray.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'preserved array text',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Non-ID fields should be preserved\n expect(result['items.0.text'].value).toEqual('preserved array text')\n })\n\n it('should generate new ID when pasting from array row to field', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n disableSort: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from items.0 and pasting into disableSort field\n const clipboardData = {\n type: 'array' as const,\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'row one',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'disableSort',\n })\n\n // Check that a new ID was generated\n expect(result['disableSort.0.id']).toBeDefined()\n expect(result['disableSort.0.id'].value).toBeDefined()\n expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['disableSort.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.disableSort.rows).toBeDefined()\n expect(result.disableSort.rows).toHaveLength(1)\n expect(result.disableSort.rows![0].id).not.toEqual(copiedArrayID)\n expect(result.disableSort.rows![0].id).toEqual(result['disableSort.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['disableSort.0.text'].value).toEqual('row one')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/elements/Hierarchy/ColumnBrowser/Column/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAA;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAQ9C,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA2FxC,CAAA"}
@@ -3,11 +3,11 @@
3
3
  import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import React, { useCallback } from 'react';
6
- import { PlusIcon } from '../../../icons/Plus/index.js';
7
- import { useTranslation } from '../../../providers/Translation/index.js';
8
- import { Button } from '../../Button/index.js';
9
- import { LoadMoreRow } from '../../LoadMoreRow/index.js';
10
- import { Spinner } from '../../Spinner/index.js';
6
+ import { PlusIcon } from '../../../../icons/Plus/index.js';
7
+ import { useTranslation } from '../../../../providers/Translation/index.js';
8
+ import { Button } from '../../../Button/index.js';
9
+ import { LoadMoreRow } from '../../../LoadMoreRow/index.js';
10
+ import { Spinner } from '../../../Spinner/index.js';
11
11
  import { ColumnItem } from '../ColumnItem/index.js';
12
12
  import './index.scss';
13
13
  const baseClass = 'hierarchy-column';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useCallback","PlusIcon","useTranslation","Button","LoadMoreRow","Spinner","ColumnItem","baseClass","Column","t0","$","ancestorsWithSelections","canCreate","collectionLabel","disabled","disabledIds","expandedId","filterByCollection","hasNextPage","isLoading","items","onCreateNew","onExpand","onLoadMore","onSelect","parentId","parentTitle","pathToColumn","selectedIds","totalDocs","t","t1","headerTitle","t2","t3","id","item","find","i","fullPath","title","path","handleSelect","handleCreateNew","t4","item_0","_jsx","Boolean","has","hasSelectedDescendants","isExpanded","isSelected","String","_jsxs","className","children","buttonStyle","icon","iconPosition","margin","onClick","size","map","loadingText","currentCount","length","hasMore"],"sources":["../../../../../src/elements/Hierarchy/ColumnBrowser/Column/index.tsx"],"sourcesContent":["'use client'\nimport React, { useCallback } from 'react'\n\nimport type { ColumnProps } from '../types.js'\n\nimport { PlusIcon } from '../../../../icons/Plus/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { Button } from '../../../Button/index.js'\nimport { LoadMoreRow } from '../../../LoadMoreRow/index.js'\nimport { Spinner } from '../../../Spinner/index.js'\nimport { ColumnItem } from '../ColumnItem/index.js'\nimport './index.scss'\n\nconst baseClass = 'hierarchy-column'\n\nexport const Column: React.FC<ColumnProps> = ({\n ancestorsWithSelections,\n canCreate,\n collectionLabel,\n disabled,\n disabledIds,\n expandedId,\n filterByCollection,\n hasNextPage,\n isLoading,\n items,\n onCreateNew,\n onExpand,\n onLoadMore,\n onSelect,\n parentId,\n parentTitle,\n pathToColumn,\n selectedIds,\n totalDocs,\n}) => {\n const { t } = useTranslation()\n\n const headerTitle = parentTitle || (parentId === null ? t('general:all') : '')\n\n const handleSelect = useCallback(\n ({ id }: { id: number | string }) => {\n const item = items.find((i) => i.id === id)\n const fullPath = item ? [...pathToColumn, { id: item.id, title: item.title }] : pathToColumn\n onSelect({ id, path: fullPath })\n },\n [items, onSelect, pathToColumn],\n )\n\n const handleCreateNew = useCallback(() => {\n onCreateNew({ parentId })\n }, [onCreateNew, parentId])\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <span className={`${baseClass}__header-title`}>{headerTitle}</span>\n {canCreate && (\n <Button\n buttonStyle=\"muted-text\"\n className={`${baseClass}__add-button`}\n disabled={disabled}\n icon={<PlusIcon />}\n iconPosition=\"left\"\n margin={false}\n onClick={handleCreateNew}\n size=\"xsmall\"\n >\n New {collectionLabel}\n </Button>\n )}\n </div>\n\n <div className={`${baseClass}__items`}>\n {items.map((item) => (\n <ColumnItem\n disabled={Boolean(disabled || disabledIds?.has(item.id))}\n filterByCollection={filterByCollection}\n hasSelectedDescendants={ancestorsWithSelections.has(item.id)}\n isExpanded={expandedId === item.id}\n isSelected={selectedIds.has(item.id)}\n item={item}\n key={String(item.id)}\n onExpand={onExpand}\n onSelect={handleSelect}\n />\n ))}\n\n {isLoading && (\n <div className={`${baseClass}__loading`}>\n <Spinner loadingText={null} size=\"small\" />\n </div>\n )}\n\n {!disabled && !isLoading && totalDocs > 0 && (\n <LoadMoreRow\n className={`${baseClass}__load-more`}\n currentCount={items.length}\n hasMore={hasNextPage}\n onLoadMore={onLoadMore}\n totalDocs={totalDocs}\n />\n )}\n </div>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- @use '../../../scss/type.scss';
1
+ @use '../../../../scss/type.scss';
2
2
 
3
3
  .hierarchy-column {
4
4
  width: 360px;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/elements/Hierarchy/ColumnBrowser/ColumnItem/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+B,MAAM,OAAO,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA+FhD,CAAA"}
@@ -3,9 +3,9 @@
3
3
  import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import React, { useCallback, useMemo } from 'react';
6
- import { CheckboxInput } from '../../../fields/Checkbox/Input.js';
7
- import { ChevronIcon } from '../../../icons/Chevron/index.js';
8
- import { isSuperset } from '../../../utilities/isSuperset.js';
6
+ import { CheckboxInput } from '../../../../fields/Checkbox/Input.js';
7
+ import { ChevronIcon } from '../../../../icons/Chevron/index.js';
8
+ import { isSuperset } from '../../../../utilities/isSuperset.js';
9
9
  import './index.scss';
10
10
  const baseClass = 'hierarchy-column-item';
11
11
  export const ColumnItem = t0 => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useCallback","useMemo","CheckboxInput","ChevronIcon","isSuperset","baseClass","ColumnItem","t0","$","disabled","filterByCollection","hasSelectedDescendants","isExpanded","isSelected","item","onExpand","onSelect","id","allowedCollections","hasChildren","title","t1","bb0","length","isDisabled","t2","e","stopPropagation","handleCheckboxToggle","t3","e_0","target","closest","handleRowClick","t4","e_1","key","preventDefault","handleKeyDown","t5","t6","t7","t8","filter","Boolean","t9","join","t10","undefined","t11","t12","_jsxs","className","onClick","onKeyDown","role","tabIndex","children","_jsx","checked","onToggle","readOnly","direction"],"sources":["../../../../../src/elements/Hierarchy/ColumnBrowser/ColumnItem/index.tsx"],"sourcesContent":["'use client'\nimport React, { useCallback, useMemo } from 'react'\n\nimport type { ColumnItemProps } from '../types.js'\n\nimport { CheckboxInput } from '../../../../fields/Checkbox/Input.js'\nimport { ChevronIcon } from '../../../../icons/Chevron/index.js'\nimport { isSuperset } from '../../../../utilities/isSuperset.js'\nimport './index.scss'\n\nconst baseClass = 'hierarchy-column-item'\n\nexport const ColumnItem: React.FC<ColumnItemProps> = ({\n disabled,\n filterByCollection,\n hasSelectedDescendants,\n isExpanded,\n isSelected,\n item,\n onExpand,\n onSelect,\n}) => {\n const { id, allowedCollections, hasChildren, title } = item\n\n // Disable selection if:\n // 1. This item is in the disabledIds set (e.g., being moved)\n // 2. Folder doesn't allow ALL required collections\n const isDisabled = useMemo(() => {\n if (disabled) {\n return true\n }\n if (!filterByCollection || filterByCollection.length === 0) {\n return false\n }\n return !isSuperset(allowedCollections, filterByCollection)\n }, [allowedCollections, disabled, filterByCollection])\n\n const handleCheckboxToggle = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation()\n if (isDisabled) {\n return\n }\n onSelect({ id })\n },\n [id, isDisabled, onSelect],\n )\n\n const handleRowClick = useCallback(\n (e: React.MouseEvent) => {\n // Don't expand when clicking the checkbox\n if ((e.target as HTMLElement).closest(`.${baseClass}__checkbox`)) {\n return\n }\n if (hasChildren) {\n onExpand({ id })\n }\n },\n [hasChildren, id, onExpand],\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (hasChildren) {\n onExpand({ id })\n }\n }\n },\n [hasChildren, id, onExpand],\n )\n\n return (\n <div\n className={[\n baseClass,\n isExpanded && `${baseClass}--expanded`,\n isSelected && `${baseClass}--selected`,\n isDisabled && `${baseClass}--disabled`,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isDisabled ? undefined : handleRowClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <div className={`${baseClass}__checkbox`}>\n <CheckboxInput checked={isSelected} onToggle={handleCheckboxToggle} readOnly={isDisabled} />\n </div>\n\n <span className={`${baseClass}__title`} title={title}>\n {title}\n </span>\n\n {hasSelectedDescendants && !isSelected && (\n <span className={`${baseClass}__descendant-indicator`} />\n )}\n\n {hasChildren && (\n <span className={`${baseClass}__chevron`}>\n <ChevronIcon direction=\"right\" />\n </span>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- @use '../../../scss/type.scss';
1
+ @use '../../../../scss/type.scss';
2
2
 
3
3
  .hierarchy-column-item {
4
4
  display: flex;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/ColumnBrowser/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAwE,MAAM,OAAO,CAAA;AAE5F,OAAO,KAAK,EAGV,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AASnB,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,sBAAsB,iNAchC;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;CAAE,GAAG,2BAA2B,sBA0d3F,CAAA;AAED,YAAY,EACV,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,WAAW,GACZ,MAAM,YAAY,CAAA"}
@@ -5,12 +5,12 @@ import { getTranslation } from '@payloadcms/translations';
5
5
  import { combineWhereConstraints, DEFAULT_HIERARCHY_TREE_LIMIT, formatAdminURL } from 'payload/shared';
6
6
  import * as qs from 'qs-esm';
7
7
  import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
8
- import { useEffectEvent } from '../../hooks/useEffectEvent.js';
9
- import { useAuth } from '../../providers/Auth/index.js';
10
- import { useConfig } from '../../providers/Config/index.js';
11
- import { useTranslation } from '../../providers/Translation/index.js';
12
- import { isSuperset } from '../../utilities/isSuperset.js';
13
- import { Spinner } from '../Spinner/index.js';
8
+ import { useEffectEvent } from '../../../hooks/useEffectEvent.js';
9
+ import { useAuth } from '../../../providers/Auth/index.js';
10
+ import { useConfig } from '../../../providers/Config/index.js';
11
+ import { useTranslation } from '../../../providers/Translation/index.js';
12
+ import { isSuperset } from '../../../utilities/isSuperset.js';
13
+ import { Spinner } from '../../Spinner/index.js';
14
14
  import { Column } from './Column/index.js';
15
15
  import './index.scss';
16
16
  const baseClass = 'hierarchy-column-browser';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","combineWhereConstraints","DEFAULT_HIERARCHY_TREE_LIMIT","formatAdminURL","qs","React","useCallback","useEffect","useImperativeHandle","useRef","useState","useEffectEvent","useAuth","useConfig","useTranslation","isSuperset","Spinner","Column","baseClass","HierarchyColumnBrowser","ancestorsWithSelections","baseFilter","disabledIds","filterByCollection","hierarchyCollectionSlug","initialExpandedPath","isLoadingPath","onCreateNew","onSelect","parentFieldName","ref","selectedIds","useAsTitle","i18n","permissions","config","routes","api","serverURL","getEntityConfig","collectionConfig","collectionSlug","hierarchyConfig","hierarchy","undefined","treeLimit","admin","collectionLabel","labels","singular","canCreate","Boolean","collections","create","columns","setColumns","expandedPath","setExpandedPath","containerRef","lastColumnRef","hasLoadedRef","fetchItems","page","parentId","parentWhere","exists","equals","where","collectionSpecific","typeFieldName","fieldName","length","allPossibleTypes","Object","keys","relatedCollections","and","or","in","not_in","whereWithBaseFilter","queryString","stringify","limit","sort","addQueryPrefix","url","apiRoute","path","response","fetch","credentials","ok","Error","data","json","allItems","docs","map","doc","id","allowedCollections","hasChildren","title","String","items","filter","item","hasNextPage","totalDocs","refreshColumn","columnIndex","findIndex","col","prev","updated","isLoading","loadColumns","parentIds","push","results","Promise","all","index","parentTitle","columnsWithTitles","prevColumn","parentItem","find","current","scrollIntoView","behavior","inline","handleExpand","itemId","column","i","newExpandedPath","slice","newColumns","targetIndex","handleLoadMore","nextPage","newItems","getPathToColumn","_jsxs","className","isLastColumn","expandedId","pathToColumn","_jsx","disabled","onExpand","onLoadMore"],"sources":["../../../../src/elements/Hierarchy/ColumnBrowser/index.tsx"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n combineWhereConstraints,\n DEFAULT_HIERARCHY_TREE_LIMIT,\n formatAdminURL,\n} from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'\n\nimport type {\n ColumnItemData,\n ColumnState,\n HierarchyColumnBrowserProps,\n HierarchyColumnBrowserRef,\n} from './types.js'\n\nimport { useEffectEvent } from '../../../hooks/useEffectEvent.js'\nimport { useAuth } from '../../../providers/Auth/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { isSuperset } from '../../../utilities/isSuperset.js'\nimport { Spinner } from '../../Spinner/index.js'\nimport { Column } from './Column/index.js'\nimport './index.scss'\n\nconst baseClass = 'hierarchy-column-browser'\n\nexport const HierarchyColumnBrowser = function HierarchyColumnBrowser({\n ancestorsWithSelections,\n baseFilter,\n disabledIds,\n filterByCollection,\n hierarchyCollectionSlug,\n initialExpandedPath,\n isLoadingPath,\n onCreateNew,\n onSelect,\n parentFieldName,\n ref,\n selectedIds,\n useAsTitle = 'id',\n}: { ref?: React.RefObject<HierarchyColumnBrowserRef | null> } & HierarchyColumnBrowserProps) {\n const { i18n } = useTranslation()\n const { permissions } = useAuth()\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug: hierarchyCollectionSlug })\n const hierarchyConfig =\n collectionConfig?.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy\n : undefined\n const treeLimit = hierarchyConfig?.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n\n const collectionLabel = collectionConfig\n ? getTranslation(collectionConfig.labels?.singular || hierarchyCollectionSlug, i18n)\n : hierarchyCollectionSlug\n const canCreate = Boolean(permissions?.collections?.[hierarchyCollectionSlug]?.create)\n\n const [columns, setColumns] = useState<ColumnState[]>([])\n const [expandedPath, setExpandedPath] = useState<(number | string)[]>([])\n const containerRef = useRef<HTMLDivElement>(null)\n const lastColumnRef = useRef<HTMLDivElement>(null)\n const hasLoadedRef = useRef(false)\n\n const fetchItems = useCallback(\n async ({\n page,\n parentId,\n }: {\n page: number\n parentId: null | number | string\n }): Promise<{\n hasNextPage: boolean\n items: ColumnItemData[]\n totalDocs: number\n }> => {\n const parentWhere =\n parentId === null\n ? { [parentFieldName]: { exists: false } }\n : { [parentFieldName]: { equals: parentId } }\n\n // Build the final where clause, adding collectionSpecific filtering if configured\n let where: Record<string, unknown> = parentWhere\n\n // Filter by collection type if collectionSpecific is configured and filterByCollection is defined\n // - undefined: no filtering, show all folders\n // - [] empty: show all folders (no constraints)\n // - ['posts', ...]: show folders that allow ANY of these OR unrestricted\n // Note: Ideally we'd enforce ALL (superset) but hasMany enum fields in PG\n // do not support \"contains all\" queries easily\n if (hierarchyConfig?.collectionSpecific && filterByCollection !== undefined) {\n const typeFieldName = hierarchyConfig.collectionSpecific.fieldName\n\n if (filterByCollection.length > 0) {\n // Get all possible type field values from relatedCollections\n // This is used to detect \"unrestricted\" folders (empty allowedTypes array)\n const allPossibleTypes = Object.keys(hierarchyConfig.relatedCollections || {})\n\n where = {\n and: [\n parentWhere,\n {\n or: [\n // items that allow ANY of the selected collections\n { [typeFieldName]: { in: filterByCollection } },\n // OR items that are unrestricted (no type field exists)\n { [typeFieldName]: { exists: false } },\n // OR items with empty allowedTypes array (unrestricted)\n // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres\n ...(allPossibleTypes.length > 0\n ? [{ [typeFieldName]: { not_in: allPossibleTypes } }]\n : []),\n ],\n },\n ],\n }\n } else {\n // Empty array: show all items of this parent\n where = parentWhere\n }\n }\n\n // Combine with baseFilter if provided\n const whereWithBaseFilter = combineWhereConstraints([where, baseFilter])\n\n const queryString = qs.stringify(\n { limit: treeLimit, page, sort: useAsTitle, where: whereWithBaseFilter },\n { addQueryPrefix: true },\n )\n\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${hierarchyCollectionSlug}${queryString}`,\n serverURL,\n })\n\n const response = await fetch(url, {\n credentials: 'include',\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch items')\n }\n\n const data = await response.json()\n\n const typeFieldName = hierarchyConfig?.collectionSpecific\n ? hierarchyConfig.collectionSpecific.fieldName\n : undefined\n\n const allItems: ColumnItemData[] = (data.docs || []).map(\n (doc: { id: number | string } & Record<string, unknown>) => ({\n id: doc.id,\n allowedCollections: typeFieldName\n ? (doc[typeFieldName] as string[] | undefined)\n : undefined,\n hasChildren: true, // Always allow expansion - empty children handled gracefully\n title: String(doc[useAsTitle] || doc.id),\n }),\n )\n\n // Client-side filter: only show items that are a superset of required collections\n // Server query uses ANY (due to PG limitations), but we want ALL (superset)\n const items =\n filterByCollection && filterByCollection.length > 0\n ? allItems.filter((item) => isSuperset(item.allowedCollections, filterByCollection))\n : allItems\n\n return {\n hasNextPage: data.hasNextPage || false,\n items,\n totalDocs: data.totalDocs || 0,\n }\n },\n [\n api,\n baseFilter,\n filterByCollection,\n hierarchyConfig,\n parentFieldName,\n serverURL,\n hierarchyCollectionSlug,\n treeLimit,\n useAsTitle,\n ],\n )\n\n const refreshColumn = useCallback(\n async (parentId: null | number | string) => {\n const columnIndex = columns.findIndex((col) => col.parentId === parentId)\n if (columnIndex === -1) {\n return\n }\n\n setColumns((prev) => {\n const updated = [...prev]\n updated[columnIndex] = { ...updated[columnIndex], isLoading: true }\n return updated\n })\n\n try {\n const { hasNextPage, items, totalDocs } = await fetchItems({ page: 1, parentId })\n\n setColumns((prev) => {\n const updated = [...prev]\n if (updated[columnIndex]) {\n updated[columnIndex] = {\n ...updated[columnIndex],\n hasNextPage,\n isLoading: false,\n items,\n page: 1,\n totalDocs,\n }\n }\n return updated\n })\n } catch {\n setColumns((prev) => {\n const updated = [...prev]\n if (updated[columnIndex]) {\n updated[columnIndex] = { ...updated[columnIndex], isLoading: false }\n }\n return updated\n })\n }\n },\n [columns, fetchItems],\n )\n\n useImperativeHandle(ref, () => ({ refreshColumn }), [refreshColumn])\n\n const loadColumns = useEffectEvent(async (path?: (number | string)[]) => {\n // Build list of parentIds to fetch: [null, ...path]\n const parentIds: (null | number | string)[] = [null]\n if (path?.length) {\n parentIds.push(...path)\n }\n\n // Set initial loading state for all columns\n setColumns(\n parentIds.map((parentId) => ({\n hasNextPage: false,\n isLoading: true,\n items: [],\n page: 1,\n parentId,\n totalDocs: 0,\n })),\n )\n\n // Set expanded path to match (excluding null/root)\n if (path?.length) {\n setExpandedPath(path)\n }\n\n // Fetch all columns in parallel\n const results = await Promise.all(\n parentIds.map(async (parentId, index) => {\n try {\n const { hasNextPage, items, totalDocs } = await fetchItems({ page: 1, parentId })\n let parentTitle: string | undefined\n if (index > 0 && parentId !== null) {\n // Will be filled in after all fetches complete\n }\n return {\n hasNextPage,\n isLoading: false,\n items,\n page: 1,\n parentId,\n parentTitle,\n totalDocs,\n }\n } catch {\n return {\n hasNextPage: false,\n isLoading: false,\n items: [],\n page: 1,\n parentId,\n parentTitle: undefined,\n totalDocs: 0,\n }\n }\n }),\n )\n\n // Fill in parent titles from previous columns\n const columnsWithTitles = results.map((col, index) => {\n if (index === 0 || col.parentId === null) {\n return col\n }\n const prevColumn = results[index - 1]\n const parentItem = prevColumn?.items.find((item) => item.id === col.parentId)\n return {\n ...col,\n parentTitle: parentItem?.title || String(col.parentId),\n }\n })\n\n setColumns(columnsWithTitles)\n })\n\n // Load columns on mount - wait for path loading to complete\n useEffect(() => {\n if (isLoadingPath || hasLoadedRef.current) {\n return\n }\n hasLoadedRef.current = true\n void loadColumns(initialExpandedPath)\n }, [initialExpandedPath, isLoadingPath])\n\n // Auto-scroll to the last column when columns change\n useEffect(() => {\n if (lastColumnRef.current && columns.length > 1) {\n lastColumnRef.current.scrollIntoView({ behavior: 'smooth', inline: 'start' })\n }\n }, [columns.length])\n\n const handleExpand = useCallback(\n async ({ columnIndex, itemId }: { columnIndex: number; itemId: number | string }) => {\n const column = columns[columnIndex]\n if (!column) {\n return\n }\n\n const item = column.items.find((i) => i.id === itemId)\n if (!item) {\n return\n }\n\n // Update expanded path - keep path up to this column, add new item\n const newExpandedPath = [...expandedPath.slice(0, columnIndex), itemId]\n setExpandedPath(newExpandedPath)\n\n // Remove columns to the right and add new loading column\n const newColumns = columns.slice(0, columnIndex + 1)\n newColumns.push({\n hasNextPage: false,\n isLoading: true,\n items: [],\n page: 1,\n parentId: itemId,\n parentTitle: item.title,\n totalDocs: 0,\n })\n\n setColumns(newColumns)\n\n // Fetch children\n try {\n const { hasNextPage, items, totalDocs } = await fetchItems({ page: 1, parentId: itemId })\n\n setColumns((prev) => {\n const updated = [...prev]\n const targetIndex = columnIndex + 1\n\n if (updated[targetIndex]?.parentId === itemId) {\n updated[targetIndex] = {\n hasNextPage,\n isLoading: false,\n items,\n page: 1,\n parentId: itemId,\n parentTitle: item.title,\n totalDocs,\n }\n }\n\n return updated\n })\n } catch {\n setColumns((prev) => {\n const updated = [...prev]\n const targetIndex = columnIndex + 1\n\n if (updated[targetIndex]?.parentId === itemId) {\n updated[targetIndex] = {\n hasNextPage: false,\n isLoading: false,\n items: [],\n page: 1,\n parentId: itemId,\n parentTitle: item.title,\n totalDocs: 0,\n }\n }\n\n return updated\n })\n }\n },\n [columns, expandedPath, fetchItems],\n )\n\n const handleLoadMore = useCallback(\n async ({ columnIndex }: { columnIndex: number }) => {\n const column = columns[columnIndex]\n if (!column || column.isLoading || !column.hasNextPage) {\n return\n }\n\n const nextPage = column.page + 1\n\n // Set loading state\n setColumns((prev) => {\n const updated = [...prev]\n updated[columnIndex] = { ...updated[columnIndex], isLoading: true }\n return updated\n })\n\n try {\n const { hasNextPage, items: newItems } = await fetchItems({\n page: nextPage,\n parentId: column.parentId,\n })\n\n setColumns((prev) => {\n const updated = [...prev]\n\n if (updated[columnIndex]) {\n updated[columnIndex] = {\n ...updated[columnIndex],\n hasNextPage,\n isLoading: false,\n items: [...updated[columnIndex].items, ...newItems],\n page: nextPage,\n }\n }\n\n return updated\n })\n } catch {\n setColumns((prev) => {\n const updated = [...prev]\n\n if (updated[columnIndex]) {\n updated[columnIndex] = { ...updated[columnIndex], isLoading: false }\n }\n\n return updated\n })\n }\n },\n [columns, fetchItems],\n )\n\n // Build path for each column based on parent info\n const getPathToColumn = (columnIndex: number) => {\n const path: Array<{ id: number | string; title: string }> = []\n\n for (let i = 1; i <= columnIndex; i++) {\n const col = columns[i]\n if (col?.parentId !== null && col?.parentId !== undefined) {\n path.push({\n id: col.parentId,\n title: col.parentTitle || String(col.parentId),\n })\n }\n }\n\n return path\n }\n\n return (\n <div className={baseClass} ref={containerRef}>\n {columns.map((column, index) => {\n const isLastColumn = index === columns.length - 1 && !isLoadingPath\n const expandedId = expandedPath[index] ?? null\n const pathToColumn = getPathToColumn(index)\n\n return (\n <div\n className={`${baseClass}__column-wrapper`}\n key={`${column.parentId ?? 'root'}-${index}`}\n ref={isLastColumn ? lastColumnRef : undefined}\n >\n <Column\n ancestorsWithSelections={ancestorsWithSelections}\n canCreate={canCreate && Boolean(onCreateNew)}\n collectionLabel={collectionLabel}\n disabled={isLoadingPath}\n disabledIds={disabledIds}\n expandedId={expandedId}\n filterByCollection={filterByCollection}\n hasNextPage={column.hasNextPage}\n isLoading={column.isLoading}\n items={column.items}\n onCreateNew={onCreateNew || (() => {})}\n onExpand={({ id }) => handleExpand({ columnIndex: index, itemId: id })}\n onLoadMore={() => handleLoadMore({ columnIndex: index })}\n onSelect={onSelect}\n parentId={column.parentId}\n parentTitle={column.parentTitle}\n pathToColumn={pathToColumn}\n selectedIds={selectedIds}\n totalDocs={column.totalDocs}\n />\n </div>\n )\n })}\n {isLoadingPath && (\n <div className={`${baseClass}__column-wrapper ${baseClass}__column-wrapper--loading`}>\n <Spinner />\n </div>\n )}\n </div>\n )\n}\n\nexport type {\n ColumnItemData,\n HierarchyColumnBrowserProps,\n HierarchyColumnBrowserRef,\n PathSegment,\n} from './types.js'\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/ColumnBrowser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAGpC,MAAM,MAAM,cAAc,GAAG;IAC3B,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,cAAc,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACnD,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IAC7C,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAA;IAClB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IAClC,UAAU,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAClC,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,qFAAqF;IACrF,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACnD,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,EAAE,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,4CAA4C;IAC5C,aAAa,EAAE,CAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACnE,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,uBAAuB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IAC7C,2EAA2E;IAC3E,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IAClC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,mBAAmB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACzC,8DAA8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACpE,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,EAAE,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/elements/Hierarchy/ColumnBrowser/types.ts"],"sourcesContent":["import type { Where } from 'payload'\nimport type React from 'react'\n\nexport type ColumnItemData = {\n /** For folders with collectionSpecific config, the allowed collection slugs */\n allowedCollections?: string[]\n hasChildren: boolean\n id: number | string\n title: string\n}\n\nexport type PathSegment = {\n id: number | string\n title: string\n}\n\nexport type ColumnItemProps = {\n disabled?: boolean\n /** Required collections that the folder must allow (for superset check) */\n filterByCollection?: string[]\n hasSelectedDescendants: boolean\n isExpanded: boolean\n isSelected: boolean\n item: ColumnItemData\n onExpand: (params: { id: number | string }) => void\n onSelect: (params: { id: number | string }) => void\n}\n\nexport type ColumnProps = {\n ancestorsWithSelections: Set<number | string>\n /** Whether user can create new documents */\n canCreate: boolean\n /** Label for the collection (e.g., \"Folder\") */\n collectionLabel: string\n disabled?: boolean\n /** IDs that should be disabled (e.g., items being moved can't be selected as destination) */\n disabledIds?: Set<number | string>\n expandedId: null | number | string\n /** Required collections for superset check (passed to ColumnItem) */\n filterByCollection?: string[]\n hasNextPage: boolean\n isLoading: boolean\n items: ColumnItemData[]\n /** Called when user clicks \"New\" button - parent should open drawer with parentId */\n onCreateNew: (params: { parentId: null | number | string }) => void\n onExpand: (params: { id: number | string }) => void\n onLoadMore: () => void\n onSelect: (params: { id: number | string; path: PathSegment[] }) => void\n parentId: null | number | string\n parentTitle?: string\n pathToColumn: PathSegment[]\n selectedIds: Set<number | string>\n totalDocs: number\n}\n\nexport type ColumnState = {\n hasNextPage: boolean\n isLoading: boolean\n items: ColumnItemData[]\n page: number\n parentId: null | number | string\n parentTitle?: string\n totalDocs: number\n}\n\nexport type HierarchyColumnBrowserRef = {\n /** Refetch a specific column by parentId */\n refreshColumn: (parentId: null | number | string) => Promise<void>\n}\n\nexport type HierarchyColumnBrowserProps = {\n ancestorsWithSelections: Set<number | string>\n /** Base filter constraint (e.g., tenant filter) to apply to all queries */\n baseFilter?: null | Where\n /** IDs that should be disabled (e.g., items being moved can't be selected as destination) */\n disabledIds?: Set<number | string>\n /**\n * Filters hierarchy items based on collection type restrictions:\n * - `undefined`: No filtering, show all folders\n * - `[]` (empty array): No filtering, show all folders (no constraints)\n * - `['posts', ...]`: Show folders accepting ANY of these collections OR unrestricted folders\n *\n * Note: Query uses ANY semantics due to PG hasMany enum limitations.\n * Client-side enforcement can disable selection of folders that don't allow ALL required collections.\n */\n filterByCollection?: string[]\n hierarchyCollectionSlug: string\n initialExpandedPath?: (number | string)[]\n /** Whether the initial expanded path is still being loaded */\n isLoadingPath?: boolean\n /** Called when user clicks \"New\" button to create a new item */\n onCreateNew?: (params: { parentId: null | number | string }) => void\n onSelect: (params: { id: number | string; path: PathSegment[] }) => void\n parentFieldName: string\n selectedIds: Set<number | string>\n useAsTitle?: string\n}\n"],"mappings":"AAsEA","ignoreList":[]}