From fd9af0165372212263233651cdbb086c6d1b929c Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Mon, 6 Oct 2025 10:13:22 -0700 Subject: [PATCH 1/3] commit --- packages/next/package.json | 20 ++++++++++++++ .../src/elements/DocumentHeader/index.tsx | 3 +++ .../src/elements/Nav/NavHamburger/index.tsx | 3 +++ .../src/elements/Nav/NavWrapper/index.tsx | 3 +++ .../next/src/elements/Nav/index.client.tsx | 3 +++ packages/next/src/esbuildEntry.ts | 2 +- packages/next/src/exports/elements.ts | 4 +++ packages/next/src/exports/rsc.ts | 3 +++ packages/next/src/exports/views.ts | 12 +++++++++ packages/next/src/views/Account/index.tsx | 2 +- .../src/views/Dashboard/Default/index.tsx | 4 +-- packages/next/src/views/Dashboard/index.tsx | 26 +++++++++++-------- packages/next/src/views/Document/index.tsx | 2 +- packages/next/src/views/List/index.tsx | 24 ++++++++++++++--- packages/next/src/views/Root/getRouteData.ts | 10 +++---- 15 files changed, 97 insertions(+), 24 deletions(-) create mode 100644 packages/next/src/exports/elements.ts create mode 100644 packages/next/src/exports/rsc.ts diff --git a/packages/next/package.json b/packages/next/package.json index de67cfefc55..d4ac1b9c0b3 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -64,6 +64,16 @@ "import": "./src/exports/views.ts", "types": "./src/exports/views.ts", "default": "./src/exports/views.ts" + }, + "./elements": { + "import": "./src/exports/elements.ts", + "types": "./src/exports/elements.ts", + "default": "./src/exports/elements.ts" + }, + "./rsc": { + "import": "./src/exports/rsc.ts", + "types": "./src/exports/rsc.ts", + "default": "./src/exports/rsc.ts" } }, "main": "./src/index.js", @@ -177,6 +187,16 @@ "import": "./dist/exports/views.js", "types": "./dist/exports/views.d.ts", "default": "./dist/exports/views.js" + }, + "./elements": { + "import": "./dist/exports/elements.js", + "types": "./dist/exports/elements.d.ts", + "default": "./dist/exports/elements.js" + }, + "./rsc": { + "import": "./dist/exports/rsc.js", + "types": "./dist/exports/rsc.d.ts", + "default": "./dist/exports/rsc.js" } }, "main": "./dist/index.js", diff --git a/packages/next/src/elements/DocumentHeader/index.tsx b/packages/next/src/elements/DocumentHeader/index.tsx index a7640f3ed42..84c136015fa 100644 --- a/packages/next/src/elements/DocumentHeader/index.tsx +++ b/packages/next/src/elements/DocumentHeader/index.tsx @@ -13,6 +13,9 @@ import './index.scss' const baseClass = `doc-header` +/** + * @internal + */ export const DocumentHeader: React.FC<{ AfterHeader?: React.ReactNode collectionConfig?: SanitizedCollectionConfig diff --git a/packages/next/src/elements/Nav/NavHamburger/index.tsx b/packages/next/src/elements/Nav/NavHamburger/index.tsx index e8e550f34b4..a5654595b29 100644 --- a/packages/next/src/elements/Nav/NavHamburger/index.tsx +++ b/packages/next/src/elements/Nav/NavHamburger/index.tsx @@ -2,6 +2,9 @@ import { Hamburger, useNav } from '@payloadcms/ui' import React from 'react' +/** + * @internal + */ export const NavHamburger: React.FC<{ baseClass?: string }> = ({ baseClass }) => { diff --git a/packages/next/src/elements/Nav/NavWrapper/index.tsx b/packages/next/src/elements/Nav/NavWrapper/index.tsx index a2bde0712f9..19276e3283e 100644 --- a/packages/next/src/elements/Nav/NavWrapper/index.tsx +++ b/packages/next/src/elements/Nav/NavWrapper/index.tsx @@ -4,6 +4,9 @@ import React from 'react' import './index.scss' +/** + * @internal + */ export const NavWrapper: React.FC<{ baseClass?: string children: React.ReactNode diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index 7ba3213421f..d65fc56a8ec 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -12,6 +12,9 @@ import React, { Fragment } from 'react' const baseClass = 'nav' +/** + * @internal + */ export const DefaultNavClient: React.FC<{ groups: ReturnType navPreferences: NavPreferences diff --git a/packages/next/src/esbuildEntry.ts b/packages/next/src/esbuildEntry.ts index aadffdb39ce..072af044675 100644 --- a/packages/next/src/esbuildEntry.ts +++ b/packages/next/src/esbuildEntry.ts @@ -1,4 +1,4 @@ export { RootLayout } from './layouts/Root/index.js' -export { Dashboard as DashboardPage } from './views/Dashboard/index.js' +export { DashboardView } from './views/Dashboard/index.js' export { LoginView } from './views/Login/index.js' export { RootPage } from './views/Root/index.js' diff --git a/packages/next/src/exports/elements.ts b/packages/next/src/exports/elements.ts new file mode 100644 index 00000000000..268ddf40cd5 --- /dev/null +++ b/packages/next/src/exports/elements.ts @@ -0,0 +1,4 @@ +'use client' +export { DefaultNavClient } from '../elements/Nav/index.client.js' +export { NavHamburger } from '../elements/Nav/NavHamburger/index.js' +export { NavWrapper } from '../elements/Nav/NavWrapper/index.js' diff --git a/packages/next/src/exports/rsc.ts b/packages/next/src/exports/rsc.ts new file mode 100644 index 00000000000..5b6fb9ef6a2 --- /dev/null +++ b/packages/next/src/exports/rsc.ts @@ -0,0 +1,3 @@ +export { DocumentHeader } from '../elements/DocumentHeader/index.js' +export { Logo } from '../elements/Logo/index.js' +export { DefaultNav } from '../elements/Nav/index.js' diff --git a/packages/next/src/exports/views.ts b/packages/next/src/exports/views.ts index 91d9995db3e..dc91620405e 100644 --- a/packages/next/src/exports/views.ts +++ b/packages/next/src/exports/views.ts @@ -1,3 +1,15 @@ +export { AccountView } from '../views/Account/index.js' +export { + type DashboardViewClientProps, + type DashboardViewServerProps, + type DashboardViewServerPropsOnly, + DefaultDashboard, +} from '../views/Dashboard/Default/index.js' +export { DashboardView } from '../views/Dashboard/index.js' + +export { ListView, renderListView, type RenderListViewArgs } from '../views/List/index.js' +export { LoginView } from '../views/Login/index.js' export { NotFoundPage } from '../views/NotFound/index.js' + export { type GenerateViewMetadata, RootPage } from '../views/Root/index.js' export { generatePageMetadata } from '../views/Root/metadata.js' diff --git a/packages/next/src/views/Account/index.tsx b/packages/next/src/views/Account/index.tsx index 1ffc791508b..7bb0ab89a6d 100644 --- a/packages/next/src/views/Account/index.tsx +++ b/packages/next/src/views/Account/index.tsx @@ -16,7 +16,7 @@ import { EditView } from '../Edit/index.js' import { AccountClient } from './index.client.js' import { Settings } from './Settings/index.js' -export async function Account({ initPageResult, params, searchParams }: AdminViewServerProps) { +export async function AccountView({ initPageResult, params, searchParams }: AdminViewServerProps) { const { languageOptions, locale, diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index e8111bdb121..92e9ce83b55 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -1,5 +1,5 @@ import type { groupNavItems } from '@payloadcms/ui/shared' -import type { ClientUser, Locale, ServerProps } from 'payload' +import type { AdminViewServerPropsOnly, ClientUser, Locale, ServerProps } from 'payload' import { getTranslation } from '@payloadcms/translations' import { Button, Card, Gutter, Locked } from '@payloadcms/ui' @@ -29,7 +29,7 @@ export type DashboardViewServerPropsOnly = { */ Link?: React.ComponentType navGroups?: ReturnType -} & ServerProps +} & AdminViewServerPropsOnly export type DashboardViewServerProps = DashboardViewClientProps & DashboardViewServerPropsOnly diff --git a/packages/next/src/views/Dashboard/index.tsx b/packages/next/src/views/Dashboard/index.tsx index f63869a461a..77d2667c483 100644 --- a/packages/next/src/views/Dashboard/index.tsx +++ b/packages/next/src/views/Dashboard/index.tsx @@ -1,5 +1,5 @@ import type { EntityToGroup } from '@payloadcms/ui/shared' -import type { AdminViewServerProps } from 'payload' +import type { AdminViewServerProps, TypedUser } from 'payload' import { HydrateAuthProvider, SetStepNav } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' @@ -10,7 +10,9 @@ import type { DashboardViewClientProps, DashboardViewServerPropsOnly } from './D import { DefaultDashboard } from './Default/index.js' -export async function Dashboard({ initPageResult, params, searchParams }: AdminViewServerProps) { +const globalLockDurationDefault = 300 + +export async function DashboardView(props: AdminViewServerProps) { const { locale, permissions, @@ -22,8 +24,7 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV }, req, visibleEntities, - } = initPageResult - + } = props.initPageResult const collections = config.collections.filter( (collection) => permissions?.collections?.[collection.slug]?.read && @@ -36,7 +37,7 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV ) // Query locked global documents only if there are globals in the config - let globalData = [] + let globalData: DashboardViewServerPropsOnly['globalData'] = [] if (config.globals.length > 0) { const lockedDocuments = await payload.find({ @@ -45,6 +46,11 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV overrideAccess: false, pagination: false, req, + select: { + globalSlug: true, + updatedAt: true, + user: true, + }, where: { globalSlug: { exists: true, @@ -54,11 +60,10 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV // Map over globals to include `lockDuration` and lock data for each global slug globalData = config.globals.map((global) => { - const lockDurationDefault = 300 const lockDuration = typeof global.lockDocuments === 'object' ? global.lockDocuments.duration - : lockDurationDefault + : globalLockDurationDefault const lockedDoc = lockedDocuments.docs.find((doc) => doc.globalSlug === global.slug) @@ -66,8 +71,8 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV slug: global.slug, data: { _isLocked: !!lockedDoc, - _lastEditedAt: lockedDoc?.updatedAt ?? null, - _userEditing: lockedDoc?.user?.value ?? null, + _lastEditedAt: (lockedDoc?.updatedAt as string) ?? null, + _userEditing: (lockedDoc?.user as { value?: TypedUser })?.value ?? null, }, lockDuration, } @@ -109,14 +114,13 @@ export async function Dashboard({ initPageResult, params, searchParams }: AdminV Fallback: DefaultDashboard, importMap: payload.importMap, serverProps: { + ...props, globalData, i18n, locale, navGroups, - params, payload, permissions, - searchParams, user, visibleEntities, } satisfies DashboardViewServerPropsOnly, diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 8d1fafdb6f0..0cd1d56e1ee 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -422,7 +422,7 @@ export const renderDocument = async ({ } } -export async function Document(props: AdminViewServerProps) { +export async function DocumentView(props: AdminViewServerProps) { try { const { Document: RenderedDocument } = await renderDocument(props) return RenderedDocument diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 4e98a9c564d..65001ae0c16 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -7,6 +7,7 @@ import type { ListViewClientProps, ListViewServerPropsOnly, PaginatedDocs, + PayloadComponent, QueryPreset, SanitizedCollectionPermission, } from 'payload' @@ -32,7 +33,17 @@ import { renderListViewSlots } from './renderListViewSlots.js' import { resolveAllFilterOptions } from './resolveAllFilterOptions.js' import { transformColumnsToSelect } from './transformColumnsToSelect.js' -type RenderListViewArgs = { +/** + * @internal + */ +export type RenderListViewArgs = { + /** + * Allows providing your own list view component. This will override the default list view component and + * the collection's configured list view component (if any). + */ + ComponentOverride?: + | PayloadComponent + | React.ComponentType customCellProps?: Record disableBulkDelete?: boolean disableBulkEdit?: boolean @@ -40,7 +51,10 @@ type RenderListViewArgs = { drawerSlug?: string enableRowSelections: boolean overrideEntityVisibility?: boolean - query: ListQuery + /** + * If not ListQuery is provided, `req.query` will be used. + */ + query?: ListQuery redirectAfterDelete?: boolean redirectAfterDuplicate?: boolean /** @@ -54,6 +68,8 @@ type RenderListViewArgs = { * the list view on the server for both: * - default list view * - list view within drawers + * + * @internal */ export const renderListView = async ( args: RenderListViewArgs, @@ -62,6 +78,7 @@ export const renderListView = async ( }> => { const { clientConfig, + ComponentOverride, customCellProps, disableBulkDelete, disableBulkEdit, @@ -385,7 +402,8 @@ export const renderListView = async ( Table, viewType, } satisfies ListViewClientProps, - Component: collectionConfig?.admin?.components?.views?.list?.Component, + Component: + ComponentOverride ?? collectionConfig?.admin?.components?.views?.list?.Component, Fallback: DefaultListView, importMap: payload.importMap, serverProps, diff --git a/packages/next/src/views/Root/getRouteData.ts b/packages/next/src/views/Root/getRouteData.ts index 88797d8fb61..f04ffd78d10 100644 --- a/packages/next/src/views/Root/getRouteData.ts +++ b/packages/next/src/views/Root/getRouteData.ts @@ -16,13 +16,13 @@ import type React from 'react' import { parseDocumentID } from 'payload' import { formatAdminURL, isNumber } from 'payload/shared' -import { Account } from '../Account/index.js' +import { AccountView } from '../Account/index.js' import { BrowseByFolder } from '../BrowseByFolder/index.js' import { CollectionFolderView } from '../CollectionFolders/index.js' import { TrashView } from '../CollectionTrash/index.js' import { CreateFirstUserView } from '../CreateFirstUser/index.js' -import { Dashboard } from '../Dashboard/index.js' -import { Document as DocumentView } from '../Document/index.js' +import { DashboardView } from '../Dashboard/index.js' +import { DocumentView } from '../Document/index.js' import { forgotPasswordBaseClass, ForgotPasswordView } from '../ForgotPassword/index.js' import { ListView } from '../List/index.js' import { loginBaseClass, LoginView } from '../Login/index.js' @@ -54,7 +54,7 @@ export type ViewFromConfig = { } const oneSegmentViews: OneSegmentViews = { - account: Account, + account: AccountView, browseByFolder: BrowseByFolder, createFirstUser: CreateFirstUserView, forgot: ForgotPasswordView, @@ -141,7 +141,7 @@ export const getRouteData = ({ case 0: { if (currentRoute === adminRoute) { ViewToRender = { - Component: Dashboard, + Component: DashboardView, } templateClassName = 'dashboard' templateType = 'default' From 7fe12f2aabd419ac4e56dccab39056dd3248fd6c Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Mon, 6 Oct 2025 11:09:06 -0700 Subject: [PATCH 2/3] rename --- packages/next/package.json | 8 ++++---- packages/next/src/exports/{elements.ts => client.ts} | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) rename packages/next/src/exports/{elements.ts => client.ts} (99%) diff --git a/packages/next/package.json b/packages/next/package.json index d4ac1b9c0b3..b6a557f0ebe 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -188,10 +188,10 @@ "types": "./dist/exports/views.d.ts", "default": "./dist/exports/views.js" }, - "./elements": { - "import": "./dist/exports/elements.js", - "types": "./dist/exports/elements.d.ts", - "default": "./dist/exports/elements.js" + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" }, "./rsc": { "import": "./dist/exports/rsc.js", diff --git a/packages/next/src/exports/elements.ts b/packages/next/src/exports/client.ts similarity index 99% rename from packages/next/src/exports/elements.ts rename to packages/next/src/exports/client.ts index 268ddf40cd5..7ed5deebf9c 100644 --- a/packages/next/src/exports/elements.ts +++ b/packages/next/src/exports/client.ts @@ -1,4 +1,5 @@ 'use client' + export { DefaultNavClient } from '../elements/Nav/index.client.js' export { NavHamburger } from '../elements/Nav/NavHamburger/index.js' export { NavWrapper } from '../elements/Nav/NavWrapper/index.js' From f0cccee989c9f2afaf456bc4c73ea0730a93bc57 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Mon, 6 Oct 2025 11:12:07 -0700 Subject: [PATCH 3/3] rename --- packages/next/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/next/package.json b/packages/next/package.json index b6a557f0ebe..4baf929c1b2 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -65,10 +65,10 @@ "types": "./src/exports/views.ts", "default": "./src/exports/views.ts" }, - "./elements": { - "import": "./src/exports/elements.ts", - "types": "./src/exports/elements.ts", - "default": "./src/exports/elements.ts" + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" }, "./rsc": { "import": "./src/exports/rsc.ts",