payload-nested-docs-page-tree 1.4.0 → 1.4.1
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/LICENSE +21 -21
- package/README.md +276 -231
- package/dist/components/PageTreeContext.js.map +1 -1
- package/dist/components/PageTreeListView.client.js.map +1 -1
- package/dist/components/PageTreeListView.module.css +358 -358
- package/dist/components/PageTreeListView.server.js.map +1 -1
- package/dist/components/PageTreeTitleCell.js.map +1 -1
- package/dist/endpoints/createMovePageEndpoint.d.ts +1 -0
- package/dist/endpoints/createMovePageEndpoint.js +24 -6
- package/dist/endpoints/createMovePageEndpoint.js.map +1 -1
- package/dist/endpoints/createReorderPageEndpoint.js +4 -1
- package/dist/endpoints/createReorderPageEndpoint.js.map +1 -1
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.js +22 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/badgeConfig.js.map +1 -1
- package/dist/utilities/dropTargets.js.map +1 -1
- package/dist/utilities/moveValidation.js.map +1 -1
- package/dist/utilities/pageTree.js.map +1 -1
- package/dist/utilities/pageTreeCollision.js.map +1 -1
- package/dist/utilities/pageTreeConfig.js.map +1 -1
- package/dist/utilities/status.js.map +1 -1
- package/package.json +42 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PageTreeListView.server.tsx"],"sourcesContent":["import type {\r\n ColumnPreference,\r\n ListQuery,\r\n ListViewClientProps,\r\n PaginatedDocs,\r\n Params,\r\n} from 'payload'\r\n\r\nimport React from 'react'\r\nimport { getColumns, renderTable } from '@payloadcms/ui/rsc'\r\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\r\nimport { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere } from 'payload/shared'\r\n\r\nimport PageTreeListViewClient from './PageTreeListView.client.js'\r\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\r\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\r\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\r\nimport type { PageTreeSourceDoc } from '../types.js'\r\n\r\ntype ParsedQuery = Partial<ListQuery> & Record<string, unknown>\r\ntype ServerListViewProps = Record<string, any>\r\n\r\nfunction isNumericSegment(segment: string): boolean {\r\n return /^\\d+$/.test(segment)\r\n}\r\n\r\nfunction getKeySegments(key: string): string[] {\r\n const matches = key.match(/([^[\\]]+)/g)\r\n return matches ? matches.filter(Boolean) : [key]\r\n}\r\n\r\nfunction setNestedValue(target: Record<string, unknown>, key: string, value: string): void {\r\n const segments = getKeySegments(key)\r\n\r\n if (segments.length === 0) {\r\n return\r\n }\r\n\r\n let current: Record<string, unknown> | unknown[] = target\r\n\r\n for (let index = 0; index < segments.length; index += 1) {\r\n const segment = segments[index]\r\n const isLastSegment = index === segments.length - 1\r\n const nextSegment = segments[index + 1]\r\n const nextContainer: Record<string, unknown> | unknown[] = isNumericSegment(nextSegment ?? '')\r\n ? []\r\n : {}\r\n\r\n if (isLastSegment) {\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n current[arrayIndex] = value\r\n } else {\r\n const existingValue = current[segment]\r\n\r\n if (existingValue === undefined) {\r\n current[segment] = value\r\n } else if (Array.isArray(existingValue)) {\r\n existingValue.push(value)\r\n } else {\r\n current[segment] = [existingValue, value]\r\n }\r\n }\r\n\r\n return\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n const existingValue = current[arrayIndex]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[arrayIndex] = nextContainer\r\n }\r\n\r\n current = current[arrayIndex] as Record<string, unknown> | unknown[]\r\n continue\r\n }\r\n\r\n const existingValue = current[segment]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[segment] = nextContainer\r\n }\r\n\r\n current = current[segment] as Record<string, unknown> | unknown[]\r\n }\r\n}\r\n\r\nfunction parseSearchParams(searchParams?: Params): ParsedQuery {\r\n const parsed: ParsedQuery = {}\r\n\r\n for (const [key, value] of Object.entries(searchParams ?? {})) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n if (typeof entry === 'string') {\r\n setNestedValue(parsed, key, entry)\r\n }\r\n }\r\n } else if (typeof value === 'string') {\r\n setNestedValue(parsed, key, value)\r\n }\r\n }\r\n\r\n for (const key of ['columns', 'queryByGroup']) {\r\n if (typeof parsed[key] === 'string') {\r\n try {\r\n parsed[key] = JSON.parse(parsed[key] as string)\r\n } catch {\r\n // Leave invalid persisted values untouched and let Payload ignore them.\r\n }\r\n }\r\n }\r\n\r\n const sanitized: ParsedQuery = { ...parsed }\r\n\r\n for (const [key, value] of Object.entries(sanitized)) {\r\n if (\r\n key === 'columns' &&\r\n ((typeof value === 'string' && value === '[]') ||\r\n (Array.isArray(value) && value.length === 0))\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (\r\n key === 'where' &&\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Object.keys(value).length\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if ((key === 'limit' || key === 'page') && typeof value === 'string') {\r\n const parsedValue = Number.parseInt(value, 10)\r\n sanitized[key] = Number.isNaN(parsedValue) ? undefined : parsedValue\r\n }\r\n\r\n if (key === 'page' && value === 0) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (value === '') {\r\n delete sanitized[key]\r\n }\r\n }\r\n\r\n return sanitized\r\n}\r\n\r\nfunction getQueryValue<T>(incomingValue: T | undefined, fallbackValue: T): T {\r\n return incomingValue === undefined ? fallbackValue : incomingValue\r\n}\r\n\r\nfunction normalizeLimit(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizePage(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizeSearch(value: unknown): string {\r\n return typeof value === 'string' ? value : ''\r\n}\r\n\r\nfunction normalizeSort(value: unknown): string | undefined {\r\n if (Array.isArray(value)) {\r\n const sortValues = value.filter(\r\n (entry): entry is string => typeof entry === 'string' && entry.length > 0,\r\n )\r\n return sortValues.length > 0 ? sortValues.join(',') : undefined\r\n }\r\n\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\nfunction getOrderableFieldName(collectionConfig: ServerListViewProps['collectionConfig']) {\r\n return collectionConfig.orderable === true\r\n ? '_order'\r\n : typeof collectionConfig.orderable === 'string'\r\n ? collectionConfig.orderable\r\n : undefined\r\n}\r\n\r\nfunction getDefaultSort(collectionConfig: ServerListViewProps['collectionConfig']) {\r\n return typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined\r\n}\r\n\r\nfunction getEffectiveTreeSort(args: {\r\n defaultSort?: string\r\n orderableFieldName?: string\r\n sort?: string\r\n}): string | undefined {\r\n const { defaultSort, orderableFieldName, sort } = args\r\n\r\n if (sort) {\r\n return sort\r\n }\r\n\r\n if (\r\n orderableFieldName &&\r\n (defaultSort === orderableFieldName || defaultSort === `-${orderableFieldName}`)\r\n ) {\r\n return defaultSort\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction normalizeWhere(value: unknown): any {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction getCurrentQuery(props: ServerListViewProps, fallbackLimit: number): ListQuery {\r\n const parsedSearchQuery = parseSearchParams(props.searchParams)\r\n const preferenceQuery = (props.listPreferences ?? {}) as Partial<ListQuery>\r\n const mergedQuery = {\r\n ...preferenceQuery,\r\n ...parsedSearchQuery,\r\n } as ParsedQuery\r\n\r\n return {\r\n ...mergedQuery,\r\n limit: normalizeLimit(\r\n getQueryValue(mergedQuery.limit as number | undefined, fallbackLimit),\r\n fallbackLimit,\r\n ),\r\n page: normalizePage(\r\n getQueryValue(mergedQuery.page as number | undefined, props.data.page),\r\n props.data.page,\r\n ),\r\n search: normalizeSearch(mergedQuery.search),\r\n sort: normalizeSort(mergedQuery.sort) ?? normalizeSort(preferenceQuery.sort) ?? undefined,\r\n where: normalizeWhere(mergedQuery.where),\r\n }\r\n}\r\n\r\nfunction getBaseFilterArgs(\r\n props: ServerListViewProps,\r\n req: any,\r\n query: ListQuery,\r\n locale?: string,\r\n) {\r\n return {\r\n limit: 0,\r\n locale,\r\n page: 1,\r\n req,\r\n sort:\r\n normalizeSort(query.sort) ??\r\n (typeof props.collectionConfig.defaultSort === 'string'\r\n ? props.collectionConfig.defaultSort\r\n : 'id'),\r\n }\r\n}\r\n\r\nasync function getDocsWithDisplayStatus(args: {\r\n collectionConfig: ServerListViewProps['collectionConfig']\r\n collectionSlug: string\r\n docs: PageTreeSourceDoc[]\r\n locale?: string\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<PageTreeSourceDoc[]> {\r\n const { collectionConfig, collectionSlug, docs, locale, payload, req, user } = args\r\n\r\n if (!collectionConfig.versions?.drafts || docs.length === 0) {\r\n return docs\r\n }\r\n\r\n const docIDs = docs\r\n .map((doc) => doc.id)\r\n .filter((id): id is number | string => typeof id === 'number' || typeof id === 'string')\r\n\r\n if (docIDs.length === 0) {\r\n return docs\r\n }\r\n\r\n const currentResult = await payload.find({\r\n collection: collectionSlug,\r\n depth: 0,\r\n fallbackLocale: false,\r\n locale,\r\n pagination: false,\r\n req,\r\n select: {\r\n _status: true,\r\n id: true,\r\n },\r\n user,\r\n where: {\r\n id: {\r\n in: docIDs,\r\n },\r\n },\r\n } as never)\r\n\r\n return withPageTreeDisplayStatuses({\r\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\r\n draftDocs: docs,\r\n })\r\n}\r\n\r\nasync function getListClientConfig({\r\n collectionSlug,\r\n i18n,\r\n payload,\r\n req,\r\n user,\r\n}: {\r\n collectionSlug: string\r\n i18n: unknown\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<{\r\n clientCollectionConfig: any\r\n clientConfig: any\r\n}> {\r\n const clientConfig = getClientConfig({\r\n config: payload.config,\r\n i18n: i18n as never,\r\n importMap: payload.importMap,\r\n user: (user ?? true) as never,\r\n } as never)\r\n\r\n await applyLocaleFiltering({\r\n clientConfig,\r\n config: payload.config,\r\n req,\r\n } as never)\r\n\r\n const clientCollectionConfig = clientConfig.collections.find(\r\n (collection) => collection.slug === collectionSlug,\r\n )\r\n\r\n if (!clientCollectionConfig) {\r\n throw new Error(`Could not resolve client collection config for \"${collectionSlug}\"`)\r\n }\r\n\r\n return {\r\n clientCollectionConfig,\r\n clientConfig,\r\n }\r\n}\r\n\r\nexport async function NestedDocsPageTreeListView(props: ServerListViewProps) {\r\n const pageTreeConfig = getCollectionPageTreeConfig(props.collectionConfig)\r\n\r\n if (!pageTreeConfig) {\r\n throw new Error(`Could not resolve page tree config for \"${props.collectionSlug}\"`)\r\n }\r\n\r\n if (typeof props.collectionConfig.admin.useAsTitle !== 'string') {\r\n throw new Error(`Collection \"${props.collectionSlug}\" must define admin.useAsTitle`)\r\n }\r\n\r\n const query = getCurrentQuery(props, pageTreeConfig.defaultLimit)\r\n const orderableFieldName = getOrderableFieldName(props.collectionConfig)\r\n const defaultSort = getDefaultSort(props.collectionConfig)\r\n const effectiveSort = getEffectiveTreeSort({\r\n defaultSort,\r\n orderableFieldName,\r\n sort: normalizeSort(query.sort),\r\n })\r\n const effectiveQuery = {\r\n ...query,\r\n sort: effectiveSort,\r\n }\r\n const locale = props.locale?.code\r\n const req = {\r\n i18n: props.i18n,\r\n locale,\r\n payload: props.payload,\r\n query: effectiveQuery,\r\n user: props.user,\r\n }\r\n\r\n const baseFilter =\r\n props.collectionConfig.admin?.baseFilter ?? props.collectionConfig.admin?.baseListFilter\r\n const baseFilterConstraint = baseFilter\r\n ? await baseFilter(getBaseFilterArgs(props, req, query, locale))\r\n : undefined\r\n const mergedWhere = combineWhereConstraints([\r\n mergeListSearchAndWhere({\r\n collectionConfig: props.collectionConfig,\r\n search: normalizeSearch(query.search),\r\n where: normalizeWhere(query.where),\r\n } as never),\r\n baseFilterConstraint ?? undefined,\r\n ])\r\n const where = Object.keys(mergedWhere).length > 0 ? mergedWhere : undefined\r\n\r\n const fullResult = await props.payload.find({\r\n collection: props.collectionSlug,\r\n depth: 0,\r\n draft: props.collectionConfig.versions?.drafts ? true : undefined,\r\n fallbackLocale: false,\r\n includeLockStatus: true,\r\n locale,\r\n pagination: false,\r\n req,\r\n sort: normalizeSort(query.sort) ?? defaultSort,\r\n user: props.user,\r\n where,\r\n } as never)\r\n const treeSourceDocs = await getDocsWithDisplayStatus({\r\n collectionConfig: props.collectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n docs: fullResult.docs as unknown as PageTreeSourceDoc[],\r\n locale,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n\r\n const orderedDocs = buildPageTreeDocs(treeSourceDocs, {\r\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\r\n sort: effectiveSort,\r\n })\r\n const orderedData: PaginatedDocs = {\r\n docs: orderedDocs,\r\n hasNextPage: false,\r\n hasPrevPage: false,\r\n limit: normalizeLimit(query.limit, pageTreeConfig.defaultLimit),\r\n nextPage: null,\r\n page: 1,\r\n pagingCounter: orderedDocs.length > 0 ? 1 : 0,\r\n prevPage: null,\r\n totalDocs: orderedDocs.length,\r\n totalPages: 1,\r\n }\r\n const { clientCollectionConfig, clientConfig } = await getListClientConfig({\r\n collectionSlug: props.collectionSlug,\r\n i18n: props.i18n,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n const columnPreferences: ColumnPreference[] = (props.columnState as Array<{\r\n accessor: string\r\n active: boolean\r\n }>).map(({ accessor, active }) => ({\r\n accessor,\r\n active: accessor === props.collectionConfig.admin.useAsTitle ? true : active,\r\n }))\r\n const columns = getColumns({\r\n clientConfig,\r\n collectionConfig: clientCollectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n columns: columnPreferences,\r\n i18n: props.i18n,\r\n permissions: props.permissions,\r\n } as never)\r\n const fieldPermissions = props.permissions?.collections?.[props.collectionSlug]?.fields ?? true\r\n const renderedTable = await renderTable({\r\n clientCollectionConfig,\r\n clientConfig,\r\n collectionConfig: props.collectionConfig,\r\n columns,\r\n data: orderedData,\r\n enableRowSelections: Boolean(props.enableRowSelections),\r\n fieldPermissions,\r\n i18n: props.i18n,\r\n orderableFieldName: orderableFieldName ?? '',\r\n payload: props.payload,\r\n query: effectiveQuery,\r\n req,\r\n tableAppearance: 'default',\r\n useAsTitle: props.collectionConfig.admin.useAsTitle,\r\n viewType: props.viewType,\r\n } as never)\r\n const clientProps: Omit<ListViewClientProps, 'Table' | 'columnState'> = {\r\n AfterList: props.AfterList,\r\n AfterListTable: props.AfterListTable,\r\n BeforeList: props.BeforeList,\r\n BeforeListTable: props.BeforeListTable,\r\n Description: props.Description,\r\n beforeActions: props.beforeActions,\r\n collectionSlug: props.collectionSlug,\r\n disableBulkDelete: props.disableBulkDelete,\r\n disableBulkEdit: props.disableBulkEdit,\r\n disableQueryPresets: props.disableQueryPresets,\r\n enableRowSelections: props.enableRowSelections,\r\n hasCreatePermission: props.hasCreatePermission,\r\n hasDeletePermission: props.hasDeletePermission,\r\n hasTrashPermission: props.hasTrashPermission,\r\n listMenuItems: props.listMenuItems,\r\n listPreferences: props.listPreferences,\r\n newDocumentURL: props.newDocumentURL,\r\n preferenceKey: props.preferenceKey,\r\n queryPreset: props.queryPreset,\r\n queryPresetPermissions: props.queryPresetPermissions,\r\n renderedFilters: props.renderedFilters,\r\n resolvedFilterOptions: props.resolvedFilterOptions,\r\n viewType: props.viewType,\r\n }\r\n const canMoveDocs = Boolean(props.permissions?.collections?.[props.collectionSlug]?.update)\r\n\r\n return (\r\n <PageTreeListViewClient\r\n {...clientProps}\r\n allDocs={orderedDocs}\r\n badgeConfig={pageTreeConfig.badges}\r\n canMoveDocs={canMoveDocs}\r\n columnState={renderedTable.columnState}\r\n homeIndicatorEnabled={pageTreeConfig.homeIndicator.enabled}\r\n orderableFieldName={orderableFieldName}\r\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\r\n query={effectiveQuery}\r\n sourceDocs={treeSourceDocs}\r\n useAsTitle={props.collectionConfig.admin.useAsTitle}\r\n />\r\n )\r\n}\r\n\r\nexport default NestedDocsPageTreeListView\r\n"],"names":["React","getColumns","renderTable","getClientConfig","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","PageTreeListViewClient","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","isNumericSegment","segment","test","getKeySegments","key","matches","match","filter","Boolean","setNestedValue","target","value","segments","length","current","index","isLastSegment","nextSegment","nextContainer","Array","isArray","arrayIndex","Number","existingValue","undefined","push","parseSearchParams","searchParams","parsed","Object","entries","entry","JSON","parse","sanitized","keys","parsedValue","parseInt","isNaN","getQueryValue","incomingValue","fallbackValue","normalizeLimit","fallback","normalizePage","normalizeSearch","normalizeSort","sortValues","join","getOrderableFieldName","collectionConfig","orderable","getDefaultSort","defaultSort","getEffectiveTreeSort","args","orderableFieldName","sort","normalizeWhere","getCurrentQuery","props","fallbackLimit","parsedSearchQuery","preferenceQuery","listPreferences","mergedQuery","limit","page","data","search","where","getBaseFilterArgs","req","query","locale","getDocsWithDisplayStatus","collectionSlug","docs","payload","user","versions","drafts","docIDs","map","doc","id","currentResult","find","collection","depth","fallbackLocale","pagination","select","_status","in","currentDocs","draftDocs","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","admin","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","fullResult","draft","includeLockStatus","treeSourceDocs","orderedDocs","parentFieldSlug","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","columnState","accessor","active","columns","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","viewType","clientProps","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","beforeActions","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","allDocs","badgeConfig","badges","homeIndicatorEnabled","homeIndicator","enabled","sourceDocs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/PageTreeListView.server.tsx"],"sourcesContent":["import type {\n ColumnPreference,\n ListQuery,\n ListViewClientProps,\n PaginatedDocs,\n Params,\n} from 'payload'\n\nimport React from 'react'\nimport { getColumns, renderTable } from '@payloadcms/ui/rsc'\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere } from 'payload/shared'\n\nimport PageTreeListViewClient from './PageTreeListView.client.js'\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\nimport type { PageTreeSourceDoc } from '../types.js'\n\ntype ParsedQuery = Partial<ListQuery> & Record<string, unknown>\ntype ServerListViewProps = Record<string, any>\n\nfunction isNumericSegment(segment: string): boolean {\n return /^\\d+$/.test(segment)\n}\n\nfunction getKeySegments(key: string): string[] {\n const matches = key.match(/([^[\\]]+)/g)\n return matches ? matches.filter(Boolean) : [key]\n}\n\nfunction setNestedValue(target: Record<string, unknown>, key: string, value: string): void {\n const segments = getKeySegments(key)\n\n if (segments.length === 0) {\n return\n }\n\n let current: Record<string, unknown> | unknown[] = target\n\n for (let index = 0; index < segments.length; index += 1) {\n const segment = segments[index]\n const isLastSegment = index === segments.length - 1\n const nextSegment = segments[index + 1]\n const nextContainer: Record<string, unknown> | unknown[] = isNumericSegment(nextSegment ?? '')\n ? []\n : {}\n\n if (isLastSegment) {\n if (Array.isArray(current)) {\n const arrayIndex = Number(segment)\n current[arrayIndex] = value\n } else {\n const existingValue = current[segment]\n\n if (existingValue === undefined) {\n current[segment] = value\n } else if (Array.isArray(existingValue)) {\n existingValue.push(value)\n } else {\n current[segment] = [existingValue, value]\n }\n }\n\n return\n }\n\n if (Array.isArray(current)) {\n const arrayIndex = Number(segment)\n const existingValue = current[arrayIndex]\n\n if (\n typeof existingValue !== 'object' ||\n existingValue === null ||\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\n ) {\n current[arrayIndex] = nextContainer\n }\n\n current = current[arrayIndex] as Record<string, unknown> | unknown[]\n continue\n }\n\n const existingValue = current[segment]\n\n if (\n typeof existingValue !== 'object' ||\n existingValue === null ||\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\n ) {\n current[segment] = nextContainer\n }\n\n current = current[segment] as Record<string, unknown> | unknown[]\n }\n}\n\nfunction parseSearchParams(searchParams?: Params): ParsedQuery {\n const parsed: ParsedQuery = {}\n\n for (const [key, value] of Object.entries(searchParams ?? {})) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (typeof entry === 'string') {\n setNestedValue(parsed, key, entry)\n }\n }\n } else if (typeof value === 'string') {\n setNestedValue(parsed, key, value)\n }\n }\n\n for (const key of ['columns', 'queryByGroup']) {\n if (typeof parsed[key] === 'string') {\n try {\n parsed[key] = JSON.parse(parsed[key] as string)\n } catch {\n // Leave invalid persisted values untouched and let Payload ignore them.\n }\n }\n }\n\n const sanitized: ParsedQuery = { ...parsed }\n\n for (const [key, value] of Object.entries(sanitized)) {\n if (\n key === 'columns' &&\n ((typeof value === 'string' && value === '[]') ||\n (Array.isArray(value) && value.length === 0))\n ) {\n delete sanitized[key]\n continue\n }\n\n if (\n key === 'where' &&\n typeof value === 'object' &&\n value !== null &&\n !Object.keys(value).length\n ) {\n delete sanitized[key]\n continue\n }\n\n if ((key === 'limit' || key === 'page') && typeof value === 'string') {\n const parsedValue = Number.parseInt(value, 10)\n sanitized[key] = Number.isNaN(parsedValue) ? undefined : parsedValue\n }\n\n if (key === 'page' && value === 0) {\n delete sanitized[key]\n continue\n }\n\n if (value === '') {\n delete sanitized[key]\n }\n }\n\n return sanitized\n}\n\nfunction getQueryValue<T>(incomingValue: T | undefined, fallbackValue: T): T {\n return incomingValue === undefined ? fallbackValue : incomingValue\n}\n\nfunction normalizeLimit(value: unknown, fallback: number): number {\n return typeof value === 'number' && value > 0 ? value : fallback\n}\n\nfunction normalizePage(value: unknown, fallback: number): number {\n return typeof value === 'number' && value > 0 ? value : fallback\n}\n\nfunction normalizeSearch(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction normalizeSort(value: unknown): string | undefined {\n if (Array.isArray(value)) {\n const sortValues = value.filter(\n (entry): entry is string => typeof entry === 'string' && entry.length > 0,\n )\n return sortValues.length > 0 ? sortValues.join(',') : undefined\n }\n\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction getOrderableFieldName(collectionConfig: ServerListViewProps['collectionConfig']) {\n return collectionConfig.orderable === true\n ? '_order'\n : typeof collectionConfig.orderable === 'string'\n ? collectionConfig.orderable\n : undefined\n}\n\nfunction getDefaultSort(collectionConfig: ServerListViewProps['collectionConfig']) {\n return typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined\n}\n\nfunction getEffectiveTreeSort(args: {\n defaultSort?: string\n orderableFieldName?: string\n sort?: string\n}): string | undefined {\n const { defaultSort, orderableFieldName, sort } = args\n\n if (sort) {\n return sort\n }\n\n if (\n orderableFieldName &&\n (defaultSort === orderableFieldName || defaultSort === `-${orderableFieldName}`)\n ) {\n return defaultSort\n }\n\n return undefined\n}\n\nfunction normalizeWhere(value: unknown): any {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value\n }\n\n return undefined\n}\n\nfunction getCurrentQuery(props: ServerListViewProps, fallbackLimit: number): ListQuery {\n const parsedSearchQuery = parseSearchParams(props.searchParams)\n const preferenceQuery = (props.listPreferences ?? {}) as Partial<ListQuery>\n const mergedQuery = {\n ...preferenceQuery,\n ...parsedSearchQuery,\n } as ParsedQuery\n\n return {\n ...mergedQuery,\n limit: normalizeLimit(\n getQueryValue(mergedQuery.limit as number | undefined, fallbackLimit),\n fallbackLimit,\n ),\n page: normalizePage(\n getQueryValue(mergedQuery.page as number | undefined, props.data.page),\n props.data.page,\n ),\n search: normalizeSearch(mergedQuery.search),\n sort: normalizeSort(mergedQuery.sort) ?? normalizeSort(preferenceQuery.sort) ?? undefined,\n where: normalizeWhere(mergedQuery.where),\n }\n}\n\nfunction getBaseFilterArgs(\n props: ServerListViewProps,\n req: any,\n query: ListQuery,\n locale?: string,\n) {\n return {\n limit: 0,\n locale,\n page: 1,\n req,\n sort:\n normalizeSort(query.sort) ??\n (typeof props.collectionConfig.defaultSort === 'string'\n ? props.collectionConfig.defaultSort\n : 'id'),\n }\n}\n\nasync function getDocsWithDisplayStatus(args: {\n collectionConfig: ServerListViewProps['collectionConfig']\n collectionSlug: string\n docs: PageTreeSourceDoc[]\n locale?: string\n payload: any\n req: any\n user: unknown\n}): Promise<PageTreeSourceDoc[]> {\n const { collectionConfig, collectionSlug, docs, locale, payload, req, user } = args\n\n if (!collectionConfig.versions?.drafts || docs.length === 0) {\n return docs\n }\n\n const docIDs = docs\n .map((doc) => doc.id)\n .filter((id): id is number | string => typeof id === 'number' || typeof id === 'string')\n\n if (docIDs.length === 0) {\n return docs\n }\n\n const currentResult = await payload.find({\n collection: collectionSlug,\n depth: 0,\n fallbackLocale: false,\n locale,\n pagination: false,\n req,\n select: {\n _status: true,\n id: true,\n },\n user,\n where: {\n id: {\n in: docIDs,\n },\n },\n } as never)\n\n return withPageTreeDisplayStatuses({\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\n draftDocs: docs,\n })\n}\n\nasync function getListClientConfig({\n collectionSlug,\n i18n,\n payload,\n req,\n user,\n}: {\n collectionSlug: string\n i18n: unknown\n payload: any\n req: any\n user: unknown\n}): Promise<{\n clientCollectionConfig: any\n clientConfig: any\n}> {\n const clientConfig = getClientConfig({\n config: payload.config,\n i18n: i18n as never,\n importMap: payload.importMap,\n user: (user ?? true) as never,\n } as never)\n\n await applyLocaleFiltering({\n clientConfig,\n config: payload.config,\n req,\n } as never)\n\n const clientCollectionConfig = clientConfig.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n if (!clientCollectionConfig) {\n throw new Error(`Could not resolve client collection config for \"${collectionSlug}\"`)\n }\n\n return {\n clientCollectionConfig,\n clientConfig,\n }\n}\n\nexport async function NestedDocsPageTreeListView(props: ServerListViewProps) {\n const pageTreeConfig = getCollectionPageTreeConfig(props.collectionConfig)\n\n if (!pageTreeConfig) {\n throw new Error(`Could not resolve page tree config for \"${props.collectionSlug}\"`)\n }\n\n if (typeof props.collectionConfig.admin.useAsTitle !== 'string') {\n throw new Error(`Collection \"${props.collectionSlug}\" must define admin.useAsTitle`)\n }\n\n const query = getCurrentQuery(props, pageTreeConfig.defaultLimit)\n const orderableFieldName = getOrderableFieldName(props.collectionConfig)\n const defaultSort = getDefaultSort(props.collectionConfig)\n const effectiveSort = getEffectiveTreeSort({\n defaultSort,\n orderableFieldName,\n sort: normalizeSort(query.sort),\n })\n const effectiveQuery = {\n ...query,\n sort: effectiveSort,\n }\n const locale = props.locale?.code\n const req = {\n i18n: props.i18n,\n locale,\n payload: props.payload,\n query: effectiveQuery,\n user: props.user,\n }\n\n const baseFilter =\n props.collectionConfig.admin?.baseFilter ?? props.collectionConfig.admin?.baseListFilter\n const baseFilterConstraint = baseFilter\n ? await baseFilter(getBaseFilterArgs(props, req, query, locale))\n : undefined\n const mergedWhere = combineWhereConstraints([\n mergeListSearchAndWhere({\n collectionConfig: props.collectionConfig,\n search: normalizeSearch(query.search),\n where: normalizeWhere(query.where),\n } as never),\n baseFilterConstraint ?? undefined,\n ])\n const where = Object.keys(mergedWhere).length > 0 ? mergedWhere : undefined\n\n const fullResult = await props.payload.find({\n collection: props.collectionSlug,\n depth: 0,\n draft: props.collectionConfig.versions?.drafts ? true : undefined,\n fallbackLocale: false,\n includeLockStatus: true,\n locale,\n pagination: false,\n req,\n sort: normalizeSort(query.sort) ?? defaultSort,\n user: props.user,\n where,\n } as never)\n const treeSourceDocs = await getDocsWithDisplayStatus({\n collectionConfig: props.collectionConfig,\n collectionSlug: props.collectionSlug,\n docs: fullResult.docs as unknown as PageTreeSourceDoc[],\n locale,\n payload: props.payload,\n req,\n user: props.user,\n })\n\n const orderedDocs = buildPageTreeDocs(treeSourceDocs, {\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\n sort: effectiveSort,\n })\n const orderedData: PaginatedDocs = {\n docs: orderedDocs,\n hasNextPage: false,\n hasPrevPage: false,\n limit: normalizeLimit(query.limit, pageTreeConfig.defaultLimit),\n nextPage: null,\n page: 1,\n pagingCounter: orderedDocs.length > 0 ? 1 : 0,\n prevPage: null,\n totalDocs: orderedDocs.length,\n totalPages: 1,\n }\n const { clientCollectionConfig, clientConfig } = await getListClientConfig({\n collectionSlug: props.collectionSlug,\n i18n: props.i18n,\n payload: props.payload,\n req,\n user: props.user,\n })\n const columnPreferences: ColumnPreference[] = (props.columnState as Array<{\n accessor: string\n active: boolean\n }>).map(({ accessor, active }) => ({\n accessor,\n active: accessor === props.collectionConfig.admin.useAsTitle ? true : active,\n }))\n const columns = getColumns({\n clientConfig,\n collectionConfig: clientCollectionConfig,\n collectionSlug: props.collectionSlug,\n columns: columnPreferences,\n i18n: props.i18n,\n permissions: props.permissions,\n } as never)\n const fieldPermissions = props.permissions?.collections?.[props.collectionSlug]?.fields ?? true\n const renderedTable = await renderTable({\n clientCollectionConfig,\n clientConfig,\n collectionConfig: props.collectionConfig,\n columns,\n data: orderedData,\n enableRowSelections: Boolean(props.enableRowSelections),\n fieldPermissions,\n i18n: props.i18n,\n orderableFieldName: orderableFieldName ?? '',\n payload: props.payload,\n query: effectiveQuery,\n req,\n tableAppearance: 'default',\n useAsTitle: props.collectionConfig.admin.useAsTitle,\n viewType: props.viewType,\n } as never)\n const clientProps: Omit<ListViewClientProps, 'Table' | 'columnState'> = {\n AfterList: props.AfterList,\n AfterListTable: props.AfterListTable,\n BeforeList: props.BeforeList,\n BeforeListTable: props.BeforeListTable,\n Description: props.Description,\n beforeActions: props.beforeActions,\n collectionSlug: props.collectionSlug,\n disableBulkDelete: props.disableBulkDelete,\n disableBulkEdit: props.disableBulkEdit,\n disableQueryPresets: props.disableQueryPresets,\n enableRowSelections: props.enableRowSelections,\n hasCreatePermission: props.hasCreatePermission,\n hasDeletePermission: props.hasDeletePermission,\n hasTrashPermission: props.hasTrashPermission,\n listMenuItems: props.listMenuItems,\n listPreferences: props.listPreferences,\n newDocumentURL: props.newDocumentURL,\n preferenceKey: props.preferenceKey,\n queryPreset: props.queryPreset,\n queryPresetPermissions: props.queryPresetPermissions,\n renderedFilters: props.renderedFilters,\n resolvedFilterOptions: props.resolvedFilterOptions,\n viewType: props.viewType,\n }\n const canMoveDocs = Boolean(props.permissions?.collections?.[props.collectionSlug]?.update)\n\n return (\n <PageTreeListViewClient\n {...clientProps}\n allDocs={orderedDocs}\n badgeConfig={pageTreeConfig.badges}\n canMoveDocs={canMoveDocs}\n columnState={renderedTable.columnState}\n homeIndicatorEnabled={pageTreeConfig.homeIndicator.enabled}\n orderableFieldName={orderableFieldName}\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\n query={effectiveQuery}\n sourceDocs={treeSourceDocs}\n useAsTitle={props.collectionConfig.admin.useAsTitle}\n />\n )\n}\n\nexport default NestedDocsPageTreeListView\n"],"names":["React","getColumns","renderTable","getClientConfig","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","PageTreeListViewClient","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","isNumericSegment","segment","test","getKeySegments","key","matches","match","filter","Boolean","setNestedValue","target","value","segments","length","current","index","isLastSegment","nextSegment","nextContainer","Array","isArray","arrayIndex","Number","existingValue","undefined","push","parseSearchParams","searchParams","parsed","Object","entries","entry","JSON","parse","sanitized","keys","parsedValue","parseInt","isNaN","getQueryValue","incomingValue","fallbackValue","normalizeLimit","fallback","normalizePage","normalizeSearch","normalizeSort","sortValues","join","getOrderableFieldName","collectionConfig","orderable","getDefaultSort","defaultSort","getEffectiveTreeSort","args","orderableFieldName","sort","normalizeWhere","getCurrentQuery","props","fallbackLimit","parsedSearchQuery","preferenceQuery","listPreferences","mergedQuery","limit","page","data","search","where","getBaseFilterArgs","req","query","locale","getDocsWithDisplayStatus","collectionSlug","docs","payload","user","versions","drafts","docIDs","map","doc","id","currentResult","find","collection","depth","fallbackLocale","pagination","select","_status","in","currentDocs","draftDocs","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","admin","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","fullResult","draft","includeLockStatus","treeSourceDocs","orderedDocs","parentFieldSlug","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","columnState","accessor","active","columns","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","viewType","clientProps","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","beforeActions","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","allDocs","badgeConfig","badges","homeIndicatorEnabled","homeIndicator","enabled","sourceDocs"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PageTreeTitleCell.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useDraggable } from '@dnd-kit/core'\r\nimport { ChevronIcon, DragHandleIcon, useListQuery } from '@payloadcms/ui'\r\nimport React from 'react'\r\n\r\nimport type { PageTreeDoc } from '../utilities/pageTree.js'\r\n\r\nimport { usePageTree, usePageTreeRowDnd } from './PageTreeContext.js'\r\n\r\nconst HOME_PAGE_SLUG = 'home'\r\n\r\nfunction isHomePageDoc(doc: PageTreeDoc): boolean {\r\n return doc.__pageTreeParentID === null && doc.slug?.trim() === HOME_PAGE_SLUG\r\n}\r\n\r\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\r\n return Array.isArray(value) ? value[0] : value\r\n}\r\n\r\nfunction ParentMoveHandleIcon() {\n return (\n <svg\r\n aria-hidden=\"true\"\r\n className=\"icon icon--drag-handle\"\r\n fill=\"none\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n width=\"20\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\n className=\"stroke\"\n d=\"M13.75 4.25L6.25 15.75\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"2.25\"\n />\n </svg>\r\n )\n}\n\nfunction HomeIndicatorIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"pages-hierarchy-cell__home-icon\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 7L7 3L11.5 7V13.5H2.5V7Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function PageTreeTitleCell({\n children,\r\n doc,\r\n homeIndicatorEnabled,\r\n}: {\r\n children: React.ReactNode\r\n doc: PageTreeDoc\r\n homeIndicatorEnabled: boolean\r\n}) {\r\n const {\r\n activeDragRowID,\r\n canMoveDocs,\r\n collapsedIDs,\r\n parentMoveEnabled,\r\n pendingMoveRowID,\r\n toggleRow,\r\n } = usePageTree()\r\n const rowDnd = usePageTreeRowDnd()\r\n const { orderableFieldName, query = {} } = useListQuery()\r\n const depth = doc.__pageTreeDepth\r\n const hasChildren = doc.__pageTreeHasChildren\r\n const shadeLevel = Math.min(doc.__pageTreeShadeLevel, 6)\r\n const rowID = doc.__pageTreeID\r\n const isCollapsed = hasChildren && collapsedIDs.has(rowID)\r\n const dragIsDisabled = !canMoveDocs || !rowID || pendingMoveRowID !== null\r\n const showHomeIcon = homeIndicatorEnabled && isHomePageDoc(doc)\r\n const parentMoveDrag = useDraggable({\r\n id: `page-drag:${rowID}`,\r\n data: {\r\n dragType: 'move',\r\n rowID,\r\n },\r\n disabled: dragIsDisabled,\r\n })\r\n const querySort = normalizeSort(query.sort)\r\n const showOrderableHandle =\r\n canMoveDocs &&\r\n Boolean(orderableFieldName) &&\r\n (querySort === orderableFieldName || querySort === `-${orderableFieldName}`)\r\n const isActiveDragRow = activeDragRowID === rowID\r\n const isDragging = parentMoveDrag.isDragging || rowDnd?.isOrderDragging || isActiveDragRow\r\n\r\n return (\r\n <div\r\n className=\"pages-hierarchy-cell\"\r\n data-row-dragging={isDragging ? 'true' : 'false'}\r\n data-tree-depth={depth}\r\n data-tree-has-children={hasChildren ? 'true' : 'false'}\r\n data-tree-home={showHomeIcon ? 'true' : undefined}\r\n data-tree-shade-level={shadeLevel}\r\n style={{ '--pages-tree-depth': String(depth) } as React.CSSProperties}\r\n >\r\n {hasChildren ? (\r\n <button\r\n aria-expanded={!isCollapsed}\r\n aria-label={isCollapsed ? 'Expand nested items' : 'Collapse nested items'}\r\n className=\"pages-hierarchy-cell__toggle\"\r\n onClick={(event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n toggleRow(rowID)\r\n }}\r\n type=\"button\"\r\n >\r\n <ChevronIcon\r\n className={[\r\n 'pages-hierarchy-cell__chevron',\r\n isCollapsed ? 'pages-hierarchy-cell__chevron--collapsed' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n />\r\n </button>\r\n ) : (\r\n <span className=\"pages-hierarchy-cell__spacer\" />\r\n )}\r\n {showOrderableHandle ? (\r\n <button\r\n {...(rowDnd?.orderHandleAttributes ?? {})}\r\n {...(rowDnd?.orderHandleListeners ?? {})}\r\n aria-label=\"Reorder document within this parent\"\r\n className={[\r\n 'pages-hierarchy-cell__drag-handle',\r\n 'pages-hierarchy-cell__drag-handle--orderable',\r\n rowDnd?.isOrderDragging || isActiveDragRow\r\n ? 'pages-hierarchy-cell__drag-handle--active'\r\n : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n disabled={dragIsDisabled || !rowDnd}\r\n onClick={(event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }}\r\n ref={rowDnd?.orderHandleRef}\r\n type=\"button\"\r\n >\r\n <DragHandleIcon />\r\n </button>\r\n ) : null}\r\n {canMoveDocs && parentMoveEnabled ? (\r\n <button\r\n {...parentMoveDrag.attributes}\r\n {...parentMoveDrag.listeners}\r\n aria-label=\"Move document under another page\"\r\n className={[\r\n 'pages-hierarchy-cell__drag-handle',\r\n 'pages-hierarchy-cell__drag-handle--parent',\r\n parentMoveDrag.isDragging || isActiveDragRow\r\n ? 'pages-hierarchy-cell__drag-handle--active'\r\n : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n disabled={dragIsDisabled}\r\n onClick={(event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }}\r\n ref={parentMoveDrag.setNodeRef}\r\n type=\"button\"\r\n >\r\n <ParentMoveHandleIcon />\r\n </button>\r\n ) : null}\r\n <span className=\"pages-hierarchy-cell__content\">\n {showHomeIcon ? <HomeIndicatorIcon /> : null}\n {children}\n </span>\n </div>\n )\n}\n"],"names":["useDraggable","ChevronIcon","DragHandleIcon","useListQuery","React","usePageTree","usePageTreeRowDnd","HOME_PAGE_SLUG","isHomePageDoc","doc","__pageTreeParentID","slug","trim","normalizeSort","value","Array","isArray","ParentMoveHandleIcon","svg","aria-hidden","className","fill","height","viewBox","width","xmlns","path","d","stroke","strokeLinecap","strokeWidth","HomeIndicatorIcon","strokeLinejoin","PageTreeTitleCell","children","homeIndicatorEnabled","activeDragRowID","canMoveDocs","collapsedIDs","parentMoveEnabled","pendingMoveRowID","toggleRow","rowDnd","orderableFieldName","query","depth","__pageTreeDepth","hasChildren","__pageTreeHasChildren","shadeLevel","Math","min","__pageTreeShadeLevel","rowID","__pageTreeID","isCollapsed","has","dragIsDisabled","showHomeIcon","parentMoveDrag","id","data","dragType","disabled","querySort","sort","showOrderableHandle","Boolean","isActiveDragRow","isDragging","isOrderDragging","div","data-row-dragging","data-tree-depth","data-tree-has-children","data-tree-home","undefined","data-tree-shade-level","style","String","button","aria-expanded","aria-label","onClick","event","preventDefault","stopPropagation","type","filter","join","span","orderHandleAttributes","orderHandleListeners","ref","orderHandleRef","attributes","listeners","setNodeRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/PageTreeTitleCell.tsx"],"sourcesContent":["'use client'\n\nimport { useDraggable } from '@dnd-kit/core'\nimport { ChevronIcon, DragHandleIcon, useListQuery } from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { PageTreeDoc } from '../utilities/pageTree.js'\n\nimport { usePageTree, usePageTreeRowDnd } from './PageTreeContext.js'\n\nconst HOME_PAGE_SLUG = 'home'\n\nfunction isHomePageDoc(doc: PageTreeDoc): boolean {\n return doc.__pageTreeParentID === null && doc.slug?.trim() === HOME_PAGE_SLUG\n}\n\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value\n}\n\nfunction ParentMoveHandleIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"icon icon--drag-handle\"\n fill=\"none\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n className=\"stroke\"\n d=\"M13.75 4.25L6.25 15.75\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"2.25\"\n />\n </svg>\n )\n}\n\nfunction HomeIndicatorIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"pages-hierarchy-cell__home-icon\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 7L7 3L11.5 7V13.5H2.5V7Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function PageTreeTitleCell({\n children,\n doc,\n homeIndicatorEnabled,\n}: {\n children: React.ReactNode\n doc: PageTreeDoc\n homeIndicatorEnabled: boolean\n}) {\n const {\n activeDragRowID,\n canMoveDocs,\n collapsedIDs,\n parentMoveEnabled,\n pendingMoveRowID,\n toggleRow,\n } = usePageTree()\n const rowDnd = usePageTreeRowDnd()\n const { orderableFieldName, query = {} } = useListQuery()\n const depth = doc.__pageTreeDepth\n const hasChildren = doc.__pageTreeHasChildren\n const shadeLevel = Math.min(doc.__pageTreeShadeLevel, 6)\n const rowID = doc.__pageTreeID\n const isCollapsed = hasChildren && collapsedIDs.has(rowID)\n const dragIsDisabled = !canMoveDocs || !rowID || pendingMoveRowID !== null\n const showHomeIcon = homeIndicatorEnabled && isHomePageDoc(doc)\n const parentMoveDrag = useDraggable({\n id: `page-drag:${rowID}`,\n data: {\n dragType: 'move',\n rowID,\n },\n disabled: dragIsDisabled,\n })\n const querySort = normalizeSort(query.sort)\n const showOrderableHandle =\n canMoveDocs &&\n Boolean(orderableFieldName) &&\n (querySort === orderableFieldName || querySort === `-${orderableFieldName}`)\n const isActiveDragRow = activeDragRowID === rowID\n const isDragging = parentMoveDrag.isDragging || rowDnd?.isOrderDragging || isActiveDragRow\n\n return (\n <div\n className=\"pages-hierarchy-cell\"\n data-row-dragging={isDragging ? 'true' : 'false'}\n data-tree-depth={depth}\n data-tree-has-children={hasChildren ? 'true' : 'false'}\n data-tree-home={showHomeIcon ? 'true' : undefined}\n data-tree-shade-level={shadeLevel}\n style={{ '--pages-tree-depth': String(depth) } as React.CSSProperties}\n >\n {hasChildren ? (\n <button\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? 'Expand nested items' : 'Collapse nested items'}\n className=\"pages-hierarchy-cell__toggle\"\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n toggleRow(rowID)\n }}\n type=\"button\"\n >\n <ChevronIcon\n className={[\n 'pages-hierarchy-cell__chevron',\n isCollapsed ? 'pages-hierarchy-cell__chevron--collapsed' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n />\n </button>\n ) : (\n <span className=\"pages-hierarchy-cell__spacer\" />\n )}\n {showOrderableHandle ? (\n <button\n {...(rowDnd?.orderHandleAttributes ?? {})}\n {...(rowDnd?.orderHandleListeners ?? {})}\n aria-label=\"Reorder document within this parent\"\n className={[\n 'pages-hierarchy-cell__drag-handle',\n 'pages-hierarchy-cell__drag-handle--orderable',\n rowDnd?.isOrderDragging || isActiveDragRow\n ? 'pages-hierarchy-cell__drag-handle--active'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={dragIsDisabled || !rowDnd}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n ref={rowDnd?.orderHandleRef}\n type=\"button\"\n >\n <DragHandleIcon />\n </button>\n ) : null}\n {canMoveDocs && parentMoveEnabled ? (\n <button\n {...parentMoveDrag.attributes}\n {...parentMoveDrag.listeners}\n aria-label=\"Move document under another page\"\n className={[\n 'pages-hierarchy-cell__drag-handle',\n 'pages-hierarchy-cell__drag-handle--parent',\n parentMoveDrag.isDragging || isActiveDragRow\n ? 'pages-hierarchy-cell__drag-handle--active'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={dragIsDisabled}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n ref={parentMoveDrag.setNodeRef}\n type=\"button\"\n >\n <ParentMoveHandleIcon />\n </button>\n ) : null}\n <span className=\"pages-hierarchy-cell__content\">\n {showHomeIcon ? <HomeIndicatorIcon /> : null}\n {children}\n </span>\n </div>\n )\n}\n"],"names":["useDraggable","ChevronIcon","DragHandleIcon","useListQuery","React","usePageTree","usePageTreeRowDnd","HOME_PAGE_SLUG","isHomePageDoc","doc","__pageTreeParentID","slug","trim","normalizeSort","value","Array","isArray","ParentMoveHandleIcon","svg","aria-hidden","className","fill","height","viewBox","width","xmlns","path","d","stroke","strokeLinecap","strokeWidth","HomeIndicatorIcon","strokeLinejoin","PageTreeTitleCell","children","homeIndicatorEnabled","activeDragRowID","canMoveDocs","collapsedIDs","parentMoveEnabled","pendingMoveRowID","toggleRow","rowDnd","orderableFieldName","query","depth","__pageTreeDepth","hasChildren","__pageTreeHasChildren","shadeLevel","Math","min","__pageTreeShadeLevel","rowID","__pageTreeID","isCollapsed","has","dragIsDisabled","showHomeIcon","parentMoveDrag","id","data","dragType","disabled","querySort","sort","showOrderableHandle","Boolean","isActiveDragRow","isDragging","isOrderDragging","div","data-row-dragging","data-tree-depth","data-tree-has-children","data-tree-home","undefined","data-tree-shade-level","style","String","button","aria-expanded","aria-label","onClick","event","preventDefault","stopPropagation","type","filter","join","span","orderHandleAttributes","orderHandleListeners","ref","orderHandleRef","attributes","listeners","setNodeRef"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DIAGNOSTICS_FLOW_CONTEXT_KEY, createFlowID, readMainRowSnapshot } from '../utilities/diagnostics.js';
|
|
2
2
|
import { CANCEL_DRAG_MESSAGE } from '../utilities/moveValidation.js';
|
|
3
3
|
import { buildChildrenByParentID, collectDescendantIDs, getDocParentID, stringifyDocID } from '../utilities/pageTree.js';
|
|
4
|
-
import { pageTreeMoveContextKey } from '../types.js';
|
|
4
|
+
import { pageTreeMoveContextKey, pageTreeWriteContextKey } from '../types.js';
|
|
5
5
|
import { assertUpdateAccess, collectionHasAutosaveDrafts, collectionHasDrafts, getRequestedLocale, normalizeID, respond, toCollectionID } from './shared.js';
|
|
6
6
|
const SNAPSHOT_FIELDS = [
|
|
7
7
|
'_status'
|
|
@@ -91,7 +91,7 @@ async function readBodyFromRequest(req) {
|
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
93
|
export function createMovePageEndpoint(args) {
|
|
94
|
-
const { collectionSlug, diagnostics, parentFieldSlug } = args;
|
|
94
|
+
const { collectionSlug, diagnostics, parentFieldSlug, publishOnMove = false } = args;
|
|
95
95
|
const snapshotFields = [
|
|
96
96
|
...SNAPSHOT_FIELDS,
|
|
97
97
|
parentFieldSlug
|
|
@@ -205,22 +205,38 @@ export function createMovePageEndpoint(args) {
|
|
|
205
205
|
collectionSlug,
|
|
206
206
|
req
|
|
207
207
|
});
|
|
208
|
+
// With `publishOnMove`, publish the reparent right away instead of staging
|
|
209
|
+
// it — but ONLY when the moved doc had nothing staged before the move (its
|
|
210
|
+
// latest version, read above with `draft: true`, is already published). A
|
|
211
|
+
// doc with pending draft edits stays staged, so those in-progress edits are
|
|
212
|
+
// never published as a side effect of the move.
|
|
213
|
+
const publishMove = publishOnMove && hasDrafts && movedDoc._status === 'published';
|
|
208
214
|
const updateData = {
|
|
209
215
|
[parentFieldSlug]: body.parentID === null ? null : toCollectionID({
|
|
210
216
|
collectionSlug,
|
|
211
217
|
id: body.parentID,
|
|
212
218
|
req
|
|
213
|
-
})
|
|
219
|
+
}),
|
|
220
|
+
...publishMove ? {
|
|
221
|
+
_status: 'published'
|
|
222
|
+
} : {}
|
|
214
223
|
};
|
|
215
224
|
const updateArgs = {
|
|
216
225
|
collection: collectionSlug,
|
|
217
226
|
context: {
|
|
218
|
-
|
|
227
|
+
// A published move changes the live URL of this page and of every
|
|
228
|
+
// descendant nested-docs resaves on this request, so the deploy
|
|
229
|
+
// opt-out flag is withheld and consumer rebuild hooks fire normally.
|
|
230
|
+
// A staged move changes nothing live and keeps the flag.
|
|
231
|
+
...publishMove ? {} : {
|
|
232
|
+
[pageTreeMoveContextKey]: true
|
|
233
|
+
},
|
|
234
|
+
[pageTreeWriteContextKey]: true
|
|
219
235
|
},
|
|
220
|
-
autosave: hasAutosave ? true : undefined,
|
|
236
|
+
autosave: hasAutosave && !publishMove ? true : undefined,
|
|
221
237
|
data: updateData,
|
|
222
238
|
depth: 0,
|
|
223
|
-
draft: hasDrafts ? true : undefined,
|
|
239
|
+
draft: hasDrafts && !publishMove ? true : undefined,
|
|
224
240
|
id: movedID,
|
|
225
241
|
locale: getRequestedLocale(req),
|
|
226
242
|
overrideAccess: true,
|
|
@@ -246,9 +262,11 @@ export function createMovePageEndpoint(args) {
|
|
|
246
262
|
draft: updateArgs.draft,
|
|
247
263
|
hasTransaction: Boolean(req.transactionID),
|
|
248
264
|
locale: updateArgs.locale ?? null,
|
|
265
|
+
movedDocStatus: movedDoc._status ?? null,
|
|
249
266
|
movedID: String(movedID),
|
|
250
267
|
nextParentID: body.parentID,
|
|
251
268
|
publishedMainRowBefore: beforeSnapshot,
|
|
269
|
+
publishMove,
|
|
252
270
|
updateData
|
|
253
271
|
},
|
|
254
272
|
flow,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/createMovePageEndpoint.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport {\n DIAGNOSTICS_FLOW_CONTEXT_KEY,\n type Diagnostics,\n createFlowID,\n readMainRowSnapshot,\n} from '../utilities/diagnostics.js'\nimport { CANCEL_DRAG_MESSAGE } from '../utilities/moveValidation.js'\nimport {\n buildChildrenByParentID,\n collectDescendantIDs,\n getDocParentID,\n stringifyDocID,\n} from '../utilities/pageTree.js'\nimport { pageTreeMoveContextKey, type PageTreeSourceDoc } from '../types.js'\nimport {\n assertUpdateAccess,\n collectionHasAutosaveDrafts,\n collectionHasDrafts,\n getRequestedLocale,\n normalizeID,\n respond,\n toCollectionID,\n} from './shared.js'\n\nconst SNAPSHOT_FIELDS = ['_status'] as const\n\ntype MoveDocumentRequestBody = {\n parentID: null | string\n}\n\r\nfunction hasOwnProperty(value: object, key: PropertyKey): boolean {\r\n return Object.prototype.hasOwnProperty.call(value, key)\r\n}\r\n\r\nfunction normalizeMoveDocumentBody(value: unknown): MoveDocumentRequestBody | null {\n const incomingData =\r\n typeof value === 'string'\r\n ? (() => {\r\n try {\r\n return JSON.parse(value) as unknown\r\n } catch {\r\n return null\r\n }\r\n })()\r\n : value\r\n\r\n if (!incomingData || typeof incomingData !== 'object' || Array.isArray(incomingData)) {\r\n return null\r\n }\r\n\r\n if (!hasOwnProperty(incomingData, 'parentID')) {\r\n return null\r\n }\r\n\r\n const parentID = normalizeID((incomingData as { parentID?: unknown }).parentID)\r\n\r\n if (\r\n (incomingData as { parentID?: unknown }).parentID !== null &&\r\n (incomingData as { parentID?: unknown }).parentID !== undefined &&\r\n parentID === null\r\n ) {\r\n return null\r\n }\r\n\r\n return {\r\n parentID,\r\n }\r\n}\r\n\r\ntype RawBodyAttempt = {\n raw: unknown\n source: 'req.data' | 'req.json' | 'req.text'\n}\n\nasync function readBodyFromRequest(\n req: PayloadRequest,\n): Promise<{ body: MoveDocumentRequestBody | null; lastAttempt: null | RawBodyAttempt }> {\n let lastAttempt: null | RawBodyAttempt = null\n\n if (req.data !== undefined && req.data !== null) {\n lastAttempt = { raw: req.data, source: 'req.data' }\n const directBody = normalizeMoveDocumentBody(req.data)\n\n if (directBody) {\n return { body: directBody, lastAttempt }\n }\n }\n\n if (typeof req.json === 'function') {\n try {\n const raw = await req.json()\n lastAttempt = { raw, source: 'req.json' }\n const jsonBody = normalizeMoveDocumentBody(raw)\n\n if (jsonBody) {\n return { body: jsonBody, lastAttempt }\n }\n } catch {\n // Fall through to the text-based fallback when the runtime does not hydrate req.data.\n }\r\n }\r\n\n if (typeof req.text === 'function') {\n try {\n const raw = await req.text()\n lastAttempt = { raw, source: 'req.text' }\n const textBody = normalizeMoveDocumentBody(raw)\n\n if (textBody) {\n return { body: textBody, lastAttempt }\n }\n } catch {\n return { body: null, lastAttempt }\n }\n }\n\n return { body: null, lastAttempt }\n}\n\r\nexport function createMovePageEndpoint(args: {\n collectionSlug: string\n diagnostics: Diagnostics\n parentFieldSlug: string\n}): Endpoint {\n const { collectionSlug, diagnostics, parentFieldSlug } = args\n const snapshotFields = [...SNAPSHOT_FIELDS, parentFieldSlug]\n\n return {\n handler: async (req) => {\n const movedIDFromRoute = normalizeID(req.routeParams?.id)\r\n\r\n if (!movedIDFromRoute) {\r\n return respond(400, {\r\n message: 'Document ID was not specified.',\r\n })\r\n }\r\n\r\n const { body, lastAttempt } = await readBodyFromRequest(req)\n\n if (!body) {\n if (diagnostics.enabled) {\n diagnostics.log({\n collection: collectionSlug,\n data: {\n movedID: movedIDFromRoute,\n rawBody: lastAttempt?.raw ?? null,\n rawBodySource: lastAttempt?.source ?? null,\n },\n flow: createFlowID('move-endpoint'),\n level: 'warn',\n message: 'move endpoint rejected request body: parentID was missing or malformed',\n source: 'move-endpoint:body-rejected',\n })\n }\n\n return respond(400, {\n message: 'A valid parentID is required.',\n })\n }\r\n\r\n const movedID = toCollectionID({\r\n collectionSlug,\r\n id: movedIDFromRoute,\r\n req,\r\n })\r\n const nextParentID =\r\n body.parentID === null\r\n ? null\r\n : toCollectionID({\r\n collectionSlug,\r\n id: body.parentID,\r\n req,\r\n })\r\n const accessError = await assertUpdateAccess({\n collectionSlug,\n data: { [parentFieldSlug]: nextParentID },\n id: movedID,\n req,\n })\n\r\n if (accessError) {\r\n return accessError\r\n }\r\n\r\n const docsResult = await req.payload.find({\r\n collection: collectionSlug as never,\r\n depth: 0,\r\n draft: collectionHasDrafts({ collectionSlug, req }) ? true : undefined,\r\n fallbackLocale: false as never,\r\n limit: 0,\r\n locale: getRequestedLocale(req) as never,\r\n overrideAccess: true,\r\n req,\r\n } as never)\r\n const docs = docsResult.docs as unknown as PageTreeSourceDoc[]\r\n const docsByID = new Map(docs.map((doc) => [stringifyDocID(doc.id), doc]))\r\n const movedDoc = docsByID.get(movedIDFromRoute)\r\n\r\n if (!movedDoc) {\r\n return respond(404, {\r\n message: 'Document not found.',\r\n })\r\n }\r\n\r\n if (body.parentID !== null && !docsByID.has(body.parentID)) {\r\n return respond(400, {\r\n message: 'Parent document not found.',\r\n })\r\n }\r\n\r\n const currentParentID = getDocParentID(movedDoc, parentFieldSlug)\n\n if (currentParentID === body.parentID) {\n return respond(400, {\r\n message: 'Document already has that parent.',\r\n })\r\n }\r\n\r\n if (body.parentID === movedIDFromRoute) {\r\n return respond(400, {\r\n message: CANCEL_DRAG_MESSAGE,\r\n })\r\n }\r\n\r\n const childrenByParentID = buildChildrenByParentID({\r\n docs,\r\n parentFieldSlug,\r\n })\r\n const descendantIDs = collectDescendantIDs(movedIDFromRoute, childrenByParentID)\r\n\r\n if (body.parentID !== null && descendantIDs.includes(body.parentID)) {\n return respond(400, {\n message: 'A document cannot be moved under one of its descendants.',\n })\n }\n\n const flow = createFlowID('move-endpoint')\n const moveStart = Date.now()\n const hasDrafts = collectionHasDrafts({ collectionSlug, req })\n const hasAutosave = hasDrafts && collectionHasAutosaveDrafts({ collectionSlug, req })\n const updateData = {\n [parentFieldSlug]:\n body.parentID === null\n ? null\n : toCollectionID({\n collectionSlug,\n id: body.parentID,\n req,\n }),\n }\n const updateArgs = {\n collection: collectionSlug as never,\n context: {\n [pageTreeMoveContextKey]: true,\n } as Record<string, unknown>,\n autosave: hasAutosave ? true : undefined,\n data: updateData as never,\n depth: 0,\n draft: hasDrafts ? true : undefined,\n id: movedID as never,\n locale: getRequestedLocale(req) as never,\n overrideAccess: true,\n req,\n }\n\n if (diagnostics.enabled) {\n if (!req.context) {\n req.context = {}\n }\n\n ;(req.context as Record<string, unknown>)[DIAGNOSTICS_FLOW_CONTEXT_KEY] = flow\n\n const beforeSnapshot = await readMainRowSnapshot({\n collectionSlug,\n fields: snapshotFields,\n id: movedID,\n req,\n })\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n autosave: updateArgs.autosave ?? null,\n currentParentID,\n draft: updateArgs.draft,\n hasTransaction: Boolean((req as { transactionID?: unknown }).transactionID),\n locale: updateArgs.locale ?? null,\n movedID: String(movedID),\n nextParentID: body.parentID,\n publishedMainRowBefore: beforeSnapshot,\n updateData,\n },\n flow,\n level: 'info',\n message: 'move endpoint entering: parent move only',\n source: 'move-endpoint:enter',\n })\n }\n\n try {\n const result = (await req.payload.update(updateArgs as never)) as\n | (Record<string, unknown> & { _status?: string })\n | undefined\n\n if (diagnostics.enabled) {\n const afterSnapshot = await readMainRowSnapshot({\n collectionSlug,\n fields: snapshotFields,\n id: movedID,\n req,\n })\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n durMs: Date.now() - moveStart,\n movedID: String(movedID),\n publishedMainRowAfter: afterSnapshot,\n resultStatus: result?._status ?? null,\n },\n flow,\n level: 'info',\n message: 'move endpoint payload.update succeeded',\n source: 'move-endpoint:ok',\n })\n }\n } catch (err) {\n const error = err as { data?: unknown; message?: string; name?: string } & Error\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n data: error?.data ?? null,\n durMs: Date.now() - moveStart,\n message: error?.message,\n movedID: String(movedID),\n name: error?.name,\n },\n flow,\n level: 'error',\n message: `move endpoint payload.update failed: ${error?.message ?? 'unknown error'}`,\n source: 'move-endpoint:error',\n })\n\n throw err\n }\n\n return respond(200, {\n movedID: movedIDFromRoute,\n ok: true,\r\n parentID: body.parentID,\r\n })\r\n },\r\n method: 'post',\r\n path: '/:id/move',\r\n }\r\n}\r\n"],"names":["DIAGNOSTICS_FLOW_CONTEXT_KEY","createFlowID","readMainRowSnapshot","CANCEL_DRAG_MESSAGE","buildChildrenByParentID","collectDescendantIDs","getDocParentID","stringifyDocID","pageTreeMoveContextKey","assertUpdateAccess","collectionHasAutosaveDrafts","collectionHasDrafts","getRequestedLocale","normalizeID","respond","toCollectionID","SNAPSHOT_FIELDS","hasOwnProperty","value","key","Object","prototype","call","normalizeMoveDocumentBody","incomingData","JSON","parse","Array","isArray","parentID","undefined","readBodyFromRequest","req","lastAttempt","data","raw","source","directBody","body","json","jsonBody","text","textBody","createMovePageEndpoint","args","collectionSlug","diagnostics","parentFieldSlug","snapshotFields","handler","movedIDFromRoute","routeParams","id","message","enabled","log","collection","movedID","rawBody","rawBodySource","flow","level","nextParentID","accessError","docsResult","payload","find","depth","draft","fallbackLocale","limit","locale","overrideAccess","docs","docsByID","Map","map","doc","movedDoc","get","has","currentParentID","childrenByParentID","descendantIDs","includes","moveStart","Date","now","hasDrafts","hasAutosave","updateData","updateArgs","context","autosave","beforeSnapshot","fields","hasTransaction","Boolean","transactionID","String","publishedMainRowBefore","result","update","afterSnapshot","durMs","publishedMainRowAfter","resultStatus","_status","err","error","name","ok","method","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/createMovePageEndpoint.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport {\n DIAGNOSTICS_FLOW_CONTEXT_KEY,\n type Diagnostics,\n createFlowID,\n readMainRowSnapshot,\n} from '../utilities/diagnostics.js'\nimport { CANCEL_DRAG_MESSAGE } from '../utilities/moveValidation.js'\nimport {\n buildChildrenByParentID,\n collectDescendantIDs,\n getDocParentID,\n stringifyDocID,\n} from '../utilities/pageTree.js'\nimport {\n pageTreeMoveContextKey,\n type PageTreeSourceDoc,\n pageTreeWriteContextKey,\n} from '../types.js'\nimport {\n assertUpdateAccess,\n collectionHasAutosaveDrafts,\n collectionHasDrafts,\n getRequestedLocale,\n normalizeID,\n respond,\n toCollectionID,\n} from './shared.js'\n\nconst SNAPSHOT_FIELDS = ['_status'] as const\n\ntype MoveDocumentRequestBody = {\n parentID: null | string\n}\n\nfunction hasOwnProperty(value: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(value, key)\n}\n\nfunction normalizeMoveDocumentBody(value: unknown): MoveDocumentRequestBody | null {\n const incomingData =\n typeof value === 'string'\n ? (() => {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return null\n }\n })()\n : value\n\n if (!incomingData || typeof incomingData !== 'object' || Array.isArray(incomingData)) {\n return null\n }\n\n if (!hasOwnProperty(incomingData, 'parentID')) {\n return null\n }\n\n const parentID = normalizeID((incomingData as { parentID?: unknown }).parentID)\n\n if (\n (incomingData as { parentID?: unknown }).parentID !== null &&\n (incomingData as { parentID?: unknown }).parentID !== undefined &&\n parentID === null\n ) {\n return null\n }\n\n return {\n parentID,\n }\n}\n\ntype RawBodyAttempt = {\n raw: unknown\n source: 'req.data' | 'req.json' | 'req.text'\n}\n\nasync function readBodyFromRequest(\n req: PayloadRequest,\n): Promise<{ body: MoveDocumentRequestBody | null; lastAttempt: null | RawBodyAttempt }> {\n let lastAttempt: null | RawBodyAttempt = null\n\n if (req.data !== undefined && req.data !== null) {\n lastAttempt = { raw: req.data, source: 'req.data' }\n const directBody = normalizeMoveDocumentBody(req.data)\n\n if (directBody) {\n return { body: directBody, lastAttempt }\n }\n }\n\n if (typeof req.json === 'function') {\n try {\n const raw = await req.json()\n lastAttempt = { raw, source: 'req.json' }\n const jsonBody = normalizeMoveDocumentBody(raw)\n\n if (jsonBody) {\n return { body: jsonBody, lastAttempt }\n }\n } catch {\n // Fall through to the text-based fallback when the runtime does not hydrate req.data.\n }\n }\n\n if (typeof req.text === 'function') {\n try {\n const raw = await req.text()\n lastAttempt = { raw, source: 'req.text' }\n const textBody = normalizeMoveDocumentBody(raw)\n\n if (textBody) {\n return { body: textBody, lastAttempt }\n }\n } catch {\n return { body: null, lastAttempt }\n }\n }\n\n return { body: null, lastAttempt }\n}\n\nexport function createMovePageEndpoint(args: {\n collectionSlug: string\n diagnostics: Diagnostics\n parentFieldSlug: string\n publishOnMove?: boolean\n}): Endpoint {\n const { collectionSlug, diagnostics, parentFieldSlug, publishOnMove = false } = args\n const snapshotFields = [...SNAPSHOT_FIELDS, parentFieldSlug]\n\n return {\n handler: async (req) => {\n const movedIDFromRoute = normalizeID(req.routeParams?.id)\n\n if (!movedIDFromRoute) {\n return respond(400, {\n message: 'Document ID was not specified.',\n })\n }\n\n const { body, lastAttempt } = await readBodyFromRequest(req)\n\n if (!body) {\n if (diagnostics.enabled) {\n diagnostics.log({\n collection: collectionSlug,\n data: {\n movedID: movedIDFromRoute,\n rawBody: lastAttempt?.raw ?? null,\n rawBodySource: lastAttempt?.source ?? null,\n },\n flow: createFlowID('move-endpoint'),\n level: 'warn',\n message: 'move endpoint rejected request body: parentID was missing or malformed',\n source: 'move-endpoint:body-rejected',\n })\n }\n\n return respond(400, {\n message: 'A valid parentID is required.',\n })\n }\n\n const movedID = toCollectionID({\n collectionSlug,\n id: movedIDFromRoute,\n req,\n })\n const nextParentID =\n body.parentID === null\n ? null\n : toCollectionID({\n collectionSlug,\n id: body.parentID,\n req,\n })\n const accessError = await assertUpdateAccess({\n collectionSlug,\n data: { [parentFieldSlug]: nextParentID },\n id: movedID,\n req,\n })\n\n if (accessError) {\n return accessError\n }\n\n const docsResult = await req.payload.find({\n collection: collectionSlug as never,\n depth: 0,\n draft: collectionHasDrafts({ collectionSlug, req }) ? true : undefined,\n fallbackLocale: false as never,\n limit: 0,\n locale: getRequestedLocale(req) as never,\n overrideAccess: true,\n req,\n } as never)\n const docs = docsResult.docs as unknown as PageTreeSourceDoc[]\n const docsByID = new Map(docs.map((doc) => [stringifyDocID(doc.id), doc]))\n const movedDoc = docsByID.get(movedIDFromRoute)\n\n if (!movedDoc) {\n return respond(404, {\n message: 'Document not found.',\n })\n }\n\n if (body.parentID !== null && !docsByID.has(body.parentID)) {\n return respond(400, {\n message: 'Parent document not found.',\n })\n }\n\n const currentParentID = getDocParentID(movedDoc, parentFieldSlug)\n\n if (currentParentID === body.parentID) {\n return respond(400, {\n message: 'Document already has that parent.',\n })\n }\n\n if (body.parentID === movedIDFromRoute) {\n return respond(400, {\n message: CANCEL_DRAG_MESSAGE,\n })\n }\n\n const childrenByParentID = buildChildrenByParentID({\n docs,\n parentFieldSlug,\n })\n const descendantIDs = collectDescendantIDs(movedIDFromRoute, childrenByParentID)\n\n if (body.parentID !== null && descendantIDs.includes(body.parentID)) {\n return respond(400, {\n message: 'A document cannot be moved under one of its descendants.',\n })\n }\n\n const flow = createFlowID('move-endpoint')\n const moveStart = Date.now()\n const hasDrafts = collectionHasDrafts({ collectionSlug, req })\n const hasAutosave = hasDrafts && collectionHasAutosaveDrafts({ collectionSlug, req })\n // With `publishOnMove`, publish the reparent right away instead of staging\n // it — but ONLY when the moved doc had nothing staged before the move (its\n // latest version, read above with `draft: true`, is already published). A\n // doc with pending draft edits stays staged, so those in-progress edits are\n // never published as a side effect of the move.\n const publishMove = publishOnMove && hasDrafts && movedDoc._status === 'published'\n const updateData = {\n [parentFieldSlug]:\n body.parentID === null\n ? null\n : toCollectionID({\n collectionSlug,\n id: body.parentID,\n req,\n }),\n ...(publishMove ? { _status: 'published' } : {}),\n }\n const updateArgs = {\n collection: collectionSlug as never,\n context: {\n // A published move changes the live URL of this page and of every\n // descendant nested-docs resaves on this request, so the deploy\n // opt-out flag is withheld and consumer rebuild hooks fire normally.\n // A staged move changes nothing live and keeps the flag.\n ...(publishMove ? {} : { [pageTreeMoveContextKey]: true }),\n [pageTreeWriteContextKey]: true,\n } as Record<string, unknown>,\n autosave: hasAutosave && !publishMove ? true : undefined,\n data: updateData as never,\n depth: 0,\n draft: hasDrafts && !publishMove ? true : undefined,\n id: movedID as never,\n locale: getRequestedLocale(req) as never,\n overrideAccess: true,\n req,\n }\n\n if (diagnostics.enabled) {\n if (!req.context) {\n req.context = {}\n }\n\n ;(req.context as Record<string, unknown>)[DIAGNOSTICS_FLOW_CONTEXT_KEY] = flow\n\n const beforeSnapshot = await readMainRowSnapshot({\n collectionSlug,\n fields: snapshotFields,\n id: movedID,\n req,\n })\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n autosave: updateArgs.autosave ?? null,\n currentParentID,\n draft: updateArgs.draft,\n hasTransaction: Boolean((req as { transactionID?: unknown }).transactionID),\n locale: updateArgs.locale ?? null,\n movedDocStatus: movedDoc._status ?? null,\n movedID: String(movedID),\n nextParentID: body.parentID,\n publishedMainRowBefore: beforeSnapshot,\n publishMove,\n updateData,\n },\n flow,\n level: 'info',\n message: 'move endpoint entering: parent move only',\n source: 'move-endpoint:enter',\n })\n }\n\n try {\n const result = (await req.payload.update(updateArgs as never)) as\n | (Record<string, unknown> & { _status?: string })\n | undefined\n\n if (diagnostics.enabled) {\n const afterSnapshot = await readMainRowSnapshot({\n collectionSlug,\n fields: snapshotFields,\n id: movedID,\n req,\n })\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n durMs: Date.now() - moveStart,\n movedID: String(movedID),\n publishedMainRowAfter: afterSnapshot,\n resultStatus: result?._status ?? null,\n },\n flow,\n level: 'info',\n message: 'move endpoint payload.update succeeded',\n source: 'move-endpoint:ok',\n })\n }\n } catch (err) {\n const error = err as { data?: unknown; message?: string; name?: string } & Error\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n data: error?.data ?? null,\n durMs: Date.now() - moveStart,\n message: error?.message,\n movedID: String(movedID),\n name: error?.name,\n },\n flow,\n level: 'error',\n message: `move endpoint payload.update failed: ${error?.message ?? 'unknown error'}`,\n source: 'move-endpoint:error',\n })\n\n throw err\n }\n\n return respond(200, {\n movedID: movedIDFromRoute,\n ok: true,\n parentID: body.parentID,\n })\n },\n method: 'post',\n path: '/:id/move',\n }\n}\n"],"names":["DIAGNOSTICS_FLOW_CONTEXT_KEY","createFlowID","readMainRowSnapshot","CANCEL_DRAG_MESSAGE","buildChildrenByParentID","collectDescendantIDs","getDocParentID","stringifyDocID","pageTreeMoveContextKey","pageTreeWriteContextKey","assertUpdateAccess","collectionHasAutosaveDrafts","collectionHasDrafts","getRequestedLocale","normalizeID","respond","toCollectionID","SNAPSHOT_FIELDS","hasOwnProperty","value","key","Object","prototype","call","normalizeMoveDocumentBody","incomingData","JSON","parse","Array","isArray","parentID","undefined","readBodyFromRequest","req","lastAttempt","data","raw","source","directBody","body","json","jsonBody","text","textBody","createMovePageEndpoint","args","collectionSlug","diagnostics","parentFieldSlug","publishOnMove","snapshotFields","handler","movedIDFromRoute","routeParams","id","message","enabled","log","collection","movedID","rawBody","rawBodySource","flow","level","nextParentID","accessError","docsResult","payload","find","depth","draft","fallbackLocale","limit","locale","overrideAccess","docs","docsByID","Map","map","doc","movedDoc","get","has","currentParentID","childrenByParentID","descendantIDs","includes","moveStart","Date","now","hasDrafts","hasAutosave","publishMove","_status","updateData","updateArgs","context","autosave","beforeSnapshot","fields","hasTransaction","Boolean","transactionID","movedDocStatus","String","publishedMainRowBefore","result","update","afterSnapshot","durMs","publishedMainRowAfter","resultStatus","err","error","name","ok","method","path"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { combineWhereConstraints, generateNKeysBetween } from 'payload/shared';
|
|
2
|
-
import { pageTreeMoveContextKey } from '../types.js';
|
|
2
|
+
import { pageTreeMoveContextKey, pageTreeWriteContextKey } from '../types.js';
|
|
3
3
|
import { createFlowID, DIAGNOSTICS_FLOW_CONTEXT_KEY, readMainRowSnapshot } from '../utilities/diagnostics.js';
|
|
4
4
|
import { getDocParentID, stringifyDocID } from '../utilities/pageTree.js';
|
|
5
5
|
import { assertUpdateAccess, collectionHasDrafts, getRequestedLocale, normalizeID, respond, toCollectionID } from './shared.js';
|
|
@@ -471,8 +471,11 @@ export function createReorderPageEndpoint(args) {
|
|
|
471
471
|
if (!req.context) {
|
|
472
472
|
req.context = {};
|
|
473
473
|
}
|
|
474
|
+
// A reorder only writes the order key, never publishing state, so it
|
|
475
|
+
// always carries the deploy opt-out flag.
|
|
474
476
|
;
|
|
475
477
|
req.context[pageTreeMoveContextKey] = true;
|
|
478
|
+
req.context[pageTreeWriteContextKey] = true;
|
|
476
479
|
req.context[DIAGNOSTICS_FLOW_CONTEXT_KEY] = flow;
|
|
477
480
|
const relatedDocsResult = await req.payload.find({
|
|
478
481
|
collection: collectionSlug,
|