@payloadcms/next 3.80.0-internal-debug.cd99b1f → 3.80.0-internal.21e9c47

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 (523) hide show
  1. package/dist/auth/login.js +58 -52
  2. package/dist/auth/login.js.map +1 -1
  3. package/dist/auth/logout.js +44 -39
  4. package/dist/auth/logout.js.map +1 -1
  5. package/dist/auth/refresh.js +47 -45
  6. package/dist/auth/refresh.js.map +1 -1
  7. package/dist/cjs/withPayload.cjs +24 -65
  8. package/dist/cjs/withPayload.cjs.map +2 -2
  9. package/dist/config.js +0 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js +15 -9
  12. package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js.map +1 -1
  13. package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js +71 -40
  14. package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js.map +1 -1
  15. package/dist/elements/DocumentHeader/Tabs/Tab/index.js +59 -65
  16. package/dist/elements/DocumentHeader/Tabs/Tab/index.js.map +1 -1
  17. package/dist/elements/DocumentHeader/Tabs/index.js +70 -80
  18. package/dist/elements/DocumentHeader/Tabs/index.js.map +1 -1
  19. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +23 -16
  20. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js.map +1 -1
  21. package/dist/elements/DocumentHeader/Tabs/tabs/index.js +69 -61
  22. package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
  23. package/dist/elements/DocumentHeader/index.js +28 -48
  24. package/dist/elements/DocumentHeader/index.js.map +1 -1
  25. package/dist/elements/FormHeader/index.js +16 -30
  26. package/dist/elements/FormHeader/index.js.map +1 -1
  27. package/dist/elements/HierarchyTypeField/index.d.ts +9 -0
  28. package/dist/elements/HierarchyTypeField/index.d.ts.map +1 -0
  29. package/dist/elements/HierarchyTypeField/index.js +114 -0
  30. package/dist/elements/HierarchyTypeField/index.js.map +1 -0
  31. package/dist/elements/HierarchyTypeField/index.server.d.ts +9 -0
  32. package/dist/elements/HierarchyTypeField/index.server.d.ts.map +1 -0
  33. package/dist/elements/HierarchyTypeField/index.server.js +32 -0
  34. package/dist/elements/HierarchyTypeField/index.server.js.map +1 -0
  35. package/dist/elements/Logo/index.js +34 -19
  36. package/dist/elements/Logo/index.js.map +1 -1
  37. package/dist/elements/Nav/NavHamburger/index.js +44 -23
  38. package/dist/elements/Nav/NavHamburger/index.js.map +1 -1
  39. package/dist/elements/Nav/NavWrapper/index.js +54 -28
  40. package/dist/elements/Nav/NavWrapper/index.js.map +1 -1
  41. package/dist/elements/Nav/SettingsMenuButton/index.js +39 -33
  42. package/dist/elements/Nav/SettingsMenuButton/index.js.map +1 -1
  43. package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts +8 -0
  44. package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts.map +1 -0
  45. package/dist/elements/Nav/SidebarTabs/TabError/index.js +42 -0
  46. package/dist/elements/Nav/SidebarTabs/TabError/index.js.map +1 -0
  47. package/dist/elements/Nav/SidebarTabs/constants.d.ts +2 -0
  48. package/dist/elements/Nav/SidebarTabs/constants.d.ts.map +1 -0
  49. package/dist/elements/Nav/SidebarTabs/constants.js +2 -0
  50. package/dist/elements/Nav/SidebarTabs/constants.js.map +1 -0
  51. package/dist/elements/Nav/SidebarTabs/index.client.d.ts +20 -0
  52. package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -0
  53. package/dist/elements/Nav/SidebarTabs/index.client.js +155 -0
  54. package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -0
  55. package/dist/elements/Nav/SidebarTabs/index.d.ts +17 -0
  56. package/dist/elements/Nav/SidebarTabs/index.d.ts.map +1 -0
  57. package/dist/elements/Nav/SidebarTabs/index.js +80 -0
  58. package/dist/elements/Nav/SidebarTabs/index.js.map +1 -0
  59. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +10 -0
  60. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +1 -0
  61. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +53 -0
  62. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -0
  63. package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
  64. package/dist/elements/Nav/getNavPrefs.js +56 -27
  65. package/dist/elements/Nav/getNavPrefs.js.map +1 -1
  66. package/dist/elements/Nav/index.client.d.ts.map +1 -1
  67. package/dist/elements/Nav/index.client.js +104 -100
  68. package/dist/elements/Nav/index.client.js.map +1 -1
  69. package/dist/elements/Nav/index.d.ts.map +1 -1
  70. package/dist/elements/Nav/index.js +199 -193
  71. package/dist/elements/Nav/index.js.map +1 -1
  72. package/dist/exports/auth.js +0 -1
  73. package/dist/exports/auth.js.map +1 -1
  74. package/dist/exports/client.d.ts +2 -1
  75. package/dist/exports/client.d.ts.map +1 -1
  76. package/dist/exports/client.js +3 -2
  77. package/dist/exports/client.js.map +1 -1
  78. package/dist/exports/layouts.js +0 -1
  79. package/dist/exports/layouts.js.map +1 -1
  80. package/dist/exports/routes.js +0 -1
  81. package/dist/exports/routes.js.map +1 -1
  82. package/dist/exports/rsc.d.ts +2 -1
  83. package/dist/exports/rsc.d.ts.map +1 -1
  84. package/dist/exports/rsc.js +2 -2
  85. package/dist/exports/rsc.js.map +1 -1
  86. package/dist/exports/templates.js +0 -1
  87. package/dist/exports/templates.js.map +1 -1
  88. package/dist/exports/utilities.d.ts +2 -0
  89. package/dist/exports/utilities.d.ts.map +1 -1
  90. package/dist/exports/utilities.js +13 -7
  91. package/dist/exports/utilities.js.map +1 -1
  92. package/dist/exports/views.js +0 -1
  93. package/dist/exports/views.js.map +1 -1
  94. package/dist/index.js +0 -1
  95. package/dist/index.js.map +1 -1
  96. package/dist/layouts/Root/NestProviders.js +20 -21
  97. package/dist/layouts/Root/NestProviders.js.map +1 -1
  98. package/dist/layouts/Root/checkDependencies.js +41 -49
  99. package/dist/layouts/Root/checkDependencies.js.map +1 -1
  100. package/dist/layouts/Root/index.js +103 -128
  101. package/dist/layouts/Root/index.js.map +1 -1
  102. package/dist/prod/styles.css +1 -5
  103. package/dist/routes/graphql/handler.js +122 -114
  104. package/dist/routes/graphql/handler.js.map +1 -1
  105. package/dist/routes/graphql/index.js +0 -1
  106. package/dist/routes/graphql/index.js.map +1 -1
  107. package/dist/routes/graphql/playground.js +27 -28
  108. package/dist/routes/graphql/playground.js.map +1 -1
  109. package/dist/routes/index.js +0 -1
  110. package/dist/routes/index.js.map +1 -1
  111. package/dist/routes/rest/index.js +22 -23
  112. package/dist/routes/rest/index.js.map +1 -1
  113. package/dist/routes/rest/og/image.js +79 -103
  114. package/dist/routes/rest/og/image.js.map +1 -1
  115. package/dist/routes/rest/og/index.js +54 -59
  116. package/dist/routes/rest/og/index.js.map +1 -1
  117. package/dist/templates/Default/NavHamburger/index.js +20 -12
  118. package/dist/templates/Default/NavHamburger/index.js.map +1 -1
  119. package/dist/templates/Default/Wrapper/index.js +44 -20
  120. package/dist/templates/Default/Wrapper/index.js.map +1 -1
  121. package/dist/templates/Default/index.js +116 -147
  122. package/dist/templates/Default/index.js.map +1 -1
  123. package/dist/templates/Minimal/index.js +17 -26
  124. package/dist/templates/Minimal/index.js.map +1 -1
  125. package/dist/utilities/getExistingAuthToken.js +2 -3
  126. package/dist/utilities/getExistingAuthToken.js.map +1 -1
  127. package/dist/utilities/getHierarchyAncestry.d.ts +24 -0
  128. package/dist/utilities/getHierarchyAncestry.d.ts.map +1 -0
  129. package/dist/utilities/getHierarchyAncestry.js +103 -0
  130. package/dist/utilities/getHierarchyAncestry.js.map +1 -0
  131. package/dist/utilities/getNextRequestI18n.js +13 -12
  132. package/dist/utilities/getNextRequestI18n.js.map +1 -1
  133. package/dist/utilities/getPayloadHMR.js +5 -5
  134. package/dist/utilities/getPayloadHMR.js.map +1 -1
  135. package/dist/utilities/getPreferences.js +22 -27
  136. package/dist/utilities/getPreferences.js.map +1 -1
  137. package/dist/utilities/getRequestLocale.js +14 -13
  138. package/dist/utilities/getRequestLocale.js.map +1 -1
  139. package/dist/utilities/getRequestTheme.js +19 -19
  140. package/dist/utilities/getRequestTheme.js.map +1 -1
  141. package/dist/utilities/getRouteWithoutAdmin.js +5 -3
  142. package/dist/utilities/getRouteWithoutAdmin.js.map +1 -1
  143. package/dist/utilities/handleAuthRedirect.js +36 -22
  144. package/dist/utilities/handleAuthRedirect.js.map +1 -1
  145. package/dist/utilities/handleServerFunctions.js +44 -34
  146. package/dist/utilities/handleServerFunctions.js.map +1 -1
  147. package/dist/utilities/initReq.js +96 -78
  148. package/dist/utilities/initReq.js.map +1 -1
  149. package/dist/utilities/isCustomAdminView.js +26 -22
  150. package/dist/utilities/isCustomAdminView.js.map +1 -1
  151. package/dist/utilities/isPublicAdminRoute.js +20 -26
  152. package/dist/utilities/isPublicAdminRoute.js.map +1 -1
  153. package/dist/utilities/meta.js +63 -68
  154. package/dist/utilities/meta.js.map +1 -1
  155. package/dist/utilities/selectiveCache.js +26 -25
  156. package/dist/utilities/selectiveCache.js.map +1 -1
  157. package/dist/utilities/setPayloadAuthCookie.js +22 -19
  158. package/dist/utilities/setPayloadAuthCookie.js.map +1 -1
  159. package/dist/utilities/slugify.js +33 -24
  160. package/dist/utilities/slugify.js.map +1 -1
  161. package/dist/utilities/timestamp.js +6 -7
  162. package/dist/utilities/timestamp.js.map +1 -1
  163. package/dist/views/API/LocaleSelector/index.js +39 -17
  164. package/dist/views/API/LocaleSelector/index.js.map +1 -1
  165. package/dist/views/API/RenderJSON/index.js +126 -171
  166. package/dist/views/API/RenderJSON/index.js.map +1 -1
  167. package/dist/views/API/index.client.js +199 -291
  168. package/dist/views/API/index.client.js.map +1 -1
  169. package/dist/views/API/index.js +2 -7
  170. package/dist/views/API/index.js.map +1 -1
  171. package/dist/views/API/metadata.js +23 -18
  172. package/dist/views/API/metadata.js.map +1 -1
  173. package/dist/views/Account/ResetPreferences/index.js +102 -78
  174. package/dist/views/Account/ResetPreferences/index.js.map +1 -1
  175. package/dist/views/Account/Settings/LanguageSelector.js +47 -18
  176. package/dist/views/Account/Settings/LanguageSelector.js.map +1 -1
  177. package/dist/views/Account/Settings/index.js +25 -60
  178. package/dist/views/Account/Settings/index.js.map +1 -1
  179. package/dist/views/Account/ToggleTheme/index.js +55 -38
  180. package/dist/views/Account/ToggleTheme/index.js.map +1 -1
  181. package/dist/views/Account/index.client.js +32 -16
  182. package/dist/views/Account/index.client.js.map +1 -1
  183. package/dist/views/Account/index.js +162 -149
  184. package/dist/views/Account/index.js.map +1 -1
  185. package/dist/views/Account/metadata.js +12 -8
  186. package/dist/views/Account/metadata.js.map +1 -1
  187. package/dist/views/CollectionTrash/index.js +17 -17
  188. package/dist/views/CollectionTrash/index.js.map +1 -1
  189. package/dist/views/CollectionTrash/metadata.js +21 -18
  190. package/dist/views/CollectionTrash/metadata.js.map +1 -1
  191. package/dist/views/CreateFirstUser/index.client.js +103 -117
  192. package/dist/views/CreateFirstUser/index.client.js.map +1 -1
  193. package/dist/views/CreateFirstUser/index.js +81 -87
  194. package/dist/views/CreateFirstUser/index.js.map +1 -1
  195. package/dist/views/CreateFirstUser/metadata.js +12 -8
  196. package/dist/views/CreateFirstUser/metadata.js.map +1 -1
  197. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +170 -145
  198. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
  199. package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js +118 -144
  200. package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js.map +1 -1
  201. package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js +72 -59
  202. package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js.map +1 -1
  203. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js +414 -435
  204. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js.map +1 -1
  205. package/dist/views/Dashboard/Default/ModularDashboard/index.js +63 -54
  206. package/dist/views/Dashboard/Default/ModularDashboard/index.js.map +1 -1
  207. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +96 -65
  208. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
  209. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js +54 -44
  210. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js.map +1 -1
  211. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +72 -65
  212. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  213. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js +175 -193
  214. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js.map +1 -1
  215. package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js +30 -31
  216. package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js.map +1 -1
  217. package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromConfig.js +17 -18
  218. package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromConfig.js.map +1 -1
  219. package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromPreferences.js +5 -6
  220. package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromPreferences.js.map +1 -1
  221. package/dist/views/Dashboard/Default/ModularDashboard/utils/localeUtils.js +74 -69
  222. package/dist/views/Dashboard/Default/ModularDashboard/utils/localeUtils.js.map +1 -1
  223. package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js +234 -228
  224. package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js.map +1 -1
  225. package/dist/views/Dashboard/Default/index.js +45 -59
  226. package/dist/views/Dashboard/Default/index.js.map +1 -1
  227. package/dist/views/Dashboard/index.js +42 -46
  228. package/dist/views/Dashboard/index.js.map +1 -1
  229. package/dist/views/Dashboard/metadata.js +14 -10
  230. package/dist/views/Dashboard/metadata.js.map +1 -1
  231. package/dist/views/Document/getCustomDocumentViewByKey.js +2 -3
  232. package/dist/views/Document/getCustomDocumentViewByKey.js.map +1 -1
  233. package/dist/views/Document/getCustomViewByRoute.js +30 -27
  234. package/dist/views/Document/getCustomViewByRoute.js.map +1 -1
  235. package/dist/views/Document/getDocPreferences.js +41 -40
  236. package/dist/views/Document/getDocPreferences.js.map +1 -1
  237. package/dist/views/Document/getDocumentData.js +55 -44
  238. package/dist/views/Document/getDocumentData.js.map +1 -1
  239. package/dist/views/Document/getDocumentPermissions.js +117 -114
  240. package/dist/views/Document/getDocumentPermissions.js.map +1 -1
  241. package/dist/views/Document/getDocumentView.js +283 -313
  242. package/dist/views/Document/getDocumentView.js.map +1 -1
  243. package/dist/views/Document/getIsLocked.js +73 -73
  244. package/dist/views/Document/getIsLocked.js.map +1 -1
  245. package/dist/views/Document/getMetaBySegment.js +136 -130
  246. package/dist/views/Document/getMetaBySegment.js.map +1 -1
  247. package/dist/views/Document/getVersions.js +213 -220
  248. package/dist/views/Document/getVersions.js.map +1 -1
  249. package/dist/views/Document/handleServerFunction.js +127 -100
  250. package/dist/views/Document/handleServerFunction.js.map +1 -1
  251. package/dist/views/Document/index.js +359 -319
  252. package/dist/views/Document/index.js.map +1 -1
  253. package/dist/views/Document/metadata.js +1 -2
  254. package/dist/views/Document/metadata.js.map +1 -1
  255. package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
  256. package/dist/views/Document/renderDocumentSlots.js +163 -141
  257. package/dist/views/Document/renderDocumentSlots.js.map +1 -1
  258. package/dist/views/Edit/index.js +6 -10
  259. package/dist/views/Edit/index.js.map +1 -1
  260. package/dist/views/Edit/metadata.js +46 -36
  261. package/dist/views/Edit/metadata.js.map +1 -1
  262. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js +164 -130
  263. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js.map +1 -1
  264. package/dist/views/ForgotPassword/index.js +62 -79
  265. package/dist/views/ForgotPassword/index.js.map +1 -1
  266. package/dist/views/ForgotPassword/metadata.js +12 -8
  267. package/dist/views/ForgotPassword/metadata.js.map +1 -1
  268. package/dist/views/List/createSerializableValue.js +11 -12
  269. package/dist/views/List/createSerializableValue.js.map +1 -1
  270. package/dist/views/List/enrichDocsWithVersionStatus.js +86 -86
  271. package/dist/views/List/enrichDocsWithVersionStatus.js.map +1 -1
  272. package/dist/views/List/extractRelationshipDisplayValue.js +14 -15
  273. package/dist/views/List/extractRelationshipDisplayValue.js.map +1 -1
  274. package/dist/views/List/extractValueOrRelationshipID.js +15 -16
  275. package/dist/views/List/extractValueOrRelationshipID.js.map +1 -1
  276. package/dist/views/List/handleGroupBy.js +150 -133
  277. package/dist/views/List/handleGroupBy.js.map +1 -1
  278. package/dist/views/List/handleHierarchy.d.ts +17 -0
  279. package/dist/views/List/handleHierarchy.d.ts.map +1 -0
  280. package/dist/views/List/handleHierarchy.js +243 -0
  281. package/dist/views/List/handleHierarchy.js.map +1 -0
  282. package/dist/views/List/handleServerFunction.js +122 -96
  283. package/dist/views/List/handleServerFunction.js.map +1 -1
  284. package/dist/views/List/index.d.ts.map +1 -1
  285. package/dist/views/List/index.js +382 -310
  286. package/dist/views/List/index.js.map +1 -1
  287. package/dist/views/List/metadata.js +20 -17
  288. package/dist/views/List/metadata.js.map +1 -1
  289. package/dist/views/List/renderListViewSlots.js +75 -82
  290. package/dist/views/List/renderListViewSlots.js.map +1 -1
  291. package/dist/views/List/resolveAllFilterOptions.js +45 -43
  292. package/dist/views/List/resolveAllFilterOptions.js.map +1 -1
  293. package/dist/views/List/transformColumnsToSelect.js +8 -9
  294. package/dist/views/List/transformColumnsToSelect.js.map +1 -1
  295. package/dist/views/Login/LoginField/index.js +89 -57
  296. package/dist/views/Login/LoginField/index.js.map +1 -1
  297. package/dist/views/Login/LoginForm/index.js +160 -107
  298. package/dist/views/Login/LoginForm/index.js.map +1 -1
  299. package/dist/views/Login/index.js +85 -82
  300. package/dist/views/Login/index.js.map +1 -1
  301. package/dist/views/Login/metadata.js +12 -8
  302. package/dist/views/Login/metadata.js.map +1 -1
  303. package/dist/views/Logout/LogoutClient.js +120 -84
  304. package/dist/views/Logout/LogoutClient.js.map +1 -1
  305. package/dist/views/Logout/index.js +29 -29
  306. package/dist/views/Logout/index.js.map +1 -1
  307. package/dist/views/Logout/metadata.js +11 -7
  308. package/dist/views/Logout/metadata.js.map +1 -1
  309. package/dist/views/NotFound/index.client.js +82 -71
  310. package/dist/views/NotFound/index.client.js.map +1 -1
  311. package/dist/views/NotFound/index.js +73 -72
  312. package/dist/views/NotFound/index.js.map +1 -1
  313. package/dist/views/NotFound/metadata.js +9 -7
  314. package/dist/views/NotFound/metadata.js.map +1 -1
  315. package/dist/views/ResetPassword/ResetPasswordForm/index.js +108 -97
  316. package/dist/views/ResetPassword/ResetPasswordForm/index.js.map +1 -1
  317. package/dist/views/ResetPassword/index.js +73 -93
  318. package/dist/views/ResetPassword/index.js.map +1 -1
  319. package/dist/views/ResetPassword/metadata.js +12 -8
  320. package/dist/views/ResetPassword/metadata.js.map +1 -1
  321. package/dist/views/Root/attachViewActions.js +23 -18
  322. package/dist/views/Root/attachViewActions.js.map +1 -1
  323. package/dist/views/Root/generateCustomViewMetadata.js +21 -19
  324. package/dist/views/Root/generateCustomViewMetadata.js.map +1 -1
  325. package/dist/views/Root/getCustomViewByKey.js +14 -12
  326. package/dist/views/Root/getCustomViewByKey.js.map +1 -1
  327. package/dist/views/Root/getCustomViewByRoute.js +42 -31
  328. package/dist/views/Root/getCustomViewByRoute.js.map +1 -1
  329. package/dist/views/Root/getDocumentViewInfo.js +23 -24
  330. package/dist/views/Root/getDocumentViewInfo.js.map +1 -1
  331. package/dist/views/Root/getRouteData.d.ts +1 -4
  332. package/dist/views/Root/getRouteData.d.ts.map +1 -1
  333. package/dist/views/Root/getRouteData.js +264 -336
  334. package/dist/views/Root/getRouteData.js.map +1 -1
  335. package/dist/views/Root/index.d.ts.map +1 -1
  336. package/dist/views/Root/index.js +265 -249
  337. package/dist/views/Root/index.js.map +1 -1
  338. package/dist/views/Root/isPathMatchingRoute.js +26 -21
  339. package/dist/views/Root/isPathMatchingRoute.js.map +1 -1
  340. package/dist/views/Root/metadata.d.ts.map +1 -1
  341. package/dist/views/Root/metadata.js +148 -179
  342. package/dist/views/Root/metadata.js.map +1 -1
  343. package/dist/views/Unauthorized/index.js +46 -54
  344. package/dist/views/Unauthorized/index.js.map +1 -1
  345. package/dist/views/Unauthorized/metadata.js +12 -8
  346. package/dist/views/Unauthorized/metadata.js.map +1 -1
  347. package/dist/views/Verify/index.client.js +43 -25
  348. package/dist/views/Verify/index.client.js.map +1 -1
  349. package/dist/views/Verify/index.js +64 -69
  350. package/dist/views/Verify/index.js.map +1 -1
  351. package/dist/views/Verify/metadata.js +12 -8
  352. package/dist/views/Verify/metadata.js.map +1 -1
  353. package/dist/views/Version/Default/SelectedLocalesContext.js +4 -4
  354. package/dist/views/Version/Default/SelectedLocalesContext.js.map +1 -1
  355. package/dist/views/Version/Default/SetStepNav.js +127 -86
  356. package/dist/views/Version/Default/SetStepNav.js.map +1 -1
  357. package/dist/views/Version/Default/index.js +236 -380
  358. package/dist/views/Version/Default/index.js.map +1 -1
  359. package/dist/views/Version/Default/types.js +1 -2
  360. package/dist/views/Version/Default/types.js.map +1 -1
  361. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js +119 -102
  362. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js.map +1 -1
  363. package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js +73 -78
  364. package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js.map +1 -1
  365. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +408 -363
  366. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
  367. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js +51 -40
  368. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js.map +1 -1
  369. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js +70 -38
  370. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js.map +1 -1
  371. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js +56 -59
  372. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js.map +1 -1
  373. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +117 -139
  374. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js.map +1 -1
  375. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js +61 -56
  376. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js.map +1 -1
  377. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +206 -224
  378. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
  379. package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js +11 -17
  380. package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js.map +1 -1
  381. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js +74 -49
  382. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js.map +1 -1
  383. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +146 -135
  384. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js.map +1 -1
  385. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js +82 -57
  386. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js.map +1 -1
  387. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js +211 -252
  388. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js.map +1 -1
  389. package/dist/views/Version/RenderFieldsToDiff/fields/index.js +22 -23
  390. package/dist/views/Version/RenderFieldsToDiff/fields/index.js.map +1 -1
  391. package/dist/views/Version/RenderFieldsToDiff/index.js +9 -12
  392. package/dist/views/Version/RenderFieldsToDiff/index.js.map +1 -1
  393. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js +228 -213
  394. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js.map +1 -1
  395. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js +826 -1005
  396. package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js.map +1 -1
  397. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js +1 -2
  398. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js.map +1 -1
  399. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js +43 -44
  400. package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js.map +1 -1
  401. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js +36 -32
  402. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js.map +1 -1
  403. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js +129 -145
  404. package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js.map +1 -1
  405. package/dist/views/Version/Restore/index.js +92 -117
  406. package/dist/views/Version/Restore/index.js.map +1 -1
  407. package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js +50 -33
  408. package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js.map +1 -1
  409. package/dist/views/Version/SelectComparison/VersionDrawer/index.js +226 -170
  410. package/dist/views/Version/SelectComparison/VersionDrawer/index.js.map +1 -1
  411. package/dist/views/Version/SelectComparison/index.js +50 -73
  412. package/dist/views/Version/SelectComparison/index.js.map +1 -1
  413. package/dist/views/Version/SelectComparison/types.js +1 -2
  414. package/dist/views/Version/SelectComparison/types.js.map +1 -1
  415. package/dist/views/Version/SelectLocales/index.js +32 -34
  416. package/dist/views/Version/SelectLocales/index.js.map +1 -1
  417. package/dist/views/Version/VersionPillLabel/VersionPillLabel.js +100 -106
  418. package/dist/views/Version/VersionPillLabel/VersionPillLabel.js.map +1 -1
  419. package/dist/views/Version/VersionPillLabel/getVersionLabel.js +35 -30
  420. package/dist/views/Version/VersionPillLabel/getVersionLabel.js.map +1 -1
  421. package/dist/views/Version/fetchVersions.js +138 -113
  422. package/dist/views/Version/fetchVersions.js.map +1 -1
  423. package/dist/views/Version/index.js +326 -328
  424. package/dist/views/Version/index.js.map +1 -1
  425. package/dist/views/Version/metadata.js +50 -43
  426. package/dist/views/Version/metadata.js.map +1 -1
  427. package/dist/views/Versions/buildColumns.js +79 -95
  428. package/dist/views/Versions/buildColumns.js.map +1 -1
  429. package/dist/views/Versions/cells/AutosaveCell/index.js +38 -34
  430. package/dist/views/Versions/cells/AutosaveCell/index.js.map +1 -1
  431. package/dist/views/Versions/cells/CreatedAt/index.js +53 -32
  432. package/dist/views/Versions/cells/CreatedAt/index.js.map +1 -1
  433. package/dist/views/Versions/cells/ID/index.js +8 -10
  434. package/dist/views/Versions/cells/ID/index.js.map +1 -1
  435. package/dist/views/Versions/index.client.js +83 -106
  436. package/dist/views/Versions/index.client.js.map +1 -1
  437. package/dist/views/Versions/index.js +164 -164
  438. package/dist/views/Versions/index.js.map +1 -1
  439. package/dist/views/Versions/metadata.js +44 -37
  440. package/dist/views/Versions/metadata.js.map +1 -1
  441. package/dist/views/Versions/types.js +1 -2
  442. package/dist/views/Versions/types.js.map +1 -1
  443. package/dist/withPayload/withPayload.js +177 -236
  444. package/dist/withPayload/withPayload.js.map +1 -1
  445. package/dist/withPayload/withPayload.spec.js +35 -36
  446. package/dist/withPayload/withPayload.spec.js.map +1 -1
  447. package/dist/withPayload/withPayload.utils.js +73 -65
  448. package/dist/withPayload/withPayload.utils.js.map +1 -1
  449. package/dist/withPayload/withPayloadLegacy.js +40 -41
  450. package/dist/withPayload/withPayloadLegacy.js.map +1 -1
  451. package/package.json +6 -6
  452. package/dist/elements/DocumentHeader/Tabs/Tab/index.scss +0 -38
  453. package/dist/elements/DocumentHeader/Tabs/index.scss +0 -54
  454. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.scss +0 -10
  455. package/dist/elements/DocumentHeader/index.scss +0 -64
  456. package/dist/elements/FormHeader/index.scss +0 -8
  457. package/dist/elements/Nav/NavWrapper/index.scss +0 -27
  458. package/dist/elements/Nav/SettingsMenuButton/index.scss +0 -11
  459. package/dist/elements/Nav/index.scss +0 -173
  460. package/dist/esbuildEntry.d.ts +0 -5
  461. package/dist/esbuildEntry.d.ts.map +0 -1
  462. package/dist/esbuildEntry.js +0 -6
  463. package/dist/esbuildEntry.js.map +0 -1
  464. package/dist/templates/Default/Wrapper/index.scss +0 -58
  465. package/dist/templates/Default/index.scss +0 -79
  466. package/dist/templates/Minimal/index.scss +0 -30
  467. package/dist/views/API/RenderJSON/index.scss +0 -129
  468. package/dist/views/API/index.scss +0 -119
  469. package/dist/views/Account/Settings/index.scss +0 -48
  470. package/dist/views/BrowseByFolder/buildView.d.ts +0 -13
  471. package/dist/views/BrowseByFolder/buildView.d.ts.map +0 -1
  472. package/dist/views/BrowseByFolder/buildView.js +0 -151
  473. package/dist/views/BrowseByFolder/buildView.js.map +0 -1
  474. package/dist/views/BrowseByFolder/index.d.ts +0 -4
  475. package/dist/views/BrowseByFolder/index.d.ts.map +0 -1
  476. package/dist/views/BrowseByFolder/index.js +0 -20
  477. package/dist/views/BrowseByFolder/index.js.map +0 -1
  478. package/dist/views/BrowseByFolder/metadata.d.ts +0 -4
  479. package/dist/views/BrowseByFolder/metadata.d.ts.map +0 -1
  480. package/dist/views/BrowseByFolder/metadata.js +0 -16
  481. package/dist/views/BrowseByFolder/metadata.js.map +0 -1
  482. package/dist/views/CollectionFolders/buildView.d.ts +0 -15
  483. package/dist/views/CollectionFolders/buildView.d.ts.map +0 -1
  484. package/dist/views/CollectionFolders/buildView.js +0 -136
  485. package/dist/views/CollectionFolders/buildView.js.map +0 -1
  486. package/dist/views/CollectionFolders/index.d.ts +0 -4
  487. package/dist/views/CollectionFolders/index.d.ts.map +0 -1
  488. package/dist/views/CollectionFolders/index.js +0 -20
  489. package/dist/views/CollectionFolders/index.js.map +0 -1
  490. package/dist/views/CollectionFolders/metadata.d.ts +0 -7
  491. package/dist/views/CollectionFolders/metadata.d.ts.map +0 -1
  492. package/dist/views/CollectionFolders/metadata.js +0 -22
  493. package/dist/views/CollectionFolders/metadata.js.map +0 -1
  494. package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts +0 -11
  495. package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts.map +0 -1
  496. package/dist/views/CollectionFolders/renderFolderViewSlots.js +0 -61
  497. package/dist/views/CollectionFolders/renderFolderViewSlots.js.map +0 -1
  498. package/dist/views/CreateFirstUser/index.scss +0 -21
  499. package/dist/views/Dashboard/Default/ModularDashboard/index.scss +0 -318
  500. package/dist/views/Login/LoginForm/index.scss +0 -10
  501. package/dist/views/Login/index.scss +0 -10
  502. package/dist/views/Logout/index.scss +0 -25
  503. package/dist/views/NotFound/index.scss +0 -57
  504. package/dist/views/ResetPassword/index.scss +0 -11
  505. package/dist/views/Unauthorized/index.scss +0 -14
  506. package/dist/views/Verify/index.scss +0 -16
  507. package/dist/views/Version/Default/index.scss +0 -170
  508. package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.scss +0 -81
  509. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.scss +0 -12
  510. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.scss +0 -9
  511. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.scss +0 -59
  512. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.scss +0 -91
  513. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.scss +0 -4
  514. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.scss +0 -9
  515. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.scss +0 -4
  516. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.scss +0 -121
  517. package/dist/views/Version/RenderFieldsToDiff/index.scss +0 -24
  518. package/dist/views/Version/Restore/index.scss +0 -84
  519. package/dist/views/Version/SelectComparison/VersionDrawer/index.scss +0 -18
  520. package/dist/views/Version/SelectComparison/index.scss +0 -9
  521. package/dist/views/Version/VersionPillLabel/index.scss +0 -26
  522. package/dist/views/Versions/cells/AutosaveCell/index.scss +0 -9
  523. package/dist/views/Versions/index.scss +0 -110
