@payloadcms/next 3.80.0-internal-debug.7019cc9 → 3.80.0-internal.0311fce
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.
- package/dist/auth/login.js +58 -52
- package/dist/auth/login.js.map +1 -1
- package/dist/auth/logout.js +44 -39
- package/dist/auth/logout.js.map +1 -1
- package/dist/auth/refresh.js +47 -45
- package/dist/auth/refresh.js.map +1 -1
- package/dist/cjs/withPayload.cjs +24 -65
- package/dist/cjs/withPayload.cjs.map +2 -2
- package/dist/config.js +0 -1
- package/dist/config.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js +15 -9
- package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js +71 -40
- package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/Tab/index.js +59 -65
- package/dist/elements/DocumentHeader/Tabs/Tab/index.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/index.js +70 -80
- package/dist/elements/DocumentHeader/Tabs/index.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +23 -16
- package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js.map +1 -1
- package/dist/elements/DocumentHeader/Tabs/tabs/index.js +69 -61
- package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
- package/dist/elements/DocumentHeader/index.js +28 -48
- package/dist/elements/DocumentHeader/index.js.map +1 -1
- package/dist/elements/FormHeader/index.js +16 -30
- package/dist/elements/FormHeader/index.js.map +1 -1
- package/dist/elements/HierarchyTypeField/index.d.ts +9 -0
- package/dist/elements/HierarchyTypeField/index.d.ts.map +1 -0
- package/dist/elements/HierarchyTypeField/index.js +114 -0
- package/dist/elements/HierarchyTypeField/index.js.map +1 -0
- package/dist/elements/HierarchyTypeField/index.server.d.ts +9 -0
- package/dist/elements/HierarchyTypeField/index.server.d.ts.map +1 -0
- package/dist/elements/HierarchyTypeField/index.server.js +32 -0
- package/dist/elements/HierarchyTypeField/index.server.js.map +1 -0
- package/dist/elements/Logo/index.js +34 -19
- package/dist/elements/Logo/index.js.map +1 -1
- package/dist/elements/Nav/NavHamburger/index.js +44 -23
- package/dist/elements/Nav/NavHamburger/index.js.map +1 -1
- package/dist/elements/Nav/NavWrapper/index.js +54 -28
- package/dist/elements/Nav/NavWrapper/index.js.map +1 -1
- package/dist/elements/Nav/SettingsMenuButton/index.js +39 -33
- package/dist/elements/Nav/SettingsMenuButton/index.js.map +1 -1
- package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts +8 -0
- package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts.map +1 -0
- package/dist/elements/Nav/SidebarTabs/TabError/index.js +42 -0
- package/dist/elements/Nav/SidebarTabs/TabError/index.js.map +1 -0
- package/dist/elements/Nav/SidebarTabs/constants.d.ts +2 -0
- package/dist/elements/Nav/SidebarTabs/constants.d.ts.map +1 -0
- package/dist/elements/Nav/SidebarTabs/constants.js +2 -0
- package/dist/elements/Nav/SidebarTabs/constants.js.map +1 -0
- package/dist/elements/Nav/SidebarTabs/index.client.d.ts +20 -0
- package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -0
- package/dist/elements/Nav/SidebarTabs/index.client.js +155 -0
- package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -0
- package/dist/elements/Nav/SidebarTabs/index.d.ts +17 -0
- package/dist/elements/Nav/SidebarTabs/index.d.ts.map +1 -0
- package/dist/elements/Nav/SidebarTabs/index.js +80 -0
- package/dist/elements/Nav/SidebarTabs/index.js.map +1 -0
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +10 -0
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +1 -0
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +53 -0
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -0
- package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
- package/dist/elements/Nav/getNavPrefs.js +56 -27
- package/dist/elements/Nav/getNavPrefs.js.map +1 -1
- package/dist/elements/Nav/index.client.d.ts.map +1 -1
- package/dist/elements/Nav/index.client.js +104 -100
- package/dist/elements/Nav/index.client.js.map +1 -1
- package/dist/elements/Nav/index.d.ts.map +1 -1
- package/dist/elements/Nav/index.js +199 -193
- package/dist/elements/Nav/index.js.map +1 -1
- package/dist/exports/auth.js +0 -1
- package/dist/exports/auth.js.map +1 -1
- package/dist/exports/client.d.ts +2 -1
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +3 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/layouts.js +0 -1
- package/dist/exports/layouts.js.map +1 -1
- package/dist/exports/routes.js +0 -1
- package/dist/exports/routes.js.map +1 -1
- package/dist/exports/rsc.d.ts +2 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +2 -2
- package/dist/exports/rsc.js.map +1 -1
- package/dist/exports/templates.js +0 -1
- package/dist/exports/templates.js.map +1 -1
- package/dist/exports/utilities.d.ts +2 -0
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/exports/utilities.js +13 -7
- package/dist/exports/utilities.js.map +1 -1
- package/dist/exports/views.js +0 -1
- package/dist/exports/views.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/layouts/Root/NestProviders.js +20 -21
- package/dist/layouts/Root/NestProviders.js.map +1 -1
- package/dist/layouts/Root/checkDependencies.js +41 -49
- package/dist/layouts/Root/checkDependencies.js.map +1 -1
- package/dist/layouts/Root/index.js +103 -128
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/prod/styles.css +1 -5
- package/dist/routes/graphql/handler.js +122 -114
- package/dist/routes/graphql/handler.js.map +1 -1
- package/dist/routes/graphql/index.js +0 -1
- package/dist/routes/graphql/index.js.map +1 -1
- package/dist/routes/graphql/playground.js +27 -28
- package/dist/routes/graphql/playground.js.map +1 -1
- package/dist/routes/index.js +0 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/rest/index.js +22 -23
- package/dist/routes/rest/index.js.map +1 -1
- package/dist/routes/rest/og/image.js +79 -103
- package/dist/routes/rest/og/image.js.map +1 -1
- package/dist/routes/rest/og/index.js +54 -59
- package/dist/routes/rest/og/index.js.map +1 -1
- package/dist/templates/Default/NavHamburger/index.js +20 -12
- package/dist/templates/Default/NavHamburger/index.js.map +1 -1
- package/dist/templates/Default/Wrapper/index.js +44 -20
- package/dist/templates/Default/Wrapper/index.js.map +1 -1
- package/dist/templates/Default/index.js +116 -147
- package/dist/templates/Default/index.js.map +1 -1
- package/dist/templates/Minimal/index.js +17 -26
- package/dist/templates/Minimal/index.js.map +1 -1
- package/dist/utilities/getExistingAuthToken.js +2 -3
- package/dist/utilities/getExistingAuthToken.js.map +1 -1
- package/dist/utilities/getHierarchyAncestry.d.ts +24 -0
- package/dist/utilities/getHierarchyAncestry.d.ts.map +1 -0
- package/dist/utilities/getHierarchyAncestry.js +103 -0
- package/dist/utilities/getHierarchyAncestry.js.map +1 -0
- package/dist/utilities/getNextRequestI18n.js +13 -12
- package/dist/utilities/getNextRequestI18n.js.map +1 -1
- package/dist/utilities/getPayloadHMR.js +5 -5
- package/dist/utilities/getPayloadHMR.js.map +1 -1
- package/dist/utilities/getPreferences.js +22 -27
- package/dist/utilities/getPreferences.js.map +1 -1
- package/dist/utilities/getRequestLocale.js +14 -13
- package/dist/utilities/getRequestLocale.js.map +1 -1
- package/dist/utilities/getRequestTheme.js +19 -19
- package/dist/utilities/getRequestTheme.js.map +1 -1
- package/dist/utilities/getRouteWithoutAdmin.js +5 -3
- package/dist/utilities/getRouteWithoutAdmin.js.map +1 -1
- package/dist/utilities/handleAuthRedirect.js +36 -22
- package/dist/utilities/handleAuthRedirect.js.map +1 -1
- package/dist/utilities/handleServerFunctions.js +44 -34
- package/dist/utilities/handleServerFunctions.js.map +1 -1
- package/dist/utilities/initReq.js +96 -78
- package/dist/utilities/initReq.js.map +1 -1
- package/dist/utilities/isCustomAdminView.js +26 -22
- package/dist/utilities/isCustomAdminView.js.map +1 -1
- package/dist/utilities/isPublicAdminRoute.js +20 -26
- package/dist/utilities/isPublicAdminRoute.js.map +1 -1
- package/dist/utilities/meta.js +63 -68
- package/dist/utilities/meta.js.map +1 -1
- package/dist/utilities/selectiveCache.js +26 -25
- package/dist/utilities/selectiveCache.js.map +1 -1
- package/dist/utilities/setPayloadAuthCookie.js +22 -19
- package/dist/utilities/setPayloadAuthCookie.js.map +1 -1
- package/dist/utilities/slugify.js +33 -24
- package/dist/utilities/slugify.js.map +1 -1
- package/dist/utilities/timestamp.js +6 -7
- package/dist/utilities/timestamp.js.map +1 -1
- package/dist/views/API/LocaleSelector/index.js +39 -17
- package/dist/views/API/LocaleSelector/index.js.map +1 -1
- package/dist/views/API/RenderJSON/index.js +126 -171
- package/dist/views/API/RenderJSON/index.js.map +1 -1
- package/dist/views/API/index.client.js +199 -291
- package/dist/views/API/index.client.js.map +1 -1
- package/dist/views/API/index.js +2 -7
- package/dist/views/API/index.js.map +1 -1
- package/dist/views/API/metadata.js +23 -18
- package/dist/views/API/metadata.js.map +1 -1
- package/dist/views/Account/ResetPreferences/index.js +102 -78
- package/dist/views/Account/ResetPreferences/index.js.map +1 -1
- package/dist/views/Account/Settings/LanguageSelector.js +47 -18
- package/dist/views/Account/Settings/LanguageSelector.js.map +1 -1
- package/dist/views/Account/Settings/index.js +25 -60
- package/dist/views/Account/Settings/index.js.map +1 -1
- package/dist/views/Account/ToggleTheme/index.js +55 -38
- package/dist/views/Account/ToggleTheme/index.js.map +1 -1
- package/dist/views/Account/index.client.js +32 -16
- package/dist/views/Account/index.client.js.map +1 -1
- package/dist/views/Account/index.js +162 -149
- package/dist/views/Account/index.js.map +1 -1
- package/dist/views/Account/metadata.js +12 -8
- package/dist/views/Account/metadata.js.map +1 -1
- package/dist/views/CollectionTrash/index.js +17 -17
- package/dist/views/CollectionTrash/index.js.map +1 -1
- package/dist/views/CollectionTrash/metadata.js +21 -18
- package/dist/views/CollectionTrash/metadata.js.map +1 -1
- package/dist/views/CreateFirstUser/index.client.js +103 -117
- package/dist/views/CreateFirstUser/index.client.js.map +1 -1
- package/dist/views/CreateFirstUser/index.js +81 -87
- package/dist/views/CreateFirstUser/index.js.map +1 -1
- package/dist/views/CreateFirstUser/metadata.js +12 -8
- package/dist/views/CreateFirstUser/metadata.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +170 -145
- package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js +118 -144
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js +72 -59
- package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.client.js +414 -435
- package/dist/views/Dashboard/Default/ModularDashboard/index.client.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.js +63 -54
- package/dist/views/Dashboard/Default/ModularDashboard/index.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +96 -65
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js +54 -44
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +72 -65
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js +175 -193
- package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js +30 -31
- package/dist/views/Dashboard/Default/ModularDashboard/utils/collisionDetection.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromConfig.js +17 -18
- package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromConfig.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromPreferences.js +5 -6
- package/dist/views/Dashboard/Default/ModularDashboard/utils/getItemsFromPreferences.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/utils/localeUtils.js +74 -69
- package/dist/views/Dashboard/Default/ModularDashboard/utils/localeUtils.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js +234 -228
- package/dist/views/Dashboard/Default/ModularDashboard/utils/sensors.js.map +1 -1
- package/dist/views/Dashboard/Default/index.js +45 -59
- package/dist/views/Dashboard/Default/index.js.map +1 -1
- package/dist/views/Dashboard/index.js +42 -46
- package/dist/views/Dashboard/index.js.map +1 -1
- package/dist/views/Dashboard/metadata.js +14 -10
- package/dist/views/Dashboard/metadata.js.map +1 -1
- package/dist/views/Document/getCustomDocumentViewByKey.js +2 -3
- package/dist/views/Document/getCustomDocumentViewByKey.js.map +1 -1
- package/dist/views/Document/getCustomViewByRoute.js +30 -27
- package/dist/views/Document/getCustomViewByRoute.js.map +1 -1
- package/dist/views/Document/getDocPreferences.js +41 -40
- package/dist/views/Document/getDocPreferences.js.map +1 -1
- package/dist/views/Document/getDocumentData.js +55 -44
- package/dist/views/Document/getDocumentData.js.map +1 -1
- package/dist/views/Document/getDocumentPermissions.js +117 -114
- package/dist/views/Document/getDocumentPermissions.js.map +1 -1
- package/dist/views/Document/getDocumentView.js +283 -313
- package/dist/views/Document/getDocumentView.js.map +1 -1
- package/dist/views/Document/getIsLocked.js +73 -73
- package/dist/views/Document/getIsLocked.js.map +1 -1
- package/dist/views/Document/getMetaBySegment.js +136 -130
- package/dist/views/Document/getMetaBySegment.js.map +1 -1
- package/dist/views/Document/getVersions.js +213 -220
- package/dist/views/Document/getVersions.js.map +1 -1
- package/dist/views/Document/handleServerFunction.js +127 -100
- package/dist/views/Document/handleServerFunction.js.map +1 -1
- package/dist/views/Document/index.js +359 -319
- package/dist/views/Document/index.js.map +1 -1
- package/dist/views/Document/metadata.js +1 -2
- package/dist/views/Document/metadata.js.map +1 -1
- package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
- package/dist/views/Document/renderDocumentSlots.js +163 -141
- package/dist/views/Document/renderDocumentSlots.js.map +1 -1
- package/dist/views/Edit/index.js +6 -10
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/Edit/metadata.js +46 -36
- package/dist/views/Edit/metadata.js.map +1 -1
- package/dist/views/ForgotPassword/ForgotPasswordForm/index.js +164 -130
- package/dist/views/ForgotPassword/ForgotPasswordForm/index.js.map +1 -1
- package/dist/views/ForgotPassword/index.js +62 -79
- package/dist/views/ForgotPassword/index.js.map +1 -1
- package/dist/views/ForgotPassword/metadata.js +12 -8
- package/dist/views/ForgotPassword/metadata.js.map +1 -1
- package/dist/views/List/createSerializableValue.js +11 -12
- package/dist/views/List/createSerializableValue.js.map +1 -1
- package/dist/views/List/enrichDocsWithVersionStatus.js +86 -86
- package/dist/views/List/enrichDocsWithVersionStatus.js.map +1 -1
- package/dist/views/List/extractRelationshipDisplayValue.js +14 -15
- package/dist/views/List/extractRelationshipDisplayValue.js.map +1 -1
- package/dist/views/List/extractValueOrRelationshipID.js +15 -16
- package/dist/views/List/extractValueOrRelationshipID.js.map +1 -1
- package/dist/views/List/handleGroupBy.js +150 -133
- package/dist/views/List/handleGroupBy.js.map +1 -1
- package/dist/views/List/handleHierarchy.d.ts +17 -0
- package/dist/views/List/handleHierarchy.d.ts.map +1 -0
- package/dist/views/List/handleHierarchy.js +243 -0
- package/dist/views/List/handleHierarchy.js.map +1 -0
- package/dist/views/List/handleServerFunction.js +122 -96
- package/dist/views/List/handleServerFunction.js.map +1 -1
- package/dist/views/List/index.d.ts.map +1 -1
- package/dist/views/List/index.js +382 -310
- package/dist/views/List/index.js.map +1 -1
- package/dist/views/List/metadata.js +20 -17
- package/dist/views/List/metadata.js.map +1 -1
- package/dist/views/List/renderListViewSlots.js +75 -82
- package/dist/views/List/renderListViewSlots.js.map +1 -1
- package/dist/views/List/resolveAllFilterOptions.js +45 -43
- package/dist/views/List/resolveAllFilterOptions.js.map +1 -1
- package/dist/views/List/transformColumnsToSelect.js +8 -9
- package/dist/views/List/transformColumnsToSelect.js.map +1 -1
- package/dist/views/Login/LoginField/index.js +89 -57
- package/dist/views/Login/LoginField/index.js.map +1 -1
- package/dist/views/Login/LoginForm/index.js +160 -107
- package/dist/views/Login/LoginForm/index.js.map +1 -1
- package/dist/views/Login/index.js +85 -82
- package/dist/views/Login/index.js.map +1 -1
- package/dist/views/Login/metadata.js +12 -8
- package/dist/views/Login/metadata.js.map +1 -1
- package/dist/views/Logout/LogoutClient.js +120 -84
- package/dist/views/Logout/LogoutClient.js.map +1 -1
- package/dist/views/Logout/index.js +29 -29
- package/dist/views/Logout/index.js.map +1 -1
- package/dist/views/Logout/metadata.js +11 -7
- package/dist/views/Logout/metadata.js.map +1 -1
- package/dist/views/NotFound/index.client.js +82 -71
- package/dist/views/NotFound/index.client.js.map +1 -1
- package/dist/views/NotFound/index.js +73 -72
- package/dist/views/NotFound/index.js.map +1 -1
- package/dist/views/NotFound/metadata.js +9 -7
- package/dist/views/NotFound/metadata.js.map +1 -1
- package/dist/views/ResetPassword/ResetPasswordForm/index.js +108 -97
- package/dist/views/ResetPassword/ResetPasswordForm/index.js.map +1 -1
- package/dist/views/ResetPassword/index.js +73 -93
- package/dist/views/ResetPassword/index.js.map +1 -1
- package/dist/views/ResetPassword/metadata.js +12 -8
- package/dist/views/ResetPassword/metadata.js.map +1 -1
- package/dist/views/Root/attachViewActions.js +23 -18
- package/dist/views/Root/attachViewActions.js.map +1 -1
- package/dist/views/Root/generateCustomViewMetadata.js +21 -19
- package/dist/views/Root/generateCustomViewMetadata.js.map +1 -1
- package/dist/views/Root/getCustomViewByKey.js +14 -12
- package/dist/views/Root/getCustomViewByKey.js.map +1 -1
- package/dist/views/Root/getCustomViewByRoute.js +42 -31
- package/dist/views/Root/getCustomViewByRoute.js.map +1 -1
- package/dist/views/Root/getDocumentViewInfo.js +23 -24
- package/dist/views/Root/getDocumentViewInfo.js.map +1 -1
- package/dist/views/Root/getRouteData.d.ts +1 -4
- package/dist/views/Root/getRouteData.d.ts.map +1 -1
- package/dist/views/Root/getRouteData.js +264 -336
- package/dist/views/Root/getRouteData.js.map +1 -1
- package/dist/views/Root/index.d.ts.map +1 -1
- package/dist/views/Root/index.js +265 -249
- package/dist/views/Root/index.js.map +1 -1
- package/dist/views/Root/isPathMatchingRoute.js +26 -21
- package/dist/views/Root/isPathMatchingRoute.js.map +1 -1
- package/dist/views/Root/metadata.d.ts.map +1 -1
- package/dist/views/Root/metadata.js +148 -179
- package/dist/views/Root/metadata.js.map +1 -1
- package/dist/views/Unauthorized/index.js +46 -54
- package/dist/views/Unauthorized/index.js.map +1 -1
- package/dist/views/Unauthorized/metadata.js +12 -8
- package/dist/views/Unauthorized/metadata.js.map +1 -1
- package/dist/views/Verify/index.client.js +43 -25
- package/dist/views/Verify/index.client.js.map +1 -1
- package/dist/views/Verify/index.js +64 -69
- package/dist/views/Verify/index.js.map +1 -1
- package/dist/views/Verify/metadata.js +12 -8
- package/dist/views/Verify/metadata.js.map +1 -1
- package/dist/views/Version/Default/SelectedLocalesContext.js +4 -4
- package/dist/views/Version/Default/SelectedLocalesContext.js.map +1 -1
- package/dist/views/Version/Default/SetStepNav.js +127 -86
- package/dist/views/Version/Default/SetStepNav.js.map +1 -1
- package/dist/views/Version/Default/index.js +236 -380
- package/dist/views/Version/Default/index.js.map +1 -1
- package/dist/views/Version/Default/types.js +1 -2
- package/dist/views/Version/Default/types.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js +119 -102
- package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js +73 -78
- package/dist/views/Version/RenderFieldsToDiff/RenderVersionFieldsToDiff.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +408 -363
- package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js +51 -40
- package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js +70 -38
- package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js +56 -59
- package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +117 -139
- package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js +61 -56
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/generateLabelFromValue.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +206 -224
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js +11 -17
- package/dist/views/Version/RenderFieldsToDiff/fields/Row/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js +74 -49
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +146 -135
- package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js +82 -57
- package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js +211 -252
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/index.js +22 -23
- package/dist/views/Version/RenderFieldsToDiff/fields/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/index.js +9 -12
- package/dist/views/Version/RenderFieldsToDiff/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js +228 -213
- package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js +826 -1005
- package/dist/views/Version/RenderFieldsToDiff/utilities/countChangedFields.spec.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js +1 -2
- package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js +43 -44
- package/dist/views/Version/RenderFieldsToDiff/utilities/fieldHasChanges.spec.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js +36 -32
- package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js +129 -145
- package/dist/views/Version/RenderFieldsToDiff/utilities/getFieldsForRowComparison.spec.js.map +1 -1
- package/dist/views/Version/Restore/index.js +92 -117
- package/dist/views/Version/Restore/index.js.map +1 -1
- package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js +50 -33
- package/dist/views/Version/SelectComparison/VersionDrawer/CreatedAtCell.js.map +1 -1
- package/dist/views/Version/SelectComparison/VersionDrawer/index.js +226 -170
- package/dist/views/Version/SelectComparison/VersionDrawer/index.js.map +1 -1
- package/dist/views/Version/SelectComparison/index.js +50 -73
- package/dist/views/Version/SelectComparison/index.js.map +1 -1
- package/dist/views/Version/SelectComparison/types.js +1 -2
- package/dist/views/Version/SelectComparison/types.js.map +1 -1
- package/dist/views/Version/SelectLocales/index.js +32 -34
- package/dist/views/Version/SelectLocales/index.js.map +1 -1
- package/dist/views/Version/VersionPillLabel/VersionPillLabel.js +100 -106
- package/dist/views/Version/VersionPillLabel/VersionPillLabel.js.map +1 -1
- package/dist/views/Version/VersionPillLabel/getVersionLabel.js +35 -30
- package/dist/views/Version/VersionPillLabel/getVersionLabel.js.map +1 -1
- package/dist/views/Version/fetchVersions.js +138 -113
- package/dist/views/Version/fetchVersions.js.map +1 -1
- package/dist/views/Version/index.js +326 -328
- package/dist/views/Version/index.js.map +1 -1
- package/dist/views/Version/metadata.js +50 -43
- package/dist/views/Version/metadata.js.map +1 -1
- package/dist/views/Versions/buildColumns.js +79 -95
- package/dist/views/Versions/buildColumns.js.map +1 -1
- package/dist/views/Versions/cells/AutosaveCell/index.js +38 -34
- package/dist/views/Versions/cells/AutosaveCell/index.js.map +1 -1
- package/dist/views/Versions/cells/CreatedAt/index.js +53 -32
- package/dist/views/Versions/cells/CreatedAt/index.js.map +1 -1
- package/dist/views/Versions/cells/ID/index.js +8 -10
- package/dist/views/Versions/cells/ID/index.js.map +1 -1
- package/dist/views/Versions/index.client.js +83 -106
- package/dist/views/Versions/index.client.js.map +1 -1
- package/dist/views/Versions/index.js +164 -164
- package/dist/views/Versions/index.js.map +1 -1
- package/dist/views/Versions/metadata.js +44 -37
- package/dist/views/Versions/metadata.js.map +1 -1
- package/dist/views/Versions/types.js +1 -2
- package/dist/views/Versions/types.js.map +1 -1
- package/dist/withPayload/withPayload.js +177 -236
- package/dist/withPayload/withPayload.js.map +1 -1
- package/dist/withPayload/withPayload.spec.js +35 -36
- package/dist/withPayload/withPayload.spec.js.map +1 -1
- package/dist/withPayload/withPayload.utils.js +73 -65
- package/dist/withPayload/withPayload.utils.js.map +1 -1
- package/dist/withPayload/withPayloadLegacy.js +40 -41
- package/dist/withPayload/withPayloadLegacy.js.map +1 -1
- package/package.json +6 -6
- package/dist/elements/DocumentHeader/Tabs/Tab/index.scss +0 -38
- package/dist/elements/DocumentHeader/Tabs/index.scss +0 -54
- package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.scss +0 -10
- package/dist/elements/DocumentHeader/index.scss +0 -64
- package/dist/elements/FormHeader/index.scss +0 -8
- package/dist/elements/Nav/NavWrapper/index.scss +0 -27
- package/dist/elements/Nav/SettingsMenuButton/index.scss +0 -11
- package/dist/elements/Nav/index.scss +0 -173
- package/dist/esbuildEntry.d.ts +0 -5
- package/dist/esbuildEntry.d.ts.map +0 -1
- package/dist/esbuildEntry.js +0 -6
- package/dist/esbuildEntry.js.map +0 -1
- package/dist/templates/Default/Wrapper/index.scss +0 -58
- package/dist/templates/Default/index.scss +0 -79
- package/dist/templates/Minimal/index.scss +0 -30
- package/dist/views/API/RenderJSON/index.scss +0 -129
- package/dist/views/API/index.scss +0 -119
- package/dist/views/Account/Settings/index.scss +0 -48
- package/dist/views/BrowseByFolder/buildView.d.ts +0 -13
- package/dist/views/BrowseByFolder/buildView.d.ts.map +0 -1
- package/dist/views/BrowseByFolder/buildView.js +0 -151
- package/dist/views/BrowseByFolder/buildView.js.map +0 -1
- package/dist/views/BrowseByFolder/index.d.ts +0 -4
- package/dist/views/BrowseByFolder/index.d.ts.map +0 -1
- package/dist/views/BrowseByFolder/index.js +0 -20
- package/dist/views/BrowseByFolder/index.js.map +0 -1
- package/dist/views/BrowseByFolder/metadata.d.ts +0 -4
- package/dist/views/BrowseByFolder/metadata.d.ts.map +0 -1
- package/dist/views/BrowseByFolder/metadata.js +0 -16
- package/dist/views/BrowseByFolder/metadata.js.map +0 -1
- package/dist/views/CollectionFolders/buildView.d.ts +0 -15
- package/dist/views/CollectionFolders/buildView.d.ts.map +0 -1
- package/dist/views/CollectionFolders/buildView.js +0 -136
- package/dist/views/CollectionFolders/buildView.js.map +0 -1
- package/dist/views/CollectionFolders/index.d.ts +0 -4
- package/dist/views/CollectionFolders/index.d.ts.map +0 -1
- package/dist/views/CollectionFolders/index.js +0 -20
- package/dist/views/CollectionFolders/index.js.map +0 -1
- package/dist/views/CollectionFolders/metadata.d.ts +0 -7
- package/dist/views/CollectionFolders/metadata.d.ts.map +0 -1
- package/dist/views/CollectionFolders/metadata.js +0 -22
- package/dist/views/CollectionFolders/metadata.js.map +0 -1
- package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts +0 -11
- package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts.map +0 -1
- package/dist/views/CollectionFolders/renderFolderViewSlots.js +0 -61
- package/dist/views/CollectionFolders/renderFolderViewSlots.js.map +0 -1
- package/dist/views/CreateFirstUser/index.scss +0 -21
- package/dist/views/Dashboard/Default/ModularDashboard/index.scss +0 -318
- package/dist/views/Login/LoginForm/index.scss +0 -10
- package/dist/views/Login/index.scss +0 -10
- package/dist/views/Logout/index.scss +0 -25
- package/dist/views/NotFound/index.scss +0 -57
- package/dist/views/ResetPassword/index.scss +0 -11
- package/dist/views/Unauthorized/index.scss +0 -14
- package/dist/views/Verify/index.scss +0 -16
- package/dist/views/Version/Default/index.scss +0 -170
- package/dist/views/Version/RenderFieldsToDiff/DiffCollapser/index.scss +0 -81
- package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.scss +0 -12
- package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.scss +0 -9
- package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.scss +0 -59
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.scss +0 -91
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.scss +0 -4
- package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.scss +0 -9
- package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.scss +0 -4
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.scss +0 -121
- package/dist/views/Version/RenderFieldsToDiff/index.scss +0 -24
- package/dist/views/Version/Restore/index.scss +0 -84
- package/dist/views/Version/SelectComparison/VersionDrawer/index.scss +0 -18
- package/dist/views/Version/SelectComparison/index.scss +0 -9
- package/dist/views/Version/VersionPillLabel/index.scss +0 -26
- package/dist/views/Versions/cells/AutosaveCell/index.scss +0 -9
- 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 ({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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":"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"}
|
|
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":[]}
|