@payloadcms/ui 3.80.0-internal.37a8509 → 3.80.0-internal.52ab774

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 (490) hide show
  1. package/dist/elements/BulkUpload/EditForm/index.d.ts.map +1 -1
  2. package/dist/elements/BulkUpload/EditForm/index.js +0 -12
  3. package/dist/elements/BulkUpload/EditForm/index.js.map +1 -1
  4. package/dist/elements/Button/index.d.ts.map +1 -1
  5. package/dist/elements/Button/index.js +5 -3
  6. package/dist/elements/Button/index.js.map +1 -1
  7. package/dist/elements/Button/index.scss +38 -5
  8. package/dist/elements/Button/types.d.ts +1 -1
  9. package/dist/elements/Button/types.d.ts.map +1 -1
  10. package/dist/elements/Button/types.js.map +1 -1
  11. package/dist/elements/CheckboxPopup/index.d.ts.map +1 -1
  12. package/dist/elements/CheckboxPopup/index.js +0 -1
  13. package/dist/elements/CheckboxPopup/index.js.map +1 -1
  14. package/dist/elements/CheckboxPopup/index.scss +1 -0
  15. package/dist/elements/CreateDocumentButton/index.d.ts +26 -0
  16. package/dist/elements/CreateDocumentButton/index.d.ts.map +1 -0
  17. package/dist/elements/CreateDocumentButton/index.js +182 -0
  18. package/dist/elements/CreateDocumentButton/index.js.map +1 -0
  19. package/dist/elements/DefaultListViewTabs/index.d.ts.map +1 -1
  20. package/dist/elements/DefaultListViewTabs/index.js +28 -54
  21. package/dist/elements/DefaultListViewTabs/index.js.map +1 -1
  22. package/dist/elements/DelayedSpinner/index.d.ts +23 -0
  23. package/dist/elements/DelayedSpinner/index.d.ts.map +1 -0
  24. package/dist/elements/DelayedSpinner/index.js +61 -0
  25. package/dist/elements/DelayedSpinner/index.js.map +1 -0
  26. package/dist/elements/DocumentControls/index.d.ts +1 -0
  27. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  28. package/dist/elements/DocumentControls/index.js +6 -10
  29. package/dist/elements/DocumentControls/index.js.map +1 -1
  30. package/dist/elements/DocumentControls/index.scss +1 -1
  31. package/dist/elements/DocumentDrawer/index.d.ts.map +1 -1
  32. package/dist/elements/DocumentDrawer/index.js +54 -141
  33. package/dist/elements/DocumentDrawer/index.js.map +1 -1
  34. package/dist/elements/DocumentDrawer/types.d.ts +7 -1
  35. package/dist/elements/DocumentDrawer/types.d.ts.map +1 -1
  36. package/dist/elements/DocumentDrawer/types.js.map +1 -1
  37. package/dist/elements/DrawerActionHeader/index.d.ts.map +1 -1
  38. package/dist/elements/DrawerActionHeader/index.js +2 -0
  39. package/dist/elements/DrawerActionHeader/index.js.map +1 -1
  40. package/dist/elements/DrawerActionHeader/index.scss +2 -2
  41. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.d.ts +5 -0
  42. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.d.ts.map +1 -0
  43. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js +166 -0
  44. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js.map +1 -0
  45. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.scss +63 -0
  46. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.d.ts +5 -0
  47. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.d.ts.map +1 -0
  48. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.js +161 -0
  49. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.js.map +1 -0
  50. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.scss +105 -0
  51. package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts +8 -0
  52. package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts.map +1 -0
  53. package/dist/elements/Hierarchy/ColumnBrowser/index.js +473 -0
  54. package/dist/elements/Hierarchy/ColumnBrowser/index.js.map +1 -0
  55. package/dist/elements/Hierarchy/ColumnBrowser/index.scss +20 -0
  56. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts +106 -0
  57. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -0
  58. package/dist/elements/Hierarchy/ColumnBrowser/types.js +2 -0
  59. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -0
  60. package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts +11 -0
  61. package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts.map +1 -0
  62. package/dist/elements/Hierarchy/DocHeaderButton/index.js +126 -0
  63. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -0
  64. package/dist/elements/{FolderView/MoveDocToFolder → Hierarchy/DocHeaderButton}/index.scss +7 -1
  65. package/dist/elements/Hierarchy/DocHeaderButton/index.server.d.ts +10 -0
  66. package/dist/elements/Hierarchy/DocHeaderButton/index.server.d.ts.map +1 -0
  67. package/dist/elements/Hierarchy/DocHeaderButton/index.server.js +34 -0
  68. package/dist/elements/Hierarchy/DocHeaderButton/index.server.js.map +1 -0
  69. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts +15 -0
  70. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts.map +1 -0
  71. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js +60 -0
  72. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js.map +1 -0
  73. package/dist/elements/Hierarchy/Drawer/index.d.ts +20 -0
  74. package/dist/elements/Hierarchy/Drawer/index.d.ts.map +1 -0
  75. package/dist/elements/Hierarchy/Drawer/index.js +291 -0
  76. package/dist/elements/Hierarchy/Drawer/index.js.map +1 -0
  77. package/dist/elements/Hierarchy/Drawer/index.scss +81 -0
  78. package/dist/elements/Hierarchy/Drawer/types.d.ts +68 -0
  79. package/dist/elements/Hierarchy/Drawer/types.d.ts.map +1 -0
  80. package/dist/elements/Hierarchy/Drawer/types.js +3 -0
  81. package/dist/elements/Hierarchy/Drawer/types.js.map +1 -0
  82. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts +30 -0
  83. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts.map +1 -0
  84. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js +148 -0
  85. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js.map +1 -0
  86. package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts +13 -0
  87. package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts.map +1 -0
  88. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js +185 -0
  89. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js.map +1 -0
  90. package/dist/elements/Hierarchy/Field/SelectedHierarchies.scss +78 -0
  91. package/dist/elements/Hierarchy/Field/index.client.d.ts +8 -0
  92. package/dist/elements/Hierarchy/Field/index.client.d.ts.map +1 -0
  93. package/dist/elements/Hierarchy/Field/index.client.js +186 -0
  94. package/dist/elements/Hierarchy/Field/index.client.js.map +1 -0
  95. package/dist/elements/Hierarchy/Field/index.scss +35 -0
  96. package/dist/elements/Hierarchy/Field/index.server.d.ts +3 -0
  97. package/dist/elements/Hierarchy/Field/index.server.d.ts.map +1 -0
  98. package/dist/elements/Hierarchy/Field/index.server.js +30 -0
  99. package/dist/elements/Hierarchy/Field/index.server.js.map +1 -0
  100. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts +4 -0
  101. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts.map +1 -0
  102. package/dist/elements/Hierarchy/HydrateProvider/index.js +70 -0
  103. package/dist/elements/Hierarchy/HydrateProvider/index.js.map +1 -0
  104. package/dist/elements/Hierarchy/MoveMany/index.d.ts +22 -0
  105. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -0
  106. package/dist/elements/Hierarchy/MoveMany/index.js +278 -0
  107. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -0
  108. package/dist/elements/Hierarchy/MoveMany/index.scss +7 -0
  109. package/dist/elements/Hierarchy/Search/HierarchySearchInput.d.ts +18 -0
  110. package/dist/elements/Hierarchy/Search/HierarchySearchInput.d.ts.map +1 -0
  111. package/dist/elements/Hierarchy/Search/HierarchySearchInput.js +115 -0
  112. package/dist/elements/Hierarchy/Search/HierarchySearchInput.js.map +1 -0
  113. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.d.ts +13 -0
  114. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.d.ts.map +1 -0
  115. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.js +88 -0
  116. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.js.map +1 -0
  117. package/dist/elements/Hierarchy/Search/HierarchySearchResults.d.ts +17 -0
  118. package/dist/elements/Hierarchy/Search/HierarchySearchResults.d.ts.map +1 -0
  119. package/dist/elements/Hierarchy/Search/HierarchySearchResults.js +85 -0
  120. package/dist/elements/Hierarchy/Search/HierarchySearchResults.js.map +1 -0
  121. package/dist/elements/Hierarchy/Search/index.d.ts +10 -0
  122. package/dist/elements/Hierarchy/Search/index.d.ts.map +1 -0
  123. package/dist/elements/Hierarchy/Search/index.js +144 -0
  124. package/dist/elements/Hierarchy/Search/index.js.map +1 -0
  125. package/dist/elements/Hierarchy/Search/index.scss +212 -0
  126. package/dist/elements/Hierarchy/Search/types.d.ts +21 -0
  127. package/dist/elements/Hierarchy/Search/types.d.ts.map +1 -0
  128. package/dist/elements/Hierarchy/Search/types.js +2 -0
  129. package/dist/elements/Hierarchy/Search/types.js.map +1 -0
  130. package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts +20 -0
  131. package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -0
  132. package/dist/elements/Hierarchy/Search/useHierarchySearch.js +122 -0
  133. package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -0
  134. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts +21 -0
  135. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -0
  136. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js +194 -0
  137. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -0
  138. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts +7 -0
  139. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -0
  140. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js +177 -0
  141. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -0
  142. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.d.ts +8 -0
  143. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.d.ts.map +1 -0
  144. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.js +36 -0
  145. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.js.map +1 -0
  146. package/dist/elements/Hierarchy/Tree/LoadMore/index.d.ts +12 -0
  147. package/dist/elements/Hierarchy/Tree/LoadMore/index.d.ts.map +1 -0
  148. package/dist/elements/Hierarchy/Tree/LoadMore/index.js +29 -0
  149. package/dist/elements/Hierarchy/Tree/LoadMore/index.js.map +1 -0
  150. package/dist/elements/Hierarchy/Tree/LoadMore/index.scss +26 -0
  151. package/dist/elements/Hierarchy/Tree/TreeConnector.d.ts +7 -0
  152. package/dist/elements/Hierarchy/Tree/TreeConnector.d.ts.map +1 -0
  153. package/dist/elements/Hierarchy/Tree/TreeConnector.js +23 -0
  154. package/dist/elements/Hierarchy/Tree/TreeConnector.js.map +1 -0
  155. package/dist/elements/Hierarchy/Tree/TreeFocusContext.d.ts +28 -0
  156. package/dist/elements/Hierarchy/Tree/TreeFocusContext.d.ts.map +1 -0
  157. package/dist/elements/Hierarchy/Tree/TreeFocusContext.js +140 -0
  158. package/dist/elements/Hierarchy/Tree/TreeFocusContext.js.map +1 -0
  159. package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts +5 -0
  160. package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts.map +1 -0
  161. package/dist/elements/Hierarchy/Tree/TreeNode/index.js +225 -0
  162. package/dist/elements/Hierarchy/Tree/TreeNode/index.js.map +1 -0
  163. package/dist/elements/Hierarchy/Tree/TreeNode/index.scss +110 -0
  164. package/dist/elements/Hierarchy/Tree/index.d.ts +5 -0
  165. package/dist/elements/Hierarchy/Tree/index.d.ts.map +1 -0
  166. package/dist/elements/Hierarchy/Tree/index.js +305 -0
  167. package/dist/elements/Hierarchy/Tree/index.js.map +1 -0
  168. package/dist/elements/Hierarchy/Tree/index.scss +60 -0
  169. package/dist/elements/Hierarchy/Tree/types.d.ts +76 -0
  170. package/dist/elements/Hierarchy/Tree/types.d.ts.map +1 -0
  171. package/dist/elements/Hierarchy/Tree/types.js +2 -0
  172. package/dist/elements/Hierarchy/Tree/types.js.map +1 -0
  173. package/dist/elements/Hierarchy/Tree/useChildren.d.ts +32 -0
  174. package/dist/elements/Hierarchy/Tree/useChildren.d.ts.map +1 -0
  175. package/dist/elements/Hierarchy/Tree/useChildren.js +233 -0
  176. package/dist/elements/Hierarchy/Tree/useChildren.js.map +1 -0
  177. package/dist/elements/Link/index.d.ts +4 -0
  178. package/dist/elements/Link/index.d.ts.map +1 -1
  179. package/dist/elements/Link/index.js +5 -0
  180. package/dist/elements/Link/index.js.map +1 -1
  181. package/dist/elements/ListHeader/TitleActions/index.d.ts +0 -1
  182. package/dist/elements/ListHeader/TitleActions/index.d.ts.map +1 -1
  183. package/dist/elements/ListHeader/TitleActions/index.js +0 -1
  184. package/dist/elements/ListHeader/TitleActions/index.js.map +1 -1
  185. package/dist/elements/ListHeader/index.js +2 -2
  186. package/dist/elements/ListHeader/index.js.map +1 -1
  187. package/dist/elements/ListSelection/index.scss +2 -1
  188. package/dist/elements/LoadMoreRow/index.d.ts +15 -0
  189. package/dist/elements/LoadMoreRow/index.d.ts.map +1 -0
  190. package/dist/elements/LoadMoreRow/index.js +75 -0
  191. package/dist/elements/LoadMoreRow/index.js.map +1 -0
  192. package/dist/elements/LoadMoreRow/index.scss +42 -0
  193. package/dist/elements/Locked/index.scss +1 -1
  194. package/dist/elements/RelationshipTable/index.js +3 -3
  195. package/dist/elements/RelationshipTable/index.js.map +1 -1
  196. package/dist/elements/Spinner/index.d.ts +16 -0
  197. package/dist/elements/Spinner/index.d.ts.map +1 -0
  198. package/dist/elements/Spinner/index.js +49 -0
  199. package/dist/elements/Spinner/index.js.map +1 -0
  200. package/dist/elements/Spinner/index.scss +39 -0
  201. package/dist/elements/StepNav/index.d.ts.map +1 -1
  202. package/dist/elements/StepNav/index.js +10 -1
  203. package/dist/elements/StepNav/index.js.map +1 -1
  204. package/dist/elements/StepNav/types.d.ts +1 -0
  205. package/dist/elements/StepNav/types.d.ts.map +1 -1
  206. package/dist/elements/StepNav/types.js.map +1 -1
  207. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.d.ts +6 -0
  208. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.d.ts.map +1 -0
  209. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +187 -0
  210. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -0
  211. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.scss +29 -0
  212. package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
  213. package/dist/elements/Table/DefaultCell/index.js +20 -0
  214. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  215. package/dist/elements/Tooltip/index.js +1 -1
  216. package/dist/elements/Tooltip/index.js.map +1 -1
  217. package/dist/elements/Tooltip/index.scss +1 -15
  218. package/dist/elements/withMergedProps/index.d.ts +1 -1
  219. package/dist/elements/withMergedProps/index.js +1 -1
  220. package/dist/elements/withMergedProps/index.js.map +1 -1
  221. package/dist/exports/client/index.d.ts +26 -9
  222. package/dist/exports/client/index.d.ts.map +1 -1
  223. package/dist/exports/client/index.js +14 -12
  224. package/dist/exports/client/index.js.map +4 -4
  225. package/dist/exports/rsc/index.d.ts +3 -3
  226. package/dist/exports/rsc/index.d.ts.map +1 -1
  227. package/dist/exports/rsc/index.js +3 -3
  228. package/dist/exports/rsc/index.js.map +1 -1
  229. package/dist/exports/shared/index.js.map +1 -1
  230. package/dist/fields/Join/index.d.ts.map +1 -1
  231. package/dist/fields/Join/index.js +1 -1
  232. package/dist/fields/Join/index.js.map +1 -1
  233. package/dist/fields/Null/index.d.ts +11 -0
  234. package/dist/fields/Null/index.d.ts.map +1 -0
  235. package/dist/fields/Null/index.js +13 -0
  236. package/dist/fields/Null/index.js.map +1 -0
  237. package/dist/icons/Chevron/index.d.ts.map +1 -1
  238. package/dist/icons/Chevron/index.js +5 -1
  239. package/dist/icons/Chevron/index.js.map +1 -1
  240. package/dist/icons/Document/index.d.ts +3 -1
  241. package/dist/icons/Document/index.d.ts.map +1 -1
  242. package/dist/icons/Document/index.js +4 -2
  243. package/dist/icons/Document/index.js.map +1 -1
  244. package/dist/icons/Document/index.scss +4 -0
  245. package/dist/icons/Filter/index.d.ts +4 -0
  246. package/dist/icons/Filter/index.d.ts.map +1 -0
  247. package/dist/icons/Filter/index.js +15 -0
  248. package/dist/icons/Filter/index.js.map +1 -0
  249. package/dist/icons/Filter/index.scss +13 -0
  250. package/dist/icons/Folder/index.d.ts +4 -2
  251. package/dist/icons/Folder/index.d.ts.map +1 -1
  252. package/dist/icons/Folder/index.js +4 -2
  253. package/dist/icons/Folder/index.js.map +1 -1
  254. package/dist/icons/Folder/index.scss +8 -0
  255. package/dist/icons/Lock/index.scss +1 -1
  256. package/dist/icons/Plus/index.d.ts.map +1 -1
  257. package/dist/icons/Plus/index.js +2 -1
  258. package/dist/icons/Plus/index.js.map +1 -1
  259. package/dist/icons/TableView/index.d.ts +3 -0
  260. package/dist/icons/TableView/index.d.ts.map +1 -0
  261. package/dist/icons/TableView/index.js +16 -0
  262. package/dist/icons/TableView/index.js.map +1 -0
  263. package/dist/icons/Tag/index.d.ts +8 -0
  264. package/dist/icons/Tag/index.d.ts.map +1 -0
  265. package/dist/icons/Tag/index.js +22 -0
  266. package/dist/icons/Tag/index.js.map +1 -0
  267. package/dist/icons/Tag/index.scss +14 -0
  268. package/dist/providers/DocumentSelection/index.d.ts +8 -0
  269. package/dist/providers/DocumentSelection/index.d.ts.map +1 -0
  270. package/dist/providers/DocumentSelection/index.js +239 -0
  271. package/dist/providers/DocumentSelection/index.js.map +1 -0
  272. package/dist/providers/DocumentSelection/types.d.ts +122 -0
  273. package/dist/providers/DocumentSelection/types.d.ts.map +1 -0
  274. package/dist/providers/DocumentSelection/types.js +5 -0
  275. package/dist/providers/DocumentSelection/types.js.map +1 -0
  276. package/dist/providers/Hierarchy/index.d.ts +5 -0
  277. package/dist/providers/Hierarchy/index.d.ts.map +1 -0
  278. package/dist/providers/Hierarchy/index.js +358 -0
  279. package/dist/providers/Hierarchy/index.js.map +1 -0
  280. package/dist/providers/Hierarchy/types.d.ts +106 -0
  281. package/dist/providers/Hierarchy/types.d.ts.map +1 -0
  282. package/dist/providers/Hierarchy/types.js +2 -0
  283. package/dist/providers/Hierarchy/types.js.map +1 -0
  284. package/dist/providers/Root/index.d.ts.map +1 -1
  285. package/dist/providers/Root/index.js +18 -15
  286. package/dist/providers/Root/index.js.map +1 -1
  287. package/dist/providers/ServerFunctions/index.d.ts +1 -6
  288. package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
  289. package/dist/providers/ServerFunctions/index.js +0 -18
  290. package/dist/providers/ServerFunctions/index.js.map +1 -1
  291. package/dist/providers/SidebarTabs/index.d.ts +19 -0
  292. package/dist/providers/SidebarTabs/index.d.ts.map +1 -0
  293. package/dist/providers/SidebarTabs/index.js +24 -0
  294. package/dist/providers/SidebarTabs/index.js.map +1 -0
  295. package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts +2 -1
  296. package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts.map +1 -1
  297. package/dist/providers/TableColumns/buildColumnState/renderCell.js +34 -1
  298. package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
  299. package/dist/styles.css +1 -1
  300. package/dist/utilities/handleLivePreview.d.ts.map +1 -1
  301. package/dist/utilities/isSuperset.d.ts +6 -0
  302. package/dist/utilities/isSuperset.d.ts.map +1 -0
  303. package/dist/utilities/isSuperset.js +10 -0
  304. package/dist/utilities/isSuperset.js.map +1 -0
  305. package/dist/utilities/renderTable.d.ts +3 -1
  306. package/dist/utilities/renderTable.d.ts.map +1 -1
  307. package/dist/utilities/renderTable.js +9 -3
  308. package/dist/utilities/renderTable.js.map +1 -1
  309. package/dist/views/Edit/index.d.ts +1 -1
  310. package/dist/views/Edit/index.d.ts.map +1 -1
  311. package/dist/views/Edit/index.js +4 -2
  312. package/dist/views/Edit/index.js.map +1 -1
  313. package/dist/views/HierarchyList/DocumentListSelection/index.d.ts +10 -0
  314. package/dist/views/HierarchyList/DocumentListSelection/index.d.ts.map +1 -0
  315. package/dist/views/HierarchyList/DocumentListSelection/index.js +196 -0
  316. package/dist/views/HierarchyList/DocumentListSelection/index.js.map +1 -0
  317. package/dist/views/HierarchyList/HierarchyListHeader/index.d.ts +21 -0
  318. package/dist/views/HierarchyList/HierarchyListHeader/index.d.ts.map +1 -0
  319. package/dist/views/HierarchyList/HierarchyListHeader/index.js +68 -0
  320. package/dist/views/HierarchyList/HierarchyListHeader/index.js.map +1 -0
  321. package/dist/views/HierarchyList/HierarchyListHeader/index.scss +9 -0
  322. package/dist/views/HierarchyList/HierarchyTable/ChildNameCell.d.ts +4 -0
  323. package/dist/views/HierarchyList/HierarchyTable/ChildNameCell.d.ts.map +1 -0
  324. package/dist/views/HierarchyList/HierarchyTable/ChildNameCell.js +104 -0
  325. package/dist/views/HierarchyList/HierarchyTable/ChildNameCell.js.map +1 -0
  326. package/dist/views/HierarchyList/HierarchyTable/DateCell.d.ts +4 -0
  327. package/dist/views/HierarchyList/HierarchyTable/DateCell.d.ts.map +1 -0
  328. package/dist/views/HierarchyList/HierarchyTable/DateCell.js +53 -0
  329. package/dist/views/HierarchyList/HierarchyTable/DateCell.js.map +1 -0
  330. package/dist/views/HierarchyList/HierarchyTable/RelatedNameCell.d.ts +4 -0
  331. package/dist/views/HierarchyList/HierarchyTable/RelatedNameCell.d.ts.map +1 -0
  332. package/dist/views/HierarchyList/HierarchyTable/RelatedNameCell.js +128 -0
  333. package/dist/views/HierarchyList/HierarchyTable/RelatedNameCell.js.map +1 -0
  334. package/dist/views/HierarchyList/HierarchyTable/SlotTable.d.ts +99 -0
  335. package/dist/views/HierarchyList/HierarchyTable/SlotTable.d.ts.map +1 -0
  336. package/dist/views/HierarchyList/HierarchyTable/SlotTable.js +118 -0
  337. package/dist/views/HierarchyList/HierarchyTable/SlotTable.js.map +1 -0
  338. package/dist/views/HierarchyList/HierarchyTable/SlotTable.scss +214 -0
  339. package/dist/views/HierarchyList/HierarchyTable/index.d.ts +27 -0
  340. package/dist/views/HierarchyList/HierarchyTable/index.d.ts.map +1 -0
  341. package/dist/views/HierarchyList/HierarchyTable/index.js +388 -0
  342. package/dist/views/HierarchyList/HierarchyTable/index.js.map +1 -0
  343. package/dist/views/HierarchyList/HierarchyTable/index.scss +148 -0
  344. package/dist/views/HierarchyList/HierarchyTable/types.d.ts +20 -0
  345. package/dist/views/HierarchyList/HierarchyTable/types.d.ts.map +1 -0
  346. package/dist/views/HierarchyList/HierarchyTable/types.js +2 -0
  347. package/dist/views/HierarchyList/HierarchyTable/types.js.map +1 -0
  348. package/dist/views/HierarchyList/TypeFilter/index.d.ts +15 -0
  349. package/dist/views/HierarchyList/TypeFilter/index.d.ts.map +1 -0
  350. package/dist/views/HierarchyList/TypeFilter/index.js +37 -0
  351. package/dist/views/HierarchyList/TypeFilter/index.js.map +1 -0
  352. package/dist/views/HierarchyList/TypeFilter/index.scss +32 -0
  353. package/dist/views/HierarchyList/index.d.ts +5 -0
  354. package/dist/views/HierarchyList/index.d.ts.map +1 -0
  355. package/dist/views/HierarchyList/index.js +305 -0
  356. package/dist/views/HierarchyList/index.js.map +1 -0
  357. package/dist/views/HierarchyList/index.scss +72 -0
  358. package/dist/views/List/index.d.ts.map +1 -1
  359. package/dist/views/List/index.js +51 -7
  360. package/dist/views/List/index.js.map +1 -1
  361. package/package.json +4 -4
  362. package/dist/elements/FolderView/Breadcrumbs/index.d.ts +0 -19
  363. package/dist/elements/FolderView/Breadcrumbs/index.d.ts.map +0 -1
  364. package/dist/elements/FolderView/Breadcrumbs/index.js +0 -96
  365. package/dist/elements/FolderView/Breadcrumbs/index.js.map +0 -1
  366. package/dist/elements/FolderView/Breadcrumbs/index.scss +0 -56
  367. package/dist/elements/FolderView/BrowseByFolderButton/index.d.ts +0 -6
  368. package/dist/elements/FolderView/BrowseByFolderButton/index.d.ts.map +0 -1
  369. package/dist/elements/FolderView/BrowseByFolderButton/index.js +0 -40
  370. package/dist/elements/FolderView/BrowseByFolderButton/index.js.map +0 -1
  371. package/dist/elements/FolderView/BrowseByFolderButton/index.scss +0 -30
  372. package/dist/elements/FolderView/Cell/index.client.d.ts +0 -13
  373. package/dist/elements/FolderView/Cell/index.client.d.ts.map +0 -1
  374. package/dist/elements/FolderView/Cell/index.client.js +0 -95
  375. package/dist/elements/FolderView/Cell/index.client.js.map +0 -1
  376. package/dist/elements/FolderView/Cell/index.server.d.ts +0 -4
  377. package/dist/elements/FolderView/Cell/index.server.d.ts.map +0 -1
  378. package/dist/elements/FolderView/Cell/index.server.js +0 -18
  379. package/dist/elements/FolderView/Cell/index.server.js.map +0 -1
  380. package/dist/elements/FolderView/ColoredFolderIcon/index.d.ts +0 -3
  381. package/dist/elements/FolderView/ColoredFolderIcon/index.d.ts.map +0 -1
  382. package/dist/elements/FolderView/ColoredFolderIcon/index.js +0 -9
  383. package/dist/elements/FolderView/ColoredFolderIcon/index.js.map +0 -1
  384. package/dist/elements/FolderView/ColoredFolderIcon/index.scss +0 -5
  385. package/dist/elements/FolderView/CurrentFolderActions/index.d.ts +0 -7
  386. package/dist/elements/FolderView/CurrentFolderActions/index.d.ts.map +0 -1
  387. package/dist/elements/FolderView/CurrentFolderActions/index.js +0 -162
  388. package/dist/elements/FolderView/CurrentFolderActions/index.js.map +0 -1
  389. package/dist/elements/FolderView/DragOverlaySelection/index.d.ts +0 -11
  390. package/dist/elements/FolderView/DragOverlaySelection/index.d.ts.map +0 -1
  391. package/dist/elements/FolderView/DragOverlaySelection/index.js +0 -62
  392. package/dist/elements/FolderView/DragOverlaySelection/index.js.map +0 -1
  393. package/dist/elements/FolderView/DragOverlaySelection/index.scss +0 -35
  394. package/dist/elements/FolderView/DraggableTableRow/index.d.ts +0 -18
  395. package/dist/elements/FolderView/DraggableTableRow/index.d.ts.map +0 -1
  396. package/dist/elements/FolderView/DraggableTableRow/index.js +0 -63
  397. package/dist/elements/FolderView/DraggableTableRow/index.js.map +0 -1
  398. package/dist/elements/FolderView/DraggableTableRow/index.scss +0 -135
  399. package/dist/elements/FolderView/DraggableWithClick/index.d.ts +0 -15
  400. package/dist/elements/FolderView/DraggableWithClick/index.d.ts.map +0 -1
  401. package/dist/elements/FolderView/DraggableWithClick/index.js +0 -86
  402. package/dist/elements/FolderView/DraggableWithClick/index.js.map +0 -1
  403. package/dist/elements/FolderView/DraggableWithClick/index.scss +0 -5
  404. package/dist/elements/FolderView/Drawers/EditFolderAction/index.d.ts +0 -7
  405. package/dist/elements/FolderView/Drawers/EditFolderAction/index.d.ts.map +0 -1
  406. package/dist/elements/FolderView/Drawers/EditFolderAction/index.js +0 -39
  407. package/dist/elements/FolderView/Drawers/EditFolderAction/index.js.map +0 -1
  408. package/dist/elements/FolderView/Drawers/MoveToFolder/index.d.ts +0 -37
  409. package/dist/elements/FolderView/Drawers/MoveToFolder/index.d.ts.map +0 -1
  410. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +0 -609
  411. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +0 -1
  412. package/dist/elements/FolderView/Drawers/MoveToFolder/index.scss +0 -30
  413. package/dist/elements/FolderView/FilterFolderTypePill/index.d.ts +0 -4
  414. package/dist/elements/FolderView/FilterFolderTypePill/index.d.ts.map +0 -1
  415. package/dist/elements/FolderView/FilterFolderTypePill/index.js +0 -102
  416. package/dist/elements/FolderView/FilterFolderTypePill/index.js.map +0 -1
  417. package/dist/elements/FolderView/FilterFolderTypePill/index.scss +0 -16
  418. package/dist/elements/FolderView/FolderField/index.scss +0 -12
  419. package/dist/elements/FolderView/FolderField/index.server.d.ts +0 -4
  420. package/dist/elements/FolderView/FolderField/index.server.d.ts.map +0 -1
  421. package/dist/elements/FolderView/FolderField/index.server.js +0 -16
  422. package/dist/elements/FolderView/FolderField/index.server.js.map +0 -1
  423. package/dist/elements/FolderView/FolderFileCard/index.d.ts +0 -30
  424. package/dist/elements/FolderView/FolderFileCard/index.d.ts.map +0 -1
  425. package/dist/elements/FolderView/FolderFileCard/index.js +0 -209
  426. package/dist/elements/FolderView/FolderFileCard/index.js.map +0 -1
  427. package/dist/elements/FolderView/FolderFileCard/index.scss +0 -247
  428. package/dist/elements/FolderView/FolderFileTable/index.d.ts +0 -8
  429. package/dist/elements/FolderView/FolderFileTable/index.d.ts.map +0 -1
  430. package/dist/elements/FolderView/FolderFileTable/index.js +0 -284
  431. package/dist/elements/FolderView/FolderFileTable/index.js.map +0 -1
  432. package/dist/elements/FolderView/FolderFileTable/index.scss +0 -11
  433. package/dist/elements/FolderView/FolderTypeField/index.d.ts +0 -4
  434. package/dist/elements/FolderView/FolderTypeField/index.d.ts.map +0 -1
  435. package/dist/elements/FolderView/FolderTypeField/index.js +0 -123
  436. package/dist/elements/FolderView/FolderTypeField/index.js.map +0 -1
  437. package/dist/elements/FolderView/ItemCardGrid/index.d.ts +0 -16
  438. package/dist/elements/FolderView/ItemCardGrid/index.d.ts.map +0 -1
  439. package/dist/elements/FolderView/ItemCardGrid/index.js +0 -34
  440. package/dist/elements/FolderView/ItemCardGrid/index.js.map +0 -1
  441. package/dist/elements/FolderView/ItemCardGrid/index.scss +0 -16
  442. package/dist/elements/FolderView/MoveDocToFolder/index.d.ts +0 -37
  443. package/dist/elements/FolderView/MoveDocToFolder/index.d.ts.map +0 -1
  444. package/dist/elements/FolderView/MoveDocToFolder/index.js +0 -292
  445. package/dist/elements/FolderView/MoveDocToFolder/index.js.map +0 -1
  446. package/dist/elements/FolderView/SimpleTable/index.d.ts +0 -19
  447. package/dist/elements/FolderView/SimpleTable/index.d.ts.map +0 -1
  448. package/dist/elements/FolderView/SimpleTable/index.js +0 -95
  449. package/dist/elements/FolderView/SimpleTable/index.js.map +0 -1
  450. package/dist/elements/FolderView/SimpleTable/index.scss +0 -59
  451. package/dist/elements/FolderView/SortByPill/index.d.ts +0 -4
  452. package/dist/elements/FolderView/SortByPill/index.d.ts.map +0 -1
  453. package/dist/elements/FolderView/SortByPill/index.js +0 -112
  454. package/dist/elements/FolderView/SortByPill/index.js.map +0 -1
  455. package/dist/elements/FolderView/SortByPill/index.scss +0 -16
  456. package/dist/elements/FolderView/ToggleViewButtons/index.d.ts +0 -8
  457. package/dist/elements/FolderView/ToggleViewButtons/index.d.ts.map +0 -1
  458. package/dist/elements/FolderView/ToggleViewButtons/index.js +0 -31
  459. package/dist/elements/FolderView/ToggleViewButtons/index.js.map +0 -1
  460. package/dist/elements/FolderView/ToggleViewButtons/index.scss +0 -17
  461. package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.d.ts +0 -15
  462. package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.d.ts.map +0 -1
  463. package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.js +0 -182
  464. package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.js.map +0 -1
  465. package/dist/providers/Folders/groupItemIDsByRelation.d.ts +0 -3
  466. package/dist/providers/Folders/groupItemIDsByRelation.d.ts.map +0 -1
  467. package/dist/providers/Folders/groupItemIDsByRelation.js +0 -10
  468. package/dist/providers/Folders/groupItemIDsByRelation.js.map +0 -1
  469. package/dist/providers/Folders/index.d.ts +0 -143
  470. package/dist/providers/Folders/index.d.ts.map +0 -1
  471. package/dist/providers/Folders/index.js +0 -641
  472. package/dist/providers/Folders/index.js.map +0 -1
  473. package/dist/utilities/getFolderResultsComponentAndData.d.ts +0 -25
  474. package/dist/utilities/getFolderResultsComponentAndData.d.ts.map +0 -1
  475. package/dist/utilities/getFolderResultsComponentAndData.js +0 -135
  476. package/dist/utilities/getFolderResultsComponentAndData.js.map +0 -1
  477. package/dist/views/BrowseByFolder/index.d.ts +0 -5
  478. package/dist/views/BrowseByFolder/index.d.ts.map +0 -1
  479. package/dist/views/BrowseByFolder/index.js +0 -342
  480. package/dist/views/BrowseByFolder/index.js.map +0 -1
  481. package/dist/views/BrowseByFolder/index.scss +0 -174
  482. package/dist/views/CollectionFolder/ListSelection/index.d.ts +0 -9
  483. package/dist/views/CollectionFolder/ListSelection/index.d.ts.map +0 -1
  484. package/dist/views/CollectionFolder/ListSelection/index.js +0 -180
  485. package/dist/views/CollectionFolder/ListSelection/index.js.map +0 -1
  486. package/dist/views/CollectionFolder/index.d.ts +0 -5
  487. package/dist/views/CollectionFolder/index.d.ts.map +0 -1
  488. package/dist/views/CollectionFolder/index.js +0 -325
  489. package/dist/views/CollectionFolder/index.js.map +0 -1
  490. package/dist/views/CollectionFolder/index.scss +0 -162
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","useRouter","DEFAULT_HIERARCHY_TREE_LIMIT","React","useCallback","useId","useMemo","useRef","TagIcon","useConfig","useHierarchy","useTranslation","CreateDocumentButton","DelayedSpinner","LoadMore","TreeFocusProvider","useTreeFocus","TreeNode","useChildren","baseClass","getDocumentTitle","doc","useAsTitle","docId","id","idStr","String","value","HierarchyTreeInner","baseFilter","collectionSlug","filterByCollections","icon","initialData","initialDataProp","initialExpandedNodes","initialExpandedNodesProp","onNodeClick","selectedNodeId","useAsTitleProp","moveFocus","router","i18n","t","getEntityConfig","createDrawerSlug","getExpandedNodesForCollection","getTreeDataForCollection","toggleNodeForCollection","typeFieldName","collectionConfig","hierarchyConfig","hierarchy","undefined","parentFieldName","treeLimit","admin","allPossibleTypeValues","relatedCollections","Object","keys","contextData","baseFilterKey","JSON","stringify","contextBaseFilterKey","contextSeededRef","lastInitialExpandedRef","current","expandedNodes","contextExpanded","size","Set","handleToggleNode","wasSeeded","length","initialSet","map","isCurrentlyExpanded","has","nodeId","childrenCache","Map","prevBaseFilterKeyRef","clear","docs","docsByParent","parentId","parentKey","set","get","push","filterKey","slice","sort","join","cacheKey","parentMeta","loadedParents","loadedCount","children","hasMore","page","Math","ceil","totalDocs","treeRef","rootNodes","isLoading","loadMore","loadMoreFromHook","refresh","cache","enabled","limit","handleLoadMore","handleNodeClick","handleTreeKeyDown","e","key","preventDefault","_jsx","className","collectionLabel","buttonStyle","collections","drawerSlug","label","labels","singular","onSave","isAllSelected","handleAllClick","_jsxs","onKeyDown","ref","role","tabIndex","filter","Boolean","onClick","color","plural","node","nodeIdStr","nodeTitle","depth","hasChildren","title","onSelect","onToggle","selected","currentCount","onLoadMore","HierarchyTree","props"],"sources":["../../../../src/elements/Hierarchy/Tree/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter } from 'next/navigation.js'\nimport { DEFAULT_HIERARCHY_TREE_LIMIT } from 'payload/shared'\nimport React, { useCallback, useId, useMemo, useRef } from 'react'\n\nimport type { CachedChildren, HierarchyTreeProps, TreeDocument } from './types.js'\n\nimport { TagIcon } from '../../../icons/Tag/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useHierarchy } from '../../../providers/Hierarchy/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { CreateDocumentButton } from '../../CreateDocumentButton/index.js'\nimport { DelayedSpinner } from '../../DelayedSpinner/index.js'\nimport { LoadMore } from './LoadMore/index.js'\nimport { TreeFocusProvider, useTreeFocus } from './TreeFocusContext.js'\nimport { TreeNode } from './TreeNode/index.js'\nimport { useChildren } from './useChildren.js'\nimport './index.scss'\n\nconst baseClass = 'tree'\n\nconst getDocumentTitle = (doc: TreeDocument, useAsTitle: string | undefined): string => {\n const docId: number | string = doc.id\n const idStr = typeof docId === 'number' ? String(docId) : docId\n\n if (!useAsTitle) {\n return idStr\n }\n\n const value = doc[useAsTitle]\n if (value && (typeof value === 'string' || typeof value === 'number')) {\n return String(value)\n }\n return idStr\n}\n\nconst HierarchyTreeInner: React.FC<HierarchyTreeProps> = ({\n baseFilter,\n collectionSlug,\n filterByCollections,\n icon,\n initialData: initialDataProp,\n initialExpandedNodes: initialExpandedNodesProp,\n onNodeClick,\n selectedNodeId,\n useAsTitle: useAsTitleProp,\n}) => {\n const { moveFocus } = useTreeFocus()\n const router = useRouter()\n const { i18n, t } = useTranslation()\n const { getEntityConfig } = useConfig()\n const createDrawerSlug = `tree-create-${useId()}`\n\n const {\n getExpandedNodesForCollection,\n getTreeDataForCollection,\n toggleNodeForCollection,\n typeFieldName,\n } = useHierarchy()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const hierarchyConfig =\n collectionConfig.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy\n : undefined\n const parentFieldName = hierarchyConfig?.parentFieldName\n const treeLimit = hierarchyConfig?.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n const useAsTitle = useAsTitleProp ?? collectionConfig.admin?.useAsTitle\n\n const allPossibleTypeValues = useMemo(\n () =>\n hierarchyConfig?.relatedCollections\n ? Object.keys(hierarchyConfig.relatedCollections)\n : undefined,\n [hierarchyConfig?.relatedCollections],\n )\n\n const contextData = getTreeDataForCollection(collectionSlug)\n const baseFilterKey = baseFilter ? JSON.stringify(baseFilter) : ''\n const contextBaseFilterKey = contextData?.baseFilter ? JSON.stringify(contextData.baseFilter) : ''\n const initialData =\n baseFilterKey === contextBaseFilterKey ? (contextData ?? initialDataProp) : initialDataProp\n // Tracks whether context has been seeded at least once since the last navigation.\n // Resets when initialExpandedNodesProp changes (new array reference = navigation).\n // Allows the memo to distinguish \"not yet seeded\" (fall back to prop) from\n // \"user collapsed all nodes\" (trust empty context).\n const contextSeededRef = useRef(false)\n const lastInitialExpandedRef = useRef(initialExpandedNodesProp)\n if (lastInitialExpandedRef.current !== initialExpandedNodesProp) {\n lastInitialExpandedRef.current = initialExpandedNodesProp\n contextSeededRef.current = false\n }\n\n const expandedNodes = useMemo(() => {\n const contextExpanded = getExpandedNodesForCollection(collectionSlug)\n if (contextExpanded.size > 0) {\n contextSeededRef.current = true\n return contextExpanded\n }\n if (contextSeededRef.current) {\n // Context was seeded (had nodes since last navigation) — trust empty set as \"all collapsed\"\n return contextExpanded\n }\n return initialExpandedNodesProp ? new Set(initialExpandedNodesProp) : contextExpanded\n }, [collectionSlug, getExpandedNodesForCollection, initialExpandedNodesProp])\n\n const handleToggleNode = useCallback(\n ({ id }: { id: number | string }) => {\n // Mark context as seeded so the memo never falls back to the prop after this interaction.\n // Capture the previous value first — seeding is only needed on the very first interaction.\n const wasSeeded = contextSeededRef.current\n contextSeededRef.current = true\n const contextExpanded = getExpandedNodesForCollection(collectionSlug)\n if (!wasSeeded && contextExpanded.size === 0 && initialExpandedNodesProp?.length) {\n // Context not yet seeded. Seed it with all initial nodes, applying the toggle correctly:\n // exclude the target if collapsing, include it if expanding.\n const initialSet = new Set(initialExpandedNodesProp.map(String))\n const isCurrentlyExpanded = initialSet.has(String(id))\n for (const nodeId of initialExpandedNodesProp) {\n if (!isCurrentlyExpanded || String(nodeId) !== String(id)) {\n toggleNodeForCollection(collectionSlug, nodeId)\n }\n }\n if (!isCurrentlyExpanded) {\n toggleNodeForCollection(collectionSlug, id)\n }\n return\n }\n toggleNodeForCollection(collectionSlug, id)\n },\n [\n collectionSlug,\n getExpandedNodesForCollection,\n initialExpandedNodesProp,\n toggleNodeForCollection,\n ],\n )\n\n // Pre-populate cache with initialData synchronously before first render\n const childrenCache = useRef<Map<string, CachedChildren>>(new Map())\n\n const prevBaseFilterKeyRef = useRef(baseFilterKey)\n if (prevBaseFilterKeyRef.current !== baseFilterKey) {\n prevBaseFilterKeyRef.current = baseFilterKey\n childrenCache.current.clear()\n }\n\n useMemo(() => {\n if (!initialData || initialData.docs.length === 0) {\n return\n }\n\n const docsByParent = new Map<string, TreeDocument[]>()\n for (const doc of initialData.docs) {\n const parentId = doc[parentFieldName] || 'null'\n const parentKey = String(parentId)\n if (!docsByParent.has(parentKey)) {\n docsByParent.set(parentKey, [])\n }\n docsByParent.get(parentKey).push(doc)\n }\n\n const filterKey = filterByCollections?.length\n ? filterByCollections.slice().sort().join(',')\n : ''\n for (const [parentKey, docs] of docsByParent) {\n const cacheKey = `${collectionSlug}-${parentKey}-${filterKey}-${baseFilterKey}`\n const parentMeta = initialData.loadedParents[parentKey]\n\n if (parentMeta) {\n const loadedCount = parentMeta.loadedCount ?? docs.length\n childrenCache.current.set(cacheKey, {\n children: docs,\n hasMore: parentMeta.hasMore,\n page: Math.ceil(loadedCount / treeLimit) || 1,\n totalDocs: parentMeta.totalDocs,\n })\n } else {\n childrenCache.current.set(cacheKey, {\n children: docs,\n hasMore: false,\n page: 1,\n totalDocs: docs.length,\n })\n }\n }\n }, [initialData, filterByCollections, parentFieldName, collectionSlug, treeLimit, baseFilterKey])\n\n const treeRef = useRef<HTMLDivElement>(null)\n\n const {\n children: rootNodes,\n hasMore,\n isLoading,\n loadMore: loadMoreFromHook,\n refresh,\n totalDocs,\n } = useChildren({\n allPossibleTypeValues,\n baseFilter,\n cache: childrenCache,\n collectionSlug,\n enabled: true,\n filterByCollections,\n initialData,\n limit: treeLimit,\n parentFieldName,\n parentId: 'null',\n typeFieldName,\n useAsTitle,\n })\n\n const handleLoadMore = useCallback(async () => {\n await loadMoreFromHook()\n }, [loadMoreFromHook])\n\n const handleNodeClick = useCallback(\n ({ id }: { id: number | string }) => {\n onNodeClick?.({ id })\n },\n [onNodeClick],\n )\n\n const handleTreeKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n moveFocus('down')\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n moveFocus('up')\n }\n },\n [moveFocus],\n )\n\n if (isLoading && !rootNodes) {\n return (\n <div className={baseClass}>\n <DelayedSpinner baseClass={baseClass} isLoading={true} />\n </div>\n )\n }\n\n if (!rootNodes || rootNodes.length === 0) {\n const collectionLabel = getEntityConfig({ collectionSlug })\n return (\n <div className={baseClass}>\n <CreateDocumentButton\n buttonStyle=\"primary\"\n collections={[{ collectionSlug }]}\n drawerSlug={createDrawerSlug}\n label={t('general:createNewLabel', {\n label: getTranslation(collectionLabel.labels.singular, i18n),\n })}\n onSave={async () => {\n await refresh()\n router.refresh()\n }}\n />\n </div>\n )\n }\n\n const isAllSelected = selectedNodeId === null\n const handleAllClick = () => onNodeClick?.({ id: null })\n\n return (\n <div\n className={baseClass}\n onKeyDown={handleTreeKeyDown}\n ref={treeRef}\n role=\"tree\"\n tabIndex={-1}\n >\n <div\n aria-selected={isAllSelected}\n className={[\n `${baseClass}__all-option`,\n isAllSelected && `${baseClass}__all-option--selected`,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleAllClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleAllClick()\n }\n }}\n role=\"treeitem\"\n tabIndex={0}\n >\n {icon || <TagIcon color=\"muted\" />}\n <span>\n {t('general:all')}{' '}\n {getTranslation(getEntityConfig({ collectionSlug })?.labels?.plural, i18n)}\n </span>\n </div>\n {rootNodes.map((node) => {\n const nodeId: number | string = node.id\n const nodeIdStr = typeof nodeId === 'number' ? String(nodeId) : nodeId\n const nodeTitle = getDocumentTitle(node, useAsTitle)\n\n return (\n <TreeNode\n allPossibleTypeValues={allPossibleTypeValues}\n baseFilter={baseFilter}\n cache={childrenCache}\n collectionSlug={collectionSlug}\n depth={0}\n expandedNodes={expandedNodes}\n filterByCollections={filterByCollections}\n key={nodeIdStr}\n limit={treeLimit}\n node={{ id: nodeId, hasChildren: true, title: nodeTitle }}\n onSelect={handleNodeClick}\n onToggle={handleToggleNode}\n parentFieldName={parentFieldName}\n selected={nodeIdStr === String(selectedNodeId)}\n selectedNodeId={selectedNodeId}\n typeFieldName={typeFieldName}\n useAsTitle={useAsTitle}\n />\n )\n })}\n {hasMore && (\n <LoadMore\n currentCount={rootNodes.length}\n depth={0}\n id=\"load-more-root\"\n onLoadMore={handleLoadMore}\n totalDocs={totalDocs}\n />\n )}\n </div>\n )\n}\n\nexport const HierarchyTree: React.FC<HierarchyTreeProps> = (props) => {\n return (\n <TreeFocusProvider>\n <HierarchyTreeInner {...props} />\n </TreeFocusProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ @import '../../../scss/styles.scss';
2
+
3
+ .tree {
4
+ --tree-indent: 20px;
5
+ --tree-chevron-width: 16px;
6
+ --tree-chevron-spacing: 8px;
7
+ --tree-node-padding-y: calc(var(--base) / 4);
8
+ --tree-node-content-height: 24px;
9
+ --tree-row-gap: 8px;
10
+ --tree-font-size: 13px;
11
+
12
+ padding: 0;
13
+ margin: 0;
14
+ margin-top: 2px; // account for accessibility outline
15
+
16
+ &__all-option {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 8px;
20
+ padding: var(--tree-node-padding-y) 0;
21
+ font-size: var(--tree-font-size);
22
+ line-height: var(--tree-node-content-height);
23
+ height: var(--tree-node-content-height);
24
+ margin-bottom: var(--tree-row-gap);
25
+ cursor: pointer;
26
+ user-select: none;
27
+ color: var(--theme-text);
28
+ border-radius: var(--style-radius-s);
29
+
30
+ &:hover {
31
+ text-decoration: underline;
32
+ }
33
+ &:focus-visible {
34
+ outline: var(--accessibility-outline);
35
+ }
36
+ &--selected {
37
+ font-weight: 600;
38
+ }
39
+
40
+ svg {
41
+ width: 16px;
42
+ height: 16px;
43
+ flex-shrink: 0;
44
+ }
45
+ }
46
+
47
+ &__loading {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ padding: var(--base);
52
+ min-height: 100px;
53
+ }
54
+
55
+ &__empty {
56
+ padding: 12px 16px;
57
+ color: var(--theme-elevation-500);
58
+ font-size: var(--tree-font-size);
59
+ }
60
+ }
@@ -0,0 +1,76 @@
1
+ import type { TypeWithID, Where } from 'payload';
2
+ import type { ReactNode, RefObject } from 'react';
3
+ export type HierarchyDocument = {
4
+ [key: string]: unknown;
5
+ } & TypeWithID;
6
+ export type HierarchyInitialData = {
7
+ baseFilter?: null | Where;
8
+ docs: HierarchyDocument[];
9
+ loadedParents: Record<string, {
10
+ hasMore: boolean;
11
+ loadedCount?: number;
12
+ totalDocs: number;
13
+ }>;
14
+ };
15
+ export type HierarchyTreeProps = {
16
+ baseFilter?: null | Where;
17
+ collectionSlug: string;
18
+ filterByCollections?: string[];
19
+ icon?: ReactNode;
20
+ /** Initial data for first render (before context hydration). After hydration, context data takes precedence. */
21
+ initialData?: HierarchyInitialData | null;
22
+ /** Initial expanded nodes for first render (before context hydration). After hydration, context takes precedence. */
23
+ initialExpandedNodes?: (number | string)[];
24
+ onNodeClick?: ({ id }: {
25
+ id: null | number | string;
26
+ }) => void;
27
+ selectedNodeId?: null | number | string;
28
+ useAsTitle?: string;
29
+ };
30
+ export type TreeDocument = {
31
+ [key: string]: unknown;
32
+ id: number | string;
33
+ };
34
+ export type TreeNodeData = {
35
+ hasChildren: boolean;
36
+ id: number | string;
37
+ title: string;
38
+ };
39
+ export type CachedChildren = {
40
+ children: TreeDocument[];
41
+ hasMore: boolean;
42
+ page: number;
43
+ totalDocs: number;
44
+ };
45
+ export type TreeCache = RefObject<Map<string, CachedChildren>>;
46
+ export type TreeInitialData = {
47
+ docs: TreeDocument[];
48
+ loadedParents: Record<string, {
49
+ hasMore: boolean;
50
+ loadedCount?: number;
51
+ totalDocs: number;
52
+ }>;
53
+ };
54
+ export type TreeNodeProps = {
55
+ allPossibleTypeValues?: string[];
56
+ baseFilter?: null | Where;
57
+ cache: TreeCache;
58
+ collectionSlug: string;
59
+ depth: number;
60
+ expandedNodes: Set<number | string>;
61
+ filterByCollections?: string[];
62
+ limit: number;
63
+ node: TreeNodeData;
64
+ onSelect?: ({ id }: {
65
+ id: number | string;
66
+ }) => void;
67
+ onToggle: ({ id }: {
68
+ id: number | string;
69
+ }) => void;
70
+ parentFieldName: string;
71
+ selected?: boolean;
72
+ selectedNodeId?: number | string;
73
+ typeFieldName?: null | string;
74
+ useAsTitle?: string;
75
+ };
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Tree/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/elements/Hierarchy/Tree/types.ts"],"sourcesContent":["import type { TypeWithID, Where } from 'payload'\nimport type { ReactNode, RefObject } from 'react'\n\nexport type HierarchyDocument = {\n [key: string]: unknown\n} & TypeWithID\n\nexport type HierarchyInitialData = {\n baseFilter?: null | Where\n docs: HierarchyDocument[]\n // Metadata about what was loaded - keyed by parent ID ('null' for root)\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport type HierarchyTreeProps = {\n baseFilter?: null | Where\n collectionSlug: string\n filterByCollections?: string[]\n icon?: ReactNode\n /** Initial data for first render (before context hydration). After hydration, context data takes precedence. */\n initialData?: HierarchyInitialData | null\n /** Initial expanded nodes for first render (before context hydration). After hydration, context takes precedence. */\n initialExpandedNodes?: (number | string)[]\n onNodeClick?: ({ id }: { id: null | number | string }) => void\n selectedNodeId?: null | number | string\n useAsTitle?: string\n}\n\n// Tree primitive types (used by TreeNode, useChildren, HierarchyTree)\n\nexport type TreeDocument = {\n [key: string]: unknown\n id: number | string\n}\n\nexport type TreeNodeData = {\n hasChildren: boolean\n id: number | string\n title: string\n}\n\nexport type CachedChildren = {\n children: TreeDocument[]\n hasMore: boolean\n page: number\n totalDocs: number\n}\n\nexport type TreeCache = RefObject<Map<string, CachedChildren>>\n\nexport type TreeInitialData = {\n docs: TreeDocument[]\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport type TreeNodeProps = {\n allPossibleTypeValues?: string[]\n baseFilter?: null | Where\n cache: TreeCache\n collectionSlug: string\n depth: number\n expandedNodes: Set<number | string>\n filterByCollections?: string[]\n limit: number\n node: TreeNodeData\n onSelect?: ({ id }: { id: number | string }) => void\n onToggle: ({ id }: { id: number | string }) => void\n parentFieldName: string\n selected?: boolean\n selectedNodeId?: number | string\n typeFieldName?: null | string\n useAsTitle?: string\n}\n"],"mappings":"AAuDA","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ import type { Where } from 'payload';
2
+ import type { TreeCache, TreeDocument, TreeInitialData } from './types.js';
3
+ type UseChildrenArgs = {
4
+ allPossibleTypeValues?: string[];
5
+ /** Base filter to apply to all queries (e.g., tenant filter) */
6
+ baseFilter?: null | Where;
7
+ cache?: TreeCache;
8
+ /** Pre-computed cache key to ensure consistency with cache population */
9
+ cacheKey?: string;
10
+ collectionSlug: string;
11
+ enabled?: boolean;
12
+ filterByCollections?: string[];
13
+ initialData?: null | TreeInitialData;
14
+ limit?: number;
15
+ parentFieldName: string;
16
+ parentId: number | string;
17
+ typeFieldName?: null | string;
18
+ useAsTitle?: string;
19
+ };
20
+ type UseChildrenReturn = {
21
+ children: null | TreeDocument[];
22
+ hasMore: boolean;
23
+ isLoading: boolean;
24
+ /** Explicitly load children. Safe to call multiple times — no-ops if already loaded. */
25
+ load: () => Promise<TreeDocument[]>;
26
+ loadMore: () => Promise<TreeDocument[]>;
27
+ refresh: () => Promise<TreeDocument[]>;
28
+ totalDocs: number;
29
+ };
30
+ export declare const useChildren: ({ allPossibleTypeValues, baseFilter, cache, cacheKey: cacheKeyProp, collectionSlug, enabled, filterByCollections, initialData, limit, parentFieldName, parentId, typeFieldName, useAsTitle, }: UseChildrenArgs) => UseChildrenReturn;
31
+ export {};
32
+ //# sourceMappingURL=useChildren.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChildren.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Tree/useChildren.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK1E,KAAK,eAAe,GAAG;IACrB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,WAAW,CAAC,EAAE,IAAI,GAAG,eAAe,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,IAAI,GAAG,YAAY,EAAE,CAAA;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,wFAAwF;IACxF,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACvC,OAAO,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,kMAcrB,eAAe,KAAG,iBAyPpB,CAAA"}
@@ -0,0 +1,233 @@
1
+ import { combineWhereConstraints, formatAdminURL } from 'payload/shared';
2
+ import * as qs from 'qs-esm';
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { useConfig } from '../../../providers/Config/index.js';
5
+ import { isSuperset } from '../../../utilities/isSuperset.js';
6
+ export const useChildren = ({
7
+ allPossibleTypeValues,
8
+ baseFilter,
9
+ cache,
10
+ cacheKey: cacheKeyProp,
11
+ collectionSlug,
12
+ enabled = true,
13
+ filterByCollections,
14
+ initialData,
15
+ limit = 2,
16
+ parentFieldName,
17
+ parentId,
18
+ typeFieldName,
19
+ useAsTitle
20
+ }) => {
21
+ const filterKey = filterByCollections?.length ? filterByCollections.slice().sort().join(',') : '';
22
+ const baseFilterKey = baseFilter ? JSON.stringify(baseFilter) : '';
23
+ // Use provided cacheKey for consistency with cache population, or compute if not provided
24
+ const cacheKey = cacheKeyProp ?? `${collectionSlug}-${String(parentId)}-${filterKey}-${baseFilterKey}`;
25
+ const cachedData = cache?.current.get(cacheKey);
26
+ // Check if we have initial data for this specific parent
27
+ const parentKey = parentId === 'null' ? 'null' : String(parentId);
28
+ const parentMeta = initialData?.loadedParents?.[parentKey];
29
+ const hasInitialData = !!parentMeta;
30
+ // Extract docs for this parent from initialData if available
31
+ // Apply same superset filter as fetchPage for consistency
32
+ const initialDocsForParent = hasInitialData ? initialData.docs.filter(doc => {
33
+ const docParent = doc[parentFieldName] || 'null';
34
+ if (String(docParent) !== parentKey) {
35
+ return false;
36
+ }
37
+ if (filterByCollections?.length && typeFieldName) {
38
+ return isSuperset(doc[typeFieldName], filterByCollections);
39
+ }
40
+ return true;
41
+ }) : null;
42
+ const [children, setChildren] = useState(initialDocsForParent || cachedData?.children || null);
43
+ const [isLoading, setIsLoading] = useState(false);
44
+ const [page, setPage] = useState(cachedData?.page || 1);
45
+ const [totalDocs, setTotalDocs] = useState(parentMeta?.totalDocs || cachedData?.totalDocs || 0);
46
+ const [hasMore, setHasMore] = useState(parentMeta?.hasMore || cachedData?.hasMore || false);
47
+ const initializedRef = useRef(!!hasInitialData);
48
+ // Refs for stable access inside load() without adding state to its dep array
49
+ const childrenRef = useRef(children);
50
+ childrenRef.current = children;
51
+ const isLoadingRef = useRef(isLoading);
52
+ isLoadingRef.current = isLoading;
53
+ const {
54
+ config: {
55
+ routes: {
56
+ api
57
+ },
58
+ serverURL
59
+ }
60
+ } = useConfig();
61
+ const fetchPage = useCallback(async (pageToFetch, currentChildren) => {
62
+ setIsLoading(true);
63
+ try {
64
+ const parentCondition = parentId === 'null' || parentId === null ? {
65
+ or: [{
66
+ [parentFieldName]: {
67
+ exists: false
68
+ }
69
+ }, {
70
+ [parentFieldName]: {
71
+ equals: null
72
+ }
73
+ }]
74
+ } : {
75
+ [parentFieldName]: {
76
+ equals: parentId
77
+ }
78
+ };
79
+ // Build filter condition for collection type filtering
80
+ // Matches items that:
81
+ // - allow ANY of the selected collections, OR
82
+ // - are unrestricted (type field doesn't exist), OR
83
+ // - have empty allowedTypes array (unrestricted)
84
+ const filterCondition = filterByCollections?.length && typeFieldName ? {
85
+ or: [{
86
+ [typeFieldName]: {
87
+ in: filterByCollections
88
+ }
89
+ }, {
90
+ [typeFieldName]: {
91
+ exists: false
92
+ }
93
+ },
94
+ // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres
95
+ ...(allPossibleTypeValues?.length ? [{
96
+ [typeFieldName]: {
97
+ not_in: allPossibleTypeValues
98
+ }
99
+ }] : [])]
100
+ } : undefined;
101
+ // Combine conditions: parent + filter + baseFilter
102
+ const where = combineWhereConstraints([parentCondition, filterCondition, baseFilter]);
103
+ const queryParams = {
104
+ limit,
105
+ page: pageToFetch,
106
+ sort: useAsTitle ?? 'id',
107
+ where
108
+ };
109
+ const queryString = qs.stringify(queryParams, {
110
+ addQueryPrefix: true
111
+ });
112
+ const url = formatAdminURL({
113
+ apiRoute: api,
114
+ path: `/${collectionSlug}${queryString}`,
115
+ serverURL
116
+ });
117
+ const response = await fetch(url, {
118
+ credentials: 'include'
119
+ });
120
+ if (!response.ok) {
121
+ throw new Error('Failed to fetch children');
122
+ }
123
+ const data = await response.json();
124
+ const allDocs = data.docs || [];
125
+ // Client-side filter: only show items that are a superset of required collections
126
+ // Server query uses ANY (due to PG limitations), but we want ALL (superset)
127
+ const newDocs = filterByCollections?.length && typeFieldName ? allDocs.filter(doc => isSuperset(doc[typeFieldName], filterByCollections)) : allDocs;
128
+ const newChildren = pageToFetch === 1 ? newDocs : [...(currentChildren || []), ...newDocs];
129
+ setChildren(newChildren);
130
+ setTotalDocs(data.totalDocs || 0);
131
+ setHasMore(data.hasNextPage || false);
132
+ setPage(pageToFetch);
133
+ if (cache) {
134
+ cache.current.set(cacheKey, {
135
+ children: newChildren,
136
+ hasMore: data.hasNextPage || false,
137
+ page: pageToFetch,
138
+ totalDocs: data.totalDocs || 0
139
+ });
140
+ }
141
+ return newDocs;
142
+ } catch {
143
+ if (pageToFetch === 1) {
144
+ const emptyChildren = [];
145
+ setChildren(emptyChildren);
146
+ setHasMore(false);
147
+ if (cache) {
148
+ cache.current.set(cacheKey, {
149
+ children: emptyChildren,
150
+ hasMore: false,
151
+ page: 1,
152
+ totalDocs: 0
153
+ });
154
+ }
155
+ }
156
+ return [];
157
+ } finally {
158
+ setIsLoading(false);
159
+ }
160
+ }, [allPossibleTypeValues, baseFilter, parentId, parentFieldName, filterByCollections, typeFieldName, limit, useAsTitle, api, collectionSlug, serverURL, cache, cacheKey]);
161
+ // Reset state and reload when filter changes
162
+ const prevFilterKeyRef = useRef(filterKey);
163
+ useEffect(() => {
164
+ if (prevFilterKeyRef.current !== filterKey) {
165
+ prevFilterKeyRef.current = filterKey;
166
+ setChildren(null);
167
+ setPage(1);
168
+ setTotalDocs(0);
169
+ setHasMore(false);
170
+ // If the node is currently expanded, immediately reload with the new filter
171
+ if (enabled) {
172
+ void fetchPage(1, null);
173
+ }
174
+ }
175
+ }, [filterKey, enabled, fetchPage]);
176
+ // Load children explicitly. Safe to call multiple times — no-ops if already loaded or loading.
177
+ const load = useCallback(async () => {
178
+ // Consume initialData on first call without re-fetching
179
+ if (initializedRef.current && childrenRef.current !== null) {
180
+ initializedRef.current = false;
181
+ return childrenRef.current;
182
+ }
183
+ // Already loaded
184
+ if (childrenRef.current !== null) {
185
+ return childrenRef.current;
186
+ }
187
+ // Guard against concurrent calls
188
+ if (isLoadingRef.current) {
189
+ return [];
190
+ }
191
+ // Restore from cache when available (e.g., after a filter reset)
192
+ const currentCachedData = cache?.current.get(cacheKey);
193
+ if (currentCachedData) {
194
+ setChildren(currentCachedData.children);
195
+ setPage(currentCachedData.page);
196
+ setTotalDocs(currentCachedData.totalDocs);
197
+ setHasMore(currentCachedData.hasMore);
198
+ return currentCachedData.children;
199
+ }
200
+ return fetchPage(1, null);
201
+ }, [cache, cacheKey, fetchPage]);
202
+ const loadMore = useCallback(async () => {
203
+ if (isLoading || !hasMore) {
204
+ return [];
205
+ }
206
+ // If we have fewer items than our limit, the cached data was fetched with a smaller limit
207
+ // We need to re-fetch page 1 with our limit to get the full first page
208
+ const shouldRefetchPage1 = children && children.length < limit;
209
+ return fetchPage(shouldRefetchPage1 ? 1 : page + 1, children);
210
+ }, [isLoading, hasMore, page, children, fetchPage, limit]);
211
+ const refresh = useCallback(async () => {
212
+ if (cache) {
213
+ cache.current.delete(cacheKey);
214
+ }
215
+ setChildren(null);
216
+ setPage(1);
217
+ return fetchPage(1, null);
218
+ }, [cache, cacheKey, fetchPage]);
219
+ // If state hasn't been loaded yet, read directly from cache as a synchronous fallback.
220
+ // Tree's useMemo pre-populates the cache before child TreeNodes render, so this eliminates
221
+ // the brief null-children flash that occurs when a node becomes expanded after context updates.
222
+ const effectiveChildren = children ?? cache?.current.get(cacheKey)?.children ?? null;
223
+ return {
224
+ children: effectiveChildren,
225
+ hasMore,
226
+ isLoading,
227
+ load,
228
+ loadMore,
229
+ refresh,
230
+ totalDocs
231
+ };
232
+ };
233
+ //# sourceMappingURL=useChildren.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChildren.js","names":["combineWhereConstraints","formatAdminURL","qs","useCallback","useEffect","useRef","useState","useConfig","isSuperset","useChildren","allPossibleTypeValues","baseFilter","cache","cacheKey","cacheKeyProp","collectionSlug","enabled","filterByCollections","initialData","limit","parentFieldName","parentId","typeFieldName","useAsTitle","filterKey","length","slice","sort","join","baseFilterKey","JSON","stringify","String","cachedData","current","get","parentKey","parentMeta","loadedParents","hasInitialData","initialDocsForParent","docs","filter","doc","docParent","children","setChildren","isLoading","setIsLoading","page","setPage","totalDocs","setTotalDocs","hasMore","setHasMore","initializedRef","childrenRef","isLoadingRef","config","routes","api","serverURL","fetchPage","pageToFetch","currentChildren","parentCondition","or","exists","equals","filterCondition","in","not_in","undefined","where","queryParams","queryString","addQueryPrefix","url","apiRoute","path","response","fetch","credentials","ok","Error","data","json","allDocs","newDocs","newChildren","hasNextPage","set","emptyChildren","prevFilterKeyRef","load","currentCachedData","loadMore","shouldRefetchPage1","refresh","delete","effectiveChildren"],"sources":["../../../../src/elements/Hierarchy/Tree/useChildren.tsx"],"sourcesContent":["import type { Where } from 'payload'\n\nimport { combineWhereConstraints, formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { TreeCache, TreeDocument, TreeInitialData } from './types.js'\n\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { isSuperset } from '../../../utilities/isSuperset.js'\n\ntype UseChildrenArgs = {\n allPossibleTypeValues?: string[]\n /** Base filter to apply to all queries (e.g., tenant filter) */\n baseFilter?: null | Where\n cache?: TreeCache\n /** Pre-computed cache key to ensure consistency with cache population */\n cacheKey?: string\n collectionSlug: string\n enabled?: boolean\n filterByCollections?: string[]\n initialData?: null | TreeInitialData\n limit?: number\n parentFieldName: string\n parentId: number | string\n typeFieldName?: null | string\n useAsTitle?: string\n}\n\ntype UseChildrenReturn = {\n children: null | TreeDocument[]\n hasMore: boolean\n isLoading: boolean\n /** Explicitly load children. Safe to call multiple times — no-ops if already loaded. */\n load: () => Promise<TreeDocument[]>\n loadMore: () => Promise<TreeDocument[]>\n refresh: () => Promise<TreeDocument[]>\n totalDocs: number\n}\n\nexport const useChildren = ({\n allPossibleTypeValues,\n baseFilter,\n cache,\n cacheKey: cacheKeyProp,\n collectionSlug,\n enabled = true,\n filterByCollections,\n initialData,\n limit = 2,\n parentFieldName,\n parentId,\n typeFieldName,\n useAsTitle,\n}: UseChildrenArgs): UseChildrenReturn => {\n const filterKey = filterByCollections?.length ? filterByCollections.slice().sort().join(',') : ''\n const baseFilterKey = baseFilter ? JSON.stringify(baseFilter) : ''\n // Use provided cacheKey for consistency with cache population, or compute if not provided\n const cacheKey =\n cacheKeyProp ?? `${collectionSlug}-${String(parentId)}-${filterKey}-${baseFilterKey}`\n const cachedData = cache?.current.get(cacheKey)\n\n // Check if we have initial data for this specific parent\n const parentKey = parentId === 'null' ? 'null' : String(parentId)\n const parentMeta = initialData?.loadedParents?.[parentKey]\n const hasInitialData = !!parentMeta\n\n // Extract docs for this parent from initialData if available\n // Apply same superset filter as fetchPage for consistency\n const initialDocsForParent = hasInitialData\n ? initialData.docs.filter((doc) => {\n const docParent = doc[parentFieldName] || 'null'\n if (String(docParent) !== parentKey) {\n return false\n }\n if (filterByCollections?.length && typeFieldName) {\n return isSuperset(doc[typeFieldName] as string[] | undefined, filterByCollections)\n }\n return true\n })\n : null\n\n const [children, setChildren] = useState<null | TreeDocument[]>(\n initialDocsForParent || cachedData?.children || null,\n )\n const [isLoading, setIsLoading] = useState(false)\n const [page, setPage] = useState(cachedData?.page || 1)\n const [totalDocs, setTotalDocs] = useState(parentMeta?.totalDocs || cachedData?.totalDocs || 0)\n const [hasMore, setHasMore] = useState(parentMeta?.hasMore || cachedData?.hasMore || false)\n const initializedRef = useRef(!!hasInitialData)\n // Refs for stable access inside load() without adding state to its dep array\n const childrenRef = useRef(children)\n childrenRef.current = children\n const isLoadingRef = useRef(isLoading)\n isLoadingRef.current = isLoading\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const fetchPage = useCallback(\n async (\n pageToFetch: number,\n currentChildren: null | TreeDocument[],\n ): Promise<TreeDocument[]> => {\n setIsLoading(true)\n\n try {\n const parentCondition =\n parentId === 'null' || parentId === null\n ? {\n or: [\n { [parentFieldName]: { exists: false } },\n { [parentFieldName]: { equals: null } },\n ],\n }\n : { [parentFieldName]: { equals: parentId } }\n\n // Build filter condition for collection type filtering\n // Matches items that:\n // - allow ANY of the selected collections, OR\n // - are unrestricted (type field doesn't exist), OR\n // - have empty allowedTypes array (unrestricted)\n const filterCondition: undefined | Where =\n filterByCollections?.length && typeFieldName\n ? {\n or: [\n { [typeFieldName]: { in: filterByCollections } },\n { [typeFieldName]: { exists: false } },\n // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres\n ...(allPossibleTypeValues?.length\n ? [{ [typeFieldName]: { not_in: allPossibleTypeValues } }]\n : []),\n ],\n }\n : undefined\n\n // Combine conditions: parent + filter + baseFilter\n const where = combineWhereConstraints([parentCondition, filterCondition, baseFilter])\n\n const queryParams: Record<string, unknown> = {\n limit,\n page: pageToFetch,\n sort: useAsTitle ?? 'id',\n where,\n }\n\n const queryString = qs.stringify(queryParams, { addQueryPrefix: true })\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}${queryString}`,\n serverURL,\n })\n const response = await fetch(url, {\n credentials: 'include',\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch children')\n }\n\n const data = await response.json()\n const allDocs: TreeDocument[] = data.docs || []\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 newDocs =\n filterByCollections?.length && typeFieldName\n ? allDocs.filter((doc) =>\n isSuperset(doc[typeFieldName] as string[] | undefined, filterByCollections),\n )\n : allDocs\n\n const newChildren = pageToFetch === 1 ? newDocs : [...(currentChildren || []), ...newDocs]\n\n setChildren(newChildren)\n setTotalDocs(data.totalDocs || 0)\n setHasMore(data.hasNextPage || false)\n setPage(pageToFetch)\n\n if (cache) {\n cache.current.set(cacheKey, {\n children: newChildren,\n hasMore: data.hasNextPage || false,\n page: pageToFetch,\n totalDocs: data.totalDocs || 0,\n })\n }\n\n return newDocs\n } catch {\n if (pageToFetch === 1) {\n const emptyChildren: TreeDocument[] = []\n setChildren(emptyChildren)\n setHasMore(false)\n\n if (cache) {\n cache.current.set(cacheKey, {\n children: emptyChildren,\n hasMore: false,\n page: 1,\n totalDocs: 0,\n })\n }\n }\n\n return []\n } finally {\n setIsLoading(false)\n }\n },\n [\n allPossibleTypeValues,\n baseFilter,\n parentId,\n parentFieldName,\n filterByCollections,\n typeFieldName,\n limit,\n useAsTitle,\n api,\n collectionSlug,\n serverURL,\n cache,\n cacheKey,\n ],\n )\n\n // Reset state and reload when filter changes\n const prevFilterKeyRef = useRef(filterKey)\n useEffect(() => {\n if (prevFilterKeyRef.current !== filterKey) {\n prevFilterKeyRef.current = filterKey\n setChildren(null)\n setPage(1)\n setTotalDocs(0)\n setHasMore(false)\n // If the node is currently expanded, immediately reload with the new filter\n if (enabled) {\n void fetchPage(1, null)\n }\n }\n }, [filterKey, enabled, fetchPage])\n\n // Load children explicitly. Safe to call multiple times — no-ops if already loaded or loading.\n const load = useCallback(async (): Promise<TreeDocument[]> => {\n // Consume initialData on first call without re-fetching\n if (initializedRef.current && childrenRef.current !== null) {\n initializedRef.current = false\n return childrenRef.current\n }\n\n // Already loaded\n if (childrenRef.current !== null) {\n return childrenRef.current\n }\n\n // Guard against concurrent calls\n if (isLoadingRef.current) {\n return []\n }\n\n // Restore from cache when available (e.g., after a filter reset)\n const currentCachedData = cache?.current.get(cacheKey)\n if (currentCachedData) {\n setChildren(currentCachedData.children)\n setPage(currentCachedData.page)\n setTotalDocs(currentCachedData.totalDocs)\n setHasMore(currentCachedData.hasMore)\n return currentCachedData.children\n }\n\n return fetchPage(1, null)\n }, [cache, cacheKey, fetchPage])\n\n const loadMore = useCallback(async (): Promise<TreeDocument[]> => {\n if (isLoading || !hasMore) {\n return []\n }\n\n // If we have fewer items than our limit, the cached data was fetched with a smaller limit\n // We need to re-fetch page 1 with our limit to get the full first page\n const shouldRefetchPage1 = children && children.length < limit\n\n return fetchPage(shouldRefetchPage1 ? 1 : page + 1, children)\n }, [isLoading, hasMore, page, children, fetchPage, limit])\n\n const refresh = useCallback(async (): Promise<TreeDocument[]> => {\n if (cache) {\n cache.current.delete(cacheKey)\n }\n setChildren(null)\n setPage(1)\n return fetchPage(1, null)\n }, [cache, cacheKey, fetchPage])\n // If state hasn't been loaded yet, read directly from cache as a synchronous fallback.\n // Tree's useMemo pre-populates the cache before child TreeNodes render, so this eliminates\n // the brief null-children flash that occurs when a node becomes expanded after context updates.\n const effectiveChildren = children ?? cache?.current.get(cacheKey)?.children ?? null\n\n return { children: effectiveChildren, hasMore, isLoading, load, loadMore, refresh, totalDocs }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,10 @@ declare const NextLink: React.ForwardRefExoticComponent<Omit<React.AnchorHTMLAtt
4
4
  children?: React.ReactNode | undefined;
5
5
  } & React.RefAttributes<HTMLAnchorElement>>;
6
6
  type Props = {
7
+ /**
8
+ * Force a hard navigation using window.location instead of client-side routing
9
+ */
10
+ forceReload?: boolean;
7
11
  /**
8
12
  * Disable the e.preventDefault() call on click if you want to handle it yourself via onClick
9
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Link/index.tsx"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,QAAA,MAAM,QAAQ;eA4E2pG,MAAO,SAAS;2CA5EnmG,CAAA;AAgBtF,KAAK,KAAK,GAAG;IACX;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAElC,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkDhC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Link/index.tsx"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,QAAA,MAAM,QAAQ;eAsFk7F,MAAO,SAAS;2CAtF13F,CAAA;AAgBtF,KAAK,KAAK,GAAG;IACX;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAElC,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAwDhC,CAAA"}
@@ -17,6 +17,7 @@ function isModifiedEvent(event) {
17
17
  }
18
18
  export const Link = ({
19
19
  children,
20
+ forceReload = false,
20
21
  href,
21
22
  onClick,
22
23
  preventDefault = true,
@@ -44,6 +45,10 @@ export const Link = ({
44
45
  e.preventDefault();
45
46
  }
46
47
  const url = typeof href === 'string' ? href : formatUrl(href);
48
+ if (forceReload) {
49
+ window.location.href = url;
50
+ return;
51
+ }
47
52
  const navigate = () => {
48
53
  if (replace) {
49
54
  void router.replace(url, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["NextLinkImport","useRouter","React","useRouteTransition","formatUrl","NextLink","default","isModifiedEvent","event","eventTarget","currentTarget","target","getAttribute","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","Link","children","href","onClick","preventDefault","ref","replace","scroll","rest","router","startRouteTransition","_jsx","e","url","navigate","push"],"sources":["../../../src/elements/Link/index.tsx"],"sourcesContent":["'use client'\nimport NextLinkImport from 'next/link.js'\nimport { useRouter } from 'next/navigation.js'\nimport React from 'react'\n\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { formatUrl } from './formatUrl.js'\n\nconst NextLink = 'default' in NextLinkImport ? NextLinkImport.default : NextLinkImport\n\n// Copied from https://github.com/vercel/next.js/blob/canary/packages/next/src/client/link.tsx#L180-L191\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement\n const target = eventTarget.getAttribute('target')\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\ntype Props = {\n /**\n * Disable the e.preventDefault() call on click if you want to handle it yourself via onClick\n *\n * @default true\n */\n preventDefault?: boolean\n} & Parameters<typeof NextLink>[0]\n\nexport const Link: React.FC<Props> = ({\n children,\n href,\n onClick,\n preventDefault = true,\n ref,\n replace,\n scroll,\n ...rest\n}) => {\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n\n return (\n <NextLink\n href={href}\n onClick={(e) => {\n if (isModifiedEvent(e)) {\n return\n }\n\n if (onClick) {\n onClick(e)\n }\n\n // We need a preventDefault here so that a clicked link doesn't trigger twice,\n // once for default browser navigation and once for startRouteTransition\n if (preventDefault) {\n e.preventDefault()\n }\n\n const url = typeof href === 'string' ? href : formatUrl(href)\n\n const navigate = () => {\n if (replace) {\n void router.replace(url, { scroll })\n } else {\n void router.push(url, { scroll })\n }\n }\n\n // Call startRouteTransition if available, otherwise navigate directly\n startRouteTransition(navigate)\n }}\n ref={ref}\n {...rest}\n >\n {children}\n </NextLink>\n )\n}\n"],"mappings":"AAAA;;;AACA,OAAOA,cAAA,MAAoB;AAC3B,SAASC,SAAS,QAAQ;AAC1B,OAAOC,KAAA,MAAW;AAElB,SAASC,kBAAkB,QAAQ;AACnC,SAASC,SAAS,QAAQ;AAE1B,MAAMC,QAAA,GAAW,aAAaL,cAAA,GAAiBA,cAAA,CAAeM,OAAO,GAAGN,cAAA;AAExE;AACA,SAASO,gBAAgBC,KAAuB;EAC9C,MAAMC,WAAA,GAAcD,KAAA,CAAME,aAAa;EACvC,MAAMC,MAAA,GAASF,WAAA,CAAYG,YAAY,CAAC;EACxC,OACED,MAAC,IAAUA,MAAA,KAAW,WACtBH,KAAA,CAAMK,OAAO,IACbL,KAAA,CAAMM,OAAO,IACbN,KAAA,CAAMO,QAAQ,IACdP,KAAA,CAAMQ,MAAM;EAAI;EACfR,KAAA,CAAMS,WAAW,IAAIT,KAAA,CAAMS,WAAW,CAACC,KAAK,KAAK;AAEtD;AAWA,OAAO,MAAMC,IAAA,GAAwBA,CAAC;EACpCC,QAAQ;EACRC,IAAI;EACJC,OAAO;EACPC,cAAA,GAAiB,IAAI;EACrBC,GAAG;EACHC,OAAO;EACPC,MAAM;EACN,GAAGC;AAAA,CACJ;EACC,MAAMC,MAAA,GAAS3B,SAAA;EACf,MAAM;IAAE4B;EAAoB,CAAE,GAAG1B,kBAAA;EAEjC,oBACE2B,IAAA,CAACzB,QAAA;IACCgB,IAAA,EAAMA,IAAA;IACNC,OAAA,EAAUS,CAAA;MACR,IAAIxB,eAAA,CAAgBwB,CAAA,GAAI;QACtB;MACF;MAEA,IAAIT,OAAA,EAAS;QACXA,OAAA,CAAQS,CAAA;MACV;MAEA;MACA;MACA,IAAIR,cAAA,EAAgB;QAClBQ,CAAA,CAAER,cAAc;MAClB;MAEA,MAAMS,GAAA,GAAM,OAAOX,IAAA,KAAS,WAAWA,IAAA,GAAOjB,SAAA,CAAUiB,IAAA;MAExD,MAAMY,QAAA,GAAWA,CAAA;QACf,IAAIR,OAAA,EAAS;UACX,KAAKG,MAAA,CAAOH,OAAO,CAACO,GAAA,EAAK;YAAEN;UAAO;QACpC,OAAO;UACL,KAAKE,MAAA,CAAOM,IAAI,CAACF,GAAA,EAAK;YAAEN;UAAO;QACjC;MACF;MAEA;MACAG,oBAAA,CAAqBI,QAAA;IACvB;IACAT,GAAA,EAAKA,GAAA;IACJ,GAAGG,IAAI;cAEPP;;AAGP","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["NextLinkImport","useRouter","React","useRouteTransition","formatUrl","NextLink","default","isModifiedEvent","event","eventTarget","currentTarget","target","getAttribute","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","Link","children","forceReload","href","onClick","preventDefault","ref","replace","scroll","rest","router","startRouteTransition","_jsx","e","url","window","location","navigate","push"],"sources":["../../../src/elements/Link/index.tsx"],"sourcesContent":["'use client'\nimport NextLinkImport from 'next/link.js'\nimport { useRouter } from 'next/navigation.js'\nimport React from 'react'\n\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { formatUrl } from './formatUrl.js'\n\nconst NextLink = 'default' in NextLinkImport ? NextLinkImport.default : NextLinkImport\n\n// Copied from https://github.com/vercel/next.js/blob/canary/packages/next/src/client/link.tsx#L180-L191\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement\n const target = eventTarget.getAttribute('target')\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\ntype Props = {\n /**\n * Force a hard navigation using window.location instead of client-side routing\n */\n forceReload?: boolean\n /**\n * Disable the e.preventDefault() call on click if you want to handle it yourself via onClick\n *\n * @default true\n */\n preventDefault?: boolean\n} & Parameters<typeof NextLink>[0]\n\nexport const Link: React.FC<Props> = ({\n children,\n forceReload = false,\n href,\n onClick,\n preventDefault = true,\n ref,\n replace,\n scroll,\n ...rest\n}) => {\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n\n return (\n <NextLink\n href={href}\n onClick={(e) => {\n if (isModifiedEvent(e)) {\n return\n }\n\n if (onClick) {\n onClick(e)\n }\n\n // We need a preventDefault here so that a clicked link doesn't trigger twice,\n // once for default browser navigation and once for startRouteTransition\n if (preventDefault) {\n e.preventDefault()\n }\n\n const url = typeof href === 'string' ? href : formatUrl(href)\n\n if (forceReload) {\n window.location.href = url\n return\n }\n\n const navigate = () => {\n if (replace) {\n void router.replace(url, { scroll })\n } else {\n void router.push(url, { scroll })\n }\n }\n\n // Call startRouteTransition if available, otherwise navigate directly\n startRouteTransition(navigate)\n }}\n ref={ref}\n {...rest}\n >\n {children}\n </NextLink>\n )\n}\n"],"mappings":"AAAA;;;AACA,OAAOA,cAAA,MAAoB;AAC3B,SAASC,SAAS,QAAQ;AAC1B,OAAOC,KAAA,MAAW;AAElB,SAASC,kBAAkB,QAAQ;AACnC,SAASC,SAAS,QAAQ;AAE1B,MAAMC,QAAA,GAAW,aAAaL,cAAA,GAAiBA,cAAA,CAAeM,OAAO,GAAGN,cAAA;AAExE;AACA,SAASO,gBAAgBC,KAAuB;EAC9C,MAAMC,WAAA,GAAcD,KAAA,CAAME,aAAa;EACvC,MAAMC,MAAA,GAASF,WAAA,CAAYG,YAAY,CAAC;EACxC,OACED,MAAC,IAAUA,MAAA,KAAW,WACtBH,KAAA,CAAMK,OAAO,IACbL,KAAA,CAAMM,OAAO,IACbN,KAAA,CAAMO,QAAQ,IACdP,KAAA,CAAMQ,MAAM;EAAI;EACfR,KAAA,CAAMS,WAAW,IAAIT,KAAA,CAAMS,WAAW,CAACC,KAAK,KAAK;AAEtD;AAeA,OAAO,MAAMC,IAAA,GAAwBA,CAAC;EACpCC,QAAQ;EACRC,WAAA,GAAc,KAAK;EACnBC,IAAI;EACJC,OAAO;EACPC,cAAA,GAAiB,IAAI;EACrBC,GAAG;EACHC,OAAO;EACPC,MAAM;EACN,GAAGC;AAAA,CACJ;EACC,MAAMC,MAAA,GAAS5B,SAAA;EACf,MAAM;IAAE6B;EAAoB,CAAE,GAAG3B,kBAAA;EAEjC,oBACE4B,IAAA,CAAC1B,QAAA;IACCiB,IAAA,EAAMA,IAAA;IACNC,OAAA,EAAUS,CAAA;MACR,IAAIzB,eAAA,CAAgByB,CAAA,GAAI;QACtB;MACF;MAEA,IAAIT,OAAA,EAAS;QACXA,OAAA,CAAQS,CAAA;MACV;MAEA;MACA;MACA,IAAIR,cAAA,EAAgB;QAClBQ,CAAA,CAAER,cAAc;MAClB;MAEA,MAAMS,GAAA,GAAM,OAAOX,IAAA,KAAS,WAAWA,IAAA,GAAOlB,SAAA,CAAUkB,IAAA;MAExD,IAAID,WAAA,EAAa;QACfa,MAAA,CAAOC,QAAQ,CAACb,IAAI,GAAGW,GAAA;QACvB;MACF;MAEA,MAAMG,QAAA,GAAWA,CAAA;QACf,IAAIV,OAAA,EAAS;UACX,KAAKG,MAAA,CAAOH,OAAO,CAACO,GAAA,EAAK;YAAEN;UAAO;QACpC,OAAO;UACL,KAAKE,MAAA,CAAOQ,IAAI,CAACJ,GAAA,EAAK;YAAEN;UAAO;QACjC;MACF;MAEA;MACAG,oBAAA,CAAqBM,QAAA;IACvB;IACAX,GAAA,EAAKA,GAAA;IACJ,GAAGG,IAAI;cAEPR;;AAGP","ignoreList":[]}
@@ -1,5 +1,4 @@
1
1
  export { ListBulkUploadButton } from './ListBulkUploadButton.js';
2
2
  export { ListCreateNewButton } from './ListCreateNewDocButton.js';
3
- export { ListCreateNewDocInFolderButton } from './ListCreateNewDocInFolderButton.js';
4
3
  export { ListEmptyTrashButton } from './ListEmptyTrashButton.js';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/ListHeader/TitleActions/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/ListHeader/TitleActions/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
@@ -1,5 +1,4 @@
1
1
  export { ListBulkUploadButton } from './ListBulkUploadButton.js';
2
2
  export { ListCreateNewButton } from './ListCreateNewDocButton.js';
3
- export { ListCreateNewDocInFolderButton } from './ListCreateNewDocInFolderButton.js';
4
3
  export { ListEmptyTrashButton } from './ListEmptyTrashButton.js';
5
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ListBulkUploadButton","ListCreateNewButton","ListCreateNewDocInFolderButton","ListEmptyTrashButton"],"sources":["../../../../src/elements/ListHeader/TitleActions/index.tsx"],"sourcesContent":["export { ListBulkUploadButton } from './ListBulkUploadButton.js'\nexport { ListCreateNewButton } from './ListCreateNewDocButton.js'\nexport { ListCreateNewDocInFolderButton } from './ListCreateNewDocInFolderButton.js'\nexport { ListEmptyTrashButton } from './ListEmptyTrashButton.js'\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ;AACrC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,8BAA8B,QAAQ;AAC/C,SAASC,oBAAoB,QAAQ","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["ListBulkUploadButton","ListCreateNewButton","ListEmptyTrashButton"],"sources":["../../../../src/elements/ListHeader/TitleActions/index.tsx"],"sourcesContent":["export { ListBulkUploadButton } from './ListBulkUploadButton.js'\nexport { ListCreateNewButton } from './ListCreateNewDocButton.js'\nexport { ListEmptyTrashButton } from './ListEmptyTrashButton.js'\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ;AACrC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,oBAAoB,QAAQ","ignoreList":[]}
@@ -12,11 +12,11 @@ export const ListHeader = props => {
12
12
  children: [/*#__PURE__*/_jsx("h1", {
13
13
  className: `${listHeaderClass}__title`,
14
14
  children: props.title
15
- }), props.TitleActions.length ? /*#__PURE__*/_jsx("div", {
15
+ }), props.TitleActions?.length ? /*#__PURE__*/_jsx("div", {
16
16
  className: `${listHeaderClass}__title-actions`,
17
17
  children: props.TitleActions
18
18
  }) : null]
19
- }), props.Actions.length ? /*#__PURE__*/_jsx("div", {
19
+ }), props.Actions?.length ? /*#__PURE__*/_jsx("div", {
20
20
  className: `${listHeaderClass}__actions`,
21
21
  children: props.Actions
22
22
  }) : null]