@@ -4,140 +4,157 @@ import { flattenAllFields } from 'payload';
4
4
  import { createSerializableValue } from './createSerializableValue.js';
5
5
  import { extractRelationshipDisplayValue } from './extractRelationshipDisplayValue.js';
6
6
  import { extractValueOrRelationshipID } from './extractValueOrRelationshipID.js';
7
- export const handleGroupBy = async ({ clientCollectionConfig, clientConfig, collectionConfig, collectionSlug, columns, customCellProps, drawerSlug, enableRowSelections, fieldPermissions, query, req, select, trash = false, user, viewType, where: whereWithMergedSearch })=>{
8
- let Table = null;
9
- let columnState;
10
- const dataByGroup = {};
11
- // NOTE: is there a faster/better way to do this?
12
- const flattenedFields = flattenAllFields({
13
- fields: collectionConfig.fields
7
+ export const handleGroupBy = async ({
8
+ clientCollectionConfig,
9
+ clientConfig,
10
+ collectionConfig,
11
+ collectionSlug,
12
+ columns,
13
+ customCellProps,
14
+ drawerSlug,
15
+ enableRowSelections,
16
+ fieldPermissions,
17
+ query,
18
+ req,
19
+ select,
20
+ trash = false,
21
+ user,
22
+ viewType,
23
+ where: whereWithMergedSearch
24
+ }) => {
25
+ let Table = null;
26
+ let columnState;
27
+ const dataByGroup = {};
28
+ // NOTE: is there a faster/better way to do this?
29
+ const flattenedFields = flattenAllFields({
30
+ fields: collectionConfig.fields
31
+ });
32
+ const groupByFieldPath = query.groupBy.replace(/^-/, '');
33
+ const groupByField = flattenedFields.find(f => f.name === groupByFieldPath);
34
+ // Set up population for relationships
35
+ let populate;
36
+ if (groupByField?.type === 'relationship' && groupByField.relationTo) {
37
+ const relationTo = Array.isArray(groupByField.relationTo) ? groupByField.relationTo : [groupByField.relationTo];
38
+ populate = {};
39
+ relationTo.forEach(rel => {
40
+ const config = clientConfig.collections.find(c => c.slug === rel);
41
+ populate[rel] = {
42
+ [config?.admin?.useAsTitle || 'id']: true
43
+ };
14
44
  });
15
- const groupByFieldPath = query.groupBy.replace(/^-/, '');
16
- const groupByField = flattenedFields.find((f)=>f.name === groupByFieldPath);
17
- // Set up population for relationships
18
- let populate;
19
- if (groupByField?.type === 'relationship' && groupByField.relationTo) {
20
- const relationTo = Array.isArray(groupByField.relationTo) ? groupByField.relationTo : [
21
- groupByField.relationTo
22
- ];
23
- populate = {};
24
- relationTo.forEach((rel)=>{
25
- const config = clientConfig.collections.find((c)=>c.slug === rel);
26
- populate[rel] = {
27
- [config?.admin?.useAsTitle || 'id']: true
28
- };
29
- });
30
- }
31
- const distinct = await req.payload.findDistinct({
32
- collection: collectionSlug,
33
- depth: 1,
34
- field: groupByFieldPath,
35
- limit: query?.limit ? Number(query.limit) : undefined,
36
- locale: req.locale,
37
- overrideAccess: false,
38
- page: query?.page ? Number(query.page) : undefined,
39
- populate,
40
- req,
41
- sort: query?.groupBy,
42
- trash,
43
- where: whereWithMergedSearch
44
- });
45
- const data = {
46
- ...distinct,
47
- docs: distinct.values?.map(()=>({})) || [],
48
- values: undefined
49
- };
50
- await Promise.all((distinct.values || []).map(async (distinctValue, i)=>{
51
- const potentiallyPopulatedRelationship = distinctValue[groupByFieldPath];
52
- // Extract value or relationship ID for database query
53
- const valueOrRelationshipID = extractValueOrRelationshipID(potentiallyPopulatedRelationship);
54
- const groupData = await req.payload.find({
55
- collection: collectionSlug,
56
- depth: 0,
57
- draft: true,
58
- fallbackLocale: false,
59
- includeLockStatus: true,
60
- limit: query?.queryByGroup?.[valueOrRelationshipID]?.limit ? Number(query.queryByGroup[valueOrRelationshipID].limit) : undefined,
61
- locale: req.locale,
62
- overrideAccess: false,
63
- page: query?.queryByGroup?.[valueOrRelationshipID]?.page ? Number(query.queryByGroup[valueOrRelationshipID].page) : undefined,
64
- req,
65
- // Note: if we wanted to enable table-by-table sorting, we could use this:
66
- // sort: query?.queryByGroup?.[valueOrRelationshipID]?.sort,
67
- select,
68
- sort: query?.sort,
69
- trash,
70
- user,
71
- where: {
72
- ...whereWithMergedSearch || {},
73
- [groupByFieldPath]: {
74
- equals: valueOrRelationshipID
75
- }
76
- }
77
- });
78
- // Extract heading
79
- let heading;
80
- if (potentiallyPopulatedRelationship === null) {
81
- heading = req.i18n.t('general:noValue');
82
- } else if (groupByField?.type === 'relationship') {
83
- const relationshipConfig = Array.isArray(groupByField.relationTo) ? undefined : clientConfig.collections.find((c)=>c.slug === groupByField.relationTo);
84
- heading = extractRelationshipDisplayValue(potentiallyPopulatedRelationship, clientConfig, relationshipConfig);
85
- } else if (groupByField?.type === 'date') {
86
- heading = formatDate({
87
- date: String(valueOrRelationshipID),
88
- i18n: req.i18n,
89
- pattern: clientConfig.admin.dateFormat
90
- });
91
- } else if (groupByField?.type === 'checkbox') {
92
- if (valueOrRelationshipID === true) {
93
- heading = req.i18n.t('general:true');
94
- }
95
- if (valueOrRelationshipID === false) {
96
- heading = req.i18n.t('general:false');
97
- }
98
- } else {
99
- heading = String(valueOrRelationshipID);
100
- }
101
- // Create serializable value for client
102
- const serializableValue = createSerializableValue(valueOrRelationshipID);
103
- if (groupData.docs && groupData.docs.length > 0) {
104
- const { columnState: newColumnState, Table: NewTable } = renderTable({
105
- clientCollectionConfig,
106
- collectionConfig,
107
- columns,
108
- customCellProps,
109
- data: groupData,
110
- drawerSlug,
111
- enableRowSelections,
112
- fieldPermissions,
113
- groupByFieldPath,
114
- groupByValue: serializableValue,
115
- heading: heading || req.i18n.t('general:noValue'),
116
- i18n: req.i18n,
117
- key: `table-${serializableValue}`,
118
- orderableFieldName: collectionConfig.orderable === true ? '_order' : undefined,
119
- payload: req.payload,
120
- query,
121
- useAsTitle: collectionConfig.admin.useAsTitle,
122
- viewType
123
- });
124
- // Only need to set `columnState` once, using the first table's column state
125
- // This will avoid needing to generate column state explicitly for root context that wraps all tables
126
- if (!columnState) {
127
- columnState = newColumnState;
128
- }
129
- if (!Table) {
130
- Table = [];
131
- }
132
- dataByGroup[serializableValue] = groupData;
133
- Table[i] = NewTable;
45
+ }
46
+ const distinct = await req.payload.findDistinct({
47
+ collection: collectionSlug,
48
+ depth: 1,
49
+ field: groupByFieldPath,
50
+ limit: query?.limit ? Number(query.limit) : undefined,
51
+ locale: req.locale,
52
+ overrideAccess: false,
53
+ page: query?.page ? Number(query.page) : undefined,
54
+ populate,
55
+ req,
56
+ sort: query?.groupBy,
57
+ trash,
58
+ where: whereWithMergedSearch
59
+ });
60
+ const data = {
61
+ ...distinct,
62
+ docs: distinct.values?.map(() => ({})) || [],
63
+ values: undefined
64
+ };
65
+ await Promise.all((distinct.values || []).map(async (distinctValue, i) => {
66
+ const potentiallyPopulatedRelationship = distinctValue[groupByFieldPath];
67
+ // Extract value or relationship ID for database query
68
+ const valueOrRelationshipID = extractValueOrRelationshipID(potentiallyPopulatedRelationship);
69
+ const groupData = await req.payload.find({
70
+ collection: collectionSlug,
71
+ depth: 0,
72
+ draft: true,
73
+ fallbackLocale: false,
74
+ includeLockStatus: true,
75
+ limit: query?.queryByGroup?.[valueOrRelationshipID]?.limit ? Number(query.queryByGroup[valueOrRelationshipID].limit) : undefined,
76
+ locale: req.locale,
77
+ overrideAccess: false,
78
+ page: query?.queryByGroup?.[valueOrRelationshipID]?.page ? Number(query.queryByGroup[valueOrRelationshipID].page) : undefined,
79
+ req,
80
+ // Note: if we wanted to enable table-by-table sorting, we could use this:
81
+ // sort: query?.queryByGroup?.[valueOrRelationshipID]?.sort,
82
+ select,
83
+ sort: query?.sort,
84
+ trash,
85
+ user,
86
+ where: {
87
+ ...(whereWithMergedSearch || {}),
88
+ [groupByFieldPath]: {
89
+ equals: valueOrRelationshipID
134
90
  }
135
- }));
136
- return {
137
- columnState,
138
- data,
139
- Table
140
- };
91
+ }
92
+ });
93
+ // Extract heading
94
+ let heading;
95
+ if (potentiallyPopulatedRelationship === null) {
96
+ heading = req.i18n.t('general:noValue');
97
+ } else if (groupByField?.type === 'relationship') {
98
+ const relationshipConfig = Array.isArray(groupByField.relationTo) ? undefined : clientConfig.collections.find(c => c.slug === groupByField.relationTo);
99
+ heading = extractRelationshipDisplayValue(potentiallyPopulatedRelationship, clientConfig, relationshipConfig);
100
+ } else if (groupByField?.type === 'date') {
101
+ heading = formatDate({
102
+ date: String(valueOrRelationshipID),
103
+ i18n: req.i18n,
104
+ pattern: clientConfig.admin.dateFormat
105
+ });
106
+ } else if (groupByField?.type === 'checkbox') {
107
+ if (valueOrRelationshipID === true) {
108
+ heading = req.i18n.t('general:true');
109
+ }
110
+ if (valueOrRelationshipID === false) {
111
+ heading = req.i18n.t('general:false');
112
+ }
113
+ } else {
114
+ heading = String(valueOrRelationshipID);
115
+ }
116
+ // Create serializable value for client
117
+ const serializableValue = createSerializableValue(valueOrRelationshipID);
118
+ if (groupData.docs && groupData.docs.length > 0) {
119
+ const {
120
+ columnState: newColumnState,
121
+ Table: NewTable
122
+ } = renderTable({
123
+ clientCollectionConfig,
124
+ collectionConfig,
125
+ columns,
126
+ customCellProps,
127
+ data: groupData,
128
+ drawerSlug,
129
+ enableRowSelections,
130
+ fieldPermissions,
131
+ groupByFieldPath,
132
+ groupByValue: serializableValue,
133
+ heading: heading || req.i18n.t('general:noValue'),
134
+ i18n: req.i18n,
135
+ key: `table-${serializableValue}`,
136
+ orderableFieldName: collectionConfig.orderable === true ? '_order' : undefined,
137
+ payload: req.payload,
138
+ query,
139
+ useAsTitle: collectionConfig.admin.useAsTitle,
140
+ viewType
141
+ });
142
+ // Only need to set `columnState` once, using the first table's column state
143
+ // This will avoid needing to generate column state explicitly for root context that wraps all tables
144
+ if (!columnState) {
145
+ columnState = newColumnState;
146
+ }
147
+ if (!Table) {
148
+ Table = [];
149
+ }
150
+ dataByGroup[serializableValue] = groupData;
151
+ Table[i] = NewTable;
152
+ }
153
+ }));
154
+ return {
155
+ columnState,
156
+ data,
157
+ Table
158
+ };
141
159
  };
142
-
143
160
  //# sourceMappingURL=handleGroupBy.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/views/List/handleGroupBy.ts"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientConfig,\n Column,\n ListQuery,\n PaginatedDocs,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedFieldsPermissions,\n SelectType,\n ViewTypes,\n Where,\n} from 'payload'\n\nimport { renderTable } from '@payloadcms/ui/rsc'\nimport { formatDate } from '@payloadcms/ui/shared'\nimport { flattenAllFields } from 'payload'\n\nimport { createSerializableValue } from './createSerializableValue.js'\nimport { extractRelationshipDisplayValue } from './extractRelationshipDisplayValue.js'\nimport { extractValueOrRelationshipID } from './extractValueOrRelationshipID.js'\n\nexport const handleGroupBy = async ({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collectionSlug,\n columns,\n customCellProps,\n drawerSlug,\n enableRowSelections,\n fieldPermissions,\n query,\n req,\n select,\n trash = false,\n user,\n viewType,\n where: whereWithMergedSearch,\n}: {\n clientCollectionConfig: ClientCollectionConfig\n clientConfig: ClientConfig\n collectionConfig: SanitizedCollectionConfig\n collectionSlug: string\n columns: any[]\n customCellProps?: Record<string, any>\n drawerSlug?: string\n enableRowSelections?: boolean\n fieldPermissions?: SanitizedFieldsPermissions\n query?: ListQuery\n req: PayloadRequest\n select?: SelectType\n trash?: boolean\n user: any\n viewType?: ViewTypes\n where: Where\n}): Promise<{\n columnState: Column[]\n data: PaginatedDocs\n Table: null | React.ReactNode | React.ReactNode[]\n}> => {\n let Table: React.ReactNode | React.ReactNode[] = null\n let columnState: Column[]\n\n const dataByGroup: Record<string, PaginatedDocs> = {}\n\n // NOTE: is there a faster/better way to do this?\n const flattenedFields = flattenAllFields({ fields: collectionConfig.fields })\n\n const groupByFieldPath = query.groupBy.replace(/^-/, '')\n\n const groupByField = flattenedFields.find((f) => f.name === groupByFieldPath)\n\n // Set up population for relationships\n let populate\n\n if (groupByField?.type === 'relationship' && groupByField.relationTo) {\n const relationTo = Array.isArray(groupByField.relationTo)\n ? groupByField.relationTo\n : [groupByField.relationTo]\n\n populate = {}\n relationTo.forEach((rel) => {\n const config = clientConfig.collections.find((c) => c.slug === rel)\n populate[rel] = { [config?.admin?.useAsTitle || 'id']: true }\n })\n }\n\n const distinct = await req.payload.findDistinct({\n collection: collectionSlug,\n depth: 1,\n field: groupByFieldPath,\n limit: query?.limit ? Number(query.limit) : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.page ? Number(query.page) : undefined,\n populate,\n req,\n sort: query?.groupBy,\n trash,\n where: whereWithMergedSearch,\n })\n\n const data = {\n ...distinct,\n docs: distinct.values?.map(() => ({})) || [],\n values: undefined,\n }\n\n await Promise.all(\n (distinct.values || []).map(async (distinctValue, i) => {\n const potentiallyPopulatedRelationship = distinctValue[groupByFieldPath]\n\n // Extract value or relationship ID for database query\n const valueOrRelationshipID = extractValueOrRelationshipID(potentiallyPopulatedRelationship)\n\n const groupData = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit: query?.queryByGroup?.[valueOrRelationshipID]?.limit\n ? Number(query.queryByGroup[valueOrRelationshipID].limit)\n : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.queryByGroup?.[valueOrRelationshipID]?.page\n ? Number(query.queryByGroup[valueOrRelationshipID].page)\n : undefined,\n req,\n // Note: if we wanted to enable table-by-table sorting, we could use this:\n // sort: query?.queryByGroup?.[valueOrRelationshipID]?.sort,\n select,\n sort: query?.sort,\n trash,\n user,\n where: {\n ...(whereWithMergedSearch || {}),\n [groupByFieldPath]: {\n equals: valueOrRelationshipID,\n },\n },\n })\n\n // Extract heading\n let heading: string\n\n if (potentiallyPopulatedRelationship === null) {\n heading = req.i18n.t('general:noValue')\n } else if (groupByField?.type === 'relationship') {\n const relationshipConfig = Array.isArray(groupByField.relationTo)\n ? undefined\n : clientConfig.collections.find((c) => c.slug === groupByField.relationTo)\n heading = extractRelationshipDisplayValue(\n potentiallyPopulatedRelationship,\n clientConfig,\n relationshipConfig,\n )\n } else if (groupByField?.type === 'date') {\n heading = formatDate({\n date: String(valueOrRelationshipID),\n i18n: req.i18n,\n pattern: clientConfig.admin.dateFormat,\n })\n } else if (groupByField?.type === 'checkbox') {\n if (valueOrRelationshipID === true) {\n heading = req.i18n.t('general:true')\n }\n if (valueOrRelationshipID === false) {\n heading = req.i18n.t('general:false')\n }\n } else {\n heading = String(valueOrRelationshipID)\n }\n\n // Create serializable value for client\n const serializableValue = createSerializableValue(valueOrRelationshipID)\n\n if (groupData.docs && groupData.docs.length > 0) {\n const { columnState: newColumnState, Table: NewTable } = renderTable({\n clientCollectionConfig,\n collectionConfig,\n columns,\n customCellProps,\n data: groupData,\n drawerSlug,\n enableRowSelections,\n fieldPermissions,\n groupByFieldPath,\n groupByValue: serializableValue,\n heading: heading || req.i18n.t('general:noValue'),\n i18n: req.i18n,\n key: `table-${serializableValue}`,\n orderableFieldName: collectionConfig.orderable === true ? '_order' : undefined,\n payload: req.payload,\n query,\n useAsTitle: collectionConfig.admin.useAsTitle,\n viewType,\n })\n\n // Only need to set `columnState` once, using the first table's column state\n // This will avoid needing to generate column state explicitly for root context that wraps all tables\n if (!columnState) {\n columnState = newColumnState\n }\n\n if (!Table) {\n Table = []\n }\n\n dataByGroup[serializableValue] = groupData\n ;(Table as Array<React.ReactNode>)[i] = NewTable\n }\n }),\n )\n\n return {\n columnState,\n data,\n Table,\n }\n}\n"],"names":["renderTable","formatDate","flattenAllFields","createSerializableValue","extractRelationshipDisplayValue","extractValueOrRelationshipID","handleGroupBy","clientCollectionConfig","clientConfig","collectionConfig","collectionSlug","columns","customCellProps","drawerSlug","enableRowSelections","fieldPermissions","query","req","select","trash","user","viewType","where","whereWithMergedSearch","Table","columnState","dataByGroup","flattenedFields","fields","groupByFieldPath","groupBy","replace","groupByField","find","f","name","populate","type","relationTo","Array","isArray","forEach","rel","config","collections","c","slug","admin","useAsTitle","distinct","payload","findDistinct","collection","depth","field","limit","Number","undefined","locale","overrideAccess","page","sort","data","docs","values","map","Promise","all","distinctValue","i","potentiallyPopulatedRelationship","valueOrRelationshipID","groupData","draft","fallbackLocale","includeLockStatus","queryByGroup","equals","heading","i18n","t","relationshipConfig","date","String","pattern","dateFormat","serializableValue","length","newColumnState","NewTable","groupByValue","key","orderableFieldName","orderable"],"mappings":"AAcA,SAASA,WAAW,QAAQ,qBAAoB;AAChD,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,gBAAgB,QAAQ,UAAS;AAE1C,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,+BAA+B,QAAQ,uCAAsC;AACtF,SAASC,4BAA4B,QAAQ,oCAAmC;AAEhF,OAAO,MAAMC,gBAAgB,OAAO,EAClCC,sBAAsB,EACtBC,YAAY,EACZC,gBAAgB,EAChBC,cAAc,EACdC,OAAO,EACPC,eAAe,EACfC,UAAU,EACVC,mBAAmB,EACnBC,gBAAgB,EAChBC,KAAK,EACLC,GAAG,EACHC,MAAM,EACNC,QAAQ,KAAK,EACbC,IAAI,EACJC,QAAQ,EACRC,OAAOC,qBAAqB,EAkB7B;IAKC,IAAIC,QAA6C;IACjD,IAAIC;IAEJ,MAAMC,cAA6C,CAAC;IAEpD,iDAAiD;IACjD,MAAMC,kBAAkBzB,iBAAiB;QAAE0B,QAAQnB,iBAAiBmB,MAAM;IAAC;IAE3E,MAAMC,mBAAmBb,MAAMc,OAAO,CAACC,OAAO,CAAC,MAAM;IAErD,MAAMC,eAAeL,gBAAgBM,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKN;IAE5D,sCAAsC;IACtC,IAAIO;IAEJ,IAAIJ,cAAcK,SAAS,kBAAkBL,aAAaM,UAAU,EAAE;QACpE,MAAMA,aAAaC,MAAMC,OAAO,CAACR,aAAaM,UAAU,IACpDN,aAAaM,UAAU,GACvB;YAACN,aAAaM,UAAU;SAAC;QAE7BF,WAAW,CAAC;QACZE,WAAWG,OAAO,CAAC,CAACC;YAClB,MAAMC,SAASnC,aAAaoC,WAAW,CAACX,IAAI,CAAC,CAACY,IAAMA,EAAEC,IAAI,KAAKJ;YAC/DN,QAAQ,CAACM,IAAI,GAAG;gBAAE,CAACC,QAAQI,OAAOC,cAAc,KAAK,EAAE;YAAK;QAC9D;IACF;IAEA,MAAMC,WAAW,MAAMhC,IAAIiC,OAAO,CAACC,YAAY,CAAC;QAC9CC,YAAY1C;QACZ2C,OAAO;QACPC,OAAOzB;QACP0B,OAAOvC,OAAOuC,QAAQC,OAAOxC,MAAMuC,KAAK,IAAIE;QAC5CC,QAAQzC,IAAIyC,MAAM;QAClBC,gBAAgB;QAChBC,MAAM5C,OAAO4C,OAAOJ,OAAOxC,MAAM4C,IAAI,IAAIH;QACzCrB;QACAnB;QACA4C,MAAM7C,OAAOc;QACbX;QACAG,OAAOC;IACT;IAEA,MAAMuC,OAAO;QACX,GAAGb,QAAQ;QACXc,MAAMd,SAASe,MAAM,EAAEC,IAAI,IAAO,CAAA,CAAC,CAAA,MAAO,EAAE;QAC5CD,QAAQP;IACV;IAEA,MAAMS,QAAQC,GAAG,CACf,AAAClB,CAAAA,SAASe,MAAM,IAAI,EAAE,AAAD,EAAGC,GAAG,CAAC,OAAOG,eAAeC;QAChD,MAAMC,mCAAmCF,aAAa,CAACvC,iBAAiB;QAExE,sDAAsD;QACtD,MAAM0C,wBAAwBlE,6BAA6BiE;QAE3D,MAAME,YAAY,MAAMvD,IAAIiC,OAAO,CAACjB,IAAI,CAAC;YACvCmB,YAAY1C;YACZ2C,OAAO;YACPoB,OAAO;YACPC,gBAAgB;YAChBC,mBAAmB;YACnBpB,OAAOvC,OAAO4D,cAAc,CAACL,sBAAsB,EAAEhB,QACjDC,OAAOxC,MAAM4D,YAAY,CAACL,sBAAsB,CAAChB,KAAK,IACtDE;YACJC,QAAQzC,IAAIyC,MAAM;YAClBC,gBAAgB;YAChBC,MAAM5C,OAAO4D,cAAc,CAACL,sBAAsB,EAAEX,OAChDJ,OAAOxC,MAAM4D,YAAY,CAACL,sBAAsB,CAACX,IAAI,IACrDH;YACJxC;YACA,0EAA0E;YAC1E,4DAA4D;YAC5DC;YACA2C,MAAM7C,OAAO6C;YACb1C;YACAC;YACAE,OAAO;gBACL,GAAIC,yBAAyB,CAAC,CAAC;gBAC/B,CAACM,iBAAiB,EAAE;oBAClBgD,QAAQN;gBACV;YACF;QACF;QAEA,kBAAkB;QAClB,IAAIO;QAEJ,IAAIR,qCAAqC,MAAM;YAC7CQ,UAAU7D,IAAI8D,IAAI,CAACC,CAAC,CAAC;QACvB,OAAO,IAAIhD,cAAcK,SAAS,gBAAgB;YAChD,MAAM4C,qBAAqB1C,MAAMC,OAAO,CAACR,aAAaM,UAAU,IAC5DmB,YACAjD,aAAaoC,WAAW,CAACX,IAAI,CAAC,CAACY,IAAMA,EAAEC,IAAI,KAAKd,aAAaM,UAAU;YAC3EwC,UAAU1E,gCACRkE,kCACA9D,cACAyE;QAEJ,OAAO,IAAIjD,cAAcK,SAAS,QAAQ;YACxCyC,UAAU7E,WAAW;gBACnBiF,MAAMC,OAAOZ;gBACbQ,MAAM9D,IAAI8D,IAAI;gBACdK,SAAS5E,aAAauC,KAAK,CAACsC,UAAU;YACxC;QACF,OAAO,IAAIrD,cAAcK,SAAS,YAAY;YAC5C,IAAIkC,0BAA0B,MAAM;gBAClCO,UAAU7D,IAAI8D,IAAI,CAACC,CAAC,CAAC;YACvB;YACA,IAAIT,0BAA0B,OAAO;gBACnCO,UAAU7D,IAAI8D,IAAI,CAACC,CAAC,CAAC;YACvB;QACF,OAAO;YACLF,UAAUK,OAAOZ;QACnB;QAEA,uCAAuC;QACvC,MAAMe,oBAAoBnF,wBAAwBoE;QAElD,IAAIC,UAAUT,IAAI,IAAIS,UAAUT,IAAI,CAACwB,MAAM,GAAG,GAAG;YAC/C,MAAM,EAAE9D,aAAa+D,cAAc,EAAEhE,OAAOiE,QAAQ,EAAE,GAAGzF,YAAY;gBACnEO;gBACAE;gBACAE;gBACAC;gBACAkD,MAAMU;gBACN3D;gBACAC;gBACAC;gBACAc;gBACA6D,cAAcJ;gBACdR,SAASA,WAAW7D,IAAI8D,IAAI,CAACC,CAAC,CAAC;gBAC/BD,MAAM9D,IAAI8D,IAAI;gBACdY,KAAK,CAAC,MAAM,EAAEL,mBAAmB;gBACjCM,oBAAoBnF,iBAAiBoF,SAAS,KAAK,OAAO,WAAWpC;gBACrEP,SAASjC,IAAIiC,OAAO;gBACpBlC;gBACAgC,YAAYvC,iBAAiBsC,KAAK,CAACC,UAAU;gBAC7C3B;YACF;YAEA,4EAA4E;YAC5E,qGAAqG;YACrG,IAAI,CAACI,aAAa;gBAChBA,cAAc+D;YAChB;YAEA,IAAI,CAAChE,OAAO;gBACVA,QAAQ,EAAE;YACZ;YAEAE,WAAW,CAAC4D,kBAAkB,GAAGd;YAC/BhD,KAAgC,CAAC6C,EAAE,GAAGoB;QAC1C;IACF;IAGF,OAAO;QACLhE;QACAqC;QACAtC;IACF;AACF,EAAC"}
1
+ {"version":3,"file":"handleGroupBy.js","names":["renderTable","formatDate","flattenAllFields","createSerializableValue","extractRelationshipDisplayValue","extractValueOrRelationshipID","handleGroupBy","clientCollectionConfig","clientConfig","collectionConfig","collectionSlug","columns","customCellProps","drawerSlug","enableRowSelections","fieldPermissions","query","req","select","trash","user","viewType","where","whereWithMergedSearch","Table","columnState","dataByGroup","flattenedFields","fields","groupByFieldPath","groupBy","replace","groupByField","find","f","name","populate","type","relationTo","Array","isArray","forEach","rel","config","collections","c","slug","admin","useAsTitle","distinct","payload","findDistinct","collection","depth","field","limit","Number","undefined","locale","overrideAccess","page","sort","data","docs","values","map","Promise","all","distinctValue","i","potentiallyPopulatedRelationship","valueOrRelationshipID","groupData","draft","fallbackLocale","includeLockStatus","queryByGroup","equals","heading","i18n","t","relationshipConfig","date","String","pattern","dateFormat","serializableValue","length","newColumnState","NewTable","groupByValue","key","orderableFieldName","orderable"],"sources":["../../../src/views/List/handleGroupBy.ts"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientConfig,\n Column,\n ListQuery,\n PaginatedDocs,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedFieldsPermissions,\n SelectType,\n ViewTypes,\n Where,\n} from 'payload'\n\nimport { renderTable } from '@payloadcms/ui/rsc'\nimport { formatDate } from '@payloadcms/ui/shared'\nimport { flattenAllFields } from 'payload'\n\nimport { createSerializableValue } from './createSerializableValue.js'\nimport { extractRelationshipDisplayValue } from './extractRelationshipDisplayValue.js'\nimport { extractValueOrRelationshipID } from './extractValueOrRelationshipID.js'\n\nexport const handleGroupBy = async ({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collectionSlug,\n columns,\n customCellProps,\n drawerSlug,\n enableRowSelections,\n fieldPermissions,\n query,\n req,\n select,\n trash = false,\n user,\n viewType,\n where: whereWithMergedSearch,\n}: {\n clientCollectionConfig: ClientCollectionConfig\n clientConfig: ClientConfig\n collectionConfig: SanitizedCollectionConfig\n collectionSlug: string\n columns: any[]\n customCellProps?: Record<string, any>\n drawerSlug?: string\n enableRowSelections?: boolean\n fieldPermissions?: SanitizedFieldsPermissions\n query?: ListQuery\n req: PayloadRequest\n select?: SelectType\n trash?: boolean\n user: any\n viewType?: ViewTypes\n where: Where\n}): Promise<{\n columnState: Column[]\n data: PaginatedDocs\n Table: null | React.ReactNode | React.ReactNode[]\n}> => {\n let Table: React.ReactNode | React.ReactNode[] = null\n let columnState: Column[]\n\n const dataByGroup: Record<string, PaginatedDocs> = {}\n\n // NOTE: is there a faster/better way to do this?\n const flattenedFields = flattenAllFields({ fields: collectionConfig.fields })\n\n const groupByFieldPath = query.groupBy.replace(/^-/, '')\n\n const groupByField = flattenedFields.find((f) => f.name === groupByFieldPath)\n\n // Set up population for relationships\n let populate\n\n if (groupByField?.type === 'relationship' && groupByField.relationTo) {\n const relationTo = Array.isArray(groupByField.relationTo)\n ? groupByField.relationTo\n : [groupByField.relationTo]\n\n populate = {}\n relationTo.forEach((rel) => {\n const config = clientConfig.collections.find((c) => c.slug === rel)\n populate[rel] = { [config?.admin?.useAsTitle || 'id']: true }\n })\n }\n\n const distinct = await req.payload.findDistinct({\n collection: collectionSlug,\n depth: 1,\n field: groupByFieldPath,\n limit: query?.limit ? Number(query.limit) : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.page ? Number(query.page) : undefined,\n populate,\n req,\n sort: query?.groupBy,\n trash,\n where: whereWithMergedSearch,\n })\n\n const data = {\n ...distinct,\n docs: distinct.values?.map(() => ({})) || [],\n values: undefined,\n }\n\n await Promise.all(\n (distinct.values || []).map(async (distinctValue, i) => {\n const potentiallyPopulatedRelationship = distinctValue[groupByFieldPath]\n\n // Extract value or relationship ID for database query\n const valueOrRelationshipID = extractValueOrRelationshipID(potentiallyPopulatedRelationship)\n\n const groupData = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit: query?.queryByGroup?.[valueOrRelationshipID]?.limit\n ? Number(query.queryByGroup[valueOrRelationshipID].limit)\n : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.queryByGroup?.[valueOrRelationshipID]?.page\n ? Number(query.queryByGroup[valueOrRelationshipID].page)\n : undefined,\n req,\n // Note: if we wanted to enable table-by-table sorting, we could use this:\n // sort: query?.queryByGroup?.[valueOrRelationshipID]?.sort,\n select,\n sort: query?.sort,\n trash,\n user,\n where: {\n ...(whereWithMergedSearch || {}),\n [groupByFieldPath]: {\n equals: valueOrRelationshipID,\n },\n },\n })\n\n // Extract heading\n let heading: string\n\n if (potentiallyPopulatedRelationship === null) {\n heading = req.i18n.t('general:noValue')\n } else if (groupByField?.type === 'relationship') {\n const relationshipConfig = Array.isArray(groupByField.relationTo)\n ? undefined\n : clientConfig.collections.find((c) => c.slug === groupByField.relationTo)\n heading = extractRelationshipDisplayValue(\n potentiallyPopulatedRelationship,\n clientConfig,\n relationshipConfig,\n )\n } else if (groupByField?.type === 'date') {\n heading = formatDate({\n date: String(valueOrRelationshipID),\n i18n: req.i18n,\n pattern: clientConfig.admin.dateFormat,\n })\n } else if (groupByField?.type === 'checkbox') {\n if (valueOrRelationshipID === true) {\n heading = req.i18n.t('general:true')\n }\n if (valueOrRelationshipID === false) {\n heading = req.i18n.t('general:false')\n }\n } else {\n heading = String(valueOrRelationshipID)\n }\n\n // Create serializable value for client\n const serializableValue = createSerializableValue(valueOrRelationshipID)\n\n if (groupData.docs && groupData.docs.length > 0) {\n const { columnState: newColumnState, Table: NewTable } = renderTable({\n clientCollectionConfig,\n collectionConfig,\n columns,\n customCellProps,\n data: groupData,\n drawerSlug,\n enableRowSelections,\n fieldPermissions,\n groupByFieldPath,\n groupByValue: serializableValue,\n heading: heading || req.i18n.t('general:noValue'),\n i18n: req.i18n,\n key: `table-${serializableValue}`,\n orderableFieldName: collectionConfig.orderable === true ? '_order' : undefined,\n payload: req.payload,\n query,\n useAsTitle: collectionConfig.admin.useAsTitle,\n viewType,\n })\n\n // Only need to set `columnState` once, using the first table's column state\n // This will avoid needing to generate column state explicitly for root context that wraps all tables\n if (!columnState) {\n columnState = newColumnState\n }\n\n if (!Table) {\n Table = []\n }\n\n dataByGroup[serializableValue] = groupData\n ;(Table as Array<React.ReactNode>)[i] = NewTable\n }\n }),\n )\n\n return {\n columnState,\n data,\n Table,\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import type { HierarchyViewData, PayloadRequest, SanitizedCollectionConfig, SanitizedPermissions } from 'payload';
2
+ /**
3
+ * Fetches hierarchy data for a collection with a selected parent.
4
+ * Returns data that can be rendered client-side by HierarchyTable.
5
+ */
6
+ export declare const handleHierarchy: ({ collectionConfig, collectionSlug, parentId, permissions, req, search, typeFilter, user, }: {
7
+ collectionConfig: SanitizedCollectionConfig;
8
+ collectionSlug: string;
9
+ parentId: null | number | string;
10
+ permissions?: SanitizedPermissions;
11
+ req: PayloadRequest;
12
+ search?: string;
13
+ /** Filter hierarchy items by their collectionSpecific type field */
14
+ typeFilter?: string[];
15
+ user: PayloadRequest["user"];
16
+ }) => Promise<HierarchyViewData>;
17
+ //# sourceMappingURL=handleHierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleHierarchy.d.ts","sourceRoot":"","sources":["../../../src/views/List/handleHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,SAAS,CAAA;AAMhB;;;GAGG;AACH,eAAO,MAAM,eAAe,gGASzB;IACD,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC7B,KAAG,OAAO,CAAC,iBAAiB,CA+N5B,CAAA"}
@@ -0,0 +1,243 @@
1
+ import { getTranslation } from '@payloadcms/translations';
2
+ import { getAncestors } from 'payload';
3
+ import { DEFAULT_HIERARCHY_LIST_LIMIT } from 'payload/shared';
4
+ /**
5
+ * Fetches hierarchy data for a collection with a selected parent.
6
+ * Returns data that can be rendered client-side by HierarchyTable.
7
+ */
8
+ export const handleHierarchy = async ({
9
+ collectionConfig,
10
+ collectionSlug,
11
+ parentId,
12
+ permissions,
13
+ req,
14
+ search,
15
+ typeFilter,
16
+ user
17
+ }) => {
18
+ const hierarchyConfig = collectionConfig.hierarchy && typeof collectionConfig.hierarchy === 'object' ? collectionConfig.hierarchy : undefined;
19
+ if (!hierarchyConfig) {
20
+ throw new Error('Collection is not a hierarchy');
21
+ }
22
+ const parentFieldName = hierarchyConfig.parentFieldName;
23
+ const useAsTitle = collectionConfig.admin?.useAsTitle || 'id';
24
+ // Fetch the parent item and breadcrumbs (skip for root level)
25
+ let parent = null;
26
+ let breadcrumbs = [];
27
+ if (parentId !== null) {
28
+ try {
29
+ const [item, ancestors] = await Promise.all([req.payload.findByID({
30
+ id: parentId,
31
+ collection: collectionSlug,
32
+ depth: 0,
33
+ overrideAccess: false,
34
+ req,
35
+ user
36
+ }), getAncestors({
37
+ id: parentId,
38
+ collectionSlug,
39
+ req
40
+ })]);
41
+ parent = item;
42
+ breadcrumbs = ancestors;
43
+ } catch (_error) {
44
+ req.payload.logger.warn({
45
+ msg: `Hierarchy item not found: ${parentId}`
46
+ });
47
+ }
48
+ }
49
+ // Build children where clause
50
+ // For root level (parentId is null), find items without a parent
51
+ // For nested level, find items with this specific parent
52
+ const parentCondition = parentId === null ? {
53
+ or: [{
54
+ [parentFieldName]: {
55
+ exists: false
56
+ }
57
+ }, {
58
+ [parentFieldName]: {
59
+ equals: null
60
+ }
61
+ }]
62
+ } : {
63
+ [parentFieldName]: {
64
+ equals: parentId
65
+ }
66
+ };
67
+ // Build type filter condition if typeFilter is provided and collectionSpecific is configured
68
+ // Filter to folders that allow ANY of the selected types OR are unrestricted
69
+ let typeCondition;
70
+ if (typeFilter && typeFilter.length > 0 && hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object') {
71
+ const typeFieldName = hierarchyConfig.collectionSpecific.fieldName;
72
+ // Exclude the hierarchy collection itself from the filter (folders always show folders)
73
+ const filteredTypes = typeFilter.filter(t => t !== collectionSlug);
74
+ if (filteredTypes.length > 0) {
75
+ typeCondition = {
76
+ or: [{
77
+ [typeFieldName]: {
78
+ in: filteredTypes
79
+ }
80
+ }, {
81
+ [typeFieldName]: {
82
+ exists: false
83
+ }
84
+ }]
85
+ };
86
+ }
87
+ }
88
+ // Combine conditions: parent + search + typeFilter
89
+ const conditions = [parentCondition];
90
+ if (search) {
91
+ conditions.push({
92
+ [useAsTitle]: {
93
+ like: search
94
+ }
95
+ });
96
+ }
97
+ if (typeCondition) {
98
+ conditions.push(typeCondition);
99
+ }
100
+ const childrenWhere = conditions.length > 1 ? {
101
+ and: conditions
102
+ } : parentCondition;
103
+ // Fetch children (hierarchy items with this parent, or root items if parentId is null)
104
+ const childrenData = await req.payload.find({
105
+ collection: collectionSlug,
106
+ depth: 0,
107
+ draft: true,
108
+ fallbackLocale: false,
109
+ includeLockStatus: true,
110
+ limit: DEFAULT_HIERARCHY_LIST_LIMIT,
111
+ locale: req.locale,
112
+ overrideAccess: false,
113
+ page: 1,
114
+ req,
115
+ user,
116
+ where: childrenWhere
117
+ });
118
+ // Fetch related documents from other collections
119
+ // At root level: show unassigned documents (where hierarchy field doesn't exist)
120
+ // At nested level: show documents assigned to the selected hierarchy item
121
+ const relatedDocumentsByCollection = {};
122
+ // Use pre-computed relatedCollections from sanitized hierarchy config
123
+ const relatedCollectionsConfig = hierarchyConfig.relatedCollections || {};
124
+ for (const [relatedSlug, fieldInfo] of Object.entries(relatedCollectionsConfig)) {
125
+ if (relatedSlug === collectionSlug) {
126
+ continue;
127
+ }
128
+ const relatedCollectionConfig = req.payload.collections[relatedSlug]?.config;
129
+ if (!relatedCollectionConfig) {
130
+ continue;
131
+ }
132
+ // Check if user has read permission for this collection
133
+ if (!permissions?.collections?.[relatedSlug]?.read) {
134
+ continue;
135
+ }
136
+ const {
137
+ fieldName,
138
+ hasMany
139
+ } = fieldInfo;
140
+ // Build where clause based on whether we're at root or nested level
141
+ let relationshipWhere;
142
+ if (parentId === null) {
143
+ // Root level: find documents where hierarchy field doesn't exist, is null, or is empty array
144
+ const conditions = [{
145
+ [fieldName]: {
146
+ exists: false
147
+ }
148
+ }, {
149
+ [fieldName]: {
150
+ equals: null
151
+ }
152
+ }];
153
+ if (hasMany) {
154
+ // hasMany fields store cleared values as empty arrays
155
+ conditions.push({
156
+ [fieldName]: {
157
+ equals: []
158
+ }
159
+ });
160
+ }
161
+ relationshipWhere = {
162
+ or: conditions
163
+ };
164
+ } else {
165
+ // Nested level: find documents assigned to this hierarchy item
166
+ // "in" operator works for both hasMany and single relationship fields
167
+ relationshipWhere = {
168
+ [fieldName]: {
169
+ in: [parentId]
170
+ }
171
+ };
172
+ }
173
+ // Add search filter if provided
174
+ const relatedUseAsTitle = relatedCollectionConfig.admin?.useAsTitle || 'id';
175
+ const where = search ? {
176
+ and: [relationshipWhere, {
177
+ [relatedUseAsTitle]: {
178
+ like: search
179
+ }
180
+ }]
181
+ } : relationshipWhere;
182
+ try {
183
+ const data = await req.payload.find({
184
+ collection: relatedSlug,
185
+ depth: 0,
186
+ draft: true,
187
+ fallbackLocale: false,
188
+ includeLockStatus: true,
189
+ limit: DEFAULT_HIERARCHY_LIST_LIMIT,
190
+ locale: req.locale,
191
+ overrideAccess: false,
192
+ page: 1,
193
+ req,
194
+ user,
195
+ where
196
+ });
197
+ if (data.totalDocs > 0) {
198
+ relatedDocumentsByCollection[relatedSlug] = {
199
+ hasMany,
200
+ label: getTranslation(relatedCollectionConfig.labels?.plural, req.i18n),
201
+ result: data
202
+ };
203
+ }
204
+ } catch (error) {
205
+ req.payload.logger.warn({
206
+ err: error,
207
+ msg: `Failed to query related collection ${relatedSlug}`
208
+ });
209
+ }
210
+ }
211
+ // Extract allowed collections from parent's collectionSpecific field
212
+ // - undefined: collectionSpecific not configured, no filtering needed
213
+ // - []: parent folder accepts everything, can only move to unrestricted destinations
214
+ // - [{ slug, label }, ...]: parent folder has restrictions
215
+ let allowedCollections;
216
+ if (hierarchyConfig.collectionSpecific && parent) {
217
+ const typeFieldName = hierarchyConfig.collectionSpecific.fieldName;
218
+ const typeValues = parent[typeFieldName];
219
+ if (typeValues && typeValues.length > 0) {
220
+ allowedCollections = typeValues.map(slug => {
221
+ const config = req.payload.collections[slug]?.config;
222
+ const label = config ? getTranslation(config.labels?.plural, req.i18n) : slug;
223
+ return {
224
+ slug,
225
+ label
226
+ };
227
+ });
228
+ } else {
229
+ // Parent folder accepts everything (type is null or empty)
230
+ allowedCollections = [];
231
+ }
232
+ }
233
+ return {
234
+ allowedCollections,
235
+ breadcrumbs,
236
+ childrenData,
237
+ parent,
238
+ parentFieldName,
239
+ parentId,
240
+ relatedDocumentsByCollection
241
+ };
242
+ };
243
+ //# sourceMappingURL=handleHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleHierarchy.js","names":["getTranslation","getAncestors","DEFAULT_HIERARCHY_LIST_LIMIT","handleHierarchy","collectionConfig","collectionSlug","parentId","permissions","req","search","typeFilter","user","hierarchyConfig","hierarchy","undefined","Error","parentFieldName","useAsTitle","admin","parent","breadcrumbs","item","ancestors","Promise","all","payload","findByID","id","collection","depth","overrideAccess","_error","logger","warn","msg","parentCondition","or","exists","equals","typeCondition","length","collectionSpecific","typeFieldName","fieldName","filteredTypes","filter","t","in","conditions","push","like","childrenWhere","and","childrenData","find","draft","fallbackLocale","includeLockStatus","limit","locale","page","where","relatedDocumentsByCollection","relatedCollectionsConfig","relatedCollections","relatedSlug","fieldInfo","Object","entries","relatedCollectionConfig","collections","config","read","hasMany","relationshipWhere","relatedUseAsTitle","data","totalDocs","label","labels","plural","i18n","result","error","err","allowedCollections","typeValues","map","slug"],"sources":["../../../src/views/List/handleHierarchy.ts"],"sourcesContent":["import type {\n HierarchyViewData,\n PayloadRequest,\n RelatedDocumentsGrouped,\n SanitizedCollectionConfig,\n SanitizedPermissions,\n TypeWithID,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getAncestors } from 'payload'\nimport { DEFAULT_HIERARCHY_LIST_LIMIT } from 'payload/shared'\n\n/**\n * Fetches hierarchy data for a collection with a selected parent.\n * Returns data that can be rendered client-side by HierarchyTable.\n */\nexport const handleHierarchy = async ({\n collectionConfig,\n collectionSlug,\n parentId,\n permissions,\n req,\n search,\n typeFilter,\n user,\n}: {\n collectionConfig: SanitizedCollectionConfig\n collectionSlug: string\n parentId: null | number | string\n permissions?: SanitizedPermissions\n req: PayloadRequest\n search?: string\n /** Filter hierarchy items by their collectionSpecific type field */\n typeFilter?: string[]\n user: PayloadRequest['user']\n}): Promise<HierarchyViewData> => {\n const hierarchyConfig =\n collectionConfig.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy\n : undefined\n\n if (!hierarchyConfig) {\n throw new Error('Collection is not a hierarchy')\n }\n\n const parentFieldName = hierarchyConfig.parentFieldName\n\n const useAsTitle = collectionConfig.admin?.useAsTitle || 'id'\n\n // Fetch the parent item and breadcrumbs (skip for root level)\n let parent: null | (Record<string, unknown> & TypeWithID) = null\n let breadcrumbs: Array<{ id: number | string; title: string }> = []\n\n if (parentId !== null) {\n try {\n const [item, ancestors] = await Promise.all([\n req.payload.findByID({\n id: parentId,\n collection: collectionSlug,\n depth: 0,\n overrideAccess: false,\n req,\n user,\n }),\n getAncestors({\n id: parentId,\n collectionSlug,\n req,\n }),\n ])\n\n parent = item\n breadcrumbs = ancestors\n } catch (_error) {\n req.payload.logger.warn({\n msg: `Hierarchy item not found: ${parentId}`,\n })\n }\n }\n\n // Build children where clause\n // For root level (parentId is null), find items without a parent\n // For nested level, find items with this specific parent\n const parentCondition =\n parentId === null\n ? {\n or: [{ [parentFieldName]: { exists: false } }, { [parentFieldName]: { equals: null } }],\n }\n : { [parentFieldName]: { equals: parentId } }\n\n // Build type filter condition if typeFilter is provided and collectionSpecific is configured\n // Filter to folders that allow ANY of the selected types OR are unrestricted\n let typeCondition: Record<string, unknown> | undefined\n\n if (\n typeFilter &&\n typeFilter.length > 0 &&\n hierarchyConfig.collectionSpecific &&\n typeof hierarchyConfig.collectionSpecific === 'object'\n ) {\n const typeFieldName = hierarchyConfig.collectionSpecific.fieldName\n // Exclude the hierarchy collection itself from the filter (folders always show folders)\n const filteredTypes = typeFilter.filter((t) => t !== collectionSlug)\n\n if (filteredTypes.length > 0) {\n typeCondition = {\n or: [\n { [typeFieldName]: { in: filteredTypes } },\n { [typeFieldName]: { exists: false } }, // Include unrestricted folders\n ],\n }\n }\n }\n\n // Combine conditions: parent + search + typeFilter\n const conditions: Record<string, unknown>[] = [parentCondition]\n\n if (search) {\n conditions.push({ [useAsTitle]: { like: search } })\n }\n\n if (typeCondition) {\n conditions.push(typeCondition)\n }\n\n const childrenWhere = conditions.length > 1 ? { and: conditions } : parentCondition\n\n // Fetch children (hierarchy items with this parent, or root items if parentId is null)\n const childrenData = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit: DEFAULT_HIERARCHY_LIST_LIMIT,\n locale: req.locale,\n overrideAccess: false,\n page: 1,\n req,\n user,\n where: childrenWhere,\n })\n\n // Fetch related documents from other collections\n // At root level: show unassigned documents (where hierarchy field doesn't exist)\n // At nested level: show documents assigned to the selected hierarchy item\n const relatedDocumentsByCollection: RelatedDocumentsGrouped = {}\n\n // Use pre-computed relatedCollections from sanitized hierarchy config\n const relatedCollectionsConfig = hierarchyConfig.relatedCollections || {}\n\n for (const [relatedSlug, fieldInfo] of Object.entries(relatedCollectionsConfig)) {\n if (relatedSlug === collectionSlug) {\n continue\n }\n\n const relatedCollectionConfig = req.payload.collections[relatedSlug]?.config\n if (!relatedCollectionConfig) {\n continue\n }\n\n // Check if user has read permission for this collection\n if (!permissions?.collections?.[relatedSlug]?.read) {\n continue\n }\n\n const { fieldName, hasMany } = fieldInfo\n\n // Build where clause based on whether we're at root or nested level\n let relationshipWhere: Record<string, unknown>\n\n if (parentId === null) {\n // Root level: find documents where hierarchy field doesn't exist, is null, or is empty array\n const conditions: Record<string, unknown>[] = [\n { [fieldName]: { exists: false } },\n { [fieldName]: { equals: null } },\n ]\n if (hasMany) {\n // hasMany fields store cleared values as empty arrays\n conditions.push({ [fieldName]: { equals: [] } })\n }\n relationshipWhere = { or: conditions }\n } else {\n // Nested level: find documents assigned to this hierarchy item\n // \"in\" operator works for both hasMany and single relationship fields\n relationshipWhere = {\n [fieldName]: { in: [parentId] },\n }\n }\n\n // Add search filter if provided\n const relatedUseAsTitle = relatedCollectionConfig.admin?.useAsTitle || 'id'\n const where = search\n ? { and: [relationshipWhere, { [relatedUseAsTitle]: { like: search } }] }\n : relationshipWhere\n\n try {\n const data = await req.payload.find({\n collection: relatedSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit: DEFAULT_HIERARCHY_LIST_LIMIT,\n locale: req.locale,\n overrideAccess: false,\n page: 1,\n req,\n user,\n where,\n })\n\n if (data.totalDocs > 0) {\n relatedDocumentsByCollection[relatedSlug] = {\n hasMany,\n label: getTranslation(relatedCollectionConfig.labels?.plural, req.i18n),\n result: data,\n }\n }\n } catch (error) {\n req.payload.logger.warn({\n err: error,\n msg: `Failed to query related collection ${relatedSlug}`,\n })\n }\n }\n\n // Extract allowed collections from parent's collectionSpecific field\n // - undefined: collectionSpecific not configured, no filtering needed\n // - []: parent folder accepts everything, can only move to unrestricted destinations\n // - [{ slug, label }, ...]: parent folder has restrictions\n let allowedCollections: Array<{ label: string; slug: string }> | undefined\n\n if (hierarchyConfig.collectionSpecific && parent) {\n const typeFieldName = hierarchyConfig.collectionSpecific.fieldName\n const typeValues = parent[typeFieldName] as null | string[] | undefined\n\n if (typeValues && typeValues.length > 0) {\n allowedCollections = typeValues.map((slug) => {\n const config = req.payload.collections[slug]?.config\n const label = config ? getTranslation(config.labels?.plural, req.i18n) : slug\n return { slug, label }\n })\n } else {\n // Parent folder accepts everything (type is null or empty)\n allowedCollections = []\n }\n }\n\n return {\n allowedCollections,\n breadcrumbs,\n childrenData,\n parent,\n parentFieldName,\n parentId,\n relatedDocumentsByCollection,\n }\n}\n"],"mappings":"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","ignoreList":[]}