payload-nested-docs-page-tree 1.5.1 → 1.6.0
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 +141 -7
- package/dist/components/PageTreeListView.client.js +9 -4
- package/dist/components/PageTreeListView.client.js.map +1 -1
- package/dist/components/PageTreeListView.module.css +27 -0
- package/dist/components/PageTreeListView.server.js +30 -14
- package/dist/components/PageTreeListView.server.js.map +1 -1
- package/dist/components/PageTreeLocaleStatusBadges.d.ts +7 -0
- package/dist/components/PageTreeLocaleStatusBadges.js +79 -0
- package/dist/components/PageTreeLocaleStatusBadges.js.map +1 -0
- package/dist/components/PageTreeStatusBadge.d.ts +2 -1
- package/dist/components/PageTreeStatusBadge.js +10 -1
- package/dist/components/PageTreeStatusBadge.js.map +1 -1
- package/dist/components/PageTreeTitleCell.js +8 -8
- package/dist/components/PageTreeTitleCell.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +47 -8
- package/dist/types.js.map +1 -1
- package/dist/utilities/badgeConfig.js +3 -0
- package/dist/utilities/badgeConfig.js.map +1 -1
- package/dist/utilities/badgeLinks.d.ts +1 -1
- package/dist/utilities/badgeLinks.js +13 -3
- package/dist/utilities/badgeLinks.js.map +1 -1
- package/dist/utilities/localeStatus.d.ts +11 -0
- package/dist/utilities/localeStatus.js +83 -0
- package/dist/utilities/localeStatus.js.map +1 -0
- package/dist/utilities/pageTree.js +1 -1
- package/dist/utilities/pageTree.js.map +1 -1
- package/dist/utilities/pageTreeConfig.d.ts +1 -1
- package/dist/utilities/pageTreeConfig.js +2 -0
- package/dist/utilities/pageTreeConfig.js.map +1 -1
- package/dist/utilities/status.d.ts +2 -2
- package/dist/utilities/status.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 { 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] 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 badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n breadcrumbsFieldSlug: string\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 {\n badgesLinks,\n breadcrumbsFieldSlug,\n collectionConfig,\n collectionSlug,\n docs,\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 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 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 treeSourceDocs = await getDocsWithDisplayStatus({\n badgesLinks: pageTreeConfig.badgesLinks,\n breadcrumbsFieldSlug: pageTreeConfig.breadcrumbsFieldSlug,\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[] = (\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 = 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 badgesLinks={pageTreeConfig.badgesLinks}\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":["getColumns","renderTable","getClientConfig","headers","createLocalReq","extractJWT","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","React","resolvePageTreeBadgeLinks","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","payload","user","docIDs","map","doc","id","currentResult","versions","drafts","find","collection","depth","draft","fallbackLocale","overrideAccess","pagination","select","_status","liveURL","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","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 { 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 { 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 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 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 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 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 localeBadgeStatus: pageTreeConfig.localeBadgeStatus,\n localeBadgeVisibility: pageTreeConfig.localeBadgeVisibility,\n locales: statusLocales,\n payload: props.payload,\n req,\n })\n : await getDocsWithDisplayStatus({\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 allDocs={orderedDocs}\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 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","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","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","statusLocales","badges","locales","localizeStatus","localization","treeSourceDocs","localeBadgeStatus","localeBadgeVisibility","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","beforeActions","BeforeList","BeforeListTable","Description","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","allDocs","badgeConfig","homeIndicatorEnabled","homeIndicator","enabled","sourceDocs"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeLocaleStatus } from '../types.js';
|
|
2
|
+
export declare function PageTreeLocaleStatusBadges({ badgeConfig, collectionSlug, docID, statuses, }: {
|
|
3
|
+
badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig;
|
|
4
|
+
collectionSlug?: string;
|
|
5
|
+
docID?: number | string;
|
|
6
|
+
statuses: PageTreeLocaleStatus[];
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useConfig, useLocale, useTranslation } from '@payloadcms/ui';
|
|
4
|
+
import { formatAdminURL } from 'payload/shared';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { getPageTreeBadgeColor, getPageTreeBadgeLabel } from '../utilities/status.js';
|
|
7
|
+
export function PageTreeLocaleStatusBadges({ badgeConfig, collectionSlug, docID, statuses }) {
|
|
8
|
+
const { config } = useConfig();
|
|
9
|
+
const locale = useLocale();
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
return /*#__PURE__*/ _jsx("span", {
|
|
12
|
+
className: "pages-hierarchy-locale-statuses",
|
|
13
|
+
children: statuses.map(({ locale: code, status, visible })=>{
|
|
14
|
+
const active = code === locale?.code;
|
|
15
|
+
const label = getPageTreeBadgeLabel({
|
|
16
|
+
badgeLabels: badgeConfig.labels,
|
|
17
|
+
status,
|
|
18
|
+
t
|
|
19
|
+
});
|
|
20
|
+
const color = getPageTreeBadgeColor({
|
|
21
|
+
badgeColors: badgeConfig.colors,
|
|
22
|
+
status
|
|
23
|
+
});
|
|
24
|
+
const href = visible !== false && collectionSlug && docID !== undefined ? formatAdminURL({
|
|
25
|
+
adminRoute: config.routes.admin,
|
|
26
|
+
includeBasePath: true,
|
|
27
|
+
path: `/collections/${encodeURIComponent(collectionSlug)}/${encodeURIComponent(docID)}?${new URLSearchParams({
|
|
28
|
+
locale: code
|
|
29
|
+
})}`
|
|
30
|
+
}) : undefined;
|
|
31
|
+
const Badge = href ? 'a' : 'span';
|
|
32
|
+
return /*#__PURE__*/ _jsx("span", {
|
|
33
|
+
className: `pages-hierarchy-locale-status-slot${active ? ' pages-hierarchy-locale-status-slot--active' : ''}`,
|
|
34
|
+
children: /*#__PURE__*/ _jsxs(Badge, {
|
|
35
|
+
"aria-hidden": visible === false ? true : undefined,
|
|
36
|
+
"aria-label": `${code.toUpperCase()}: ${label}`,
|
|
37
|
+
className: `pages-hierarchy-status-badge pages-hierarchy-status-badge--${status} pages-hierarchy-locale-status-badge`,
|
|
38
|
+
"data-active": active ? 'true' : 'false',
|
|
39
|
+
"data-custom-color": color ? 'true' : undefined,
|
|
40
|
+
"data-locale": code,
|
|
41
|
+
"data-status": status,
|
|
42
|
+
href: href,
|
|
43
|
+
onClick: href ? (event)=>event.stopPropagation() : undefined,
|
|
44
|
+
onPointerDown: href ? (event)=>event.stopPropagation() : undefined,
|
|
45
|
+
role: href ? undefined : 'img',
|
|
46
|
+
style: {
|
|
47
|
+
...color ? {
|
|
48
|
+
'--page-tree-badge-base': color
|
|
49
|
+
} : {},
|
|
50
|
+
...visible === false ? {
|
|
51
|
+
visibility: 'hidden'
|
|
52
|
+
} : {}
|
|
53
|
+
},
|
|
54
|
+
children: [
|
|
55
|
+
/*#__PURE__*/ _jsx("span", {
|
|
56
|
+
className: "pages-hierarchy-locale-status-badge__code",
|
|
57
|
+
children: code.toUpperCase()
|
|
58
|
+
}),
|
|
59
|
+
active && /*#__PURE__*/ _jsxs(_Fragment, {
|
|
60
|
+
children: [
|
|
61
|
+
/*#__PURE__*/ _jsx("span", {
|
|
62
|
+
"aria-hidden": "true",
|
|
63
|
+
className: "pages-hierarchy-locale-status-badge__separator",
|
|
64
|
+
children: "·"
|
|
65
|
+
}),
|
|
66
|
+
/*#__PURE__*/ _jsx("span", {
|
|
67
|
+
className: "pages-hierarchy-locale-status-badge__label",
|
|
68
|
+
children: label
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})
|
|
72
|
+
]
|
|
73
|
+
})
|
|
74
|
+
}, code);
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=PageTreeLocaleStatusBadges.js.map
|
|
@@ -0,0 +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(({ locale: code, status, visible }) => {\n const active = code === locale?.code\n const label = 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-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","code","status","visible","active","label","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-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,EAAEJ,QAAQK,IAAI,EAAEC,MAAM,EAAEC,OAAO,EAAE;YAC9C,MAAMC,SAASH,SAASL,QAAQK;YAChC,MAAMI,QAAQhB,sBAAsB;gBAAEiB,aAAaf,YAAYgB,MAAM;gBAAEL;gBAAQL;YAAE;YACjF,MAAMW,QAAQpB,sBAAsB;gBAAEqB,aAAalB,YAAYmB,MAAM;gBAAER;YAAO;YAE9E,MAAMS,OACJR,YAAY,SAASX,kBAAkBC,UAAUmB,YAC7C1B,eAAe;gBACb2B,YAAYlB,OAAOmB,MAAM,CAACC,KAAK;gBAC/BC,iBAAiB;gBACjBC,MAAM,CAAC,aAAa,EAAEC,mBAAmB1B,gBAAgB,CAAC,EAAE0B,mBAAmBzB,OAAO,CAAC,EAAE,IAAI0B,gBAAgB;oBAAEvB,QAAQK;gBAAK,IAAI;YAClI,KACAW;YACN,MAAMQ,QAAQT,OAAO,MAAM;YAE3B,qBACE,KAACb;gBACCC,WAAW,CAAC,kCAAkC,EAAEK,SAAS,gDAAgD,IAAI;0BAG7G,cAAA,MAACgB;oBACCC,eAAalB,YAAY,QAAQ,OAAOS;oBACxCU,cAAY,GAAGrB,KAAKsB,WAAW,GAAG,EAAE,EAAElB,OAAO;oBAC7CN,WAAW,CAAC,2DAA2D,EAAEG,OAAO,oCAAoC,CAAC;oBACrHsB,eAAapB,SAAS,SAAS;oBAC/BqB,qBAAmBjB,QAAQ,SAASI;oBACpCc,eAAazB;oBACb0B,eAAazB;oBACbS,MAAMA;oBACNiB,SAASjB,OAAO,CAACkB,QAA4BA,MAAMC,eAAe,KAAKlB;oBACvEmB,eACEpB,OAAO,CAACkB,QAA8BA,MAAMC,eAAe,KAAKlB;oBAElEoB,MAAMrB,OAAOC,YAAY;oBACzBqB,OAAO;wBACL,GAAIzB,QAAS;4BAAE,0BAA0BA;wBAAM,IAA4B,CAAC,CAAC;wBAC7E,GAAIL,YAAY,QAAQ;4BAAE+B,YAAY;wBAAS,IAAI,CAAC,CAAC;oBACvD;;sCAEA,KAACpC;4BAAKC,WAAU;sCACbE,KAAKsB,WAAW;;wBAElBnB,wBACC;;8CACE,KAACN;oCACCuB,eAAY;oCACZtB,WAAU;8CACX;;8CAGD,KAACD;oCAAKC,WAAU;8CAA8CM;;;;;;eAhC/DJ;QAsCX;;AAGN"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { NestedDocsPageTreePluginBadgesLinks, NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeSourceDoc } from '../types.js';
|
|
2
|
-
export declare function PageTreeStatusBadge({ badgeConfig, badgesLinks, doc, }: {
|
|
2
|
+
export declare function PageTreeStatusBadge({ badgeConfig, badgesLinks, collectionSlug, doc, }: {
|
|
3
3
|
badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig;
|
|
4
4
|
badgesLinks?: NestedDocsPageTreePluginBadgesLinks;
|
|
5
|
+
collectionSlug?: string;
|
|
5
6
|
doc: PageTreeSourceDoc;
|
|
6
7
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -4,8 +4,17 @@ import { ExternalLinkIcon, LinkIcon, useTranslation } from '@payloadcms/ui';
|
|
|
4
4
|
import { EyeIcon } from '@payloadcms/ui/icons/Eye';
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import { getPageTreeBadgeColor, getPageTreeBadgeLabel, getPageTreeDisplayStatus } from '../utilities/status.js';
|
|
7
|
-
|
|
7
|
+
import { PageTreeLocaleStatusBadges } from './PageTreeLocaleStatusBadges.js';
|
|
8
|
+
export function PageTreeStatusBadge({ badgeConfig, badgesLinks, collectionSlug, doc }) {
|
|
8
9
|
const { t } = useTranslation();
|
|
10
|
+
if (badgeConfig.locales && doc.__pageTreeLocaleStatuses?.length) {
|
|
11
|
+
return /*#__PURE__*/ _jsx(PageTreeLocaleStatusBadges, {
|
|
12
|
+
badgeConfig: badgeConfig,
|
|
13
|
+
collectionSlug: collectionSlug,
|
|
14
|
+
docID: doc.id,
|
|
15
|
+
statuses: doc.__pageTreeLocaleStatuses
|
|
16
|
+
});
|
|
17
|
+
}
|
|
9
18
|
const status = getPageTreeDisplayStatus(doc);
|
|
10
19
|
const color = getPageTreeBadgeColor({
|
|
11
20
|
badgeColors: badgeConfig.colors,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PageTreeStatusBadge.tsx"],"sourcesContent":["'use client'\n\nimport { ExternalLinkIcon, LinkIcon, useTranslation } from '@payloadcms/ui'\nimport { EyeIcon } from '@payloadcms/ui/icons/Eye'\nimport React from 'react'\n\nimport type {\n NestedDocsPageTreePluginBadgesLinks,\n NestedDocsPageTreePluginResolvedBadgeConfig,\n PageTreeSourceDoc,\n} from '../types.js'\n\nimport {\n getPageTreeBadgeColor,\n getPageTreeBadgeLabel,\n getPageTreeDisplayStatus,\n} from '../utilities/status.js'\n\nexport function PageTreeStatusBadge({\n badgeConfig,\n badgesLinks,\n doc,\n}: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n doc: PageTreeSourceDoc\n}) {\n const { t } = useTranslation()\n const status = getPageTreeDisplayStatus(doc)\n const color = getPageTreeBadgeColor({ badgeColors: badgeConfig.colors, status })\n const label = getPageTreeBadgeLabel({ badgeLabels: badgeConfig.labels, status, t })\n const previewLabel = t('version:preview')\n const openInNewTabLabel = t('fields:openInNewTab')\n const publicURL = badgesLinks ? doc.__pageTreeStatusLinks?.publicURL : undefined\n const previewURL = badgesLinks ? doc.__pageTreeStatusLinks?.previewURL : undefined\n const mode = badgesLinks?.draftHasPublishedVersion ?? 'both'\n const showIcons = badgesLinks?.showIcons ?? true\n const split = status === 'changed' && mode === 'both' && Boolean(previewURL)\n const opensPreview = status === 'draft' || (status === 'changed' && mode === 'preview')\n const href = opensPreview\n ? previewURL\n : status === 'published' || status === 'changed'\n ? publicURL\n : undefined\n\n const badgeProps = {\n className: `pages-hierarchy-status-badge pages-hierarchy-status-badge--${status}${split ? ' pages-hierarchy-status-badge--split' : ''}`,\n 'data-custom-color': color ? 'true' : undefined,\n style: color ? ({ '--page-tree-badge-base': color } as React.CSSProperties) : undefined,\n }\n const linkProps = {\n href,\n onClick: (event: React.MouseEvent) => event.stopPropagation(),\n onPointerDown: (event: React.PointerEvent) => event.stopPropagation(),\n rel: 'noopener noreferrer',\n target: '_blank',\n title: `${opensPreview ? previewLabel : 'Live'} (${openInNewTabLabel})`,\n }\n\n if (!split) {\n return href ? (\n <a {...badgeProps} {...linkProps}>\n {label}\n {showIcons && (\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n {opensPreview ? <EyeIcon active={false} /> : <LinkIcon />}\n </span>\n )}\n </a>\n ) : (\n <span {...badgeProps}>{label}</span>\n )\n }\n\n return (\n <span {...badgeProps}>\n {href ? (\n <a {...linkProps} className=\"pages-hierarchy-status-badge__body\">\n {label}\n {showIcons && (\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n <LinkIcon />\n </span>\n )}\n </a>\n ) : (\n <span className=\"pages-hierarchy-status-badge__body\">{label}</span>\n )}\n <a\n {...linkProps}\n aria-label={previewLabel}\n className=\"pages-hierarchy-status-badge__preview\"\n href={previewURL}\n title={`${previewLabel} (${openInNewTabLabel})`}\n >\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n {showIcons ? <EyeIcon active={false} /> : <ExternalLinkIcon />}\n </span>\n </a>\n </span>\n )\n}\n"],"names":["ExternalLinkIcon","LinkIcon","useTranslation","EyeIcon","React","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeStatusBadge","badgeConfig","badgesLinks","doc","t","status","color","badgeColors","colors","label","badgeLabels","labels","previewLabel","openInNewTabLabel","publicURL","__pageTreeStatusLinks","undefined","previewURL","mode","draftHasPublishedVersion","showIcons","split","Boolean","opensPreview","href","badgeProps","className","style","linkProps","onClick","event","stopPropagation","onPointerDown","rel","target","title","a","span","aria-hidden","active","aria-label"],"mappings":"AAAA;;AAEA,SAASA,gBAAgB,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAgB;AAC3E,SAASC,OAAO,QAAQ,2BAA0B;AAClD,OAAOC,WAAW,QAAO;AAQzB,SACEC,qBAAqB,EACrBC,qBAAqB,EACrBC,wBAAwB,QACnB,yBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../src/components/PageTreeStatusBadge.tsx"],"sourcesContent":["'use client'\n\nimport { ExternalLinkIcon, LinkIcon, useTranslation } from '@payloadcms/ui'\nimport { EyeIcon } from '@payloadcms/ui/icons/Eye'\nimport React from 'react'\n\nimport type {\n NestedDocsPageTreePluginBadgesLinks,\n NestedDocsPageTreePluginResolvedBadgeConfig,\n PageTreeSourceDoc,\n} from '../types.js'\n\nimport {\n getPageTreeBadgeColor,\n getPageTreeBadgeLabel,\n getPageTreeDisplayStatus,\n} from '../utilities/status.js'\nimport { PageTreeLocaleStatusBadges } from './PageTreeLocaleStatusBadges.js'\n\nexport function PageTreeStatusBadge({\n badgeConfig,\n badgesLinks,\n collectionSlug,\n doc,\n}: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n badgesLinks?: NestedDocsPageTreePluginBadgesLinks\n collectionSlug?: string\n doc: PageTreeSourceDoc\n}) {\n const { t } = useTranslation()\n if (badgeConfig.locales && doc.__pageTreeLocaleStatuses?.length) {\n return (\n <PageTreeLocaleStatusBadges\n badgeConfig={badgeConfig}\n collectionSlug={collectionSlug}\n docID={doc.id}\n statuses={doc.__pageTreeLocaleStatuses}\n />\n )\n }\n\n const status = getPageTreeDisplayStatus(doc)\n const color = getPageTreeBadgeColor({ badgeColors: badgeConfig.colors, status })\n const label = getPageTreeBadgeLabel({ badgeLabels: badgeConfig.labels, status, t })\n const previewLabel = t('version:preview')\n const openInNewTabLabel = t('fields:openInNewTab')\n const publicURL = badgesLinks ? doc.__pageTreeStatusLinks?.publicURL : undefined\n const previewURL = badgesLinks ? doc.__pageTreeStatusLinks?.previewURL : undefined\n const mode = badgesLinks?.draftHasPublishedVersion ?? 'both'\n const showIcons = badgesLinks?.showIcons ?? true\n const split = status === 'changed' && mode === 'both' && Boolean(previewURL)\n const opensPreview = status === 'draft' || (status === 'changed' && mode === 'preview')\n const href = opensPreview\n ? previewURL\n : status === 'published' || status === 'changed'\n ? publicURL\n : undefined\n\n const badgeProps = {\n className: `pages-hierarchy-status-badge pages-hierarchy-status-badge--${status}${split ? ' pages-hierarchy-status-badge--split' : ''}`,\n 'data-custom-color': color ? 'true' : undefined,\n style: color ? ({ '--page-tree-badge-base': color } as React.CSSProperties) : undefined,\n }\n const linkProps = {\n href,\n onClick: (event: React.MouseEvent) => event.stopPropagation(),\n onPointerDown: (event: React.PointerEvent) => event.stopPropagation(),\n rel: 'noopener noreferrer',\n target: '_blank',\n title: `${opensPreview ? previewLabel : 'Live'} (${openInNewTabLabel})`,\n }\n\n if (!split) {\n return href ? (\n <a {...badgeProps} {...linkProps}>\n {label}\n {showIcons && (\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n {opensPreview ? <EyeIcon active={false} /> : <LinkIcon />}\n </span>\n )}\n </a>\n ) : (\n <span {...badgeProps}>{label}</span>\n )\n }\n\n return (\n <span {...badgeProps}>\n {href ? (\n <a {...linkProps} className=\"pages-hierarchy-status-badge__body\">\n {label}\n {showIcons && (\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n <LinkIcon />\n </span>\n )}\n </a>\n ) : (\n <span className=\"pages-hierarchy-status-badge__body\">{label}</span>\n )}\n <a\n {...linkProps}\n aria-label={previewLabel}\n className=\"pages-hierarchy-status-badge__preview\"\n href={previewURL}\n title={`${previewLabel} (${openInNewTabLabel})`}\n >\n <span aria-hidden=\"true\" className=\"pages-hierarchy-status-badge__icon\">\n {showIcons ? <EyeIcon active={false} /> : <ExternalLinkIcon />}\n </span>\n </a>\n </span>\n )\n}\n"],"names":["ExternalLinkIcon","LinkIcon","useTranslation","EyeIcon","React","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeLocaleStatusBadges","PageTreeStatusBadge","badgeConfig","badgesLinks","collectionSlug","doc","t","locales","__pageTreeLocaleStatuses","length","docID","id","statuses","status","color","badgeColors","colors","label","badgeLabels","labels","previewLabel","openInNewTabLabel","publicURL","__pageTreeStatusLinks","undefined","previewURL","mode","draftHasPublishedVersion","showIcons","split","Boolean","opensPreview","href","badgeProps","className","style","linkProps","onClick","event","stopPropagation","onPointerDown","rel","target","title","a","span","aria-hidden","active","aria-label"],"mappings":"AAAA;;AAEA,SAASA,gBAAgB,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAgB;AAC3E,SAASC,OAAO,QAAQ,2BAA0B;AAClD,OAAOC,WAAW,QAAO;AAQzB,SACEC,qBAAqB,EACrBC,qBAAqB,EACrBC,wBAAwB,QACnB,yBAAwB;AAC/B,SAASC,0BAA0B,QAAQ,kCAAiC;AAE5E,OAAO,SAASC,oBAAoB,EAClCC,WAAW,EACXC,WAAW,EACXC,cAAc,EACdC,GAAG,EAMJ;IACC,MAAM,EAAEC,CAAC,EAAE,GAAGZ;IACd,IAAIQ,YAAYK,OAAO,IAAIF,IAAIG,wBAAwB,EAAEC,QAAQ;QAC/D,qBACE,KAACT;YACCE,aAAaA;YACbE,gBAAgBA;YAChBM,OAAOL,IAAIM,EAAE;YACbC,UAAUP,IAAIG,wBAAwB;;IAG5C;IAEA,MAAMK,SAASd,yBAAyBM;IACxC,MAAMS,QAAQjB,sBAAsB;QAAEkB,aAAab,YAAYc,MAAM;QAAEH;IAAO;IAC9E,MAAMI,QAAQnB,sBAAsB;QAAEoB,aAAahB,YAAYiB,MAAM;QAAEN;QAAQP;IAAE;IACjF,MAAMc,eAAed,EAAE;IACvB,MAAMe,oBAAoBf,EAAE;IAC5B,MAAMgB,YAAYnB,cAAcE,IAAIkB,qBAAqB,EAAED,YAAYE;IACvE,MAAMC,aAAatB,cAAcE,IAAIkB,qBAAqB,EAAEE,aAAaD;IACzE,MAAME,OAAOvB,aAAawB,4BAA4B;IACtD,MAAMC,YAAYzB,aAAayB,aAAa;IAC5C,MAAMC,QAAQhB,WAAW,aAAaa,SAAS,UAAUI,QAAQL;IACjE,MAAMM,eAAelB,WAAW,WAAYA,WAAW,aAAaa,SAAS;IAC7E,MAAMM,OAAOD,eACTN,aACAZ,WAAW,eAAeA,WAAW,YACnCS,YACAE;IAEN,MAAMS,aAAa;QACjBC,WAAW,CAAC,2DAA2D,EAAErB,SAASgB,QAAQ,yCAAyC,IAAI;QACvI,qBAAqBf,QAAQ,SAASU;QACtCW,OAAOrB,QAAS;YAAE,0BAA0BA;QAAM,IAA4BU;IAChF;IACA,MAAMY,YAAY;QAChBJ;QACAK,SAAS,CAACC,QAA4BA,MAAMC,eAAe;QAC3DC,eAAe,CAACF,QAA8BA,MAAMC,eAAe;QACnEE,KAAK;QACLC,QAAQ;QACRC,OAAO,GAAGZ,eAAeX,eAAe,OAAO,EAAE,EAAEC,kBAAkB,CAAC,CAAC;IACzE;IAEA,IAAI,CAACQ,OAAO;QACV,OAAOG,qBACL,MAACY;YAAG,GAAGX,UAAU;YAAG,GAAGG,SAAS;;gBAC7BnB;gBACAW,2BACC,KAACiB;oBAAKC,eAAY;oBAAOZ,WAAU;8BAChCH,6BAAe,KAACpC;wBAAQoD,QAAQ;uCAAY,KAACtD;;;2BAKpD,KAACoD;YAAM,GAAGZ,UAAU;sBAAGhB;;IAE3B;IAEA,qBACE,MAAC4B;QAAM,GAAGZ,UAAU;;YACjBD,qBACC,MAACY;gBAAG,GAAGR,SAAS;gBAAEF,WAAU;;oBACzBjB;oBACAW,2BACC,KAACiB;wBAAKC,eAAY;wBAAOZ,WAAU;kCACjC,cAAA,KAACzC;;;+BAKP,KAACoD;gBAAKX,WAAU;0BAAsCjB;;0BAExD,KAAC2B;gBACE,GAAGR,SAAS;gBACbY,cAAY5B;gBACZc,WAAU;gBACVF,MAAMP;gBACNkB,OAAO,GAAGvB,aAAa,EAAE,EAAEC,kBAAkB,CAAC,CAAC;0BAE/C,cAAA,KAACwB;oBAAKC,eAAY;oBAAOZ,WAAU;8BAChCN,0BAAY,KAACjC;wBAAQoD,QAAQ;uCAAY,KAACvD;;;;;AAKrD"}
|
|
@@ -118,35 +118,35 @@ export function PageTreeTitleCell({ children, doc, homeIndicatorEnabled }) {
|
|
|
118
118
|
ref: rowDnd?.orderHandleRef,
|
|
119
119
|
type: "button",
|
|
120
120
|
children: /*#__PURE__*/ _jsxs("svg", {
|
|
121
|
-
|
|
121
|
+
fill: "none",
|
|
122
122
|
height: "20",
|
|
123
123
|
viewBox: "0 0 20 20",
|
|
124
|
-
|
|
124
|
+
width: "20",
|
|
125
125
|
xmlns: "http://www.w3.org/2000/svg",
|
|
126
126
|
children: [
|
|
127
127
|
/*#__PURE__*/ _jsx("path", {
|
|
128
128
|
d: "M7.125 6C7.95343 6 8.625 5.32843 8.625 4.5C8.625 3.67157 7.95343 3 7.125 3C6.29657 3 5.625 3.67157 5.625 4.5C5.625 5.32843 6.29657 6 7.125 6Z",
|
|
129
|
-
fill: "
|
|
129
|
+
fill: "currentColor"
|
|
130
130
|
}),
|
|
131
131
|
/*#__PURE__*/ _jsx("path", {
|
|
132
132
|
d: "M7.125 12C7.95343 12 8.625 11.3284 8.625 10.5C8.625 9.67157 7.95343 9 7.125 9C6.29657 9 5.625 9.67157 5.625 10.5C5.625 11.3284 6.29657 12 7.125 12Z",
|
|
133
|
-
fill: "
|
|
133
|
+
fill: "currentColor"
|
|
134
134
|
}),
|
|
135
135
|
/*#__PURE__*/ _jsx("path", {
|
|
136
136
|
d: "M7.125 18C7.95343 18 8.625 17.3284 8.625 16.5C8.625 15.6716 7.95343 15 7.125 15C6.29657 15 5.625 15.6716 5.625 16.5C5.625 17.3284 6.29657 18 7.125 18Z",
|
|
137
|
-
fill: "
|
|
137
|
+
fill: "currentColor"
|
|
138
138
|
}),
|
|
139
139
|
/*#__PURE__*/ _jsx("path", {
|
|
140
140
|
d: "M12.875 6C13.7034 6 14.375 5.32843 14.375 4.5C14.375 3.67157 13.7034 3 12.875 3C12.0466 3 11.375 3.67157 11.375 4.5C11.375 5.32843 12.0466 6 12.875 6Z",
|
|
141
|
-
fill: "
|
|
141
|
+
fill: "currentColor"
|
|
142
142
|
}),
|
|
143
143
|
/*#__PURE__*/ _jsx("path", {
|
|
144
144
|
d: "M12.875 12C13.7034 12 14.375 11.3284 14.375 10.5C14.375 9.67157 13.7034 9 12.875 9C12.0466 9 11.375 9.67157 11.375 10.5C11.375 11.3284 12.0466 12 12.875 12Z",
|
|
145
|
-
fill: "
|
|
145
|
+
fill: "currentColor"
|
|
146
146
|
}),
|
|
147
147
|
/*#__PURE__*/ _jsx("path", {
|
|
148
148
|
d: "M12.875 18C13.7034 18 14.375 17.3284 14.375 16.5C14.375 15.6716 13.7034 15 12.875 15C12.0466 15 11.375 15.6716 11.375 16.5C11.375 17.3284 12.0466 18 12.875 18Z",
|
|
149
|
-
fill: "
|
|
149
|
+
fill: "currentColor"
|
|
150
150
|
})
|
|
151
151
|
]
|
|
152
152
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PageTreeTitleCell.tsx"],"sourcesContent":["'use client'\n\nimport { useDraggable } from '@dnd-kit/core'\nimport { ChevronIcon, 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=\"1\"\n vectorEffect=\"non-scaling-stroke\"\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.25H2.5V7Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\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 <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.125 6C7.95343 6 8.625 5.32843 8.625 4.5C8.625 3.67157 7.95343 3 7.125 3C6.29657 3 5.625 3.67157 5.625 4.5C5.625 5.32843 6.29657 6 7.125 6Z\" fill=\"black\"/>\n <path d=\"M7.125 12C7.95343 12 8.625 11.3284 8.625 10.5C8.625 9.67157 7.95343 9 7.125 9C6.29657 9 5.625 9.67157 5.625 10.5C5.625 11.3284 6.29657 12 7.125 12Z\" fill=\"black\"/>\n <path d=\"M7.125 18C7.95343 18 8.625 17.3284 8.625 16.5C8.625 15.6716 7.95343 15 7.125 15C6.29657 15 5.625 15.6716 5.625 16.5C5.625 17.3284 6.29657 18 7.125 18Z\" fill=\"black\"/>\n <path d=\"M12.875 6C13.7034 6 14.375 5.32843 14.375 4.5C14.375 3.67157 13.7034 3 12.875 3C12.0466 3 11.375 3.67157 11.375 4.5C11.375 5.32843 12.0466 6 12.875 6Z\" fill=\"black\"/>\n <path d=\"M12.875 12C13.7034 12 14.375 11.3284 14.375 10.5C14.375 9.67157 13.7034 9 12.875 9C12.0466 9 11.375 9.67157 11.375 10.5C11.375 11.3284 12.0466 12 12.875 12Z\" fill=\"black\"/>\n <path d=\"M12.875 18C13.7034 18 14.375 17.3284 14.375 16.5C14.375 15.6716 13.7034 15 12.875 15C12.0466 15 11.375 15.6716 11.375 16.5C11.375 17.3284 12.0466 18 12.875 18Z\" fill=\"black\"/>\n </svg>\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","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","vectorEffect","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, 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=\"1\"\n vectorEffect=\"non-scaling-stroke\"\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.25H2.5V7Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\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 <svg fill=\"none\" height=\"20\" viewBox=\"0 0 20 20\" width=\"20\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.125 6C7.95343 6 8.625 5.32843 8.625 4.5C8.625 3.67157 7.95343 3 7.125 3C6.29657 3 5.625 3.67157 5.625 4.5C5.625 5.32843 6.29657 6 7.125 6Z\" fill=\"currentColor\"/>\n <path d=\"M7.125 12C7.95343 12 8.625 11.3284 8.625 10.5C8.625 9.67157 7.95343 9 7.125 9C6.29657 9 5.625 9.67157 5.625 10.5C5.625 11.3284 6.29657 12 7.125 12Z\" fill=\"currentColor\"/>\n <path d=\"M7.125 18C7.95343 18 8.625 17.3284 8.625 16.5C8.625 15.6716 7.95343 15 7.125 15C6.29657 15 5.625 15.6716 5.625 16.5C5.625 17.3284 6.29657 18 7.125 18Z\" fill=\"currentColor\"/>\n <path d=\"M12.875 6C13.7034 6 14.375 5.32843 14.375 4.5C14.375 3.67157 13.7034 3 12.875 3C12.0466 3 11.375 3.67157 11.375 4.5C11.375 5.32843 12.0466 6 12.875 6Z\" fill=\"currentColor\"/>\n <path d=\"M12.875 12C13.7034 12 14.375 11.3284 14.375 10.5C14.375 9.67157 13.7034 9 12.875 9C12.0466 9 11.375 9.67157 11.375 10.5C11.375 11.3284 12.0466 12 12.875 12Z\" fill=\"currentColor\"/>\n <path d=\"M12.875 18C13.7034 18 14.375 17.3284 14.375 16.5C14.375 15.6716 13.7034 15 12.875 15C12.0466 15 11.375 15.6716 11.375 16.5C11.375 17.3284 12.0466 18 12.875 18Z\" fill=\"currentColor\"/>\n </svg>\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","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","vectorEffect","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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from 'payload';
|
|
2
2
|
import type { NestedDocsPageTreePluginConfig } from './types.js';
|
|
3
|
-
export type { NestedDocsPageTreePluginBadgeConfig, NestedDocsPageTreePluginBadgeMap, NestedDocsPageTreePluginBadgesLinks, NestedDocsPageTreePluginBadgeStatus, NestedDocsPageTreePluginConfig, NestedDocsPageTreePluginHomeIndicatorConfig, PageTreeMoveContext, } from './types.js';
|
|
3
|
+
export type { NestedDocsPageTreePluginBadgeConfig, NestedDocsPageTreePluginBadgeMap, NestedDocsPageTreePluginBadgesLinks, NestedDocsPageTreePluginBadgeStatus, NestedDocsPageTreePluginConfig, NestedDocsPageTreePluginHomeIndicatorConfig, PageTreeLiveURL, PageTreeMoveContext, } from './types.js';
|
|
4
4
|
export { pageTreeMoveContextKey } from './types.js';
|
|
5
5
|
export declare const nestedDocsPageTreePlugin: (pluginOptions: NestedDocsPageTreePluginConfig) => (config: Config) => Config;
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js';
|
|
|
2
2
|
import { createReorderPageEndpoint } from './endpoints/createReorderPageEndpoint.js';
|
|
3
3
|
import { nestedDocsPageTreePluginCustomKey, pageTreeWriteContextKey } from './types.js';
|
|
4
4
|
import { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js';
|
|
5
|
-
import {
|
|
5
|
+
import { createFlowID, DIAGNOSTICS_FLOW_CONTEXT_KEY, projectField, resolveDiagnostics } from './utilities/diagnostics.js';
|
|
6
6
|
import { findTopLevelField, mapTopLevelFields } from './utilities/fields.js';
|
|
7
7
|
const DEFAULT_BREADCRUMBS_FIELD_SLUG = 'breadcrumbs';
|
|
8
8
|
const DEFAULT_HOME_INDICATOR_COLLECTIONS = [
|
|
@@ -24,7 +24,7 @@ const PAGE_TREE_LIST_VIEW_PATH = 'payload-nested-docs-page-tree/rsc#NestedDocsPa
|
|
|
24
24
|
if (orderableFieldName) {
|
|
25
25
|
snapshotFields.push(orderableFieldName);
|
|
26
26
|
}
|
|
27
|
-
return
|
|
27
|
+
return ({ doc, operation, previousDoc, req })=>{
|
|
28
28
|
if (!diagnostics.enabled) {
|
|
29
29
|
return doc;
|
|
30
30
|
}
|
|
@@ -79,7 +79,7 @@ const PAGE_TREE_LIST_VIEW_PATH = 'payload-nested-docs-page-tree/rsc#NestedDocsPa
|
|
|
79
79
|
},
|
|
80
80
|
flow,
|
|
81
81
|
level: 'warn',
|
|
82
|
-
message: `Published doc was demoted to "${
|
|
82
|
+
message: `Published doc was demoted to "${typeof afterStatus === 'string' ? afterStatus : JSON.stringify(afterStatus ?? 'missing')}" by a page-tree operation. Inspect the move-endpoint:enter/ok snapshots in flow ${flow} to confirm whether the main row was touched.`,
|
|
83
83
|
source: 'page-tree-change:status-flip'
|
|
84
84
|
});
|
|
85
85
|
}
|
|
@@ -132,7 +132,7 @@ function validateTargetCollection(args) {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
function buildCollectionCustom(args) {
|
|
135
|
-
const { badges, badgesLinks, breadcrumbsFieldSlug, defaultLimit, hideBreadcrumbs, homeIndicator, parentFieldSlug } = args;
|
|
135
|
+
const { badges, badgesLinks, breadcrumbsFieldSlug, defaultLimit, hideBreadcrumbs, homeIndicator, localeBadgeStatus, localeBadgeVisibility, parentFieldSlug } = args;
|
|
136
136
|
return {
|
|
137
137
|
badges,
|
|
138
138
|
badgesLinks,
|
|
@@ -140,6 +140,8 @@ function buildCollectionCustom(args) {
|
|
|
140
140
|
defaultLimit,
|
|
141
141
|
hideBreadcrumbs,
|
|
142
142
|
homeIndicator,
|
|
143
|
+
localeBadgeStatus,
|
|
144
|
+
localeBadgeVisibility,
|
|
143
145
|
parentFieldSlug
|
|
144
146
|
};
|
|
145
147
|
}
|
|
@@ -217,6 +219,8 @@ export const nestedDocsPageTreePlugin = (pluginOptions)=>(config)=>{
|
|
|
217
219
|
homeIndicator: {
|
|
218
220
|
enabled: homeIndicatorCollectionSlugs.has(collection.slug)
|
|
219
221
|
},
|
|
222
|
+
localeBadgeStatus: pluginOptions.localeBadgeStatus,
|
|
223
|
+
localeBadgeVisibility: pluginOptions.localeBadgeVisibility,
|
|
220
224
|
parentFieldSlug
|
|
221
225
|
})
|
|
222
226
|
},
|