payload-nested-docs-page-tree 1.6.7 → 1.6.9
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/README.md +20 -0
- package/dist/components/PageTreeListView.client.d.ts +2 -1
- package/dist/components/PageTreeListView.client.js +38 -9
- package/dist/components/PageTreeListView.client.js.map +1 -1
- package/dist/components/PageTreeListView.server.js +97 -26
- package/dist/components/PageTreeListView.server.js.map +1 -1
- package/dist/components/PageTreeLocaleStatusBadges.js +4 -2
- package/dist/components/PageTreeLocaleStatusBadges.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/childValidationErrors.js +8 -2
- package/dist/utilities/childValidationErrors.js.map +1 -1
- package/dist/utilities/listReuse.d.ts +12 -0
- package/dist/utilities/listReuse.js +76 -0
- package/dist/utilities/listReuse.js.map +1 -0
- package/dist/utilities/localeStatus.js +3 -0
- package/dist/utilities/localeStatus.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,9 +3,10 @@ import { getColumns, renderTable } from '@payloadcms/ui/rsc';
|
|
|
3
3
|
import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig';
|
|
4
4
|
import { headers } from 'next/headers.js';
|
|
5
5
|
import { createLocalReq, extractJWT } from 'payload';
|
|
6
|
-
import { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere } from 'payload/shared';
|
|
6
|
+
import { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere, transformColumnsToSearchParams } from 'payload/shared';
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { resolvePageTreeBadgeLinks } from '../utilities/badgeLinks.js';
|
|
9
|
+
import { canReuseListCells, getCompleteListDocs, getMissingListSelect, mergeListMetadata } from '../utilities/listReuse.js';
|
|
9
10
|
import { getPageTreeListSelect } from '../utilities/listSelect.js';
|
|
10
11
|
import { withPageTreeLocaleStatuses } from '../utilities/localeStatus.js';
|
|
11
12
|
import { buildPageTreeDocs } from '../utilities/pageTree.js';
|
|
@@ -316,28 +317,36 @@ export async function NestedDocsPageTreeListView(props) {
|
|
|
316
317
|
baseFilterConstraint ?? undefined
|
|
317
318
|
]);
|
|
318
319
|
const where = Object.keys(mergedWhere).length > 0 ? mergedWhere : undefined;
|
|
319
|
-
const
|
|
320
|
+
const select = pageTreeConfig.fastMode && !pageTreeConfig.badgesLinks ? getPageTreeListSelect({
|
|
321
|
+
breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,
|
|
322
|
+
columns: props.columnState,
|
|
323
|
+
orderableFieldName,
|
|
324
|
+
parentFieldSlug: pageTreeConfig.parentFieldSlug,
|
|
325
|
+
sort: effectiveSort,
|
|
326
|
+
useAsTitle: props.collectionConfig.admin.useAsTitle
|
|
327
|
+
}) : undefined;
|
|
328
|
+
const canReuseNativeList = Boolean(select) && !baseFilter && !query.groupBy && !query.queryByGroup && !query.trash && props.viewType !== 'trash';
|
|
329
|
+
const nativeDocs = canReuseNativeList ? getCompleteListDocs(props.data) : undefined;
|
|
330
|
+
const missingSelect = nativeDocs && select ? getMissingListSelect(nativeDocs, select) : undefined;
|
|
331
|
+
const findArgs = {
|
|
320
332
|
collection: props.collectionSlug,
|
|
321
333
|
depth: 0,
|
|
322
334
|
draft: props.collectionConfig.versions?.drafts ? true : undefined,
|
|
323
335
|
fallbackLocale: false,
|
|
324
|
-
includeLockStatus:
|
|
325
|
-
select: pageTreeConfig.fastMode && !pageTreeConfig.badgesLinks ? getPageTreeListSelect({
|
|
326
|
-
columns: props.columnState,
|
|
327
|
-
useAsTitle: props.collectionConfig.admin.useAsTitle,
|
|
328
|
-
parentFieldSlug: pageTreeConfig.parentFieldSlug,
|
|
329
|
-
breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,
|
|
330
|
-
orderableFieldName,
|
|
331
|
-
sort: effectiveSort
|
|
332
|
-
}) : undefined,
|
|
336
|
+
includeLockStatus: !nativeDocs,
|
|
333
337
|
locale,
|
|
334
338
|
overrideAccess: false,
|
|
335
339
|
pagination: false,
|
|
336
340
|
req,
|
|
341
|
+
select: missingSelect ?? select,
|
|
337
342
|
sort: normalizeSort(query.sort) ?? defaultSort,
|
|
338
343
|
user: props.user,
|
|
339
|
-
where
|
|
340
|
-
|
|
344
|
+
where: nativeDocs ? {
|
|
345
|
+
id: {
|
|
346
|
+
in: nativeDocs.map(({ id })=>id)
|
|
347
|
+
}
|
|
348
|
+
} : where
|
|
349
|
+
};
|
|
341
350
|
const { clientCollectionConfig, clientConfig } = await getListClientConfig({
|
|
342
351
|
collectionSlug: props.collectionSlug,
|
|
343
352
|
i18n: props.i18n,
|
|
@@ -346,33 +355,68 @@ export async function NestedDocsPageTreeListView(props) {
|
|
|
346
355
|
user: props.user
|
|
347
356
|
});
|
|
348
357
|
const statusLocales = pageTreeConfig.badges.locales && props.collectionConfig.versions?.drafts?.localizeStatus && clientConfig.localization ? clientConfig.localization.locales.map(({ code })=>code) : [];
|
|
349
|
-
const
|
|
358
|
+
const sourceDocsPromise = nativeDocs ? Object.keys(missingSelect).length ? props.payload.find(findArgs).then(({ docs })=>mergeListMetadata(nativeDocs, docs)) : Promise.resolve(nativeDocs) : props.payload.find(findArgs).then(({ docs })=>docs);
|
|
359
|
+
// Locale status reads only need IDs, so they can overlap missing-metadata reads.
|
|
360
|
+
const statusSourceDocs = statusLocales.length && nativeDocs ? nativeDocs : await sourceDocsPromise;
|
|
361
|
+
const statusPromise = statusLocales.length ? withPageTreeLocaleStatuses({
|
|
350
362
|
collectionSlug: props.collectionSlug,
|
|
351
|
-
docs:
|
|
363
|
+
docs: statusSourceDocs,
|
|
352
364
|
fastMode: pageTreeConfig.fastMode,
|
|
353
365
|
localeBadgeStatus: pageTreeConfig.localeBadgeStatus,
|
|
354
366
|
localeBadgeVisibility: pageTreeConfig.localeBadgeVisibility,
|
|
355
367
|
locales: statusLocales,
|
|
356
368
|
payload: props.payload,
|
|
357
369
|
req
|
|
358
|
-
}) :
|
|
359
|
-
fastMode: pageTreeConfig.fastMode,
|
|
370
|
+
}) : getDocsWithDisplayStatus({
|
|
360
371
|
badgesLinks: pageTreeConfig.badgesLinks,
|
|
361
372
|
breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,
|
|
362
373
|
collectionConfig: props.collectionConfig,
|
|
363
374
|
collectionSlug: props.collectionSlug,
|
|
364
|
-
docs:
|
|
375
|
+
docs: statusSourceDocs,
|
|
376
|
+
fastMode: pageTreeConfig.fastMode,
|
|
365
377
|
locale,
|
|
366
378
|
payload: props.payload,
|
|
367
379
|
req,
|
|
368
380
|
user: props.user
|
|
369
381
|
});
|
|
382
|
+
const [sourceDocs, statusDocs] = await Promise.all([
|
|
383
|
+
sourceDocsPromise,
|
|
384
|
+
statusPromise
|
|
385
|
+
]);
|
|
386
|
+
const treeSourceDocs = statusLocales.length && nativeDocs ? mergeListMetadata(statusDocs, sourceDocs) : statusDocs;
|
|
370
387
|
const orderedDocs = buildPageTreeDocs(treeSourceDocs, {
|
|
371
388
|
parentFieldSlug: pageTreeConfig.parentFieldSlug,
|
|
372
389
|
sort: effectiveSort
|
|
373
390
|
});
|
|
391
|
+
const suppliedDocs = Array.isArray(props.data.docs) ? props.data.docs : [];
|
|
392
|
+
const reuseCells = canReuseNativeList && canReuseListCells({
|
|
393
|
+
collectionConfig: props.collectionConfig,
|
|
394
|
+
columns: props.columnState,
|
|
395
|
+
docs: suppliedDocs,
|
|
396
|
+
useAsTitle: props.collectionConfig.admin.useAsTitle
|
|
397
|
+
});
|
|
398
|
+
const renderDefaultCells = reuseCells && !props.collectionConfig.upload && props.columnState.every((column)=>!column.active || column.accessor === '_status' || [
|
|
399
|
+
'text',
|
|
400
|
+
'textarea',
|
|
401
|
+
'email',
|
|
402
|
+
'number',
|
|
403
|
+
'date',
|
|
404
|
+
'checkbox',
|
|
405
|
+
'code'
|
|
406
|
+
].includes(column.field?.type));
|
|
407
|
+
const treeIDs = new Set(orderedDocs.map((doc)=>doc.__pageTreeID));
|
|
408
|
+
const reusedIndices = reuseCells ? suppliedDocs.flatMap((doc, index)=>treeIDs.has(String(doc.id)) ? [
|
|
409
|
+
index
|
|
410
|
+
] : []) : [];
|
|
411
|
+
const reusedIDs = reusedIndices.map((index)=>String(suppliedDocs[index].id));
|
|
412
|
+
const reusedIDSet = new Set(reusedIDs);
|
|
413
|
+
const docsToRender = renderDefaultCells ? [] : orderedDocs.filter((doc)=>!reusedIDSet.has(doc.__pageTreeID));
|
|
414
|
+
const renderedRowIDs = renderDefaultCells ? [] : [
|
|
415
|
+
...reusedIDs,
|
|
416
|
+
...docsToRender.map((doc)=>doc.__pageTreeID)
|
|
417
|
+
];
|
|
374
418
|
const orderedData = {
|
|
375
|
-
docs:
|
|
419
|
+
docs: docsToRender,
|
|
376
420
|
hasNextPage: false,
|
|
377
421
|
hasPrevPage: false,
|
|
378
422
|
limit: normalizeLimit(query.limit, pageTreeConfig.defaultLimit),
|
|
@@ -387,16 +431,16 @@ export async function NestedDocsPageTreeListView(props) {
|
|
|
387
431
|
accessor,
|
|
388
432
|
active: accessor === props.collectionConfig.admin.useAsTitle ? true : active
|
|
389
433
|
}));
|
|
390
|
-
const columns = getColumns({
|
|
434
|
+
const columns = !reuseCells || docsToRender.length ? getColumns({
|
|
391
435
|
clientConfig,
|
|
392
436
|
collectionConfig: clientCollectionConfig,
|
|
393
437
|
collectionSlug: props.collectionSlug,
|
|
394
438
|
columns: columnPreferences,
|
|
395
439
|
i18n: props.i18n,
|
|
396
440
|
permissions: props.permissions
|
|
397
|
-
});
|
|
441
|
+
}) : [];
|
|
398
442
|
const fieldPermissions = props.permissions?.collections?.[props.collectionSlug]?.fields ?? true;
|
|
399
|
-
const renderedTable = renderTable({
|
|
443
|
+
const renderedTable = !reuseCells || docsToRender.length ? renderTable({
|
|
400
444
|
clientCollectionConfig,
|
|
401
445
|
clientConfig,
|
|
402
446
|
collectionConfig: props.collectionConfig,
|
|
@@ -412,7 +456,26 @@ export async function NestedDocsPageTreeListView(props) {
|
|
|
412
456
|
tableAppearance: 'default',
|
|
413
457
|
useAsTitle: props.collectionConfig.admin.useAsTitle,
|
|
414
458
|
viewType: props.viewType
|
|
415
|
-
});
|
|
459
|
+
}) : undefined;
|
|
460
|
+
const columnState = (reuseCells ? props.columnState.map((column)=>{
|
|
461
|
+
if (!column.active || renderDefaultCells) {
|
|
462
|
+
return {
|
|
463
|
+
...column,
|
|
464
|
+
renderedCells: []
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
const rendered = renderedTable?.columnState.find((item)=>item.accessor === column.accessor);
|
|
468
|
+
return {
|
|
469
|
+
...column,
|
|
470
|
+
renderedCells: reusedIndices.length === suppliedDocs.length && !docsToRender.length ? column.renderedCells : [
|
|
471
|
+
...reusedIndices.map((index)=>column.renderedCells?.[index] ?? null),
|
|
472
|
+
...rendered?.renderedCells ?? []
|
|
473
|
+
]
|
|
474
|
+
};
|
|
475
|
+
}) : renderedTable.columnState).map((column)=>column.accessor === '_status' ? {
|
|
476
|
+
...column,
|
|
477
|
+
renderedCells: []
|
|
478
|
+
} : column);
|
|
416
479
|
const clientProps = {
|
|
417
480
|
AfterList: props.AfterList,
|
|
418
481
|
AfterListTable: props.AfterListTable,
|
|
@@ -450,12 +513,20 @@ export async function NestedDocsPageTreeListView(props) {
|
|
|
450
513
|
badgeConfig: pageTreeConfig.badges,
|
|
451
514
|
badgesLinks: badgesLinks,
|
|
452
515
|
canMoveDocs: canMoveDocs,
|
|
453
|
-
columnState:
|
|
516
|
+
columnState: columnState,
|
|
454
517
|
homeIndicatorEnabled: pageTreeConfig.homeIndicator.enabled,
|
|
455
518
|
orderableFieldName: orderableFieldName,
|
|
456
519
|
parentFieldSlug: pageTreeConfig.parentFieldSlug,
|
|
457
|
-
query:
|
|
458
|
-
|
|
520
|
+
query: {
|
|
521
|
+
...effectiveQuery,
|
|
522
|
+
// ListQueryProvider syncs this back to the URL, so it must describe the
|
|
523
|
+
// rendered columns in URL form, not the raw preference objects. Without
|
|
524
|
+
// saved or URL columns it stays empty, like Payload's list view, so the
|
|
525
|
+
// next query change doesn't pin the default columns into preferences.
|
|
526
|
+
columns: query.columns ? transformColumnsToSearchParams(columnPreferences) : undefined
|
|
527
|
+
},
|
|
528
|
+
renderDefaultCells: renderDefaultCells,
|
|
529
|
+
renderedRowIDs: renderedRowIDs,
|
|
459
530
|
sourceDocs: treeSourceDocs,
|
|
460
531
|
useAsTitle: props.collectionConfig.admin.useAsTitle
|
|
461
532
|
});
|
|
@@ -1 +1 @@
|
|
|
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 { getColumns, renderTable } from '@payloadcms/ui/rsc'\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { headers } from 'next/headers.js'\nimport { createLocalReq, extractJWT } from 'payload'\nimport {\n applyLocaleFiltering,\n combineWhereConstraints,\n mergeListSearchAndWhere,\n} from 'payload/shared'\nimport React from 'react'\n\nimport type { NestedDocsPageTreePluginBadgesLinks, PageTreeSourceDoc } from '../types.js'\n\nimport { resolvePageTreeBadgeLinks } from '../utilities/badgeLinks.js'\nimport { getPageTreeListSelect } from '../utilities/listSelect.js'\nimport { withPageTreeLocaleStatuses } from '../utilities/localeStatus.js'\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\nimport PageTreeListViewClient from './PageTreeListView.client.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])\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, fallbackLimit),\n fallbackLimit,\n ),\n page: normalizePage(\n getQueryValue(mergedQuery.page, 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 badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n breadcrumbsFieldSlug: string\n collectionConfig: ServerListViewProps['collectionConfig']\n collectionSlug: string\n docs: PageTreeSourceDoc[]\n fastMode?: boolean\n locale?: string\n payload: any\n req: any\n user: unknown\n}): Promise<PageTreeSourceDoc[]> {\n const {\n badgesLinks,\n breadcrumbsFieldSlug,\n collectionConfig,\n collectionSlug,\n docs,\n fastMode,\n locale,\n payload,\n req,\n user,\n } = args\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 = collectionConfig.versions?.drafts\n ? await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: false,\n fallbackLocale: false,\n locale,\n overrideAccess: false,\n pagination: false,\n req,\n select:\n !fastMode || typeof badgesLinks?.liveURL === 'function'\n ? undefined\n : {\n id: true,\n _status: true,\n ...(badgesLinks?.liveURL ? { [breadcrumbsFieldSlug]: true } : {}),\n },\n user,\n where: {\n id: {\n in: docIDs,\n },\n },\n } as never)\n : { docs }\n\n const currentByID = new Map<string, PageTreeSourceDoc>(\n currentResult.docs.map((doc: PageTreeSourceDoc) => [String(doc.id), doc]),\n )\n const displayDocs = withPageTreeDisplayStatuses({\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\n draftDocs: docs,\n })\n const token = badgesLinks && collectionConfig.admin.preview ? extractJWT(req) : null\n\n return Promise.all(\n displayDocs.map(async (doc) => {\n const cleanDoc = { ...doc }\n delete cleanDoc.__pageTreeStatusLinks\n const links = await resolvePageTreeBadgeLinks({\n badgesLinks,\n breadcrumbsFieldSlug,\n collectionConfig,\n draftDoc: cleanDoc,\n publishedDoc: currentByID.get(String(doc.id)),\n req,\n token,\n })\n return { ...cleanDoc, __pageTreeStatusLinks: links }\n }),\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 requestHeaders = await headers()\n const host =\n requestHeaders.get('x-forwarded-host')?.split(',')[0]?.trim() ||\n requestHeaders.get('host') ||\n 'localhost'\n const protocol =\n requestHeaders.get('x-forwarded-proto')?.split(',')[0]?.trim() === 'https' ? 'https' : 'http'\n const requestURL = new URL(props.payload.config.serverURL || `${protocol}://${host}`)\n requestURL.pathname = `${props.payload.config.routes?.admin || '/admin'}/collections/${props.collectionSlug}`\n const req = await createLocalReq(\n {\n fallbackLocale: false,\n locale,\n req: {\n headers: requestHeaders,\n i18n: props.i18n,\n locale,\n payload: props.payload,\n query: effectiveQuery,\n url: requestURL.href,\n user: props.user,\n },\n user: props.user,\n },\n props.payload,\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 select:\n pageTreeConfig.fastMode && !pageTreeConfig.badgesLinks\n ? getPageTreeListSelect({\n columns: props.columnState,\n useAsTitle: props.collectionConfig.admin.useAsTitle,\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\n breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,\n orderableFieldName,\n sort: effectiveSort,\n })\n : undefined,\n locale,\n overrideAccess: false,\n pagination: false,\n req,\n sort: normalizeSort(query.sort) ?? defaultSort,\n user: props.user,\n where,\n } as never)\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 statusLocales =\n pageTreeConfig.badges.locales &&\n props.collectionConfig.versions?.drafts?.localizeStatus &&\n clientConfig.localization\n ? clientConfig.localization.locales.map(({ code }: { code: string }) => code)\n : []\n const treeSourceDocs = statusLocales.length\n ? await withPageTreeLocaleStatuses({\n collectionSlug: props.collectionSlug,\n docs: fullResult.docs as PageTreeSourceDoc[],\n fastMode: pageTreeConfig.fastMode,\n localeBadgeStatus: pageTreeConfig.localeBadgeStatus,\n localeBadgeVisibility: pageTreeConfig.localeBadgeVisibility,\n locales: statusLocales,\n payload: props.payload,\n req,\n })\n : await getDocsWithDisplayStatus({\n fastMode: pageTreeConfig.fastMode,\n badgesLinks: pageTreeConfig.badgesLinks,\n breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,\n collectionConfig: props.collectionConfig,\n collectionSlug: props.collectionSlug,\n docs: fullResult.docs 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\n const columnPreferences: ColumnPreference[] = (\n props.columnState as Array<{\n accessor: string\n active: boolean\n }>\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 = 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, 'columnState' | 'Table'> = {\n AfterList: props.AfterList,\n AfterListTable: props.AfterListTable,\n beforeActions: props.beforeActions,\n BeforeList: props.BeforeList,\n BeforeListTable: props.BeforeListTable,\n collectionSlug: props.collectionSlug,\n Description: props.Description,\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 const badgesLinks = pageTreeConfig.badgesLinks ? { ...pageTreeConfig.badgesLinks } : undefined\n if (typeof badgesLinks?.liveURL === 'function') {\n delete badgesLinks.liveURL\n }\n\n return (\n <PageTreeListViewClient\n {...clientProps}\n badgeConfig={pageTreeConfig.badges}\n badgesLinks={badgesLinks}\n canMoveDocs={canMoveDocs}\n columnState={renderedTable.columnState}\n homeIndicatorEnabled={pageTreeConfig.homeIndicator.enabled}\n orderableFieldName={orderableFieldName}\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\n query={effectiveQuery}\n renderedRowIDs={orderedDocs.map((doc) => doc.__pageTreeID)}\n sourceDocs={treeSourceDocs}\n useAsTitle={props.collectionConfig.admin.useAsTitle}\n />\n )\n}\n\nexport default NestedDocsPageTreeListView\n"],"names":["getColumns","renderTable","getClientConfig","headers","createLocalReq","extractJWT","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","React","resolvePageTreeBadgeLinks","getPageTreeListSelect","withPageTreeLocaleStatuses","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","PageTreeListViewClient","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","badgesLinks","breadcrumbsFieldSlug","collectionSlug","docs","fastMode","payload","user","docIDs","map","doc","id","currentResult","versions","drafts","find","collection","depth","draft","fallbackLocale","overrideAccess","pagination","select","liveURL","_status","in","currentByID","Map","String","displayDocs","currentDocs","draftDocs","token","admin","preview","Promise","all","cleanDoc","__pageTreeStatusLinks","links","draftDoc","publishedDoc","get","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","requestHeaders","host","split","trim","protocol","requestURL","URL","serverURL","pathname","routes","url","href","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","fullResult","includeLockStatus","columns","columnState","parentFieldSlug","statusLocales","badges","locales","localizeStatus","localization","treeSourceDocs","localeBadgeStatus","localeBadgeVisibility","orderedDocs","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","accessor","active","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","viewType","clientProps","AfterList","AfterListTable","beforeActions","BeforeList","BeforeListTable","Description","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","badgeConfig","homeIndicatorEnabled","homeIndicator","enabled","renderedRowIDs","__pageTreeID","sourceDocs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/PageTreeListView.server.tsx"],"sourcesContent":["import type {\n Column,\n ColumnPreference,\n ListQuery,\n ListViewClientProps,\n PaginatedDocs,\n Params,\n} from 'payload'\n\nimport { getColumns, renderTable } from '@payloadcms/ui/rsc'\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { headers } from 'next/headers.js'\nimport { createLocalReq, extractJWT } from 'payload'\nimport {\n applyLocaleFiltering,\n combineWhereConstraints,\n mergeListSearchAndWhere,\n transformColumnsToSearchParams,\n} from 'payload/shared'\nimport React from 'react'\n\nimport type { NestedDocsPageTreePluginBadgesLinks, PageTreeSourceDoc } from '../types.js'\n\nimport { resolvePageTreeBadgeLinks } from '../utilities/badgeLinks.js'\nimport { canReuseListCells, getCompleteListDocs, getMissingListSelect, mergeListMetadata } from '../utilities/listReuse.js'\nimport { getPageTreeListSelect } from '../utilities/listSelect.js'\nimport { withPageTreeLocaleStatuses } from '../utilities/localeStatus.js'\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\nimport PageTreeListViewClient from './PageTreeListView.client.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])\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, fallbackLimit),\n fallbackLimit,\n ),\n page: normalizePage(\n getQueryValue(mergedQuery.page, 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 badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n breadcrumbsFieldSlug: string\n collectionConfig: ServerListViewProps['collectionConfig']\n collectionSlug: string\n docs: PageTreeSourceDoc[]\n fastMode?: boolean\n locale?: string\n payload: any\n req: any\n user: unknown\n}): Promise<PageTreeSourceDoc[]> {\n const {\n badgesLinks,\n breadcrumbsFieldSlug,\n collectionConfig,\n collectionSlug,\n docs,\n fastMode,\n locale,\n payload,\n req,\n user,\n } = args\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 = collectionConfig.versions?.drafts\n ? await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: false,\n fallbackLocale: false,\n locale,\n overrideAccess: false,\n pagination: false,\n req,\n select:\n !fastMode || typeof badgesLinks?.liveURL === 'function'\n ? undefined\n : {\n id: true,\n _status: true,\n ...(badgesLinks?.liveURL ? { [breadcrumbsFieldSlug]: true } : {}),\n },\n user,\n where: {\n id: {\n in: docIDs,\n },\n },\n } as never)\n : { docs }\n\n const currentByID = new Map<string, PageTreeSourceDoc>(\n currentResult.docs.map((doc: PageTreeSourceDoc) => [String(doc.id), doc]),\n )\n const displayDocs = withPageTreeDisplayStatuses({\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\n draftDocs: docs,\n })\n const token = badgesLinks && collectionConfig.admin.preview ? extractJWT(req) : null\n\n return Promise.all(\n displayDocs.map(async (doc) => {\n const cleanDoc = { ...doc }\n delete cleanDoc.__pageTreeStatusLinks\n const links = await resolvePageTreeBadgeLinks({\n badgesLinks,\n breadcrumbsFieldSlug,\n collectionConfig,\n draftDoc: cleanDoc,\n publishedDoc: currentByID.get(String(doc.id)),\n req,\n token,\n })\n return { ...cleanDoc, __pageTreeStatusLinks: links }\n }),\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 requestHeaders = await headers()\n const host =\n requestHeaders.get('x-forwarded-host')?.split(',')[0]?.trim() ||\n requestHeaders.get('host') ||\n 'localhost'\n const protocol =\n requestHeaders.get('x-forwarded-proto')?.split(',')[0]?.trim() === 'https' ? 'https' : 'http'\n const requestURL = new URL(props.payload.config.serverURL || `${protocol}://${host}`)\n requestURL.pathname = `${props.payload.config.routes?.admin || '/admin'}/collections/${props.collectionSlug}`\n const req = await createLocalReq(\n {\n fallbackLocale: false,\n locale,\n req: {\n headers: requestHeaders,\n i18n: props.i18n,\n locale,\n payload: props.payload,\n query: effectiveQuery,\n url: requestURL.href,\n user: props.user,\n },\n user: props.user,\n },\n props.payload,\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 select = pageTreeConfig.fastMode && !pageTreeConfig.badgesLinks\n ? getPageTreeListSelect({\n breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,\n columns: props.columnState,\n orderableFieldName,\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\n sort: effectiveSort,\n useAsTitle: props.collectionConfig.admin.useAsTitle,\n })\n : undefined\n const canReuseNativeList = Boolean(select) && !baseFilter && !query.groupBy &&\n !query.queryByGroup && !query.trash && props.viewType !== 'trash'\n const nativeDocs = canReuseNativeList ? getCompleteListDocs(props.data) : undefined\n const missingSelect = nativeDocs && select ? getMissingListSelect(nativeDocs, select) : undefined\n const findArgs = {\n collection: props.collectionSlug,\n depth: 0,\n draft: props.collectionConfig.versions?.drafts ? true : undefined,\n fallbackLocale: false,\n includeLockStatus: !nativeDocs,\n locale,\n overrideAccess: false,\n pagination: false,\n req,\n select: missingSelect ?? select,\n sort: normalizeSort(query.sort) ?? defaultSort,\n user: props.user,\n where: nativeDocs ? { id: { in: nativeDocs.map(({ id }) => id) } } : where,\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 statusLocales =\n pageTreeConfig.badges.locales &&\n props.collectionConfig.versions?.drafts?.localizeStatus &&\n clientConfig.localization\n ? clientConfig.localization.locales.map(({ code }: { code: string }) => code)\n : []\n const sourceDocsPromise: Promise<PageTreeSourceDoc[]> = nativeDocs\n ? Object.keys(missingSelect!).length\n ? props.payload.find(findArgs).then(({ docs }: PaginatedDocs<PageTreeSourceDoc>) => mergeListMetadata(nativeDocs, docs))\n : Promise.resolve(nativeDocs)\n : props.payload.find(findArgs).then(({ docs }: PaginatedDocs<PageTreeSourceDoc>) => docs)\n // Locale status reads only need IDs, so they can overlap missing-metadata reads.\n const statusSourceDocs = statusLocales.length && nativeDocs ? nativeDocs : await sourceDocsPromise\n const statusPromise = statusLocales.length\n ? withPageTreeLocaleStatuses({\n collectionSlug: props.collectionSlug,\n docs: statusSourceDocs,\n fastMode: pageTreeConfig.fastMode,\n localeBadgeStatus: pageTreeConfig.localeBadgeStatus,\n localeBadgeVisibility: pageTreeConfig.localeBadgeVisibility,\n locales: statusLocales,\n payload: props.payload,\n req,\n })\n : getDocsWithDisplayStatus({\n badgesLinks: pageTreeConfig.badgesLinks,\n breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,\n collectionConfig: props.collectionConfig,\n collectionSlug: props.collectionSlug,\n docs: statusSourceDocs,\n fastMode: pageTreeConfig.fastMode,\n locale,\n payload: props.payload,\n req,\n user: props.user,\n })\n const [sourceDocs, statusDocs] = await Promise.all([sourceDocsPromise, statusPromise])\n const treeSourceDocs = statusLocales.length && nativeDocs\n ? mergeListMetadata(statusDocs, sourceDocs)\n : statusDocs\n\n const orderedDocs = buildPageTreeDocs(treeSourceDocs, {\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\n sort: effectiveSort,\n })\n const suppliedDocs: PageTreeSourceDoc[] = Array.isArray(props.data.docs) ? props.data.docs : []\n const reuseCells = canReuseNativeList && canReuseListCells({\n collectionConfig: props.collectionConfig,\n columns: props.columnState,\n docs: suppliedDocs,\n useAsTitle: props.collectionConfig.admin.useAsTitle,\n })\n const renderDefaultCells = reuseCells && !props.collectionConfig.upload &&\n (props.columnState as Column[]).every(column => !column.active || column.accessor === '_status' ||\n ['text', 'textarea', 'email', 'number', 'date', 'checkbox', 'code'].includes(column.field?.type))\n const treeIDs = new Set(orderedDocs.map(doc => doc.__pageTreeID))\n const reusedIndices = reuseCells\n ? suppliedDocs.flatMap((doc, index) => treeIDs.has(String(doc.id)) ? [index] : [])\n : []\n const reusedIDs = reusedIndices.map(index => String(suppliedDocs[index].id))\n const reusedIDSet = new Set(reusedIDs)\n const docsToRender = renderDefaultCells ? [] : orderedDocs.filter(doc => !reusedIDSet.has(doc.__pageTreeID))\n const renderedRowIDs = renderDefaultCells ? [] : [...reusedIDs, ...docsToRender.map(doc => doc.__pageTreeID)]\n const orderedData: PaginatedDocs = {\n docs: docsToRender,\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\n const columnPreferences: ColumnPreference[] = (\n props.columnState as Array<{\n accessor: string\n active: boolean\n }>\n ).map(({ accessor, active }) => ({\n accessor,\n active: accessor === props.collectionConfig.admin.useAsTitle ? true : active,\n }))\n const columns = !reuseCells || docsToRender.length ? 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 = !reuseCells || docsToRender.length ? 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) : undefined\n const columnState: Column[] = (reuseCells\n ? (props.columnState as Column[]).map(column => {\n if (!column.active || renderDefaultCells) {\n return { ...column, renderedCells: [] }\n }\n const rendered = renderedTable?.columnState.find(item => item.accessor === column.accessor)\n return {\n ...column,\n renderedCells: reusedIndices.length === suppliedDocs.length && !docsToRender.length\n ? column.renderedCells\n : [...reusedIndices.map(index => column.renderedCells?.[index] ?? null), ...(rendered?.renderedCells ?? [])],\n }\n })\n : renderedTable!.columnState\n ).map(column => column.accessor === '_status' ? { ...column, renderedCells: [] } : column)\n const clientProps: Omit<ListViewClientProps, 'columnState' | 'Table'> = {\n AfterList: props.AfterList,\n AfterListTable: props.AfterListTable,\n beforeActions: props.beforeActions,\n BeforeList: props.BeforeList,\n BeforeListTable: props.BeforeListTable,\n collectionSlug: props.collectionSlug,\n Description: props.Description,\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 const badgesLinks = pageTreeConfig.badgesLinks ? { ...pageTreeConfig.badgesLinks } : undefined\n if (typeof badgesLinks?.liveURL === 'function') {\n delete badgesLinks.liveURL\n }\n\n return (\n <PageTreeListViewClient\n {...clientProps}\n badgeConfig={pageTreeConfig.badges}\n badgesLinks={badgesLinks}\n canMoveDocs={canMoveDocs}\n columnState={columnState}\n homeIndicatorEnabled={pageTreeConfig.homeIndicator.enabled}\n orderableFieldName={orderableFieldName}\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\n query={{\n ...effectiveQuery,\n // ListQueryProvider syncs this back to the URL, so it must describe the\n // rendered columns in URL form, not the raw preference objects. Without\n // saved or URL columns it stays empty, like Payload's list view, so the\n // next query change doesn't pin the default columns into preferences.\n columns: query.columns ? transformColumnsToSearchParams(columnPreferences) : undefined,\n }}\n renderDefaultCells={renderDefaultCells}\n renderedRowIDs={renderedRowIDs}\n sourceDocs={treeSourceDocs}\n useAsTitle={props.collectionConfig.admin.useAsTitle}\n />\n )\n}\n\nexport default NestedDocsPageTreeListView\n"],"names":["getColumns","renderTable","getClientConfig","headers","createLocalReq","extractJWT","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","transformColumnsToSearchParams","React","resolvePageTreeBadgeLinks","canReuseListCells","getCompleteListDocs","getMissingListSelect","mergeListMetadata","getPageTreeListSelect","withPageTreeLocaleStatuses","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","PageTreeListViewClient","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","badgesLinks","breadcrumbsFieldSlug","collectionSlug","docs","fastMode","payload","user","docIDs","map","doc","id","currentResult","versions","drafts","find","collection","depth","draft","fallbackLocale","overrideAccess","pagination","select","liveURL","_status","in","currentByID","Map","String","displayDocs","currentDocs","draftDocs","token","admin","preview","Promise","all","cleanDoc","__pageTreeStatusLinks","links","draftDoc","publishedDoc","get","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","requestHeaders","host","split","trim","protocol","requestURL","URL","serverURL","pathname","routes","url","href","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","columns","columnState","parentFieldSlug","canReuseNativeList","groupBy","queryByGroup","trash","viewType","nativeDocs","missingSelect","findArgs","includeLockStatus","statusLocales","badges","locales","localizeStatus","localization","sourceDocsPromise","then","resolve","statusSourceDocs","statusPromise","localeBadgeStatus","localeBadgeVisibility","sourceDocs","statusDocs","treeSourceDocs","orderedDocs","suppliedDocs","reuseCells","renderDefaultCells","upload","every","column","active","accessor","includes","field","type","treeIDs","Set","__pageTreeID","reusedIndices","flatMap","has","reusedIDs","reusedIDSet","docsToRender","renderedRowIDs","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","renderedCells","rendered","item","clientProps","AfterList","AfterListTable","beforeActions","BeforeList","BeforeListTable","Description","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","badgeConfig","homeIndicatorEnabled","homeIndicator","enabled"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export function PageTreeLocaleStatusBadges({ badgeConfig, collectionSlug, docID,
|
|
|
10
10
|
const { t } = useTranslation();
|
|
11
11
|
return /*#__PURE__*/ _jsx("span", {
|
|
12
12
|
className: "pages-hierarchy-locale-statuses",
|
|
13
|
-
children: statuses.map(({ label: customLabel, locale: code, status, visible })=>{
|
|
13
|
+
children: statuses.map(({ label: customLabel, locale: code, marker, status, visible })=>{
|
|
14
14
|
const active = code === locale?.code;
|
|
15
15
|
const label = customLabel?.trim() || getPageTreeBadgeLabel({
|
|
16
16
|
badgeLabels: badgeConfig.labels,
|
|
@@ -33,12 +33,13 @@ export function PageTreeLocaleStatusBadges({ badgeConfig, collectionSlug, docID,
|
|
|
33
33
|
className: `pages-hierarchy-locale-status-slot${active ? ' pages-hierarchy-locale-status-slot--active' : ''}`,
|
|
34
34
|
children: /*#__PURE__*/ _jsxs(Badge, {
|
|
35
35
|
"aria-hidden": visible === false ? true : undefined,
|
|
36
|
-
"aria-label": `${code.toUpperCase()}: ${label}`,
|
|
36
|
+
"aria-label": `${code.toUpperCase()}: ${label}${marker ? `, ${marker.label}` : ''}`,
|
|
37
37
|
className: `pages-hierarchy-status-badge pages-hierarchy-status-badge--${status} pages-hierarchy-locale-status-badge`,
|
|
38
38
|
"data-active": active ? 'true' : 'false',
|
|
39
39
|
"data-custom-color": color ? 'true' : undefined,
|
|
40
40
|
"data-label": label,
|
|
41
41
|
"data-locale": code,
|
|
42
|
+
"data-marker": marker?.id,
|
|
42
43
|
"data-status": status,
|
|
43
44
|
href: href,
|
|
44
45
|
onClick: href ? (event)=>event.stopPropagation() : undefined,
|
|
@@ -52,6 +53,7 @@ export function PageTreeLocaleStatusBadges({ badgeConfig, collectionSlug, docID,
|
|
|
52
53
|
visibility: 'hidden'
|
|
53
54
|
} : {}
|
|
54
55
|
},
|
|
56
|
+
title: marker?.label,
|
|
55
57
|
children: [
|
|
56
58
|
/*#__PURE__*/ _jsx("span", {
|
|
57
59
|
className: "pages-hierarchy-locale-status-badge__code",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PageTreeLocaleStatusBadges.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useLocale, useTranslation } from '@payloadcms/ui'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeLocaleStatus } from '../types.js'\n\nimport { getPageTreeBadgeColor, getPageTreeBadgeLabel } from '../utilities/status.js'\n\nexport function PageTreeLocaleStatusBadges({\n badgeConfig,\n collectionSlug,\n docID,\n statuses,\n}: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n collectionSlug?: string\n docID?: number | string\n statuses: PageTreeLocaleStatus[]\n}) {\n const { config } = useConfig()\n const locale = useLocale()\n const { t } = useTranslation()\n\n return (\n <span className=\"pages-hierarchy-locale-statuses\">\n {statuses.map(({ label: customLabel, locale: code, status, visible }) => {\n const active = code === locale?.code\n const label =\n customLabel?.trim() ||\n getPageTreeBadgeLabel({ badgeLabels: badgeConfig.labels, status, t })\n const color = getPageTreeBadgeColor({ badgeColors: badgeConfig.colors, status })\n\n const href =\n visible !== false && collectionSlug && docID !== undefined\n ? formatAdminURL({\n adminRoute: config.routes.admin,\n includeBasePath: true,\n path: `/collections/${encodeURIComponent(collectionSlug)}/${encodeURIComponent(docID)}?${new URLSearchParams({ locale: code })}`,\n })\n : undefined\n const Badge = href ? 'a' : 'span'\n\n return (\n <span\n className={`pages-hierarchy-locale-status-slot${active ? ' pages-hierarchy-locale-status-slot--active' : ''}`}\n key={code}\n >\n <Badge\n aria-hidden={visible === false ? true : undefined}\n aria-label={`${code.toUpperCase()}: ${label}`}\n className={`pages-hierarchy-status-badge pages-hierarchy-status-badge--${status} pages-hierarchy-locale-status-badge`}\n data-active={active ? 'true' : 'false'}\n data-custom-color={color ? 'true' : undefined}\n data-label={label}\n data-locale={code}\n data-status={status}\n href={href}\n onClick={href ? (event: React.MouseEvent) => event.stopPropagation() : undefined}\n onPointerDown={\n href ? (event: React.PointerEvent) => event.stopPropagation() : undefined\n }\n role={href ? undefined : 'img'}\n style={{\n ...(color ? ({ '--page-tree-badge-base': color } as React.CSSProperties) : {}),\n ...(visible === false ? { visibility: 'hidden' } : {}),\n }}\n >\n <span className=\"pages-hierarchy-locale-status-badge__code\">\n {code.toUpperCase()}\n </span>\n {active && (\n <>\n <span\n aria-hidden=\"true\"\n className=\"pages-hierarchy-locale-status-badge__separator\"\n >\n ·\n </span>\n <span className=\"pages-hierarchy-locale-status-badge__label\">{label}</span>\n </>\n )}\n </Badge>\n </span>\n )\n })}\n </span>\n )\n}\n"],"names":["useConfig","useLocale","useTranslation","formatAdminURL","React","getPageTreeBadgeColor","getPageTreeBadgeLabel","PageTreeLocaleStatusBadges","badgeConfig","collectionSlug","docID","statuses","config","locale","t","span","className","map","label","customLabel","code","status","visible","active","trim","badgeLabels","labels","color","badgeColors","colors","href","undefined","adminRoute","routes","admin","includeBasePath","path","encodeURIComponent","URLSearchParams","Badge","aria-hidden","aria-label","toUpperCase","data-active","data-custom-color","data-label","data-locale","data-status","onClick","event","stopPropagation","onPointerDown","role","style","visibility"],"mappings":"AAAA;;AAEA,SAASA,SAAS,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AACrE,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,WAAW,QAAO;AAIzB,SAASC,qBAAqB,EAAEC,qBAAqB,QAAQ,yBAAwB;AAErF,OAAO,SAASC,2BAA2B,EACzCC,WAAW,EACXC,cAAc,EACdC,KAAK,EACLC,QAAQ,EAMT;IACC,MAAM,EAAEC,MAAM,EAAE,GAAGZ;IACnB,MAAMa,SAASZ;IACf,MAAM,EAAEa,CAAC,EAAE,GAAGZ;IAEd,qBACE,KAACa;QAAKC,WAAU;kBACbL,SAASM,GAAG,CAAC,CAAC,EAAEC,OAAOC,WAAW,EAAEN,QAAQO,IAAI,EAAEC,MAAM,EAAEC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"sources":["../../src/components/PageTreeLocaleStatusBadges.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useLocale, useTranslation } from '@payloadcms/ui'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeLocaleStatus } from '../types.js'\n\nimport { getPageTreeBadgeColor, getPageTreeBadgeLabel } from '../utilities/status.js'\n\nexport function PageTreeLocaleStatusBadges({\n badgeConfig,\n collectionSlug,\n docID,\n statuses,\n}: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n collectionSlug?: string\n docID?: number | string\n statuses: PageTreeLocaleStatus[]\n}) {\n const { config } = useConfig()\n const locale = useLocale()\n const { t } = useTranslation()\n\n return (\n <span className=\"pages-hierarchy-locale-statuses\">\n {statuses.map(({ label: customLabel, locale: code, marker, status, visible }) => {\n const active = code === locale?.code\n const label =\n customLabel?.trim() ||\n getPageTreeBadgeLabel({ badgeLabels: badgeConfig.labels, status, t })\n const color = getPageTreeBadgeColor({ badgeColors: badgeConfig.colors, status })\n\n const href =\n visible !== false && collectionSlug && docID !== undefined\n ? formatAdminURL({\n adminRoute: config.routes.admin,\n includeBasePath: true,\n path: `/collections/${encodeURIComponent(collectionSlug)}/${encodeURIComponent(docID)}?${new URLSearchParams({ locale: code })}`,\n })\n : undefined\n const Badge = href ? 'a' : 'span'\n\n return (\n <span\n className={`pages-hierarchy-locale-status-slot${active ? ' pages-hierarchy-locale-status-slot--active' : ''}`}\n key={code}\n >\n <Badge\n aria-hidden={visible === false ? true : undefined}\n aria-label={`${code.toUpperCase()}: ${label}${marker ? `, ${marker.label}` : ''}`}\n className={`pages-hierarchy-status-badge pages-hierarchy-status-badge--${status} pages-hierarchy-locale-status-badge`}\n data-active={active ? 'true' : 'false'}\n data-custom-color={color ? 'true' : undefined}\n data-label={label}\n data-locale={code}\n data-marker={marker?.id}\n data-status={status}\n href={href}\n onClick={href ? (event: React.MouseEvent) => event.stopPropagation() : undefined}\n onPointerDown={\n href ? (event: React.PointerEvent) => event.stopPropagation() : undefined\n }\n role={href ? undefined : 'img'}\n style={{\n ...(color ? ({ '--page-tree-badge-base': color } as React.CSSProperties) : {}),\n ...(visible === false ? { visibility: 'hidden' } : {}),\n }}\n title={marker?.label}\n >\n <span className=\"pages-hierarchy-locale-status-badge__code\">\n {code.toUpperCase()}\n </span>\n {active && (\n <>\n <span\n aria-hidden=\"true\"\n className=\"pages-hierarchy-locale-status-badge__separator\"\n >\n ·\n </span>\n <span className=\"pages-hierarchy-locale-status-badge__label\">{label}</span>\n </>\n )}\n </Badge>\n </span>\n )\n })}\n </span>\n )\n}\n"],"names":["useConfig","useLocale","useTranslation","formatAdminURL","React","getPageTreeBadgeColor","getPageTreeBadgeLabel","PageTreeLocaleStatusBadges","badgeConfig","collectionSlug","docID","statuses","config","locale","t","span","className","map","label","customLabel","code","marker","status","visible","active","trim","badgeLabels","labels","color","badgeColors","colors","href","undefined","adminRoute","routes","admin","includeBasePath","path","encodeURIComponent","URLSearchParams","Badge","aria-hidden","aria-label","toUpperCase","data-active","data-custom-color","data-label","data-locale","data-marker","id","data-status","onClick","event","stopPropagation","onPointerDown","role","style","visibility","title"],"mappings":"AAAA;;AAEA,SAASA,SAAS,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AACrE,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,WAAW,QAAO;AAIzB,SAASC,qBAAqB,EAAEC,qBAAqB,QAAQ,yBAAwB;AAErF,OAAO,SAASC,2BAA2B,EACzCC,WAAW,EACXC,cAAc,EACdC,KAAK,EACLC,QAAQ,EAMT;IACC,MAAM,EAAEC,MAAM,EAAE,GAAGZ;IACnB,MAAMa,SAASZ;IACf,MAAM,EAAEa,CAAC,EAAE,GAAGZ;IAEd,qBACE,KAACa;QAAKC,WAAU;kBACbL,SAASM,GAAG,CAAC,CAAC,EAAEC,OAAOC,WAAW,EAAEN,QAAQO,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAE;YAC1E,MAAMC,SAASJ,SAASP,QAAQO;YAChC,MAAMF,QACJC,aAAaM,UACbnB,sBAAsB;gBAAEoB,aAAalB,YAAYmB,MAAM;gBAAEL;gBAAQR;YAAE;YACrE,MAAMc,QAAQvB,sBAAsB;gBAAEwB,aAAarB,YAAYsB,MAAM;gBAAER;YAAO;YAE9E,MAAMS,OACJR,YAAY,SAASd,kBAAkBC,UAAUsB,YAC7C7B,eAAe;gBACb8B,YAAYrB,OAAOsB,MAAM,CAACC,KAAK;gBAC/BC,iBAAiB;gBACjBC,MAAM,CAAC,aAAa,EAAEC,mBAAmB7B,gBAAgB,CAAC,EAAE6B,mBAAmB5B,OAAO,CAAC,EAAE,IAAI6B,gBAAgB;oBAAE1B,QAAQO;gBAAK,IAAI;YAClI,KACAY;YACN,MAAMQ,QAAQT,OAAO,MAAM;YAE3B,qBACE,KAAChB;gBACCC,WAAW,CAAC,kCAAkC,EAAEQ,SAAS,gDAAgD,IAAI;0BAG7G,cAAA,MAACgB;oBACCC,eAAalB,YAAY,QAAQ,OAAOS;oBACxCU,cAAY,GAAGtB,KAAKuB,WAAW,GAAG,EAAE,EAAEzB,QAAQG,SAAS,CAAC,EAAE,EAAEA,OAAOH,KAAK,EAAE,GAAG,IAAI;oBACjFF,WAAW,CAAC,2DAA2D,EAAEM,OAAO,oCAAoC,CAAC;oBACrHsB,eAAapB,SAAS,SAAS;oBAC/BqB,qBAAmBjB,QAAQ,SAASI;oBACpCc,cAAY5B;oBACZ6B,eAAa3B;oBACb4B,eAAa3B,QAAQ4B;oBACrBC,eAAa5B;oBACbS,MAAMA;oBACNoB,SAASpB,OAAO,CAACqB,QAA4BA,MAAMC,eAAe,KAAKrB;oBACvEsB,eACEvB,OAAO,CAACqB,QAA8BA,MAAMC,eAAe,KAAKrB;oBAElEuB,MAAMxB,OAAOC,YAAY;oBACzBwB,OAAO;wBACL,GAAI5B,QAAS;4BAAE,0BAA0BA;wBAAM,IAA4B,CAAC,CAAC;wBAC7E,GAAIL,YAAY,QAAQ;4BAAEkC,YAAY;wBAAS,IAAI,CAAC,CAAC;oBACvD;oBACAC,OAAOrC,QAAQH;;sCAEf,KAACH;4BAAKC,WAAU;sCACbI,KAAKuB,WAAW;;wBAElBnB,wBACC;;8CACE,KAACT;oCACC0B,eAAY;oCACZzB,WAAU;8CACX;;8CAGD,KAACD;oCAAKC,WAAU;8CAA8CE;;;;;;eAnC/DE;QAyCX;;AAGN"}
|
package/dist/types.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export type PageTreeLocaleBadgeStatus = (args: {
|
|
|
37
37
|
publishedDoc?: Record<string, unknown>;
|
|
38
38
|
req: PayloadRequest;
|
|
39
39
|
status: PageTreeLocaleStatus['status'];
|
|
40
|
-
}) => PageTreeLocaleStatus['status'] | Pick<PageTreeLocaleStatus, '
|
|
40
|
+
}) => PageTreeLocaleStatus['status'] | Pick<PageTreeLocaleStatus, 'label' | 'marker' | 'status'>;
|
|
41
41
|
export type NestedDocsPageTreePluginConfig = {
|
|
42
42
|
badges?: NestedDocsPageTreePluginBadgeConfig;
|
|
43
43
|
/** Opt in to status badge links. Preview uses the collection's admin.preview. */
|
|
@@ -114,6 +114,11 @@ export type PageTreeLocaleStatus = {
|
|
|
114
114
|
/** Optional display label; publication status remains separate. */
|
|
115
115
|
label?: string;
|
|
116
116
|
locale: string;
|
|
117
|
+
/** Optional marker; `id` is exposed as `data-marker` for styling, `label` is for people. */
|
|
118
|
+
marker?: {
|
|
119
|
+
id: string;
|
|
120
|
+
label: string;
|
|
121
|
+
};
|
|
117
122
|
status: 'changed' | 'draft' | 'published' | 'unknown';
|
|
118
123
|
visible?: boolean;
|
|
119
124
|
};
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, PayloadRequest } from 'payload'\n\nimport type { NestedDocsPageTreePluginDiagnosticsConfig } from './utilities/diagnostics.js'\n\nexport type {\n NestedDocsPageTreePluginDiagnosticEvent,\n NestedDocsPageTreePluginDiagnosticsConfig,\n} from './utilities/diagnostics.js'\n\nexport const nestedDocsPageTreePluginBadgeStatuses = ['published', 'changed', 'draft'] as const\n\nexport type NestedDocsPageTreePluginBadgeStatus =\n (typeof nestedDocsPageTreePluginBadgeStatuses)[number]\n\nexport type NestedDocsPageTreePluginBadgeMap = Partial<\n Record<NestedDocsPageTreePluginBadgeStatus, string>\n>\n\nexport type NestedDocsPageTreePluginBadgeConfig = {\n colors?: NestedDocsPageTreePluginBadgeMap\n labels?: NestedDocsPageTreePluginBadgeMap\n /** Show locale badges when the collection enables localized draft status. */\n locales?: boolean\n}\n\nexport type NestedDocsPageTreePluginResolvedBadgeConfig = {\n colors: NestedDocsPageTreePluginBadgeMap\n labels: NestedDocsPageTreePluginBadgeMap\n locales?: boolean\n}\n\nexport type NestedDocsPageTreePluginHomeIndicatorConfig =\n | {\n collections?: CollectionSlug[]\n }\n | false\n\nexport type NestedDocsPageTreePluginResolvedHomeIndicatorConfig = {\n enabled: boolean\n}\n\nexport type PageTreeLocaleBadgeVisibility = (args: {\n /** Latest draft document with all locales, read with the current user's access. */\n doc: Record<string, unknown>\n locale: string\n /** Current document, if readable. Check its locale status before treating it as published. */\n publishedDoc?: Record<string, unknown>\n req: PayloadRequest\n}) => boolean\n\nexport type PageTreeLocaleBadgeStatus = (args: {\n /** Latest draft document with all locales, read with the current user's access. */\n doc: Record<string, unknown>\n locale: string\n /** Current document, if readable. Check its locale status before treating it as published. */\n publishedDoc?: Record<string, unknown>\n req: PayloadRequest\n status: PageTreeLocaleStatus['status']\n}) => PageTreeLocaleStatus['status'] | Pick<PageTreeLocaleStatus, '
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, PayloadRequest } from 'payload'\n\nimport type { NestedDocsPageTreePluginDiagnosticsConfig } from './utilities/diagnostics.js'\n\nexport type {\n NestedDocsPageTreePluginDiagnosticEvent,\n NestedDocsPageTreePluginDiagnosticsConfig,\n} from './utilities/diagnostics.js'\n\nexport const nestedDocsPageTreePluginBadgeStatuses = ['published', 'changed', 'draft'] as const\n\nexport type NestedDocsPageTreePluginBadgeStatus =\n (typeof nestedDocsPageTreePluginBadgeStatuses)[number]\n\nexport type NestedDocsPageTreePluginBadgeMap = Partial<\n Record<NestedDocsPageTreePluginBadgeStatus, string>\n>\n\nexport type NestedDocsPageTreePluginBadgeConfig = {\n colors?: NestedDocsPageTreePluginBadgeMap\n labels?: NestedDocsPageTreePluginBadgeMap\n /** Show locale badges when the collection enables localized draft status. */\n locales?: boolean\n}\n\nexport type NestedDocsPageTreePluginResolvedBadgeConfig = {\n colors: NestedDocsPageTreePluginBadgeMap\n labels: NestedDocsPageTreePluginBadgeMap\n locales?: boolean\n}\n\nexport type NestedDocsPageTreePluginHomeIndicatorConfig =\n | {\n collections?: CollectionSlug[]\n }\n | false\n\nexport type NestedDocsPageTreePluginResolvedHomeIndicatorConfig = {\n enabled: boolean\n}\n\nexport type PageTreeLocaleBadgeVisibility = (args: {\n /** Latest draft document with all locales, read with the current user's access. */\n doc: Record<string, unknown>\n locale: string\n /** Current document, if readable. Check its locale status before treating it as published. */\n publishedDoc?: Record<string, unknown>\n req: PayloadRequest\n}) => boolean\n\nexport type PageTreeLocaleBadgeStatus = (args: {\n /** Latest draft document with all locales, read with the current user's access. */\n doc: Record<string, unknown>\n locale: string\n /** Current document, if readable. Check its locale status before treating it as published. */\n publishedDoc?: Record<string, unknown>\n req: PayloadRequest\n status: PageTreeLocaleStatus['status']\n}) => PageTreeLocaleStatus['status'] | Pick<PageTreeLocaleStatus, 'label' | 'marker' | 'status'>\n\nexport type NestedDocsPageTreePluginConfig = {\n badges?: NestedDocsPageTreePluginBadgeConfig\n /** Opt in to status badge links. Preview uses the collection's admin.preview. */\n badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n breadcrumbsFieldSlug?: string\n collections: CollectionSlug[]\n defaultLimit?: number\n /**\n * When set, the plugin emits structured diagnostic events for page-tree\n * triggered moves, including before/after snapshots of the published main row.\n * Disabled by default. Pass `true` to log to `console`, or pass an object\n * with a custom `logger` to route events elsewhere.\n */\n diagnostics?: NestedDocsPageTreePluginDiagnosticsConfig\n disabled?: boolean\n /** Enable narrower tree and status queries. Declare extra cell, hook, or badge callback fields with collection.forceSelect. @default false */\n fastMode?: boolean\n hideBreadcrumbs?: boolean\n homeIndicator?: NestedDocsPageTreePluginHomeIndicatorConfig\n /** Server-only display override. Does not change stored publication status. */\n localeBadgeStatus?: PageTreeLocaleBadgeStatus\n /** Server-only rule. False hides the badge while preserving its aligned slot. */\n localeBadgeVisibility?: PageTreeLocaleBadgeVisibility\n parentFieldSlug?: string\n /**\n * Publish a hierarchy move immediately instead of staging it as a draft - but\n * ONLY when the moved document had no unpublished changes before the move (its\n * latest version is already published). A document with pending draft edits (a\n * \"changed\" or draft-only doc) always stays staged, so in-progress edits are\n * never published as a side effect of a move. Only affects collections with\n * drafts enabled; collections without drafts move live regardless.\n *\n * Disabled by default: every move is staged as a draft and the live URL/path\n * changes only when the document is next published.\n *\n * @default false\n */\n publishOnMove?: boolean\n}\n\nexport type NestedDocsPageTreePluginCollectionCustom = {\n badges: NestedDocsPageTreePluginResolvedBadgeConfig\n badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n breadcrumbsFieldSlug: string\n defaultLimit: number\n fastMode?: boolean\n hideBreadcrumbs: boolean\n homeIndicator: NestedDocsPageTreePluginResolvedHomeIndicatorConfig\n localeBadgeStatus?: PageTreeLocaleBadgeStatus\n localeBadgeVisibility?: PageTreeLocaleBadgeVisibility\n parentFieldSlug: string\n}\n\nexport type PageTreeLiveURL<TRequest = PayloadRequest> = (args: {\n collectionSlug: string\n /** Published document read with the current user's access, at depth 0. */\n doc: PageTreeSourceDoc\n locale?: string\n /** Published document's last breadcrumb URL, when available. */\n path?: string\n req: TRequest\n}) => null | Promise<null | string | undefined> | string | undefined\n\nexport type NestedDocsPageTreePluginBadgesLinks<TRequest = PayloadRequest> = {\n /** Which links to offer for a draft with a published version. @default 'both' */\n draftHasPublishedVersion?: 'both' | 'live' | 'preview'\n /** Website base URL, or a server-only callback returning the final live URL. */\n liveURL?: PageTreeLiveURL<TRequest> | string\n /** Show live link and preview eye icons. When false, 'both' keeps an external-link preview action. @default true */\n showIcons?: boolean\n}\n\nexport type PageTreeStatusLinks = {\n previewURL?: string\n publicURL?: string\n}\n\nexport type PageTreeLocaleStatus = {\n /** Optional display label; publication status remains separate. */\n label?: string\n locale: string\n /** Optional marker; `id` is exposed as `data-marker` for styling, `label` is for people. */\n marker?: { id: string; label: string }\n status: 'changed' | 'draft' | 'published' | 'unknown'\n visible?: boolean\n}\n\nexport type PageTreeSourceDoc = {\n __pageTreeLocaleStatuses?: PageTreeLocaleStatus[]\n __pageTreeStatusLinks?: PageTreeStatusLinks\n _displayStatus?: null | string\n _status?: null | string\n id?: number | string\n slug?: null | string\n} & Record<string, unknown>\n\nexport const nestedDocsPageTreePluginCustomKey = 'nestedDocsPageTreePlugin'\n\n/**\n * Set on Payload's hook context for every page-tree write that leaves the\n * published site unchanged: sibling reorders, and parent moves staged as\n * drafts. Deploy/revalidate hooks read it to skip rebuilds they do not need.\n *\n * It is deliberately NOT set when `publishOnMove` publishes a move, because\n * that move changed the live URL of the page and its descendants and the site\n * does need rebuilding. That way one guard covers every configuration:\n *\n * ```ts\n * if (req.context?.[pageTreeMoveContextKey]) return\n * ```\n *\n * Note the flag describes the *effect* of the write, not its kind - it is\n * absent on published moves even though those are still page-tree moves. Use\n * `pageTreeWriteContextKey` when you need \"was this a page-tree write at all\".\n */\nexport const pageTreeMoveContextKey = 'pageTreeMove'\n\n/**\n * Internal: set on every page-tree write regardless of whether it published.\n * Diagnostics uses it so that published moves are still traced, which is the\n * case most worth observing. Not part of the public API.\n */\nexport const pageTreeWriteContextKey = 'pageTreeWrite'\n\nexport type PageTreeMoveContext = {\n [pageTreeMoveContextKey]?: boolean\n [pageTreeWriteContextKey]?: boolean\n}\n"],"names":["nestedDocsPageTreePluginBadgeStatuses","nestedDocsPageTreePluginCustomKey","pageTreeMoveContextKey","pageTreeWriteContextKey"],"mappings":"AASA,OAAO,MAAMA,wCAAwC;IAAC;IAAa;IAAW;CAAQ,CAAS;AAmJ/F,OAAO,MAAMC,oCAAoC,2BAA0B;AAE3E;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,MAAMC,yBAAyB,eAAc;AAEpD;;;;CAIC,GACD,OAAO,MAAMC,0BAA0B,gBAAe"}
|
|
@@ -34,9 +34,15 @@ const childErrors = new WeakMap();
|
|
|
34
34
|
return property === 'update' ? update : Reflect.get(target, property, receiver);
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
|
+
// REST and admin requests are real Request objects, whose getters and
|
|
38
|
+
// methods throw "Illegal invocation" unless called on the Request itself.
|
|
37
39
|
const req = new Proxy(args.req, {
|
|
38
|
-
get (target, property
|
|
39
|
-
|
|
40
|
+
get (target, property) {
|
|
41
|
+
if (property === 'payload') {
|
|
42
|
+
return payload;
|
|
43
|
+
}
|
|
44
|
+
const value = Reflect.get(target, property);
|
|
45
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
40
46
|
}
|
|
41
47
|
});
|
|
42
48
|
scopedRequests.add(req);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/childValidationErrors.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, Payload, PayloadRequest } from 'payload'\n\nimport { APIError, ValidationError } from 'payload'\n\nconst nestedDocsError = 'Could not publish or save changes: One or more children are invalid.'\nconst scopedRequests = new WeakSet<PayloadRequest>()\nconst childErrors = new WeakMap<ValidationError, string>()\n\n/**\n * Nested Docs catches child validation failures and replaces their details with\n * a generic APIError. Observe only this hook's Local API calls, leaving the\n * shared Payload instance and the original transaction-bearing request intact.\n */\nexport function withChildValidationErrors(\n hook: CollectionAfterChangeHook,\n collectionSlug: string,\n titleField: string,\n): CollectionAfterChangeHook {\n return async (args) => {\n let childError: undefined | ValidationError\n const nested = scopedRequests.has(args.req)\n const update = (async (options: Parameters<Payload['update']>[0]) => {\n try {\n return await args.req.payload.update(options)\n } catch (error) {\n if (\n error instanceof ValidationError &&\n error.data.errors.length &&\n options.collection === collectionSlug &&\n options.id != null &&\n String(options.id) !== String(args.doc.id)\n ) {\n childError = error\n if (!childErrors.has(error)) {\n // Older Nested Docs versions pass populateBreadcrumbs' promise.\n const data = await Promise.resolve(options.data)\n const title = data?.[titleField]\n const name = typeof title === 'string' && title.trim() ? ` \"${title}\"` : ''\n const locale = options.locale ?? args.req.locale\n const fields = error.data.errors\n .map(\n (field) =>\n `${typeof field.label === 'string' ? field.label : field.path}: ${field.message}`,\n )\n .join('\\n')\n childErrors.set(\n error,\n `Could not publish or save changes: child page${name} (ID: ${String(options.id)}${locale ? `, locale: ${locale}` : ''}) is invalid.\\n${fields}`,\n )\n }\n }\n throw error\n }\n }) as Payload['update']\n const payload = new Proxy(args.req.payload, {\n get(target, property, receiver) {\n return property === 'update' ? update : Reflect.get(target, property, receiver)\n },\n })\n const req = new Proxy(args.req, {\n get(target, property
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/childValidationErrors.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, Payload, PayloadRequest } from 'payload'\n\nimport { APIError, ValidationError } from 'payload'\n\nconst nestedDocsError = 'Could not publish or save changes: One or more children are invalid.'\nconst scopedRequests = new WeakSet<PayloadRequest>()\nconst childErrors = new WeakMap<ValidationError, string>()\n\n/**\n * Nested Docs catches child validation failures and replaces their details with\n * a generic APIError. Observe only this hook's Local API calls, leaving the\n * shared Payload instance and the original transaction-bearing request intact.\n */\nexport function withChildValidationErrors(\n hook: CollectionAfterChangeHook,\n collectionSlug: string,\n titleField: string,\n): CollectionAfterChangeHook {\n return async (args) => {\n let childError: undefined | ValidationError\n const nested = scopedRequests.has(args.req)\n const update = (async (options: Parameters<Payload['update']>[0]) => {\n try {\n return await args.req.payload.update(options)\n } catch (error) {\n if (\n error instanceof ValidationError &&\n error.data.errors.length &&\n options.collection === collectionSlug &&\n options.id != null &&\n String(options.id) !== String(args.doc.id)\n ) {\n childError = error\n if (!childErrors.has(error)) {\n // Older Nested Docs versions pass populateBreadcrumbs' promise.\n const data = await Promise.resolve(options.data)\n const title = data?.[titleField]\n const name = typeof title === 'string' && title.trim() ? ` \"${title}\"` : ''\n const locale = options.locale ?? args.req.locale\n const fields = error.data.errors\n .map(\n (field) =>\n `${typeof field.label === 'string' ? field.label : field.path}: ${field.message}`,\n )\n .join('\\n')\n childErrors.set(\n error,\n `Could not publish or save changes: child page${name} (ID: ${String(options.id)}${locale ? `, locale: ${locale}` : ''}) is invalid.\\n${fields}`,\n )\n }\n }\n throw error\n }\n }) as Payload['update']\n const payload = new Proxy(args.req.payload, {\n get(target, property, receiver) {\n return property === 'update' ? update : Reflect.get(target, property, receiver)\n },\n })\n // REST and admin requests are real Request objects, whose getters and\n // methods throw \"Illegal invocation\" unless called on the Request itself.\n const req = new Proxy(args.req, {\n get(target, property) {\n if (property === 'payload') {\n return payload\n }\n const value: unknown = Reflect.get(target, property)\n return typeof value === 'function' ? value.bind(target) : value\n },\n })\n scopedRequests.add(req)\n try {\n return await hook({ ...args, req })\n } catch (error) {\n if (!nested && error instanceof ValidationError) {\n const message = childErrors.get(error)\n if (message) {\n throw new APIError(message, 400)\n }\n }\n if (childError && error instanceof Error && error.message === nestedDocsError) {\n // Ancestor Nested Docs hooks only propagate ValidationErrors. Convert\n // at the outermost hook so child paths never mark the parent's fields.\n if (nested) {\n throw childError\n }\n throw new APIError(childErrors.get(childError)!, 400)\n }\n throw error\n } finally {\n scopedRequests.delete(req)\n }\n }\n}\n"],"names":["APIError","ValidationError","nestedDocsError","scopedRequests","WeakSet","childErrors","WeakMap","withChildValidationErrors","hook","collectionSlug","titleField","args","childError","nested","has","req","update","options","payload","error","data","errors","length","collection","id","String","doc","Promise","resolve","title","name","trim","locale","fields","map","field","label","path","message","join","set","Proxy","get","target","property","receiver","Reflect","value","bind","add","Error","delete"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CollectionConfig, Column, PaginatedDocs, SelectType } from 'payload';
|
|
2
|
+
import type { PageTreeSourceDoc } from '../types.js';
|
|
3
|
+
export declare function hasUniqueDocIDs(docs: PageTreeSourceDoc[]): boolean;
|
|
4
|
+
export declare function getCompleteListDocs(data?: Partial<PaginatedDocs>): PageTreeSourceDoc[] | undefined;
|
|
5
|
+
export declare function getMissingListSelect(docs: PageTreeSourceDoc[], select: SelectType): SelectType;
|
|
6
|
+
export declare function mergeListMetadata(docs: PageTreeSourceDoc[], metadata: PageTreeSourceDoc[]): PageTreeSourceDoc[];
|
|
7
|
+
export declare function canReuseListCells({ collectionConfig, columns, docs, useAsTitle, }: {
|
|
8
|
+
collectionConfig: CollectionConfig;
|
|
9
|
+
columns: Column[];
|
|
10
|
+
docs: PageTreeSourceDoc[];
|
|
11
|
+
useAsTitle: string;
|
|
12
|
+
}): boolean;
|