payload-nested-docs-page-tree 1.1.0 → 1.2.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 CHANGED
@@ -10,7 +10,7 @@ Adds a nested tree list view for nested docs collections in Payload admin, with
10
10
 
11
11
  It works alongside `@payloadcms/plugin-nested-docs`. It does not replace nested docs persistence, breadcrumbs generation, or routing.
12
12
 
13
- Tested with Payload `3.84.1` and Next.js `16.2`.
13
+ Tested with Payload `3.84.1` and Next.js `16.2`.
14
14
 
15
15
 
16
16
  ## Install
@@ -49,16 +49,47 @@ If needed, refresh the admin import map:
49
49
  payload generate:importmap
50
50
  ```
51
51
 
52
- ## What It Adds
53
-
54
- - replaces the collection list view with a nested tree table
55
- - preserves sorting, filters, pagination, bulk selection, and row actions
56
- - adds `POST /:id/move` for drag-and-drop parent changes
57
- - hides the read-only breadcrumbs field by default
58
-
59
- ## Status Badges
60
-
61
- The tree view supports three document states:
52
+ ## What It Adds
53
+
54
+ - replaces the collection list view with a nested tree table
55
+ - preserves sorting, filters, pagination, bulk selection, and row actions
56
+ - adds `POST /:id/move` for drag-and-drop parent changes
57
+ - marks the root page with slug `home` using a home icon on the title link
58
+ - hides the read-only breadcrumbs field by default
59
+
60
+ ## Home Indicator
61
+
62
+ By default, the home icon is enabled only for the `pages` collection.
63
+
64
+ ```ts
65
+ nestedDocsPageTreePlugin({
66
+ collections: ['pages'],
67
+ })
68
+ ```
69
+
70
+ For custom page collection slugs, pass an exact allow-list:
71
+
72
+ ```ts
73
+ nestedDocsPageTreePlugin({
74
+ collections: ['page-tree', 'categories'],
75
+ homeIndicator: {
76
+ collections: ['page-tree'],
77
+ },
78
+ })
79
+ ```
80
+
81
+ To disable the home icon everywhere:
82
+
83
+ ```ts
84
+ nestedDocsPageTreePlugin({
85
+ collections: ['pages'],
86
+ homeIndicator: false,
87
+ })
88
+ ```
89
+
90
+ ## Status Badges
91
+
92
+ The tree view supports three document states:
62
93
 
63
94
  - `published`: live and up to date
64
95
  - `changed`: live, but has unpublished changes
@@ -91,10 +122,11 @@ nestedDocsPageTreePlugin({
91
122
  - `collections`: target collection slugs
92
123
  - `parentFieldSlug`: defaults to `'parent'`
93
124
  - `breadcrumbsFieldSlug`: defaults to `'breadcrumbs'`
94
- - `defaultLimit`: defaults to `100`
95
- - `hideBreadcrumbs`: defaults to `true`
96
- - `disabled`: defaults to `false`
97
- - `badges`: optional label and color overrides for `published`, `changed`, and `draft`
125
+ - `defaultLimit`: defaults to `100`
126
+ - `hideBreadcrumbs`: defaults to `true`
127
+ - `homeIndicator`: defaults to `{ collections: ['pages'] }`; set to `false` to disable
128
+ - `disabled`: defaults to `false`
129
+ - `badges`: optional label and color overrides for `published`, `changed`, and `draft`
98
130
 
99
131
  ## Development
100
132
 
@@ -6,6 +6,7 @@ type PageTreeListViewClientOwnProps = {
6
6
  badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig;
7
7
  canMoveDocs: boolean;
8
8
  columnState: Column[];
9
+ homeIndicatorEnabled: boolean;
9
10
  orderableFieldName?: string;
10
11
  parentFieldSlug: string;
11
12
  query: ListQuery;
@@ -13,5 +14,5 @@ type PageTreeListViewClientOwnProps = {
13
14
  useAsTitle: string;
14
15
  };
15
16
  type PageTreeListViewClientProps = Omit<ListViewClientProps, 'columnState' | 'Table'> & PageTreeListViewClientOwnProps;
16
- export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDocs, columnState, orderableFieldName, parentFieldSlug, query, sourceDocs, useAsTitle, ...props }: PageTreeListViewClientProps): import("react/jsx-runtime").JSX.Element;
17
+ export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDocs, columnState, homeIndicatorEnabled, orderableFieldName, parentFieldSlug, query, sourceDocs, useAsTitle, ...props }: PageTreeListViewClientProps): import("react/jsx-runtime").JSX.Element;
17
18
  export {};
@@ -212,7 +212,7 @@ function insertManualOrderColumn(columns, orderColumn) {
212
212
  ];
213
213
  }
214
214
  function buildTableColumns(args) {
215
- const { badgeConfig, columnState, docs, enableRowSelections, orderableFieldName, parentFieldSlug, t, useAsTitle } = args;
215
+ const { badgeConfig, columnState, docs, enableRowSelections, homeIndicatorEnabled, orderableFieldName, parentFieldSlug, t, useAsTitle } = args;
216
216
  const columnsToUse = columnState.map((column)=>{
217
217
  if (column.accessor === useAsTitle) {
218
218
  return {
@@ -220,6 +220,7 @@ function buildTableColumns(args) {
220
220
  active: true,
221
221
  renderedCells: docs.map((doc, index)=>/*#__PURE__*/ _jsx(PageTreeTitleCell, {
222
222
  doc: doc,
223
+ homeIndicatorEnabled: homeIndicatorEnabled,
223
224
  children: column.renderedCells?.[index] ?? getDocDisplayLabel(doc)
224
225
  }, doc.__pageTreeID ?? index))
225
226
  };
@@ -429,7 +430,7 @@ function HierarchyTable({ activeDragRowID, allDocsByID, allowSameParentDrops, co
429
430
  })
430
431
  });
431
432
  }
432
- export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDocs, columnState, orderableFieldName, parentFieldSlug, query, sourceDocs, useAsTitle, ...props }) {
433
+ export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDocs, columnState, homeIndicatorEnabled, orderableFieldName, parentFieldSlug, query, sourceDocs, useAsTitle, ...props }) {
433
434
  const router = useRouter();
434
435
  const searchParams = useSearchParams();
435
436
  const { config } = useConfig();
@@ -554,6 +555,7 @@ export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDo
554
555
  columnState: paginatedColumnState,
555
556
  docs: paginatedDocs,
556
557
  enableRowSelections: props.enableRowSelections,
558
+ homeIndicatorEnabled,
557
559
  orderableFieldName,
558
560
  parentFieldSlug,
559
561
  t: i18n.t,
@@ -562,6 +564,7 @@ export default function PageTreeListViewClient({ allDocs, badgeConfig, canMoveDo
562
564
  paginatedColumnState,
563
565
  paginatedDocs,
564
566
  badgeConfig,
567
+ homeIndicatorEnabled,
565
568
  orderableFieldName,
566
569
  parentFieldSlug,
567
570
  props.enableRowSelections,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PageTreeListView.client.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { Column, ListQuery, ListViewClientProps, PaginatedDocs } from 'payload'\r\n\r\nimport {\r\n DndContext,\r\n type DragEndEvent,\r\n type DragOverEvent,\r\n DragOverlay,\r\n type DragStartEvent,\r\n PointerSensor,\r\n useDroppable,\r\n useSensor,\r\n useSensors,\r\n} from '@dnd-kit/core'\r\nimport {\r\n DefaultListView,\r\n ListQueryProvider,\r\n SelectAll,\r\n SelectRow,\r\n SortHeader,\r\n toast,\r\n useConfig,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { useRouter, useSearchParams } from 'next/navigation'\r\nimport React from 'react'\r\n\r\nimport type {\r\n NestedDocsPageTreePluginResolvedBadgeConfig,\r\n PageTreeSourceDoc,\r\n} from '../types.js'\r\n\r\nimport {\r\n buildInsertDropTargets,\r\n getDropTargetParentDoc,\r\n getOrderPlacementFromDropTarget,\r\n type PageTreeDropTarget,\r\n type PageTreeOrderPlacement,\r\n} from '../utilities/dropTargets.js'\r\nimport {\r\n CANCEL_DRAG_MESSAGE,\r\n getDropValidation,\r\n type PageTreeDropValidation,\r\n} from '../utilities/moveValidation.js'\r\nimport {\r\n buildDocSlugPath,\r\n buildPageTreeDocs,\r\n buildProspectiveDocSlugPath,\r\n getDocDisplayLabel,\r\n getVisibleTreeDocs,\r\n type PageTreeDoc,\r\n} from '../utilities/pageTree.js'\r\nimport { pageTreeCollisionDetectionStrategy } from '../utilities/pageTreeCollision.js'\r\nimport {\r\n getPageTreeBadgeColor,\r\n getPageTreeBadgeLabel,\r\n getPageTreeDisplayStatus,\r\n type PageTreeDisplayStatus,\r\n} from '../utilities/status.js'\r\nimport { PageTreeProvider } from './PageTreeContext.js'\r\nimport styles from './PageTreeListView.module.css'\r\nimport { PageTreeTitleCell } from './PageTreeTitleCell.js'\r\n\r\ntype PageTreeListViewClientOwnProps = {\r\n allDocs: PageTreeDoc[]\r\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\r\n canMoveDocs: boolean\r\n columnState: Column[]\r\n orderableFieldName?: string\r\n parentFieldSlug: string\r\n query: ListQuery\r\n sourceDocs: PageTreeSourceDoc[]\r\n useAsTitle: string\r\n}\r\n\r\ntype PageTreeListViewClientProps = Omit<ListViewClientProps, 'columnState' | 'Table'> &\r\n PageTreeListViewClientOwnProps\r\n\r\ntype SelectableRowData = React.ComponentProps<typeof SelectRow>['rowData']\r\ntype PageTreeDragData = {\r\n dragType?: 'move'\r\n rowID?: string\r\n}\r\ntype ReorderDirection = 'greater' | 'less'\r\n\r\nconst MANUAL_ORDER_COLUMN_ACCESSOR = '_dragHandle'\r\nconst SILENT_MOVE_MESSAGES = new Set([CANCEL_DRAG_MESSAGE])\r\n\r\nfunction getRowDropID(rowID: string): string {\r\n return `page-drop:${rowID}`\r\n}\r\n\r\nfunction getPageTreeDragData(value: unknown): PageTreeDragData {\r\n return value && typeof value === 'object' ? (value as PageTreeDragData) : {}\r\n}\r\n\r\nfunction getPayloadDocID(doc: PageTreeDoc): number | string | undefined {\r\n return typeof doc.id === 'number' || typeof doc.id === 'string' ? doc.id : undefined\r\n}\r\n\r\nfunction getManualOrderDropValidation(args: {\r\n activeDoc: PageTreeDoc\r\n targetDoc?: PageTreeDoc\r\n}): PageTreeDropValidation {\r\n const { activeDoc, targetDoc } = args\r\n\r\n if (!targetDoc) {\r\n return {\r\n isValid: true,\r\n parentID: null,\r\n }\r\n }\r\n\r\n if (targetDoc.__pageTreeID === activeDoc.__pageTreeID) {\r\n return {\r\n isValid: false,\r\n message: CANCEL_DRAG_MESSAGE,\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n }\r\n\r\n if (targetDoc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID)) {\r\n return {\r\n isValid: false,\r\n message: 'A document cannot be moved under one of its descendants.',\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n }\r\n\r\n return {\r\n isValid: true,\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n}\r\n\r\nfunction getDropValidationForMode(args: {\r\n activeDoc: PageTreeDoc\r\n allowSameParent: boolean\r\n targetDoc?: PageTreeDoc\r\n}): PageTreeDropValidation {\r\n const { activeDoc, allowSameParent, targetDoc } = args\r\n\r\n if (allowSameParent) {\r\n return getManualOrderDropValidation({\r\n activeDoc,\r\n targetDoc,\r\n })\r\n }\r\n\r\n return getDropValidation({\r\n activeDoc,\r\n targetDoc,\r\n })\r\n}\r\n\r\nfunction getCurrentOrderPlacement(args: {\r\n activeDoc: PageTreeDoc\r\n docs: PageTreeDoc[]\r\n}): PageTreeOrderPlacement {\r\n const { activeDoc, docs } = args\r\n const activeIndex = docs.findIndex((doc) => doc.__pageTreeID === activeDoc.__pageTreeID)\r\n const movingSubtreeIDs = new Set(\r\n docs\r\n .filter(\r\n (doc) =>\r\n doc.__pageTreeID === activeDoc.__pageTreeID ||\r\n doc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID),\r\n )\r\n .map((doc) => doc.__pageTreeID),\r\n )\r\n const siblingIsNotMoving = (doc: PageTreeDoc) =>\r\n doc.__pageTreeParentID === activeDoc.__pageTreeParentID &&\r\n !movingSubtreeIDs.has(doc.__pageTreeID)\r\n\r\n if (activeIndex < 0) {\r\n return {\r\n nextSiblingID: null,\r\n parentID: activeDoc.__pageTreeParentID,\r\n previousSiblingID: null,\r\n }\r\n }\r\n\r\n return {\r\n nextSiblingID: docs.slice(activeIndex + 1).find(siblingIsNotMoving)?.__pageTreeID ?? null,\r\n parentID: activeDoc.__pageTreeParentID,\r\n previousSiblingID:\r\n docs.slice(0, activeIndex).filter(siblingIsNotMoving).at(-1)?.__pageTreeID ?? null,\r\n }\r\n}\r\n\r\nfunction orderPlacementHasChanged(\r\n currentPlacement: PageTreeOrderPlacement,\r\n nextPlacement: PageTreeOrderPlacement,\r\n): boolean {\r\n return (\r\n currentPlacement.parentID !== nextPlacement.parentID ||\r\n currentPlacement.previousSiblingID !== nextPlacement.previousSiblingID ||\r\n currentPlacement.nextSiblingID !== nextPlacement.nextSiblingID\r\n )\r\n}\r\n\r\nfunction getReorderTargetFromPlacement(args: {\r\n currentSort?: string\r\n docsByID: ReadonlyMap<string, PageTreeDoc>\r\n orderableFieldName: string\r\n placement: PageTreeOrderPlacement\r\n}): {\r\n newKeyWillBe: ReorderDirection\r\n targetDoc: PageTreeDoc\r\n} | null {\r\n const { currentSort, docsByID, orderableFieldName, placement } = args\r\n const targetDocID = placement.previousSiblingID ?? placement.nextSiblingID\r\n\r\n if (!targetDocID) {\r\n return null\r\n }\r\n\r\n const targetDoc = docsByID.get(targetDocID)\r\n\r\n if (!targetDoc) {\r\n return null\r\n }\r\n\r\n return {\r\n newKeyWillBe:\r\n (placement.previousSiblingID !== null && currentSort === orderableFieldName) ||\r\n (placement.previousSiblingID === null && currentSort === `-${orderableFieldName}`)\r\n ? 'greater'\r\n : 'less',\r\n targetDoc,\r\n }\r\n}\r\n\r\nfunction buildPaginatedData(\r\n docs: PageTreeDoc[],\r\n limit: number,\r\n requestedPage: number,\r\n): PaginatedDocs {\r\n const totalDocs = docs.length\r\n const totalPages = totalDocs > 0 ? Math.max(1, Math.ceil(totalDocs / limit)) : 1\r\n const page = Math.min(Math.max(requestedPage, 1), totalPages)\r\n const startIndex = (page - 1) * limit\r\n const pageDocs = docs.slice(startIndex, startIndex + limit)\r\n\r\n return {\r\n docs: pageDocs,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n limit,\r\n nextPage: page < totalPages ? page + 1 : null,\r\n page,\r\n pagingCounter: totalDocs === 0 ? 0 : startIndex + 1,\r\n prevPage: page > 1 ? page - 1 : null,\r\n totalDocs,\r\n totalPages,\r\n }\r\n}\r\n\r\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\r\n if (Array.isArray(value)) {\r\n const sortValues = value.filter((entry) => typeof entry === 'string' && entry.length > 0)\r\n return sortValues.length > 0 ? sortValues.join(',') : undefined\r\n }\r\n\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\nfunction normalizePositiveInt(value: null | string, fallback: number): number {\r\n if (typeof value !== 'string') {\r\n return fallback\r\n }\r\n\r\n const parsedValue = Number.parseInt(value, 10)\r\n return Number.isNaN(parsedValue) || parsedValue <= 0 ? fallback : parsedValue\r\n}\r\n\r\nfunction normalizePageTreeColumnState(columnState: Column[], useAsTitle: string): Column[] {\r\n return columnState\r\n .filter((column) => column.accessor !== MANUAL_ORDER_COLUMN_ACCESSOR)\r\n .map((column) =>\r\n column.accessor === useAsTitle\r\n ? {\r\n ...column,\r\n active: true,\r\n }\r\n : column,\r\n )\r\n}\r\n\r\nfunction sliceColumnState(\r\n columnState: Column[],\r\n docs: PageTreeDoc[],\r\n renderedCellIndexByDocID: ReadonlyMap<string, number>,\r\n): Column[] {\r\n return columnState.map((column) => ({\r\n ...column,\r\n renderedCells: docs.map((doc) => {\r\n const renderedCellIndex =\r\n renderedCellIndexByDocID.get(doc.__pageTreeID) ?? doc.__pageTreeOrderIndex\r\n\r\n return column.renderedCells?.[renderedCellIndex] ?? null\r\n }),\r\n }))\r\n}\r\n\r\nfunction getSelectableRowData(doc: PageTreeDoc): SelectableRowData {\r\n const record = doc as Record<string, unknown>\r\n\r\n return {\r\n id: String(doc.id ?? doc.__pageTreeID),\r\n _isLocked: Boolean(record._isLocked),\r\n _userEditing: record._userEditing as SelectableRowData['_userEditing'],\r\n }\r\n}\r\n\r\nfunction shouldSilenceMoveMessage(message?: string): boolean {\r\n return typeof message === 'string' && SILENT_MOVE_MESSAGES.has(message)\r\n}\r\n\r\nfunction getStatusClassName(\r\n status: PageTreeDisplayStatus,\r\n): 'changed' | 'draft' | 'published' | 'unknown' {\r\n if (status === 'changed' || status === 'draft' || status === 'published') {\r\n return status\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\nfunction renderStatusBadge(args: {\r\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\r\n doc: PageTreeDoc\r\n index: number\r\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\r\n}): React.ReactNode {\r\n const { badgeConfig, doc, index, t } = args\r\n const status = getPageTreeDisplayStatus(doc)\r\n const customColor = getPageTreeBadgeColor({\r\n badgeColors: badgeConfig.colors,\r\n status,\r\n })\r\n const statusClass = getStatusClassName(status)\r\n const style = customColor\r\n ? ({ '--page-tree-badge-base': customColor } as React.CSSProperties)\r\n : undefined\r\n\r\n return (\r\n <span\r\n className={[\r\n 'pages-hierarchy-status-badge',\r\n `pages-hierarchy-status-badge--${statusClass}`,\r\n ].join(' ')}\r\n data-custom-color={customColor ? 'true' : undefined}\r\n key={doc.__pageTreeID ?? index}\r\n style={style}\r\n >\r\n {getPageTreeBadgeLabel({\r\n badgeLabels: badgeConfig.labels,\r\n status,\r\n t,\r\n })}\r\n </span>\r\n )\r\n}\r\n\r\nfunction createManualOrderColumn(docs: PageTreeDoc[]): Column {\r\n return {\r\n accessor: MANUAL_ORDER_COLUMN_ACCESSOR,\r\n active: true,\r\n field: { hidden: true } as Column['field'],\r\n Heading: <SortHeader />,\r\n renderedCells: docs.map(() => null),\r\n }\r\n}\r\n\r\nfunction insertManualOrderColumn(columns: Column[], orderColumn: Column): Column[] {\r\n const selectColumnIndex = columns.findIndex((column) => column.accessor === '_select')\r\n const insertIndex = selectColumnIndex >= 0 ? selectColumnIndex + 1 : 0\r\n\r\n return [\r\n ...columns.slice(0, insertIndex),\r\n orderColumn,\r\n ...columns.slice(insertIndex),\r\n ]\r\n}\r\n\r\nfunction buildTableColumns(args: {\r\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\r\n columnState: Column[]\r\n docs: PageTreeDoc[]\r\n enableRowSelections?: boolean\r\n orderableFieldName?: string\r\n parentFieldSlug: string\r\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\r\n useAsTitle: string\r\n}): Column[] {\r\n const {\r\n badgeConfig,\r\n columnState,\r\n docs,\r\n enableRowSelections,\r\n orderableFieldName,\r\n parentFieldSlug,\r\n t,\r\n useAsTitle,\r\n } = args\r\n const columnsToUse = columnState.map((column) => {\r\n if (column.accessor === useAsTitle) {\r\n return {\r\n ...column,\r\n active: true,\r\n renderedCells: docs.map((doc, index) => (\r\n <PageTreeTitleCell doc={doc} key={doc.__pageTreeID ?? index}>\r\n {column.renderedCells?.[index] ?? getDocDisplayLabel(doc)}\r\n </PageTreeTitleCell>\r\n )),\r\n }\r\n }\r\n\r\n if (column.accessor === '_status') {\r\n return {\r\n ...column,\r\n renderedCells: docs.map((doc, index) =>\r\n renderStatusBadge({\r\n badgeConfig,\r\n doc,\r\n index,\r\n t,\r\n }),\r\n ),\r\n }\r\n }\r\n\r\n if (column.accessor === parentFieldSlug) {\r\n return {\r\n ...column,\r\n renderedCells: docs.map((doc, index) =>\r\n doc.__pageTreeParentID !== null ? (\r\n column.renderedCells?.[index] ?? null\r\n ) : (\r\n <span className=\"pages-hierarchy-empty-cell\" key={doc.__pageTreeID ?? index}>\r\n -\r\n </span>\r\n ),\r\n ),\r\n }\r\n }\r\n\r\n return column\r\n })\r\n\r\n if (enableRowSelections) {\r\n columnsToUse.unshift({\r\n accessor: '_select',\r\n active: true,\r\n field: { hidden: true } as Column['field'],\r\n Heading: <SelectAll />,\r\n renderedCells: docs.map((doc, index) => (\r\n <SelectRow key={doc.__pageTreeID ?? index} rowData={getSelectableRowData(doc)} />\r\n )),\r\n })\r\n }\r\n\r\n if (\r\n orderableFieldName &&\r\n !columnsToUse.some((column) => column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR)\r\n ) {\r\n return insertManualOrderColumn(columnsToUse, createManualOrderColumn(docs))\r\n }\r\n\r\n return columnsToUse\r\n}\r\n\r\nfunction HierarchyInsertRow({\r\n activeColumnsCount,\r\n activeDragRowID,\r\n dropTarget,\r\n dropValidation,\r\n isMovePending,\r\n}: {\r\n activeColumnsCount: number\r\n activeDragRowID: null | string\r\n dropTarget: Extract<PageTreeDropTarget, { dropType: 'insert' }>\r\n dropValidation?: PageTreeDropValidation\r\n isMovePending: boolean\r\n}) {\r\n const { isOver, setNodeRef } = useDroppable({\r\n id: dropTarget.dropID,\r\n data: dropTarget,\r\n disabled: isMovePending,\r\n })\r\n const hasActiveDrag = Boolean(activeDragRowID)\r\n\r\n return (\r\n <tr\r\n className=\"pages-hierarchy-insert-row\"\r\n data-drag-over={isOver ? 'true' : 'false'}\r\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\r\n data-page-tree-insert=\"true\"\r\n >\r\n <td colSpan={activeColumnsCount}>\r\n <div\r\n className=\"pages-hierarchy-insert-row__target\"\r\n data-insert-depth={dropTarget.depth}\r\n ref={setNodeRef}\r\n />\r\n </td>\r\n </tr>\r\n )\r\n}\r\n\r\nfunction HierarchyTableRow({\r\n activeColumns,\r\n activeDragRowID,\r\n doc,\r\n dropValidation,\r\n insertAfterDropID,\r\n insertBeforeDropID,\r\n isMovePending,\r\n rowIndex,\r\n titleCellAccessor,\r\n}: {\r\n activeColumns: Column[]\r\n activeDragRowID: null | string\r\n doc: PageTreeDoc\r\n dropValidation?: PageTreeDropValidation\r\n insertAfterDropID: string\r\n insertBeforeDropID: string\r\n isMovePending: boolean\r\n rowIndex: number\r\n titleCellAccessor: string\r\n}) {\r\n const { isOver, setNodeRef } = useDroppable({\r\n id: getRowDropID(doc.__pageTreeID),\r\n data: {\r\n dropType: 'row',\r\n insertAfterDropID,\r\n insertBeforeDropID,\r\n rowID: doc.__pageTreeID,\r\n } satisfies Extract<PageTreeDropTarget, { dropType: 'row' }>,\r\n disabled: isMovePending,\r\n })\r\n const hasActiveDrag = Boolean(activeDragRowID)\r\n const isActiveDragRow = activeDragRowID === doc.__pageTreeID\r\n\r\n return (\r\n <tr\r\n className={`row-${rowIndex + 1}`}\r\n data-drag-over={isOver ? 'true' : 'false'}\r\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\r\n data-id={doc.id}\r\n data-is-drag-source={isActiveDragRow ? 'true' : 'false'}\r\n data-page-tree-row=\"true\"\r\n ref={setNodeRef}\r\n >\r\n {activeColumns.map((column, columnIndex) => {\r\n const { accessor } = column\r\n\r\n return (\r\n <td\r\n className={`cell-${accessor.replace(/\\./g, '__')}`}\r\n data-page-tree-manual-order-cell={\r\n accessor === MANUAL_ORDER_COLUMN_ACCESSOR ? 'true' : undefined\r\n }\r\n data-page-tree-title-cell={accessor === titleCellAccessor ? 'true' : undefined}\r\n key={columnIndex}\r\n >\r\n {column.renderedCells?.[rowIndex] ?? null}\r\n </td>\r\n )\r\n })}\r\n </tr>\r\n )\r\n}\r\n\r\nfunction HierarchyTable({\r\n activeDragRowID,\r\n allDocsByID,\r\n allowSameParentDrops,\r\n columns,\r\n data,\r\n isMovePending,\r\n titleCellAccessor,\r\n}: {\r\n activeDragRowID: null | string\r\n allDocsByID: ReadonlyMap<string, PageTreeDoc>\r\n allowSameParentDrops: boolean\r\n columns: Column[]\r\n data: PageTreeDoc[]\r\n isMovePending: boolean\r\n titleCellAccessor: string\r\n}) {\r\n const activeColumns = React.useMemo(\r\n () => columns.filter((column) => column?.active),\r\n [columns],\r\n )\r\n const hasManualOrderColumn = React.useMemo(\r\n () => activeColumns.some((column) => column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR),\r\n [activeColumns],\r\n )\r\n const insertDropTargets = React.useMemo(() => buildInsertDropTargets(data), [data])\r\n const activeDoc = activeDragRowID ? allDocsByID.get(activeDragRowID) ?? null : null\r\n const rowDropValidationByID = React.useMemo(() => {\r\n if (!activeDoc) {\r\n return new Map<string, PageTreeDropValidation>()\r\n }\r\n\r\n return new Map(\r\n data.map((doc) => [\r\n doc.__pageTreeID,\r\n getDropValidationForMode({\r\n activeDoc,\r\n allowSameParent: allowSameParentDrops,\r\n targetDoc: doc,\r\n }),\r\n ]),\r\n )\r\n }, [activeDoc, allowSameParentDrops, data])\r\n const insertDropValidationByID = React.useMemo(() => {\r\n if (!activeDoc) {\r\n return new Map<string, PageTreeDropValidation>()\r\n }\r\n\r\n return new Map(\r\n insertDropTargets.map((dropTarget) => [\r\n dropTarget.dropID,\r\n getDropValidationForMode({\r\n activeDoc,\r\n allowSameParent: allowSameParentDrops,\r\n targetDoc:\r\n dropTarget.parentID === null\r\n ? undefined\r\n : allDocsByID.get(dropTarget.parentID) ?? undefined,\r\n }),\r\n ]),\r\n )\r\n }, [activeDoc, allowSameParentDrops, allDocsByID, insertDropTargets])\r\n\r\n if (activeColumns.length === 0) {\r\n return <div>No columns selected</div>\r\n }\r\n\r\n return (\r\n <div\r\n className={[\r\n 'table-wrap pages-hierarchy-table',\r\n activeDoc ? 'pages-hierarchy-table--dragging' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n data-page-tree-orderable={hasManualOrderColumn ? 'true' : undefined}\r\n >\r\n <div className=\"table table--appearance-default\">\r\n <table cellPadding=\"0\" cellSpacing=\"0\">\r\n <thead>\r\n <tr>\r\n {activeColumns.map((column, index) => (\r\n <th\r\n data-page-tree-manual-order-cell={\r\n column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR ? 'true' : undefined\r\n }\r\n data-page-tree-title-cell={\r\n column.accessor === titleCellAccessor ? 'true' : undefined\r\n }\r\n id={`heading-${column.accessor.replace(/\\./g, '__')}`}\r\n key={index}\r\n >\r\n {column.Heading}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {insertDropTargets[0] ? (\r\n <HierarchyInsertRow\r\n activeColumnsCount={activeColumns.length}\r\n activeDragRowID={activeDragRowID}\r\n dropTarget={insertDropTargets[0]}\r\n dropValidation={insertDropValidationByID.get(insertDropTargets[0].dropID)}\r\n isMovePending={isMovePending}\r\n key={insertDropTargets[0].dropID}\r\n />\r\n ) : null}\r\n {data.map((doc, rowIndex) => (\r\n <React.Fragment key={doc.__pageTreeID}>\r\n <HierarchyTableRow\r\n activeColumns={activeColumns}\r\n activeDragRowID={activeDragRowID}\r\n doc={doc}\r\n dropValidation={rowDropValidationByID.get(doc.__pageTreeID)}\r\n insertAfterDropID={insertDropTargets[rowIndex + 1].dropID}\r\n insertBeforeDropID={insertDropTargets[rowIndex].dropID}\r\n isMovePending={isMovePending}\r\n rowIndex={rowIndex}\r\n titleCellAccessor={titleCellAccessor}\r\n />\r\n {insertDropTargets[rowIndex + 1] ? (\r\n <HierarchyInsertRow\r\n activeColumnsCount={activeColumns.length}\r\n activeDragRowID={activeDragRowID}\r\n dropTarget={insertDropTargets[rowIndex + 1]}\r\n dropValidation={insertDropValidationByID.get(\r\n insertDropTargets[rowIndex + 1].dropID,\r\n )}\r\n isMovePending={isMovePending}\r\n key={insertDropTargets[rowIndex + 1].dropID}\r\n />\r\n ) : null}\r\n </React.Fragment>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default function PageTreeListViewClient({\r\n allDocs,\r\n badgeConfig,\r\n canMoveDocs,\r\n columnState,\r\n orderableFieldName,\r\n parentFieldSlug,\r\n query,\r\n sourceDocs,\r\n useAsTitle,\r\n ...props\r\n}: PageTreeListViewClientProps) {\r\n const router = useRouter()\r\n const searchParams = useSearchParams()\r\n const { config } = useConfig()\r\n const locale = useLocale()\r\n const { i18n } = useTranslation()\r\n const [activeDragRowID, setActiveDragRowID] = React.useState<null | string>(null)\r\n const [activeDropTarget, setActiveDropTarget] = React.useState<null | PageTreeDropTarget>(null)\r\n const [collapsedIDs, setCollapsedIDs] = React.useState<Set<string>>(() => new Set())\r\n const [localSourceDocs, setLocalSourceDocs] = React.useState(sourceDocs)\r\n const [pendingMoveRowID, setPendingMoveRowID] = React.useState<null | string>(null)\r\n\r\n React.useEffect(() => {\r\n setLocalSourceDocs(sourceDocs)\r\n }, [sourceDocs])\r\n\r\n const toggleRow = React.useCallback((rowID: string) => {\r\n setCollapsedIDs((currentState) => {\r\n const nextState = new Set(currentState)\r\n\r\n if (nextState.has(rowID)) {\r\n nextState.delete(rowID)\r\n } else {\r\n nextState.add(rowID)\r\n }\r\n\r\n return nextState\r\n })\r\n }, [])\r\n const currentSort = React.useMemo(() => {\r\n const searchParamSort = searchParams.getAll('sort')\r\n\r\n if (searchParamSort.length > 0) {\r\n return normalizeSort(searchParamSort)\r\n }\r\n\r\n return normalizeSort(query.sort as string | string[] | undefined)\r\n }, [query.sort, searchParams])\r\n const manualOrderIsActive = Boolean(\r\n orderableFieldName &&\r\n (currentSort === orderableFieldName || currentSort === `-${orderableFieldName}`),\r\n )\r\n const currentLimit = React.useMemo(\r\n () =>\r\n normalizePositiveInt(\r\n searchParams.get('limit'),\r\n typeof query.limit === 'number' && query.limit > 0 ? query.limit : 10,\r\n ),\r\n [query.limit, searchParams],\r\n )\r\n const currentRequestedPage = React.useMemo(\r\n () =>\r\n normalizePositiveInt(\r\n searchParams.get('page'),\r\n typeof query.page === 'number' && query.page > 0 ? query.page : 1,\r\n ),\r\n [query.page, searchParams],\r\n )\r\n const liveAllDocs = React.useMemo(\r\n () =>\r\n buildPageTreeDocs(localSourceDocs, {\r\n parentFieldSlug,\r\n sort: currentSort,\r\n }),\r\n [currentSort, localSourceDocs, parentFieldSlug],\r\n )\r\n const collapseResetKey = React.useMemo(\r\n () => JSON.stringify([props.collectionSlug, props.viewType, searchParams.toString()]),\r\n [props.collectionSlug, props.viewType, searchParams],\r\n )\r\n const hierarchyValue = React.useMemo(\r\n () => ({\r\n activeDragRowID,\r\n canMoveDocs,\r\n collapsedIDs,\r\n pendingMoveRowID,\r\n toggleRow,\r\n }),\r\n [activeDragRowID, canMoveDocs, collapsedIDs, pendingMoveRowID, toggleRow],\r\n )\r\n\r\n React.useEffect(() => {\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n setCollapsedIDs(new Set())\r\n }, [collapseResetKey])\r\n\r\n const visibleDocs = React.useMemo(\r\n () => getVisibleTreeDocs(liveAllDocs, collapsedIDs),\r\n [liveAllDocs, collapsedIDs],\r\n )\r\n const paginatedData = React.useMemo(\r\n () => buildPaginatedData(visibleDocs, currentLimit, currentRequestedPage),\r\n [currentLimit, currentRequestedPage, visibleDocs],\r\n )\r\n const paginatedDocs = paginatedData.docs as PageTreeDoc[]\r\n const allDocsByID = React.useMemo(\r\n () => new Map(liveAllDocs.map((doc) => [doc.__pageTreeID, doc])),\r\n [liveAllDocs],\r\n )\r\n const paginatedDocsByID = React.useMemo(\r\n () => new Map(paginatedDocs.map((doc) => [doc.__pageTreeID, doc])),\r\n [paginatedDocs],\r\n )\r\n const renderedCellIndexByDocID = React.useMemo(\r\n () => new Map(allDocs.map((doc, index) => [doc.__pageTreeID, index])),\r\n [allDocs],\r\n )\r\n const normalizedColumnState = React.useMemo(\r\n () => normalizePageTreeColumnState(columnState, useAsTitle),\r\n [columnState, useAsTitle],\r\n )\r\n const paginatedColumnState = React.useMemo(\r\n () => sliceColumnState(normalizedColumnState, paginatedDocs, renderedCellIndexByDocID),\r\n [normalizedColumnState, paginatedDocs, renderedCellIndexByDocID],\r\n )\r\n const tableColumns = React.useMemo(\r\n () =>\r\n buildTableColumns({\r\n badgeConfig,\r\n columnState: paginatedColumnState,\r\n docs: paginatedDocs,\r\n enableRowSelections: props.enableRowSelections,\r\n orderableFieldName,\r\n parentFieldSlug,\r\n t: i18n.t,\r\n useAsTitle,\r\n }),\r\n [\r\n paginatedColumnState,\r\n paginatedDocs,\r\n badgeConfig,\r\n orderableFieldName,\r\n parentFieldSlug,\r\n props.enableRowSelections,\r\n i18n.t,\r\n useAsTitle,\r\n ],\r\n )\r\n const activeDragDoc = activeDragRowID ? paginatedDocsByID.get(activeDragRowID) ?? null : null\r\n const activeDragPreviewPath = React.useMemo(() => {\r\n if (!activeDragDoc) {\r\n return null\r\n }\r\n\r\n if (!activeDropTarget) {\r\n return buildDocSlugPath({\r\n doc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n })\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget: activeDropTarget,\r\n })\r\n const dropValidation = getDropValidationForMode({\r\n activeDoc: activeDragDoc,\r\n allowSameParent: manualOrderIsActive,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n return buildDocSlugPath({\r\n doc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n })\r\n }\r\n\r\n return buildProspectiveDocSlugPath({\r\n activeDoc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n }, [activeDragDoc, activeDropTarget, allDocsByID, manualOrderIsActive])\r\n const isMovePending = pendingMoveRowID !== null\r\n const sensors = useSensors(\r\n useSensor(PointerSensor, {\r\n activationConstraint: {\r\n distance: 4,\r\n },\r\n }),\r\n )\r\n const moveDocument = React.useCallback(\r\n async (args: { parentID: null | string; rowID: string }) => {\r\n const { parentID, rowID } = args\r\n const params = new URLSearchParams()\r\n\r\n if (locale?.code) {\r\n params.set('locale', locale.code)\r\n }\r\n\r\n const response = await fetch(\r\n `${config.routes.api}/${props.collectionSlug}/${encodeURIComponent(rowID)}/move${\r\n params.size > 0 ? `?${params.toString()}` : ''\r\n }`,\r\n {\r\n body: JSON.stringify({\r\n parentID,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Accept-Language': i18n.language,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n },\r\n )\r\n const result = (await response.json().catch(() => null)) as\r\n | {\r\n message?: string\r\n }\r\n | null\r\n\r\n if (!response.ok) {\r\n throw new Error(result?.message ?? 'Could not move document.')\r\n }\r\n\r\n return result\r\n },\r\n [config.routes.api, i18n.language, locale?.code, props.collectionSlug],\r\n )\r\n const reorderDocument = React.useCallback(\r\n async (args: {\r\n movedDocID: number | string\r\n newKeyWillBe: ReorderDirection\r\n targetDoc: PageTreeDoc\r\n }) => {\r\n const { movedDocID, newKeyWillBe, targetDoc } = args\r\n const targetID = getPayloadDocID(targetDoc)\r\n\r\n if (!orderableFieldName || targetID === undefined) {\r\n return undefined\r\n }\r\n\r\n const params = new URLSearchParams()\r\n\r\n if (locale?.code) {\r\n params.set('locale', locale.code)\r\n }\r\n\r\n const response = await fetch(\r\n `${config.routes.api}/reorder${params.size > 0 ? `?${params.toString()}` : ''}`,\r\n {\r\n body: JSON.stringify({\r\n collectionSlug: props.collectionSlug,\r\n docsToMove: [movedDocID],\r\n newKeyWillBe,\r\n orderableFieldName,\r\n target: {\r\n id: targetID,\r\n key: targetDoc[orderableFieldName],\r\n },\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Accept-Language': i18n.language,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n },\r\n )\r\n const result = (await response.json().catch(() => null)) as\r\n | {\r\n message?: string\r\n orderValues?: unknown[]\r\n }\r\n | null\r\n\r\n if (response.status === 403) {\r\n throw new Error('You do not have permission to reorder these rows')\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n 'Failed to reorder. This can happen if you reorder several rows too quickly. Please try again.',\r\n )\r\n }\r\n\r\n if (result?.message === 'initial migration') {\r\n throw new Error(\r\n 'You have enabled \"orderable\" on a collection with existing documents and this is the first time you have sorted documents. We have run an automatic migration to add an initial order to the documents. Please refresh the page and try again.',\r\n )\r\n }\r\n\r\n return result?.orderValues?.[0]\r\n },\r\n [\r\n config.routes.api,\r\n i18n.language,\r\n locale?.code,\r\n orderableFieldName,\r\n props.collectionSlug,\r\n ],\r\n )\r\n const handleManualOrderMoveEnd = React.useCallback(\r\n async (args: {\r\n activeDoc: PageTreeDoc\r\n dropTarget: PageTreeDropTarget\r\n rowID: string\r\n }) => {\r\n const { activeDoc, dropTarget, rowID } = args\r\n\r\n if (!orderableFieldName) {\r\n return\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget,\r\n })\r\n const dropValidation = getManualOrderDropValidation({\r\n activeDoc,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\r\n toast.error(dropValidation.message ?? 'Could not move document.')\r\n }\r\n\r\n return\r\n }\r\n\r\n const placement = getOrderPlacementFromDropTarget({\r\n activeDoc,\r\n docs: paginatedDocs,\r\n docsByID: allDocsByID,\r\n dropTarget,\r\n })\r\n\r\n if (!placement) {\r\n return\r\n }\r\n\r\n const currentPlacement = getCurrentOrderPlacement({\r\n activeDoc,\r\n docs: paginatedDocs,\r\n })\r\n const parentChanged = activeDoc.__pageTreeParentID !== placement.parentID\r\n const orderChanged = orderPlacementHasChanged(currentPlacement, placement)\r\n const reorderTarget = orderChanged\r\n ? getReorderTargetFromPlacement({\r\n currentSort,\r\n docsByID: allDocsByID,\r\n orderableFieldName,\r\n placement,\r\n })\r\n : null\r\n\r\n if (!parentChanged && !reorderTarget) {\r\n return\r\n }\r\n\r\n const movedDocID = getPayloadDocID(activeDoc)\r\n\r\n if (movedDocID === undefined) {\r\n return\r\n }\r\n\r\n const parentDoc = placement.parentID ? allDocsByID.get(placement.parentID) : undefined\r\n const nextParentValue =\r\n placement.parentID === null\r\n ? null\r\n : parentDoc\r\n ? getPayloadDocID(parentDoc) ?? placement.parentID\r\n : placement.parentID\r\n let parentMoveSucceeded = false\r\n\r\n setPendingMoveRowID(rowID)\r\n\r\n try {\r\n if (parentChanged) {\r\n await moveDocument({\r\n parentID: placement.parentID,\r\n rowID,\r\n })\r\n parentMoveSucceeded = true\r\n }\r\n\r\n const nextOrderValue = reorderTarget\r\n ? await reorderDocument({\r\n movedDocID,\r\n newKeyWillBe: reorderTarget.newKeyWillBe,\r\n targetDoc: reorderTarget.targetDoc,\r\n })\r\n : undefined\r\n\r\n if (parentChanged || typeof nextOrderValue === 'string') {\r\n setLocalSourceDocs((currentDocs) =>\r\n currentDocs.map((doc) =>\r\n String(doc.id ?? '') === String(movedDocID)\r\n ? {\r\n ...doc,\r\n ...(parentChanged\r\n ? {\r\n [parentFieldSlug]: nextParentValue,\r\n }\r\n : {}),\r\n ...(typeof nextOrderValue === 'string'\r\n ? {\r\n [orderableFieldName]: nextOrderValue,\r\n }\r\n : {}),\r\n }\r\n : doc,\r\n ),\r\n )\r\n }\r\n\r\n if (parentChanged) {\r\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\r\n }\r\n\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n } catch (error) {\r\n const message =\r\n error instanceof Error && error.message ? error.message : 'Could not move document.'\r\n\r\n toast.error(\r\n parentMoveSucceeded\r\n ? `Moved \"${getDocDisplayLabel(activeDoc)}\", but could not update its manual order. ${message}`\r\n : message,\r\n )\r\n\r\n if (parentMoveSucceeded) {\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n }\r\n } finally {\r\n setPendingMoveRowID(null)\r\n }\r\n },\r\n [\r\n allDocsByID,\r\n currentSort,\r\n moveDocument,\r\n orderableFieldName,\r\n paginatedDocs,\r\n parentFieldSlug,\r\n reorderDocument,\r\n router,\r\n ],\r\n )\r\n const handleDragCancel = React.useCallback(() => {\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n }, [])\r\n const handleDragStart = React.useCallback(\r\n (event: DragStartEvent) => {\r\n const dragData = getPageTreeDragData(event.active.data.current)\r\n\r\n if (!canMoveDocs || isMovePending) {\r\n return\r\n }\r\n\r\n const rowID = dragData.rowID\r\n\r\n if (typeof rowID === 'string' && paginatedDocsByID.has(rowID)) {\r\n setActiveDragRowID(rowID)\r\n setActiveDropTarget(null)\r\n }\r\n },\r\n [canMoveDocs, isMovePending, paginatedDocsByID],\r\n )\r\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\r\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\r\n\r\n if (!overData) {\r\n setActiveDropTarget(null)\r\n return\r\n }\r\n\r\n if (overData.dropType === 'insert') {\r\n setActiveDropTarget(overData)\r\n return\r\n }\r\n\r\n if (overData.dropType === 'row') {\r\n setActiveDropTarget(overData)\r\n return\r\n }\r\n\r\n setActiveDropTarget(null)\r\n }, [])\r\n const handleDragEnd = React.useCallback(\r\n async (event: DragEndEvent) => {\r\n const dragData = getPageTreeDragData(event.active.data.current)\r\n\r\n const rowID = dragData.rowID\r\n const activeDoc = typeof rowID === 'string' ? paginatedDocsByID.get(rowID) ?? null : null\r\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\r\n\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n\r\n if (!rowID || !activeDoc || !overData) {\r\n return\r\n }\r\n\r\n if (manualOrderIsActive && orderableFieldName) {\r\n await handleManualOrderMoveEnd({\r\n activeDoc,\r\n dropTarget: overData,\r\n rowID,\r\n })\r\n return\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget: overData,\r\n })\r\n const dropValidation = getDropValidation({\r\n activeDoc,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\r\n toast.error(dropValidation.message ?? 'Could not move document.')\r\n }\r\n\r\n return\r\n }\r\n\r\n setPendingMoveRowID(rowID)\r\n\r\n try {\r\n await moveDocument({\r\n parentID: dropValidation.parentID,\r\n rowID,\r\n })\r\n\r\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n } catch (error) {\r\n const message =\r\n error instanceof Error && error.message ? error.message : 'Could not move document.'\r\n\r\n if (shouldSilenceMoveMessage(message)) {\r\n return\r\n }\r\n\r\n toast.error(message)\r\n } finally {\r\n setPendingMoveRowID(null)\r\n }\r\n },\r\n [\r\n allDocsByID,\r\n handleManualOrderMoveEnd,\r\n manualOrderIsActive,\r\n moveDocument,\r\n orderableFieldName,\r\n paginatedDocsByID,\r\n router,\r\n ],\r\n )\r\n const handleDragEndSync = React.useCallback(\r\n (event: DragEndEvent) => {\r\n void handleDragEnd(event)\r\n },\r\n [handleDragEnd],\r\n )\r\n\r\n const tableNode = React.useMemo(\r\n () => (\r\n <DndContext\r\n collisionDetection={pageTreeCollisionDetectionStrategy}\r\n onDragCancel={handleDragCancel}\r\n onDragEnd={handleDragEndSync}\r\n onDragOver={handleDragOver}\r\n onDragStart={handleDragStart}\r\n sensors={sensors}\r\n >\r\n <HierarchyTable\r\n activeDragRowID={activeDragRowID}\r\n allDocsByID={allDocsByID}\r\n allowSameParentDrops={manualOrderIsActive}\r\n columns={tableColumns}\r\n data={paginatedDocs}\r\n isMovePending={isMovePending}\r\n titleCellAccessor={useAsTitle}\r\n />\r\n <DragOverlay dropAnimation={null} style={{ cursor: 'grabbing' }}>\n {activeDragPreviewPath ? (\r\n <div className=\"pages-hierarchy-drag-overlay\">{activeDragPreviewPath}</div>\r\n ) : null}\r\n </DragOverlay>\r\n </DndContext>\r\n ),\r\n [\r\n activeDragPreviewPath,\r\n activeDragRowID,\r\n handleDragCancel,\r\n handleDragEndSync,\r\n handleDragOver,\r\n handleDragStart,\r\n isMovePending,\r\n allDocsByID,\r\n manualOrderIsActive,\r\n paginatedDocs,\r\n sensors,\r\n tableColumns,\r\n useAsTitle,\r\n ],\r\n )\r\n\r\n return (\r\n <div className={styles.root}>\r\n <PageTreeProvider value={hierarchyValue}>\r\n <ListQueryProvider\r\n collectionSlug={props.collectionSlug}\r\n data={paginatedData}\r\n modifySearchParams\r\n orderableFieldName={orderableFieldName}\r\n query={{\r\n ...query,\r\n limit: currentLimit,\r\n page: paginatedData.page,\r\n sort: currentSort,\r\n }}\r\n >\r\n <DefaultListView {...props} columnState={paginatedColumnState} Table={tableNode} />\r\n </ListQueryProvider>\r\n </PageTreeProvider>\r\n </div>\r\n )\r\n}\r\n"],"names":["DndContext","DragOverlay","PointerSensor","useDroppable","useSensor","useSensors","DefaultListView","ListQueryProvider","SelectAll","SelectRow","SortHeader","toast","useConfig","useLocale","useTranslation","useRouter","useSearchParams","React","buildInsertDropTargets","getDropTargetParentDoc","getOrderPlacementFromDropTarget","CANCEL_DRAG_MESSAGE","getDropValidation","buildDocSlugPath","buildPageTreeDocs","buildProspectiveDocSlugPath","getDocDisplayLabel","getVisibleTreeDocs","pageTreeCollisionDetectionStrategy","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeProvider","styles","PageTreeTitleCell","MANUAL_ORDER_COLUMN_ACCESSOR","SILENT_MOVE_MESSAGES","Set","getRowDropID","rowID","getPageTreeDragData","value","getPayloadDocID","doc","id","undefined","getManualOrderDropValidation","args","activeDoc","targetDoc","isValid","parentID","__pageTreeID","message","__pageTreeAncestorIDs","includes","getDropValidationForMode","allowSameParent","getCurrentOrderPlacement","docs","activeIndex","findIndex","movingSubtreeIDs","filter","map","siblingIsNotMoving","__pageTreeParentID","has","nextSiblingID","previousSiblingID","slice","find","at","orderPlacementHasChanged","currentPlacement","nextPlacement","getReorderTargetFromPlacement","currentSort","docsByID","orderableFieldName","placement","targetDocID","get","newKeyWillBe","buildPaginatedData","limit","requestedPage","totalDocs","length","totalPages","Math","max","ceil","page","min","startIndex","pageDocs","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","normalizeSort","Array","isArray","sortValues","entry","join","normalizePositiveInt","fallback","parsedValue","Number","parseInt","isNaN","normalizePageTreeColumnState","columnState","useAsTitle","column","accessor","active","sliceColumnState","renderedCellIndexByDocID","renderedCells","renderedCellIndex","__pageTreeOrderIndex","getSelectableRowData","record","String","_isLocked","Boolean","_userEditing","shouldSilenceMoveMessage","getStatusClassName","status","renderStatusBadge","badgeConfig","index","t","customColor","badgeColors","colors","statusClass","style","span","className","data-custom-color","badgeLabels","labels","createManualOrderColumn","field","hidden","Heading","insertManualOrderColumn","columns","orderColumn","selectColumnIndex","insertIndex","buildTableColumns","enableRowSelections","parentFieldSlug","columnsToUse","unshift","rowData","some","HierarchyInsertRow","activeColumnsCount","activeDragRowID","dropTarget","dropValidation","isMovePending","isOver","setNodeRef","dropID","data","disabled","hasActiveDrag","tr","data-drag-over","data-drop-valid","data-page-tree-insert","td","colSpan","div","data-insert-depth","depth","ref","HierarchyTableRow","activeColumns","insertAfterDropID","insertBeforeDropID","rowIndex","titleCellAccessor","dropType","isActiveDragRow","data-id","data-is-drag-source","data-page-tree-row","columnIndex","replace","data-page-tree-manual-order-cell","data-page-tree-title-cell","HierarchyTable","allDocsByID","allowSameParentDrops","useMemo","hasManualOrderColumn","insertDropTargets","rowDropValidationByID","Map","insertDropValidationByID","data-page-tree-orderable","table","cellPadding","cellSpacing","thead","th","tbody","Fragment","PageTreeListViewClient","allDocs","canMoveDocs","query","sourceDocs","props","router","searchParams","config","locale","i18n","setActiveDragRowID","useState","activeDropTarget","setActiveDropTarget","collapsedIDs","setCollapsedIDs","localSourceDocs","setLocalSourceDocs","pendingMoveRowID","setPendingMoveRowID","useEffect","toggleRow","useCallback","currentState","nextState","delete","add","searchParamSort","getAll","sort","manualOrderIsActive","currentLimit","currentRequestedPage","liveAllDocs","collapseResetKey","JSON","stringify","collectionSlug","viewType","toString","hierarchyValue","visibleDocs","paginatedData","paginatedDocs","paginatedDocsByID","normalizedColumnState","paginatedColumnState","tableColumns","activeDragDoc","activeDragPreviewPath","sensors","activationConstraint","distance","moveDocument","params","URLSearchParams","code","set","response","fetch","routes","api","encodeURIComponent","size","body","credentials","headers","language","method","result","json","catch","ok","Error","reorderDocument","movedDocID","targetID","docsToMove","target","key","orderValues","handleManualOrderMoveEnd","error","parentChanged","orderChanged","reorderTarget","parentDoc","nextParentValue","parentMoveSucceeded","nextOrderValue","currentDocs","success","startTransition","refresh","handleDragCancel","handleDragStart","event","dragData","current","handleDragOver","overData","over","handleDragEnd","handleDragEndSync","tableNode","collisionDetection","onDragCancel","onDragEnd","onDragOver","onDragStart","dropAnimation","cursor","root","modifySearchParams","Table"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/PageTreeListView.client.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { Column, ListQuery, ListViewClientProps, PaginatedDocs } from 'payload'\r\n\r\nimport {\r\n DndContext,\r\n type DragEndEvent,\r\n type DragOverEvent,\r\n DragOverlay,\r\n type DragStartEvent,\r\n PointerSensor,\r\n useDroppable,\r\n useSensor,\r\n useSensors,\r\n} from '@dnd-kit/core'\r\nimport {\r\n DefaultListView,\r\n ListQueryProvider,\r\n SelectAll,\r\n SelectRow,\r\n SortHeader,\r\n toast,\r\n useConfig,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { useRouter, useSearchParams } from 'next/navigation'\r\nimport React from 'react'\r\n\r\nimport type {\r\n NestedDocsPageTreePluginResolvedBadgeConfig,\r\n PageTreeSourceDoc,\r\n} from '../types.js'\r\n\r\nimport {\r\n buildInsertDropTargets,\r\n getDropTargetParentDoc,\r\n getOrderPlacementFromDropTarget,\r\n type PageTreeDropTarget,\r\n type PageTreeOrderPlacement,\r\n} from '../utilities/dropTargets.js'\r\nimport {\r\n CANCEL_DRAG_MESSAGE,\r\n getDropValidation,\r\n type PageTreeDropValidation,\r\n} from '../utilities/moveValidation.js'\r\nimport {\r\n buildDocSlugPath,\r\n buildPageTreeDocs,\r\n buildProspectiveDocSlugPath,\r\n getDocDisplayLabel,\r\n getVisibleTreeDocs,\r\n type PageTreeDoc,\r\n} from '../utilities/pageTree.js'\r\nimport { pageTreeCollisionDetectionStrategy } from '../utilities/pageTreeCollision.js'\r\nimport {\r\n getPageTreeBadgeColor,\r\n getPageTreeBadgeLabel,\r\n getPageTreeDisplayStatus,\r\n type PageTreeDisplayStatus,\r\n} from '../utilities/status.js'\r\nimport { PageTreeProvider } from './PageTreeContext.js'\r\nimport styles from './PageTreeListView.module.css'\r\nimport { PageTreeTitleCell } from './PageTreeTitleCell.js'\r\n\r\ntype PageTreeListViewClientOwnProps = {\r\n allDocs: PageTreeDoc[]\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n canMoveDocs: boolean\n columnState: Column[]\n homeIndicatorEnabled: boolean\n orderableFieldName?: string\n parentFieldSlug: string\n query: ListQuery\n sourceDocs: PageTreeSourceDoc[]\n useAsTitle: string\r\n}\r\n\r\ntype PageTreeListViewClientProps = Omit<ListViewClientProps, 'columnState' | 'Table'> &\r\n PageTreeListViewClientOwnProps\r\n\r\ntype SelectableRowData = React.ComponentProps<typeof SelectRow>['rowData']\r\ntype PageTreeDragData = {\r\n dragType?: 'move'\r\n rowID?: string\r\n}\r\ntype ReorderDirection = 'greater' | 'less'\r\n\r\nconst MANUAL_ORDER_COLUMN_ACCESSOR = '_dragHandle'\r\nconst SILENT_MOVE_MESSAGES = new Set([CANCEL_DRAG_MESSAGE])\r\n\r\nfunction getRowDropID(rowID: string): string {\r\n return `page-drop:${rowID}`\r\n}\r\n\r\nfunction getPageTreeDragData(value: unknown): PageTreeDragData {\r\n return value && typeof value === 'object' ? (value as PageTreeDragData) : {}\r\n}\r\n\r\nfunction getPayloadDocID(doc: PageTreeDoc): number | string | undefined {\r\n return typeof doc.id === 'number' || typeof doc.id === 'string' ? doc.id : undefined\r\n}\r\n\r\nfunction getManualOrderDropValidation(args: {\r\n activeDoc: PageTreeDoc\r\n targetDoc?: PageTreeDoc\r\n}): PageTreeDropValidation {\r\n const { activeDoc, targetDoc } = args\r\n\r\n if (!targetDoc) {\r\n return {\r\n isValid: true,\r\n parentID: null,\r\n }\r\n }\r\n\r\n if (targetDoc.__pageTreeID === activeDoc.__pageTreeID) {\r\n return {\r\n isValid: false,\r\n message: CANCEL_DRAG_MESSAGE,\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n }\r\n\r\n if (targetDoc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID)) {\r\n return {\r\n isValid: false,\r\n message: 'A document cannot be moved under one of its descendants.',\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n }\r\n\r\n return {\r\n isValid: true,\r\n parentID: targetDoc.__pageTreeID,\r\n }\r\n}\r\n\r\nfunction getDropValidationForMode(args: {\r\n activeDoc: PageTreeDoc\r\n allowSameParent: boolean\r\n targetDoc?: PageTreeDoc\r\n}): PageTreeDropValidation {\r\n const { activeDoc, allowSameParent, targetDoc } = args\r\n\r\n if (allowSameParent) {\r\n return getManualOrderDropValidation({\r\n activeDoc,\r\n targetDoc,\r\n })\r\n }\r\n\r\n return getDropValidation({\r\n activeDoc,\r\n targetDoc,\r\n })\r\n}\r\n\r\nfunction getCurrentOrderPlacement(args: {\r\n activeDoc: PageTreeDoc\r\n docs: PageTreeDoc[]\r\n}): PageTreeOrderPlacement {\r\n const { activeDoc, docs } = args\r\n const activeIndex = docs.findIndex((doc) => doc.__pageTreeID === activeDoc.__pageTreeID)\r\n const movingSubtreeIDs = new Set(\r\n docs\r\n .filter(\r\n (doc) =>\r\n doc.__pageTreeID === activeDoc.__pageTreeID ||\r\n doc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID),\r\n )\r\n .map((doc) => doc.__pageTreeID),\r\n )\r\n const siblingIsNotMoving = (doc: PageTreeDoc) =>\r\n doc.__pageTreeParentID === activeDoc.__pageTreeParentID &&\r\n !movingSubtreeIDs.has(doc.__pageTreeID)\r\n\r\n if (activeIndex < 0) {\r\n return {\r\n nextSiblingID: null,\r\n parentID: activeDoc.__pageTreeParentID,\r\n previousSiblingID: null,\r\n }\r\n }\r\n\r\n return {\r\n nextSiblingID: docs.slice(activeIndex + 1).find(siblingIsNotMoving)?.__pageTreeID ?? null,\r\n parentID: activeDoc.__pageTreeParentID,\r\n previousSiblingID:\r\n docs.slice(0, activeIndex).filter(siblingIsNotMoving).at(-1)?.__pageTreeID ?? null,\r\n }\r\n}\r\n\r\nfunction orderPlacementHasChanged(\r\n currentPlacement: PageTreeOrderPlacement,\r\n nextPlacement: PageTreeOrderPlacement,\r\n): boolean {\r\n return (\r\n currentPlacement.parentID !== nextPlacement.parentID ||\r\n currentPlacement.previousSiblingID !== nextPlacement.previousSiblingID ||\r\n currentPlacement.nextSiblingID !== nextPlacement.nextSiblingID\r\n )\r\n}\r\n\r\nfunction getReorderTargetFromPlacement(args: {\r\n currentSort?: string\r\n docsByID: ReadonlyMap<string, PageTreeDoc>\r\n orderableFieldName: string\r\n placement: PageTreeOrderPlacement\r\n}): {\r\n newKeyWillBe: ReorderDirection\r\n targetDoc: PageTreeDoc\r\n} | null {\r\n const { currentSort, docsByID, orderableFieldName, placement } = args\r\n const targetDocID = placement.previousSiblingID ?? placement.nextSiblingID\r\n\r\n if (!targetDocID) {\r\n return null\r\n }\r\n\r\n const targetDoc = docsByID.get(targetDocID)\r\n\r\n if (!targetDoc) {\r\n return null\r\n }\r\n\r\n return {\r\n newKeyWillBe:\r\n (placement.previousSiblingID !== null && currentSort === orderableFieldName) ||\r\n (placement.previousSiblingID === null && currentSort === `-${orderableFieldName}`)\r\n ? 'greater'\r\n : 'less',\r\n targetDoc,\r\n }\r\n}\r\n\r\nfunction buildPaginatedData(\r\n docs: PageTreeDoc[],\r\n limit: number,\r\n requestedPage: number,\r\n): PaginatedDocs {\r\n const totalDocs = docs.length\r\n const totalPages = totalDocs > 0 ? Math.max(1, Math.ceil(totalDocs / limit)) : 1\r\n const page = Math.min(Math.max(requestedPage, 1), totalPages)\r\n const startIndex = (page - 1) * limit\r\n const pageDocs = docs.slice(startIndex, startIndex + limit)\r\n\r\n return {\r\n docs: pageDocs,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n limit,\r\n nextPage: page < totalPages ? page + 1 : null,\r\n page,\r\n pagingCounter: totalDocs === 0 ? 0 : startIndex + 1,\r\n prevPage: page > 1 ? page - 1 : null,\r\n totalDocs,\r\n totalPages,\r\n }\r\n}\r\n\r\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\r\n if (Array.isArray(value)) {\r\n const sortValues = value.filter((entry) => typeof entry === 'string' && entry.length > 0)\r\n return sortValues.length > 0 ? sortValues.join(',') : undefined\r\n }\r\n\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\nfunction normalizePositiveInt(value: null | string, fallback: number): number {\r\n if (typeof value !== 'string') {\r\n return fallback\r\n }\r\n\r\n const parsedValue = Number.parseInt(value, 10)\r\n return Number.isNaN(parsedValue) || parsedValue <= 0 ? fallback : parsedValue\r\n}\r\n\r\nfunction normalizePageTreeColumnState(columnState: Column[], useAsTitle: string): Column[] {\r\n return columnState\r\n .filter((column) => column.accessor !== MANUAL_ORDER_COLUMN_ACCESSOR)\r\n .map((column) =>\r\n column.accessor === useAsTitle\r\n ? {\r\n ...column,\r\n active: true,\r\n }\r\n : column,\r\n )\r\n}\r\n\r\nfunction sliceColumnState(\r\n columnState: Column[],\r\n docs: PageTreeDoc[],\r\n renderedCellIndexByDocID: ReadonlyMap<string, number>,\r\n): Column[] {\r\n return columnState.map((column) => ({\r\n ...column,\r\n renderedCells: docs.map((doc) => {\r\n const renderedCellIndex =\r\n renderedCellIndexByDocID.get(doc.__pageTreeID) ?? doc.__pageTreeOrderIndex\r\n\r\n return column.renderedCells?.[renderedCellIndex] ?? null\r\n }),\r\n }))\r\n}\r\n\r\nfunction getSelectableRowData(doc: PageTreeDoc): SelectableRowData {\r\n const record = doc as Record<string, unknown>\r\n\r\n return {\r\n id: String(doc.id ?? doc.__pageTreeID),\r\n _isLocked: Boolean(record._isLocked),\r\n _userEditing: record._userEditing as SelectableRowData['_userEditing'],\r\n }\r\n}\r\n\r\nfunction shouldSilenceMoveMessage(message?: string): boolean {\r\n return typeof message === 'string' && SILENT_MOVE_MESSAGES.has(message)\r\n}\r\n\r\nfunction getStatusClassName(\r\n status: PageTreeDisplayStatus,\r\n): 'changed' | 'draft' | 'published' | 'unknown' {\r\n if (status === 'changed' || status === 'draft' || status === 'published') {\r\n return status\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\nfunction renderStatusBadge(args: {\r\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\r\n doc: PageTreeDoc\r\n index: number\r\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\r\n}): React.ReactNode {\r\n const { badgeConfig, doc, index, t } = args\r\n const status = getPageTreeDisplayStatus(doc)\r\n const customColor = getPageTreeBadgeColor({\r\n badgeColors: badgeConfig.colors,\r\n status,\r\n })\r\n const statusClass = getStatusClassName(status)\r\n const style = customColor\r\n ? ({ '--page-tree-badge-base': customColor } as React.CSSProperties)\r\n : undefined\r\n\r\n return (\r\n <span\r\n className={[\r\n 'pages-hierarchy-status-badge',\r\n `pages-hierarchy-status-badge--${statusClass}`,\r\n ].join(' ')}\r\n data-custom-color={customColor ? 'true' : undefined}\r\n key={doc.__pageTreeID ?? index}\r\n style={style}\r\n >\r\n {getPageTreeBadgeLabel({\r\n badgeLabels: badgeConfig.labels,\r\n status,\r\n t,\r\n })}\r\n </span>\r\n )\r\n}\r\n\r\nfunction createManualOrderColumn(docs: PageTreeDoc[]): Column {\r\n return {\r\n accessor: MANUAL_ORDER_COLUMN_ACCESSOR,\r\n active: true,\r\n field: { hidden: true } as Column['field'],\r\n Heading: <SortHeader />,\r\n renderedCells: docs.map(() => null),\r\n }\r\n}\r\n\r\nfunction insertManualOrderColumn(columns: Column[], orderColumn: Column): Column[] {\r\n const selectColumnIndex = columns.findIndex((column) => column.accessor === '_select')\r\n const insertIndex = selectColumnIndex >= 0 ? selectColumnIndex + 1 : 0\r\n\r\n return [\r\n ...columns.slice(0, insertIndex),\r\n orderColumn,\r\n ...columns.slice(insertIndex),\r\n ]\r\n}\r\n\r\nfunction buildTableColumns(args: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n columnState: Column[]\n docs: PageTreeDoc[]\n enableRowSelections?: boolean\n homeIndicatorEnabled: boolean\n orderableFieldName?: string\n parentFieldSlug: string\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\n useAsTitle: string\n}): Column[] {\r\n const {\r\n badgeConfig,\r\n columnState,\n docs,\n enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t,\n useAsTitle,\r\n } = args\r\n const columnsToUse = columnState.map((column) => {\r\n if (column.accessor === useAsTitle) {\r\n return {\r\n ...column,\n active: true,\n renderedCells: docs.map((doc, index) => (\n <PageTreeTitleCell\n doc={doc}\n homeIndicatorEnabled={homeIndicatorEnabled}\n key={doc.__pageTreeID ?? index}\n >\n {column.renderedCells?.[index] ?? getDocDisplayLabel(doc)}\n </PageTreeTitleCell>\n )),\n }\r\n }\r\n\r\n if (column.accessor === '_status') {\r\n return {\r\n ...column,\r\n renderedCells: docs.map((doc, index) =>\r\n renderStatusBadge({\r\n badgeConfig,\r\n doc,\r\n index,\r\n t,\r\n }),\r\n ),\r\n }\r\n }\r\n\r\n if (column.accessor === parentFieldSlug) {\r\n return {\r\n ...column,\r\n renderedCells: docs.map((doc, index) =>\r\n doc.__pageTreeParentID !== null ? (\r\n column.renderedCells?.[index] ?? null\r\n ) : (\r\n <span className=\"pages-hierarchy-empty-cell\" key={doc.__pageTreeID ?? index}>\r\n -\r\n </span>\r\n ),\r\n ),\r\n }\r\n }\r\n\r\n return column\r\n })\r\n\r\n if (enableRowSelections) {\r\n columnsToUse.unshift({\r\n accessor: '_select',\r\n active: true,\r\n field: { hidden: true } as Column['field'],\r\n Heading: <SelectAll />,\r\n renderedCells: docs.map((doc, index) => (\r\n <SelectRow key={doc.__pageTreeID ?? index} rowData={getSelectableRowData(doc)} />\r\n )),\r\n })\r\n }\r\n\r\n if (\r\n orderableFieldName &&\r\n !columnsToUse.some((column) => column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR)\r\n ) {\r\n return insertManualOrderColumn(columnsToUse, createManualOrderColumn(docs))\r\n }\r\n\r\n return columnsToUse\r\n}\r\n\r\nfunction HierarchyInsertRow({\r\n activeColumnsCount,\r\n activeDragRowID,\r\n dropTarget,\r\n dropValidation,\r\n isMovePending,\r\n}: {\r\n activeColumnsCount: number\r\n activeDragRowID: null | string\r\n dropTarget: Extract<PageTreeDropTarget, { dropType: 'insert' }>\r\n dropValidation?: PageTreeDropValidation\r\n isMovePending: boolean\r\n}) {\r\n const { isOver, setNodeRef } = useDroppable({\r\n id: dropTarget.dropID,\r\n data: dropTarget,\r\n disabled: isMovePending,\r\n })\r\n const hasActiveDrag = Boolean(activeDragRowID)\r\n\r\n return (\r\n <tr\r\n className=\"pages-hierarchy-insert-row\"\r\n data-drag-over={isOver ? 'true' : 'false'}\r\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\r\n data-page-tree-insert=\"true\"\r\n >\r\n <td colSpan={activeColumnsCount}>\r\n <div\r\n className=\"pages-hierarchy-insert-row__target\"\r\n data-insert-depth={dropTarget.depth}\r\n ref={setNodeRef}\r\n />\r\n </td>\r\n </tr>\r\n )\r\n}\r\n\r\nfunction HierarchyTableRow({\r\n activeColumns,\r\n activeDragRowID,\r\n doc,\r\n dropValidation,\r\n insertAfterDropID,\r\n insertBeforeDropID,\r\n isMovePending,\r\n rowIndex,\r\n titleCellAccessor,\r\n}: {\r\n activeColumns: Column[]\r\n activeDragRowID: null | string\r\n doc: PageTreeDoc\r\n dropValidation?: PageTreeDropValidation\r\n insertAfterDropID: string\r\n insertBeforeDropID: string\r\n isMovePending: boolean\r\n rowIndex: number\r\n titleCellAccessor: string\r\n}) {\r\n const { isOver, setNodeRef } = useDroppable({\r\n id: getRowDropID(doc.__pageTreeID),\r\n data: {\r\n dropType: 'row',\r\n insertAfterDropID,\r\n insertBeforeDropID,\r\n rowID: doc.__pageTreeID,\r\n } satisfies Extract<PageTreeDropTarget, { dropType: 'row' }>,\r\n disabled: isMovePending,\r\n })\r\n const hasActiveDrag = Boolean(activeDragRowID)\r\n const isActiveDragRow = activeDragRowID === doc.__pageTreeID\r\n\r\n return (\r\n <tr\r\n className={`row-${rowIndex + 1}`}\r\n data-drag-over={isOver ? 'true' : 'false'}\r\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\r\n data-id={doc.id}\r\n data-is-drag-source={isActiveDragRow ? 'true' : 'false'}\r\n data-page-tree-row=\"true\"\r\n ref={setNodeRef}\r\n >\r\n {activeColumns.map((column, columnIndex) => {\r\n const { accessor } = column\r\n\r\n return (\r\n <td\r\n className={`cell-${accessor.replace(/\\./g, '__')}`}\r\n data-page-tree-manual-order-cell={\r\n accessor === MANUAL_ORDER_COLUMN_ACCESSOR ? 'true' : undefined\r\n }\r\n data-page-tree-title-cell={accessor === titleCellAccessor ? 'true' : undefined}\r\n key={columnIndex}\r\n >\r\n {column.renderedCells?.[rowIndex] ?? null}\r\n </td>\r\n )\r\n })}\r\n </tr>\r\n )\r\n}\r\n\r\nfunction HierarchyTable({\r\n activeDragRowID,\r\n allDocsByID,\r\n allowSameParentDrops,\r\n columns,\r\n data,\r\n isMovePending,\r\n titleCellAccessor,\r\n}: {\r\n activeDragRowID: null | string\r\n allDocsByID: ReadonlyMap<string, PageTreeDoc>\r\n allowSameParentDrops: boolean\r\n columns: Column[]\r\n data: PageTreeDoc[]\r\n isMovePending: boolean\r\n titleCellAccessor: string\r\n}) {\r\n const activeColumns = React.useMemo(\r\n () => columns.filter((column) => column?.active),\r\n [columns],\r\n )\r\n const hasManualOrderColumn = React.useMemo(\r\n () => activeColumns.some((column) => column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR),\r\n [activeColumns],\r\n )\r\n const insertDropTargets = React.useMemo(() => buildInsertDropTargets(data), [data])\r\n const activeDoc = activeDragRowID ? allDocsByID.get(activeDragRowID) ?? null : null\r\n const rowDropValidationByID = React.useMemo(() => {\r\n if (!activeDoc) {\r\n return new Map<string, PageTreeDropValidation>()\r\n }\r\n\r\n return new Map(\r\n data.map((doc) => [\r\n doc.__pageTreeID,\r\n getDropValidationForMode({\r\n activeDoc,\r\n allowSameParent: allowSameParentDrops,\r\n targetDoc: doc,\r\n }),\r\n ]),\r\n )\r\n }, [activeDoc, allowSameParentDrops, data])\r\n const insertDropValidationByID = React.useMemo(() => {\r\n if (!activeDoc) {\r\n return new Map<string, PageTreeDropValidation>()\r\n }\r\n\r\n return new Map(\r\n insertDropTargets.map((dropTarget) => [\r\n dropTarget.dropID,\r\n getDropValidationForMode({\r\n activeDoc,\r\n allowSameParent: allowSameParentDrops,\r\n targetDoc:\r\n dropTarget.parentID === null\r\n ? undefined\r\n : allDocsByID.get(dropTarget.parentID) ?? undefined,\r\n }),\r\n ]),\r\n )\r\n }, [activeDoc, allowSameParentDrops, allDocsByID, insertDropTargets])\r\n\r\n if (activeColumns.length === 0) {\r\n return <div>No columns selected</div>\r\n }\r\n\r\n return (\r\n <div\r\n className={[\r\n 'table-wrap pages-hierarchy-table',\r\n activeDoc ? 'pages-hierarchy-table--dragging' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n data-page-tree-orderable={hasManualOrderColumn ? 'true' : undefined}\r\n >\r\n <div className=\"table table--appearance-default\">\r\n <table cellPadding=\"0\" cellSpacing=\"0\">\r\n <thead>\r\n <tr>\r\n {activeColumns.map((column, index) => (\r\n <th\r\n data-page-tree-manual-order-cell={\r\n column.accessor === MANUAL_ORDER_COLUMN_ACCESSOR ? 'true' : undefined\r\n }\r\n data-page-tree-title-cell={\r\n column.accessor === titleCellAccessor ? 'true' : undefined\r\n }\r\n id={`heading-${column.accessor.replace(/\\./g, '__')}`}\r\n key={index}\r\n >\r\n {column.Heading}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {insertDropTargets[0] ? (\r\n <HierarchyInsertRow\r\n activeColumnsCount={activeColumns.length}\r\n activeDragRowID={activeDragRowID}\r\n dropTarget={insertDropTargets[0]}\r\n dropValidation={insertDropValidationByID.get(insertDropTargets[0].dropID)}\r\n isMovePending={isMovePending}\r\n key={insertDropTargets[0].dropID}\r\n />\r\n ) : null}\r\n {data.map((doc, rowIndex) => (\r\n <React.Fragment key={doc.__pageTreeID}>\r\n <HierarchyTableRow\r\n activeColumns={activeColumns}\r\n activeDragRowID={activeDragRowID}\r\n doc={doc}\r\n dropValidation={rowDropValidationByID.get(doc.__pageTreeID)}\r\n insertAfterDropID={insertDropTargets[rowIndex + 1].dropID}\r\n insertBeforeDropID={insertDropTargets[rowIndex].dropID}\r\n isMovePending={isMovePending}\r\n rowIndex={rowIndex}\r\n titleCellAccessor={titleCellAccessor}\r\n />\r\n {insertDropTargets[rowIndex + 1] ? (\r\n <HierarchyInsertRow\r\n activeColumnsCount={activeColumns.length}\r\n activeDragRowID={activeDragRowID}\r\n dropTarget={insertDropTargets[rowIndex + 1]}\r\n dropValidation={insertDropValidationByID.get(\r\n insertDropTargets[rowIndex + 1].dropID,\r\n )}\r\n isMovePending={isMovePending}\r\n key={insertDropTargets[rowIndex + 1].dropID}\r\n />\r\n ) : null}\r\n </React.Fragment>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default function PageTreeListViewClient({\r\n allDocs,\r\n badgeConfig,\n canMoveDocs,\n columnState,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n query,\n sourceDocs,\r\n useAsTitle,\r\n ...props\r\n}: PageTreeListViewClientProps) {\r\n const router = useRouter()\r\n const searchParams = useSearchParams()\r\n const { config } = useConfig()\r\n const locale = useLocale()\r\n const { i18n } = useTranslation()\r\n const [activeDragRowID, setActiveDragRowID] = React.useState<null | string>(null)\r\n const [activeDropTarget, setActiveDropTarget] = React.useState<null | PageTreeDropTarget>(null)\r\n const [collapsedIDs, setCollapsedIDs] = React.useState<Set<string>>(() => new Set())\r\n const [localSourceDocs, setLocalSourceDocs] = React.useState(sourceDocs)\r\n const [pendingMoveRowID, setPendingMoveRowID] = React.useState<null | string>(null)\r\n\r\n React.useEffect(() => {\r\n setLocalSourceDocs(sourceDocs)\r\n }, [sourceDocs])\r\n\r\n const toggleRow = React.useCallback((rowID: string) => {\r\n setCollapsedIDs((currentState) => {\r\n const nextState = new Set(currentState)\r\n\r\n if (nextState.has(rowID)) {\r\n nextState.delete(rowID)\r\n } else {\r\n nextState.add(rowID)\r\n }\r\n\r\n return nextState\r\n })\r\n }, [])\r\n const currentSort = React.useMemo(() => {\r\n const searchParamSort = searchParams.getAll('sort')\r\n\r\n if (searchParamSort.length > 0) {\r\n return normalizeSort(searchParamSort)\r\n }\r\n\r\n return normalizeSort(query.sort as string | string[] | undefined)\r\n }, [query.sort, searchParams])\r\n const manualOrderIsActive = Boolean(\r\n orderableFieldName &&\r\n (currentSort === orderableFieldName || currentSort === `-${orderableFieldName}`),\r\n )\r\n const currentLimit = React.useMemo(\r\n () =>\r\n normalizePositiveInt(\r\n searchParams.get('limit'),\r\n typeof query.limit === 'number' && query.limit > 0 ? query.limit : 10,\r\n ),\r\n [query.limit, searchParams],\r\n )\r\n const currentRequestedPage = React.useMemo(\r\n () =>\r\n normalizePositiveInt(\r\n searchParams.get('page'),\r\n typeof query.page === 'number' && query.page > 0 ? query.page : 1,\r\n ),\r\n [query.page, searchParams],\r\n )\r\n const liveAllDocs = React.useMemo(\r\n () =>\r\n buildPageTreeDocs(localSourceDocs, {\r\n parentFieldSlug,\r\n sort: currentSort,\r\n }),\r\n [currentSort, localSourceDocs, parentFieldSlug],\r\n )\r\n const collapseResetKey = React.useMemo(\r\n () => JSON.stringify([props.collectionSlug, props.viewType, searchParams.toString()]),\r\n [props.collectionSlug, props.viewType, searchParams],\r\n )\r\n const hierarchyValue = React.useMemo(\r\n () => ({\r\n activeDragRowID,\r\n canMoveDocs,\r\n collapsedIDs,\r\n pendingMoveRowID,\r\n toggleRow,\r\n }),\r\n [activeDragRowID, canMoveDocs, collapsedIDs, pendingMoveRowID, toggleRow],\r\n )\r\n\r\n React.useEffect(() => {\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n setCollapsedIDs(new Set())\r\n }, [collapseResetKey])\r\n\r\n const visibleDocs = React.useMemo(\r\n () => getVisibleTreeDocs(liveAllDocs, collapsedIDs),\r\n [liveAllDocs, collapsedIDs],\r\n )\r\n const paginatedData = React.useMemo(\r\n () => buildPaginatedData(visibleDocs, currentLimit, currentRequestedPage),\r\n [currentLimit, currentRequestedPage, visibleDocs],\r\n )\r\n const paginatedDocs = paginatedData.docs as PageTreeDoc[]\r\n const allDocsByID = React.useMemo(\r\n () => new Map(liveAllDocs.map((doc) => [doc.__pageTreeID, doc])),\r\n [liveAllDocs],\r\n )\r\n const paginatedDocsByID = React.useMemo(\r\n () => new Map(paginatedDocs.map((doc) => [doc.__pageTreeID, doc])),\r\n [paginatedDocs],\r\n )\r\n const renderedCellIndexByDocID = React.useMemo(\r\n () => new Map(allDocs.map((doc, index) => [doc.__pageTreeID, index])),\r\n [allDocs],\r\n )\r\n const normalizedColumnState = React.useMemo(\r\n () => normalizePageTreeColumnState(columnState, useAsTitle),\r\n [columnState, useAsTitle],\r\n )\r\n const paginatedColumnState = React.useMemo(\r\n () => sliceColumnState(normalizedColumnState, paginatedDocs, renderedCellIndexByDocID),\r\n [normalizedColumnState, paginatedDocs, renderedCellIndexByDocID],\r\n )\r\n const tableColumns = React.useMemo(\r\n () =>\r\n buildTableColumns({\r\n badgeConfig,\r\n columnState: paginatedColumnState,\r\n docs: paginatedDocs,\n enableRowSelections: props.enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t: i18n.t,\n useAsTitle,\r\n }),\r\n [\r\n paginatedColumnState,\r\n paginatedDocs,\r\n badgeConfig,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n props.enableRowSelections,\r\n i18n.t,\r\n useAsTitle,\r\n ],\r\n )\r\n const activeDragDoc = activeDragRowID ? paginatedDocsByID.get(activeDragRowID) ?? null : null\r\n const activeDragPreviewPath = React.useMemo(() => {\r\n if (!activeDragDoc) {\r\n return null\r\n }\r\n\r\n if (!activeDropTarget) {\r\n return buildDocSlugPath({\r\n doc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n })\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget: activeDropTarget,\r\n })\r\n const dropValidation = getDropValidationForMode({\r\n activeDoc: activeDragDoc,\r\n allowSameParent: manualOrderIsActive,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n return buildDocSlugPath({\r\n doc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n })\r\n }\r\n\r\n return buildProspectiveDocSlugPath({\r\n activeDoc: activeDragDoc,\r\n docsByID: allDocsByID,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n }, [activeDragDoc, activeDropTarget, allDocsByID, manualOrderIsActive])\r\n const isMovePending = pendingMoveRowID !== null\r\n const sensors = useSensors(\r\n useSensor(PointerSensor, {\r\n activationConstraint: {\r\n distance: 4,\r\n },\r\n }),\r\n )\r\n const moveDocument = React.useCallback(\r\n async (args: { parentID: null | string; rowID: string }) => {\r\n const { parentID, rowID } = args\r\n const params = new URLSearchParams()\r\n\r\n if (locale?.code) {\r\n params.set('locale', locale.code)\r\n }\r\n\r\n const response = await fetch(\r\n `${config.routes.api}/${props.collectionSlug}/${encodeURIComponent(rowID)}/move${\r\n params.size > 0 ? `?${params.toString()}` : ''\r\n }`,\r\n {\r\n body: JSON.stringify({\r\n parentID,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Accept-Language': i18n.language,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n },\r\n )\r\n const result = (await response.json().catch(() => null)) as\r\n | {\r\n message?: string\r\n }\r\n | null\r\n\r\n if (!response.ok) {\r\n throw new Error(result?.message ?? 'Could not move document.')\r\n }\r\n\r\n return result\r\n },\r\n [config.routes.api, i18n.language, locale?.code, props.collectionSlug],\r\n )\r\n const reorderDocument = React.useCallback(\r\n async (args: {\r\n movedDocID: number | string\r\n newKeyWillBe: ReorderDirection\r\n targetDoc: PageTreeDoc\r\n }) => {\r\n const { movedDocID, newKeyWillBe, targetDoc } = args\r\n const targetID = getPayloadDocID(targetDoc)\r\n\r\n if (!orderableFieldName || targetID === undefined) {\r\n return undefined\r\n }\r\n\r\n const params = new URLSearchParams()\r\n\r\n if (locale?.code) {\r\n params.set('locale', locale.code)\r\n }\r\n\r\n const response = await fetch(\r\n `${config.routes.api}/reorder${params.size > 0 ? `?${params.toString()}` : ''}`,\r\n {\r\n body: JSON.stringify({\r\n collectionSlug: props.collectionSlug,\r\n docsToMove: [movedDocID],\r\n newKeyWillBe,\r\n orderableFieldName,\r\n target: {\r\n id: targetID,\r\n key: targetDoc[orderableFieldName],\r\n },\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Accept-Language': i18n.language,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n },\r\n )\r\n const result = (await response.json().catch(() => null)) as\r\n | {\r\n message?: string\r\n orderValues?: unknown[]\r\n }\r\n | null\r\n\r\n if (response.status === 403) {\r\n throw new Error('You do not have permission to reorder these rows')\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n 'Failed to reorder. This can happen if you reorder several rows too quickly. Please try again.',\r\n )\r\n }\r\n\r\n if (result?.message === 'initial migration') {\r\n throw new Error(\r\n 'You have enabled \"orderable\" on a collection with existing documents and this is the first time you have sorted documents. We have run an automatic migration to add an initial order to the documents. Please refresh the page and try again.',\r\n )\r\n }\r\n\r\n return result?.orderValues?.[0]\r\n },\r\n [\r\n config.routes.api,\r\n i18n.language,\r\n locale?.code,\r\n orderableFieldName,\r\n props.collectionSlug,\r\n ],\r\n )\r\n const handleManualOrderMoveEnd = React.useCallback(\r\n async (args: {\r\n activeDoc: PageTreeDoc\r\n dropTarget: PageTreeDropTarget\r\n rowID: string\r\n }) => {\r\n const { activeDoc, dropTarget, rowID } = args\r\n\r\n if (!orderableFieldName) {\r\n return\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget,\r\n })\r\n const dropValidation = getManualOrderDropValidation({\r\n activeDoc,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\r\n toast.error(dropValidation.message ?? 'Could not move document.')\r\n }\r\n\r\n return\r\n }\r\n\r\n const placement = getOrderPlacementFromDropTarget({\r\n activeDoc,\r\n docs: paginatedDocs,\r\n docsByID: allDocsByID,\r\n dropTarget,\r\n })\r\n\r\n if (!placement) {\r\n return\r\n }\r\n\r\n const currentPlacement = getCurrentOrderPlacement({\r\n activeDoc,\r\n docs: paginatedDocs,\r\n })\r\n const parentChanged = activeDoc.__pageTreeParentID !== placement.parentID\r\n const orderChanged = orderPlacementHasChanged(currentPlacement, placement)\r\n const reorderTarget = orderChanged\r\n ? getReorderTargetFromPlacement({\r\n currentSort,\r\n docsByID: allDocsByID,\r\n orderableFieldName,\r\n placement,\r\n })\r\n : null\r\n\r\n if (!parentChanged && !reorderTarget) {\r\n return\r\n }\r\n\r\n const movedDocID = getPayloadDocID(activeDoc)\r\n\r\n if (movedDocID === undefined) {\r\n return\r\n }\r\n\r\n const parentDoc = placement.parentID ? allDocsByID.get(placement.parentID) : undefined\r\n const nextParentValue =\r\n placement.parentID === null\r\n ? null\r\n : parentDoc\r\n ? getPayloadDocID(parentDoc) ?? placement.parentID\r\n : placement.parentID\r\n let parentMoveSucceeded = false\r\n\r\n setPendingMoveRowID(rowID)\r\n\r\n try {\r\n if (parentChanged) {\r\n await moveDocument({\r\n parentID: placement.parentID,\r\n rowID,\r\n })\r\n parentMoveSucceeded = true\r\n }\r\n\r\n const nextOrderValue = reorderTarget\r\n ? await reorderDocument({\r\n movedDocID,\r\n newKeyWillBe: reorderTarget.newKeyWillBe,\r\n targetDoc: reorderTarget.targetDoc,\r\n })\r\n : undefined\r\n\r\n if (parentChanged || typeof nextOrderValue === 'string') {\r\n setLocalSourceDocs((currentDocs) =>\r\n currentDocs.map((doc) =>\r\n String(doc.id ?? '') === String(movedDocID)\r\n ? {\r\n ...doc,\r\n ...(parentChanged\r\n ? {\r\n [parentFieldSlug]: nextParentValue,\r\n }\r\n : {}),\r\n ...(typeof nextOrderValue === 'string'\r\n ? {\r\n [orderableFieldName]: nextOrderValue,\r\n }\r\n : {}),\r\n }\r\n : doc,\r\n ),\r\n )\r\n }\r\n\r\n if (parentChanged) {\r\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\r\n }\r\n\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n } catch (error) {\r\n const message =\r\n error instanceof Error && error.message ? error.message : 'Could not move document.'\r\n\r\n toast.error(\r\n parentMoveSucceeded\r\n ? `Moved \"${getDocDisplayLabel(activeDoc)}\", but could not update its manual order. ${message}`\r\n : message,\r\n )\r\n\r\n if (parentMoveSucceeded) {\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n }\r\n } finally {\r\n setPendingMoveRowID(null)\r\n }\r\n },\r\n [\r\n allDocsByID,\r\n currentSort,\r\n moveDocument,\r\n orderableFieldName,\r\n paginatedDocs,\r\n parentFieldSlug,\r\n reorderDocument,\r\n router,\r\n ],\r\n )\r\n const handleDragCancel = React.useCallback(() => {\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n }, [])\r\n const handleDragStart = React.useCallback(\r\n (event: DragStartEvent) => {\r\n const dragData = getPageTreeDragData(event.active.data.current)\r\n\r\n if (!canMoveDocs || isMovePending) {\r\n return\r\n }\r\n\r\n const rowID = dragData.rowID\r\n\r\n if (typeof rowID === 'string' && paginatedDocsByID.has(rowID)) {\r\n setActiveDragRowID(rowID)\r\n setActiveDropTarget(null)\r\n }\r\n },\r\n [canMoveDocs, isMovePending, paginatedDocsByID],\r\n )\r\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\r\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\r\n\r\n if (!overData) {\r\n setActiveDropTarget(null)\r\n return\r\n }\r\n\r\n if (overData.dropType === 'insert') {\r\n setActiveDropTarget(overData)\r\n return\r\n }\r\n\r\n if (overData.dropType === 'row') {\r\n setActiveDropTarget(overData)\r\n return\r\n }\r\n\r\n setActiveDropTarget(null)\r\n }, [])\r\n const handleDragEnd = React.useCallback(\r\n async (event: DragEndEvent) => {\r\n const dragData = getPageTreeDragData(event.active.data.current)\r\n\r\n const rowID = dragData.rowID\r\n const activeDoc = typeof rowID === 'string' ? paginatedDocsByID.get(rowID) ?? null : null\r\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\r\n\r\n setActiveDragRowID(null)\r\n setActiveDropTarget(null)\r\n\r\n if (!rowID || !activeDoc || !overData) {\r\n return\r\n }\r\n\r\n if (manualOrderIsActive && orderableFieldName) {\r\n await handleManualOrderMoveEnd({\r\n activeDoc,\r\n dropTarget: overData,\r\n rowID,\r\n })\r\n return\r\n }\r\n\r\n const targetDoc = getDropTargetParentDoc({\r\n docsByID: allDocsByID,\r\n dropTarget: overData,\r\n })\r\n const dropValidation = getDropValidation({\r\n activeDoc,\r\n targetDoc: targetDoc ?? undefined,\r\n })\r\n\r\n if (!dropValidation.isValid) {\r\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\r\n toast.error(dropValidation.message ?? 'Could not move document.')\r\n }\r\n\r\n return\r\n }\r\n\r\n setPendingMoveRowID(rowID)\r\n\r\n try {\r\n await moveDocument({\r\n parentID: dropValidation.parentID,\r\n rowID,\r\n })\r\n\r\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\r\n React.startTransition(() => {\r\n router.refresh()\r\n })\r\n } catch (error) {\r\n const message =\r\n error instanceof Error && error.message ? error.message : 'Could not move document.'\r\n\r\n if (shouldSilenceMoveMessage(message)) {\r\n return\r\n }\r\n\r\n toast.error(message)\r\n } finally {\r\n setPendingMoveRowID(null)\r\n }\r\n },\r\n [\r\n allDocsByID,\r\n handleManualOrderMoveEnd,\r\n manualOrderIsActive,\r\n moveDocument,\r\n orderableFieldName,\r\n paginatedDocsByID,\r\n router,\r\n ],\r\n )\r\n const handleDragEndSync = React.useCallback(\r\n (event: DragEndEvent) => {\r\n void handleDragEnd(event)\r\n },\r\n [handleDragEnd],\r\n )\r\n\r\n const tableNode = React.useMemo(\r\n () => (\r\n <DndContext\r\n collisionDetection={pageTreeCollisionDetectionStrategy}\r\n onDragCancel={handleDragCancel}\r\n onDragEnd={handleDragEndSync}\r\n onDragOver={handleDragOver}\r\n onDragStart={handleDragStart}\r\n sensors={sensors}\r\n >\r\n <HierarchyTable\r\n activeDragRowID={activeDragRowID}\r\n allDocsByID={allDocsByID}\r\n allowSameParentDrops={manualOrderIsActive}\r\n columns={tableColumns}\r\n data={paginatedDocs}\r\n isMovePending={isMovePending}\r\n titleCellAccessor={useAsTitle}\r\n />\r\n <DragOverlay dropAnimation={null} style={{ cursor: 'grabbing' }}>\r\n {activeDragPreviewPath ? (\r\n <div className=\"pages-hierarchy-drag-overlay\">{activeDragPreviewPath}</div>\r\n ) : null}\r\n </DragOverlay>\r\n </DndContext>\r\n ),\r\n [\r\n activeDragPreviewPath,\r\n activeDragRowID,\r\n handleDragCancel,\r\n handleDragEndSync,\r\n handleDragOver,\r\n handleDragStart,\r\n isMovePending,\r\n allDocsByID,\r\n manualOrderIsActive,\r\n paginatedDocs,\r\n sensors,\r\n tableColumns,\r\n useAsTitle,\r\n ],\r\n )\r\n\r\n return (\r\n <div className={styles.root}>\r\n <PageTreeProvider value={hierarchyValue}>\r\n <ListQueryProvider\r\n collectionSlug={props.collectionSlug}\r\n data={paginatedData}\r\n modifySearchParams\r\n orderableFieldName={orderableFieldName}\r\n query={{\r\n ...query,\r\n limit: currentLimit,\r\n page: paginatedData.page,\r\n sort: currentSort,\r\n }}\r\n >\r\n <DefaultListView {...props} columnState={paginatedColumnState} Table={tableNode} />\r\n </ListQueryProvider>\r\n </PageTreeProvider>\r\n </div>\r\n )\r\n}\r\n"],"names":["DndContext","DragOverlay","PointerSensor","useDroppable","useSensor","useSensors","DefaultListView","ListQueryProvider","SelectAll","SelectRow","SortHeader","toast","useConfig","useLocale","useTranslation","useRouter","useSearchParams","React","buildInsertDropTargets","getDropTargetParentDoc","getOrderPlacementFromDropTarget","CANCEL_DRAG_MESSAGE","getDropValidation","buildDocSlugPath","buildPageTreeDocs","buildProspectiveDocSlugPath","getDocDisplayLabel","getVisibleTreeDocs","pageTreeCollisionDetectionStrategy","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeProvider","styles","PageTreeTitleCell","MANUAL_ORDER_COLUMN_ACCESSOR","SILENT_MOVE_MESSAGES","Set","getRowDropID","rowID","getPageTreeDragData","value","getPayloadDocID","doc","id","undefined","getManualOrderDropValidation","args","activeDoc","targetDoc","isValid","parentID","__pageTreeID","message","__pageTreeAncestorIDs","includes","getDropValidationForMode","allowSameParent","getCurrentOrderPlacement","docs","activeIndex","findIndex","movingSubtreeIDs","filter","map","siblingIsNotMoving","__pageTreeParentID","has","nextSiblingID","previousSiblingID","slice","find","at","orderPlacementHasChanged","currentPlacement","nextPlacement","getReorderTargetFromPlacement","currentSort","docsByID","orderableFieldName","placement","targetDocID","get","newKeyWillBe","buildPaginatedData","limit","requestedPage","totalDocs","length","totalPages","Math","max","ceil","page","min","startIndex","pageDocs","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","normalizeSort","Array","isArray","sortValues","entry","join","normalizePositiveInt","fallback","parsedValue","Number","parseInt","isNaN","normalizePageTreeColumnState","columnState","useAsTitle","column","accessor","active","sliceColumnState","renderedCellIndexByDocID","renderedCells","renderedCellIndex","__pageTreeOrderIndex","getSelectableRowData","record","String","_isLocked","Boolean","_userEditing","shouldSilenceMoveMessage","getStatusClassName","status","renderStatusBadge","badgeConfig","index","t","customColor","badgeColors","colors","statusClass","style","span","className","data-custom-color","badgeLabels","labels","createManualOrderColumn","field","hidden","Heading","insertManualOrderColumn","columns","orderColumn","selectColumnIndex","insertIndex","buildTableColumns","enableRowSelections","homeIndicatorEnabled","parentFieldSlug","columnsToUse","unshift","rowData","some","HierarchyInsertRow","activeColumnsCount","activeDragRowID","dropTarget","dropValidation","isMovePending","isOver","setNodeRef","dropID","data","disabled","hasActiveDrag","tr","data-drag-over","data-drop-valid","data-page-tree-insert","td","colSpan","div","data-insert-depth","depth","ref","HierarchyTableRow","activeColumns","insertAfterDropID","insertBeforeDropID","rowIndex","titleCellAccessor","dropType","isActiveDragRow","data-id","data-is-drag-source","data-page-tree-row","columnIndex","replace","data-page-tree-manual-order-cell","data-page-tree-title-cell","HierarchyTable","allDocsByID","allowSameParentDrops","useMemo","hasManualOrderColumn","insertDropTargets","rowDropValidationByID","Map","insertDropValidationByID","data-page-tree-orderable","table","cellPadding","cellSpacing","thead","th","tbody","Fragment","PageTreeListViewClient","allDocs","canMoveDocs","query","sourceDocs","props","router","searchParams","config","locale","i18n","setActiveDragRowID","useState","activeDropTarget","setActiveDropTarget","collapsedIDs","setCollapsedIDs","localSourceDocs","setLocalSourceDocs","pendingMoveRowID","setPendingMoveRowID","useEffect","toggleRow","useCallback","currentState","nextState","delete","add","searchParamSort","getAll","sort","manualOrderIsActive","currentLimit","currentRequestedPage","liveAllDocs","collapseResetKey","JSON","stringify","collectionSlug","viewType","toString","hierarchyValue","visibleDocs","paginatedData","paginatedDocs","paginatedDocsByID","normalizedColumnState","paginatedColumnState","tableColumns","activeDragDoc","activeDragPreviewPath","sensors","activationConstraint","distance","moveDocument","params","URLSearchParams","code","set","response","fetch","routes","api","encodeURIComponent","size","body","credentials","headers","language","method","result","json","catch","ok","Error","reorderDocument","movedDocID","targetID","docsToMove","target","key","orderValues","handleManualOrderMoveEnd","error","parentChanged","orderChanged","reorderTarget","parentDoc","nextParentValue","parentMoveSucceeded","nextOrderValue","currentDocs","success","startTransition","refresh","handleDragCancel","handleDragStart","event","dragData","current","handleDragOver","overData","over","handleDragEnd","handleDragEndSync","tableNode","collisionDetection","onDragCancel","onDragEnd","onDragOver","onDragStart","dropAnimation","cursor","root","modifySearchParams","Table"],"mappings":"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"}
@@ -189,14 +189,14 @@
189
189
  box-shadow: inset 0 0 0 2px rgb(232 236 241 / 0.42);
190
190
  }
191
191
 
192
- :global(html[data-theme='dark']) .root :global(.pages-hierarchy-table .table tbody tr[data-page-tree-row='true'][data-drag-over='true'][data-drop-valid='false']:not([data-is-drag-source='true'])) {
193
- box-shadow: inset 0 0 0 999px rgb(190 90 70 / 0.24);
194
- }
195
-
196
- .root :global(.pages-hierarchy-cell) {
197
- align-items: center;
198
- display: flex;
199
- gap: 0.35rem;
192
+ :global(html[data-theme='dark']) .root :global(.pages-hierarchy-table .table tbody tr[data-page-tree-row='true'][data-drag-over='true'][data-drop-valid='false']:not([data-is-drag-source='true'])) {
193
+ box-shadow: inset 0 0 0 999px rgb(190 90 70 / 0.24);
194
+ }
195
+
196
+ .root :global(.pages-hierarchy-cell) {
197
+ align-items: center;
198
+ display: flex;
199
+ gap: 0.35rem;
200
200
  min-width: 0;
201
201
  padding-inline-start: calc(var(--pages-tree-depth, 0) * 1.75rem);
202
202
  }
@@ -227,30 +227,30 @@
227
227
  color 0.15s ease;
228
228
  }
229
229
 
230
- .root :global(.pages-hierarchy-cell__drag-handle) {
231
- cursor: grab;
232
- margin-inline-end: 3px;
233
- touch-action: none;
234
- }
230
+ .root :global(.pages-hierarchy-cell__drag-handle) {
231
+ cursor: grab;
232
+ margin-inline-end: 3px;
233
+ touch-action: none;
234
+ }
235
235
 
236
236
  .root :global(.pages-hierarchy-cell__drag-handle:disabled) {
237
237
  cursor: default;
238
238
  opacity: 0.45;
239
239
  }
240
240
 
241
- .root :global(.pages-hierarchy-cell__drag-handle--active) {
242
- color: var(--theme-text);
243
- }
244
-
245
- .root :global(.pages-hierarchy-cell__drag-handle:active:not(:disabled)),
246
- .root :global(.pages-hierarchy-cell__drag-handle--active:not(:disabled)) {
247
- cursor: grabbing;
248
- }
249
-
250
- .root :global(.pages-hierarchy-cell__drag-handle svg) {
251
- block-size: 0.95rem;
252
- inline-size: 0.95rem;
253
- }
241
+ .root :global(.pages-hierarchy-cell__drag-handle--active) {
242
+ color: var(--theme-text);
243
+ }
244
+
245
+ .root :global(.pages-hierarchy-cell__drag-handle:active:not(:disabled)),
246
+ .root :global(.pages-hierarchy-cell__drag-handle--active:not(:disabled)) {
247
+ cursor: grabbing;
248
+ }
249
+
250
+ .root :global(.pages-hierarchy-cell__drag-handle svg) {
251
+ block-size: 0.95rem;
252
+ inline-size: 0.95rem;
253
+ }
254
254
 
255
255
  .root :global(.pages-hierarchy-cell__drag-handle:hover:not(:disabled)),
256
256
  .root :global(.pages-hierarchy-cell__drag-handle:focus-visible:not(:disabled)),
@@ -270,6 +270,24 @@
270
270
  transform: rotate(-90deg);
271
271
  }
272
272
 
273
+ .root :global(.pages-hierarchy-cell[data-tree-home='true'] .pages-hierarchy-cell__content > a:first-child),
274
+ .root :global(.pages-hierarchy-cell[data-tree-home='true'] .pages-hierarchy-cell__content > button:first-child) {
275
+ align-items: center;
276
+ display: inline-flex;
277
+ gap: 0.35rem;
278
+ }
279
+
280
+ .root :global(.pages-hierarchy-cell[data-tree-home='true'] .pages-hierarchy-cell__content > a:first-child::before),
281
+ .root :global(.pages-hierarchy-cell[data-tree-home='true'] .pages-hierarchy-cell__content > button:first-child::before) {
282
+ background: currentColor;
283
+ block-size: 1rem;
284
+ content: '';
285
+ flex: 0 0 1rem;
286
+ inline-size: 1rem;
287
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V9.48907C3 9.18048 3.14247 8.88917 3.38606 8.69972L11.3861 2.47749C11.7472 2.19663 12.2528 2.19663 12.6139 2.47749L20.6139 8.69972C20.8575 8.88917 21 9.18048 21 9.48907V20ZM19 19V9.97815L12 4.53371L5 9.97815V19H19Z'/%3E%3C/svg%3E") center / contain no-repeat;
288
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V9.48907C3 9.18048 3.14247 8.88917 3.38606 8.69972L11.3861 2.47749C11.7472 2.19663 12.2528 2.19663 12.6139 2.47749L20.6139 8.69972C20.8575 8.88917 21 9.18048 21 9.48907V20ZM19 19V9.97815L12 4.53371L5 9.97815V19H19Z'/%3E%3C/svg%3E") center / contain no-repeat;
289
+ }
290
+
273
291
  .root :global(.pages-hierarchy-cell__content) {
274
292
  flex: 1 1 auto;
275
293
  min-width: 0;
@@ -289,14 +307,14 @@
289
307
  display: inline-flex;
290
308
  font-family: var(--font-mono, var(--font-body));
291
309
  font-size: 0.95rem;
292
- font-weight: 500;
293
- inline-size: max-content;
294
- margin-inline-start: 2rem;
295
- padding: 0.65rem 0.85rem;
296
- pointer-events: none;
297
- transform: translateY(calc(0.75rem - 50%));
298
- white-space: nowrap;
299
- }
310
+ font-weight: 500;
311
+ inline-size: max-content;
312
+ margin-inline-start: 2rem;
313
+ padding: 0.65rem 0.85rem;
314
+ pointer-events: none;
315
+ transform: translateY(calc(0.75rem - 50%));
316
+ white-space: nowrap;
317
+ }
300
318
 
301
319
  .root :global(.pages-hierarchy-status-badge) {
302
320
  align-items: center;
@@ -378,6 +378,7 @@ export async function NestedDocsPageTreeListView(props) {
378
378
  badgeConfig: pageTreeConfig.badges,
379
379
  canMoveDocs: canMoveDocs,
380
380
  columnState: renderedTable.columnState,
381
+ homeIndicatorEnabled: pageTreeConfig.homeIndicator.enabled,
381
382
  orderableFieldName: orderableFieldName,
382
383
  parentFieldSlug: pageTreeConfig.parentFieldSlug,
383
384
  query: effectiveQuery,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PageTreeListView.server.tsx"],"sourcesContent":["import type {\r\n ColumnPreference,\r\n ListQuery,\r\n ListViewClientProps,\r\n PaginatedDocs,\r\n Params,\r\n} from 'payload'\r\n\r\nimport React from 'react'\r\nimport { getColumns, renderTable } from '@payloadcms/ui/rsc'\r\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\r\nimport { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere } from 'payload/shared'\r\n\r\nimport PageTreeListViewClient from './PageTreeListView.client.js'\r\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\r\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\r\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\r\nimport type { PageTreeSourceDoc } from '../types.js'\r\n\r\ntype ParsedQuery = Partial<ListQuery> & Record<string, unknown>\r\ntype ServerListViewProps = Record<string, any>\r\n\r\nfunction isNumericSegment(segment: string): boolean {\r\n return /^\\d+$/.test(segment)\r\n}\r\n\r\nfunction getKeySegments(key: string): string[] {\r\n const matches = key.match(/([^[\\]]+)/g)\r\n return matches ? matches.filter(Boolean) : [key]\r\n}\r\n\r\nfunction setNestedValue(target: Record<string, unknown>, key: string, value: string): void {\r\n const segments = getKeySegments(key)\r\n\r\n if (segments.length === 0) {\r\n return\r\n }\r\n\r\n let current: Record<string, unknown> | unknown[] = target\r\n\r\n for (let index = 0; index < segments.length; index += 1) {\r\n const segment = segments[index]\r\n const isLastSegment = index === segments.length - 1\r\n const nextSegment = segments[index + 1]\r\n const nextContainer: Record<string, unknown> | unknown[] = isNumericSegment(nextSegment ?? '')\r\n ? []\r\n : {}\r\n\r\n if (isLastSegment) {\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n current[arrayIndex] = value\r\n } else {\r\n const existingValue = current[segment]\r\n\r\n if (existingValue === undefined) {\r\n current[segment] = value\r\n } else if (Array.isArray(existingValue)) {\r\n existingValue.push(value)\r\n } else {\r\n current[segment] = [existingValue, value]\r\n }\r\n }\r\n\r\n return\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n const existingValue = current[arrayIndex]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[arrayIndex] = nextContainer\r\n }\r\n\r\n current = current[arrayIndex] as Record<string, unknown> | unknown[]\r\n continue\r\n }\r\n\r\n const existingValue = current[segment]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[segment] = nextContainer\r\n }\r\n\r\n current = current[segment] as Record<string, unknown> | unknown[]\r\n }\r\n}\r\n\r\nfunction parseSearchParams(searchParams?: Params): ParsedQuery {\r\n const parsed: ParsedQuery = {}\r\n\r\n for (const [key, value] of Object.entries(searchParams ?? {})) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n if (typeof entry === 'string') {\r\n setNestedValue(parsed, key, entry)\r\n }\r\n }\r\n } else if (typeof value === 'string') {\r\n setNestedValue(parsed, key, value)\r\n }\r\n }\r\n\r\n for (const key of ['columns', 'queryByGroup']) {\r\n if (typeof parsed[key] === 'string') {\r\n try {\r\n parsed[key] = JSON.parse(parsed[key] as string)\r\n } catch {\r\n // Leave invalid persisted values untouched and let Payload ignore them.\r\n }\r\n }\r\n }\r\n\r\n const sanitized: ParsedQuery = { ...parsed }\r\n\r\n for (const [key, value] of Object.entries(sanitized)) {\r\n if (\r\n key === 'columns' &&\r\n ((typeof value === 'string' && value === '[]') ||\r\n (Array.isArray(value) && value.length === 0))\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (\r\n key === 'where' &&\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Object.keys(value).length\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if ((key === 'limit' || key === 'page') && typeof value === 'string') {\r\n const parsedValue = Number.parseInt(value, 10)\r\n sanitized[key] = Number.isNaN(parsedValue) ? undefined : parsedValue\r\n }\r\n\r\n if (key === 'page' && value === 0) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (value === '') {\r\n delete sanitized[key]\r\n }\r\n }\r\n\r\n return sanitized\r\n}\r\n\r\nfunction getQueryValue<T>(incomingValue: T | undefined, fallbackValue: T): T {\r\n return incomingValue === undefined ? fallbackValue : incomingValue\r\n}\r\n\r\nfunction normalizeLimit(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizePage(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizeSearch(value: unknown): string {\r\n return typeof value === 'string' ? value : ''\r\n}\r\n\r\nfunction normalizeSort(value: unknown): string | undefined {\n if (Array.isArray(value)) {\r\n const sortValues = value.filter(\r\n (entry): entry is string => typeof entry === 'string' && entry.length > 0,\r\n )\r\n return sortValues.length > 0 ? sortValues.join(',') : undefined\r\n }\r\n\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction getOrderableFieldName(collectionConfig: ServerListViewProps['collectionConfig']) {\n return collectionConfig.orderable === true ? '_order' : 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\r\n return undefined\r\n}\r\n\r\nfunction getCurrentQuery(props: ServerListViewProps, fallbackLimit: number): ListQuery {\r\n const parsedSearchQuery = parseSearchParams(props.searchParams)\r\n const preferenceQuery = (props.listPreferences ?? {}) as Partial<ListQuery>\r\n const mergedQuery = {\r\n ...preferenceQuery,\r\n ...parsedSearchQuery,\r\n } as ParsedQuery\r\n\r\n return {\r\n ...mergedQuery,\r\n limit: normalizeLimit(\r\n getQueryValue(mergedQuery.limit as number | undefined, fallbackLimit),\r\n fallbackLimit,\r\n ),\r\n page: normalizePage(\r\n getQueryValue(mergedQuery.page as number | undefined, props.data.page),\r\n props.data.page,\r\n ),\r\n search: normalizeSearch(mergedQuery.search),\r\n sort: normalizeSort(mergedQuery.sort) ?? normalizeSort(preferenceQuery.sort) ?? undefined,\r\n where: normalizeWhere(mergedQuery.where),\r\n }\r\n}\r\n\r\nfunction getBaseFilterArgs(\r\n props: ServerListViewProps,\r\n req: any,\r\n query: ListQuery,\r\n locale?: string,\r\n) {\r\n return {\r\n limit: 0,\r\n locale,\r\n page: 1,\r\n req,\r\n sort:\r\n normalizeSort(query.sort) ??\r\n (typeof props.collectionConfig.defaultSort === 'string'\r\n ? props.collectionConfig.defaultSort\r\n : 'id'),\r\n }\r\n}\r\n\r\nasync function getDocsWithDisplayStatus(args: {\r\n collectionConfig: ServerListViewProps['collectionConfig']\r\n collectionSlug: string\r\n docs: PageTreeSourceDoc[]\r\n locale?: string\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<PageTreeSourceDoc[]> {\r\n const { collectionConfig, collectionSlug, docs, locale, payload, req, user } = args\r\n\r\n if (!collectionConfig.versions?.drafts || docs.length === 0) {\r\n return docs\r\n }\r\n\r\n const docIDs = docs\r\n .map((doc) => doc.id)\r\n .filter((id): id is number | string => typeof id === 'number' || typeof id === 'string')\r\n\r\n if (docIDs.length === 0) {\r\n return docs\r\n }\r\n\r\n const currentResult = await payload.find({\r\n collection: collectionSlug,\r\n depth: 0,\r\n fallbackLocale: false,\r\n locale,\r\n pagination: false,\r\n req,\r\n select: {\r\n _status: true,\r\n id: true,\r\n },\r\n user,\r\n where: {\r\n id: {\r\n in: docIDs,\r\n },\r\n },\r\n } as never)\r\n\r\n return withPageTreeDisplayStatuses({\r\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\r\n draftDocs: docs,\r\n })\r\n}\r\n\r\nasync function getListClientConfig({\r\n collectionSlug,\r\n i18n,\r\n payload,\r\n req,\r\n user,\r\n}: {\r\n collectionSlug: string\r\n i18n: unknown\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<{\r\n clientCollectionConfig: any\r\n clientConfig: any\r\n}> {\r\n const clientConfig = getClientConfig({\r\n config: payload.config,\r\n i18n: i18n as never,\r\n importMap: payload.importMap,\r\n user: (user ?? true) as never,\r\n } as never)\r\n\r\n await applyLocaleFiltering({\r\n clientConfig,\r\n config: payload.config,\r\n req,\r\n } as never)\r\n\r\n const clientCollectionConfig = clientConfig.collections.find(\r\n (collection) => collection.slug === collectionSlug,\r\n )\r\n\r\n if (!clientCollectionConfig) {\r\n throw new Error(`Could not resolve client collection config for \"${collectionSlug}\"`)\r\n }\r\n\r\n return {\r\n clientCollectionConfig,\r\n clientConfig,\r\n }\r\n}\r\n\r\nexport async function NestedDocsPageTreeListView(props: ServerListViewProps) {\r\n const pageTreeConfig = getCollectionPageTreeConfig(props.collectionConfig)\r\n\r\n if (!pageTreeConfig) {\r\n throw new Error(`Could not resolve page tree config for \"${props.collectionSlug}\"`)\r\n }\r\n\r\n if (typeof props.collectionConfig.admin.useAsTitle !== 'string') {\r\n throw new Error(`Collection \"${props.collectionSlug}\" must define admin.useAsTitle`)\r\n }\r\n\r\n const query = getCurrentQuery(props, pageTreeConfig.defaultLimit)\n const orderableFieldName = getOrderableFieldName(props.collectionConfig)\n const defaultSort = getDefaultSort(props.collectionConfig)\n const effectiveSort = getEffectiveTreeSort({\n defaultSort,\n orderableFieldName,\n sort: normalizeSort(query.sort),\n })\n const effectiveQuery = {\n ...query,\n sort: effectiveSort,\n }\n const locale = props.locale?.code\n const req = {\n i18n: props.i18n,\n locale,\n payload: props.payload,\n query: effectiveQuery,\n user: props.user,\n }\n\r\n const baseFilter =\r\n props.collectionConfig.admin?.baseFilter ?? props.collectionConfig.admin?.baseListFilter\r\n const baseFilterConstraint = baseFilter\r\n ? await baseFilter(getBaseFilterArgs(props, req, query, locale))\r\n : undefined\r\n const mergedWhere = combineWhereConstraints([\r\n mergeListSearchAndWhere({\r\n collectionConfig: props.collectionConfig,\r\n search: normalizeSearch(query.search),\r\n where: normalizeWhere(query.where),\r\n } as never),\r\n baseFilterConstraint ?? undefined,\r\n ])\r\n const where = Object.keys(mergedWhere).length > 0 ? mergedWhere : undefined\r\n\r\n const fullResult = await props.payload.find({\r\n collection: props.collectionSlug,\r\n depth: 0,\r\n draft: props.collectionConfig.versions?.drafts ? true : undefined,\r\n fallbackLocale: false,\r\n includeLockStatus: true,\r\n locale,\r\n pagination: false,\r\n req,\r\n sort:\n normalizeSort(query.sort) ??\n defaultSort,\n user: props.user,\r\n where,\r\n } as never)\r\n const treeSourceDocs = await getDocsWithDisplayStatus({\r\n collectionConfig: props.collectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n docs: fullResult.docs as unknown as PageTreeSourceDoc[],\r\n locale,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n\r\n const orderedDocs = buildPageTreeDocs(treeSourceDocs, {\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\n sort: effectiveSort,\n })\n const orderedData: PaginatedDocs = {\r\n docs: orderedDocs,\r\n hasNextPage: false,\r\n hasPrevPage: false,\r\n limit: normalizeLimit(query.limit, pageTreeConfig.defaultLimit),\r\n nextPage: null,\r\n page: 1,\r\n pagingCounter: orderedDocs.length > 0 ? 1 : 0,\r\n prevPage: null,\r\n totalDocs: orderedDocs.length,\r\n totalPages: 1,\r\n }\r\n const { clientCollectionConfig, clientConfig } = await getListClientConfig({\r\n collectionSlug: props.collectionSlug,\r\n i18n: props.i18n,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n const columnPreferences: ColumnPreference[] = (props.columnState as Array<{\r\n accessor: string\r\n active: boolean\r\n }>).map(({ accessor, active }) => ({\r\n accessor,\r\n active: accessor === props.collectionConfig.admin.useAsTitle ? true : active,\r\n }))\r\n const columns = getColumns({\r\n clientConfig,\r\n collectionConfig: clientCollectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n columns: columnPreferences,\r\n i18n: props.i18n,\r\n permissions: props.permissions,\r\n } as never)\r\n const fieldPermissions = props.permissions?.collections?.[props.collectionSlug]?.fields ?? true\r\n const renderedTable = await renderTable({\r\n clientCollectionConfig,\r\n clientConfig,\r\n collectionConfig: props.collectionConfig,\r\n columns,\r\n data: orderedData,\r\n enableRowSelections: Boolean(props.enableRowSelections),\r\n fieldPermissions,\r\n i18n: props.i18n,\r\n orderableFieldName: orderableFieldName ?? '',\n payload: props.payload,\r\n query: effectiveQuery,\n req,\r\n tableAppearance: 'default',\r\n useAsTitle: props.collectionConfig.admin.useAsTitle,\r\n viewType: props.viewType,\r\n } as never)\r\n const clientProps: Omit<ListViewClientProps, 'Table' | 'columnState'> = {\r\n AfterList: props.AfterList,\r\n AfterListTable: props.AfterListTable,\r\n BeforeList: props.BeforeList,\r\n BeforeListTable: props.BeforeListTable,\r\n Description: props.Description,\r\n beforeActions: props.beforeActions,\r\n collectionSlug: props.collectionSlug,\r\n disableBulkDelete: props.disableBulkDelete,\r\n disableBulkEdit: props.disableBulkEdit,\r\n disableQueryPresets: props.disableQueryPresets,\r\n enableRowSelections: props.enableRowSelections,\r\n hasCreatePermission: props.hasCreatePermission,\r\n hasDeletePermission: props.hasDeletePermission,\r\n hasTrashPermission: props.hasTrashPermission,\r\n listMenuItems: props.listMenuItems,\r\n listPreferences: props.listPreferences,\r\n newDocumentURL: props.newDocumentURL,\r\n preferenceKey: props.preferenceKey,\r\n queryPreset: props.queryPreset,\r\n queryPresetPermissions: props.queryPresetPermissions,\r\n renderedFilters: props.renderedFilters,\r\n resolvedFilterOptions: props.resolvedFilterOptions,\r\n viewType: props.viewType,\r\n }\r\n const canMoveDocs = Boolean(props.permissions?.collections?.[props.collectionSlug]?.update)\r\n\r\n return (\r\n <PageTreeListViewClient\r\n {...clientProps}\r\n allDocs={orderedDocs}\r\n badgeConfig={pageTreeConfig.badges}\r\n canMoveDocs={canMoveDocs}\r\n columnState={renderedTable.columnState}\n orderableFieldName={orderableFieldName}\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\n query={effectiveQuery}\n sourceDocs={treeSourceDocs}\r\n useAsTitle={props.collectionConfig.admin.useAsTitle}\r\n />\r\n )\r\n}\r\n\r\nexport default NestedDocsPageTreeListView\r\n"],"names":["React","getColumns","renderTable","getClientConfig","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","PageTreeListViewClient","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","isNumericSegment","segment","test","getKeySegments","key","matches","match","filter","Boolean","setNestedValue","target","value","segments","length","current","index","isLastSegment","nextSegment","nextContainer","Array","isArray","arrayIndex","Number","existingValue","undefined","push","parseSearchParams","searchParams","parsed","Object","entries","entry","JSON","parse","sanitized","keys","parsedValue","parseInt","isNaN","getQueryValue","incomingValue","fallbackValue","normalizeLimit","fallback","normalizePage","normalizeSearch","normalizeSort","sortValues","join","getOrderableFieldName","collectionConfig","orderable","getDefaultSort","defaultSort","getEffectiveTreeSort","args","orderableFieldName","sort","normalizeWhere","getCurrentQuery","props","fallbackLimit","parsedSearchQuery","preferenceQuery","listPreferences","mergedQuery","limit","page","data","search","where","getBaseFilterArgs","req","query","locale","getDocsWithDisplayStatus","collectionSlug","docs","payload","user","versions","drafts","docIDs","map","doc","id","currentResult","find","collection","depth","fallbackLocale","pagination","select","_status","in","currentDocs","draftDocs","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","admin","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","fullResult","draft","includeLockStatus","treeSourceDocs","orderedDocs","parentFieldSlug","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","columnState","accessor","active","columns","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","viewType","clientProps","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","beforeActions","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","allDocs","badgeConfig","badges","sourceDocs"],"mappings":";AAQA,OAAOA,WAAW,QAAO;AACzB,SAASC,UAAU,EAAEC,WAAW,QAAQ,qBAAoB;AAC5D,SAASC,eAAe,QAAQ,2CAA0C;AAC1E,SAASC,oBAAoB,EAAEC,uBAAuB,EAAEC,uBAAuB,QAAQ,iBAAgB;AAEvG,OAAOC,4BAA4B,+BAA8B;AACjE,SAASC,iBAAiB,QAAQ,2BAA0B;AAC5D,SAASC,2BAA2B,QAAQ,iCAAgC;AAC5E,SAASC,2BAA2B,QAAQ,yBAAwB;AAMpE,SAASC,iBAAiBC,OAAe;IACvC,OAAO,QAAQC,IAAI,CAACD;AACtB;AAEA,SAASE,eAAeC,GAAW;IACjC,MAAMC,UAAUD,IAAIE,KAAK,CAAC;IAC1B,OAAOD,UAAUA,QAAQE,MAAM,CAACC,WAAW;QAACJ;KAAI;AAClD;AAEA,SAASK,eAAeC,MAA+B,EAAEN,GAAW,EAAEO,KAAa;IACjF,MAAMC,WAAWT,eAAeC;IAEhC,IAAIQ,SAASC,MAAM,KAAK,GAAG;QACzB;IACF;IAEA,IAAIC,UAA+CJ;IAEnD,IAAK,IAAIK,QAAQ,GAAGA,QAAQH,SAASC,MAAM,EAAEE,SAAS,EAAG;QACvD,MAAMd,UAAUW,QAAQ,CAACG,MAAM;QAC/B,MAAMC,gBAAgBD,UAAUH,SAASC,MAAM,GAAG;QAClD,MAAMI,cAAcL,QAAQ,CAACG,QAAQ,EAAE;QACvC,MAAMG,gBAAqDlB,iBAAiBiB,eAAe,MACvF,EAAE,GACF,CAAC;QAEL,IAAID,eAAe;YACjB,IAAIG,MAAMC,OAAO,CAACN,UAAU;gBAC1B,MAAMO,aAAaC,OAAOrB;gBAC1Ba,OAAO,CAACO,WAAW,GAAGV;YACxB,OAAO;gBACL,MAAMY,gBAAgBT,OAAO,CAACb,QAAQ;gBAEtC,IAAIsB,kBAAkBC,WAAW;oBAC/BV,OAAO,CAACb,QAAQ,GAAGU;gBACrB,OAAO,IAAIQ,MAAMC,OAAO,CAACG,gBAAgB;oBACvCA,cAAcE,IAAI,CAACd;gBACrB,OAAO;oBACLG,OAAO,CAACb,QAAQ,GAAG;wBAACsB;wBAAeZ;qBAAM;gBAC3C;YACF;YAEA;QACF;QAEA,IAAIQ,MAAMC,OAAO,CAACN,UAAU;YAC1B,MAAMO,aAAaC,OAAOrB;YAC1B,MAAMsB,gBAAgBT,OAAO,CAACO,WAAW;YAEzC,IACE,OAAOE,kBAAkB,YACzBA,kBAAkB,QAClBJ,MAAMC,OAAO,CAACG,mBAAmBJ,MAAMC,OAAO,CAACF,gBAC/C;gBACAJ,OAAO,CAACO,WAAW,GAAGH;YACxB;YAEAJ,UAAUA,OAAO,CAACO,WAAW;YAC7B;QACF;QAEA,MAAME,gBAAgBT,OAAO,CAACb,QAAQ;QAEtC,IACE,OAAOsB,kBAAkB,YACzBA,kBAAkB,QAClBJ,MAAMC,OAAO,CAACG,mBAAmBJ,MAAMC,OAAO,CAACF,gBAC/C;YACAJ,OAAO,CAACb,QAAQ,GAAGiB;QACrB;QAEAJ,UAAUA,OAAO,CAACb,QAAQ;IAC5B;AACF;AAEA,SAASyB,kBAAkBC,YAAqB;IAC9C,MAAMC,SAAsB,CAAC;IAE7B,KAAK,MAAM,CAACxB,KAAKO,MAAM,IAAIkB,OAAOC,OAAO,CAACH,gBAAgB,CAAC,GAAI;QAC7D,IAAIR,MAAMC,OAAO,CAACT,QAAQ;YACxB,KAAK,MAAMoB,SAASpB,MAAO;gBACzB,IAAI,OAAOoB,UAAU,UAAU;oBAC7BtB,eAAemB,QAAQxB,KAAK2B;gBAC9B;YACF;QACF,OAAO,IAAI,OAAOpB,UAAU,UAAU;YACpCF,eAAemB,QAAQxB,KAAKO;QAC9B;IACF;IAEA,KAAK,MAAMP,OAAO;QAAC;QAAW;KAAe,CAAE;QAC7C,IAAI,OAAOwB,MAAM,CAACxB,IAAI,KAAK,UAAU;YACnC,IAAI;gBACFwB,MAAM,CAACxB,IAAI,GAAG4B,KAAKC,KAAK,CAACL,MAAM,CAACxB,IAAI;YACtC,EAAE,OAAM;YACN,wEAAwE;YAC1E;QACF;IACF;IAEA,MAAM8B,YAAyB;QAAE,GAAGN,MAAM;IAAC;IAE3C,KAAK,MAAM,CAACxB,KAAKO,MAAM,IAAIkB,OAAOC,OAAO,CAACI,WAAY;QACpD,IACE9B,QAAQ,aACP,CAAA,AAAC,OAAOO,UAAU,YAAYA,UAAU,QACtCQ,MAAMC,OAAO,CAACT,UAAUA,MAAME,MAAM,KAAK,CAAC,GAC7C;YACA,OAAOqB,SAAS,CAAC9B,IAAI;YACrB;QACF;QAEA,IACEA,QAAQ,WACR,OAAOO,UAAU,YACjBA,UAAU,QACV,CAACkB,OAAOM,IAAI,CAACxB,OAAOE,MAAM,EAC1B;YACA,OAAOqB,SAAS,CAAC9B,IAAI;YACrB;QACF;QAEA,IAAI,AAACA,CAAAA,QAAQ,WAAWA,QAAQ,MAAK,KAAM,OAAOO,UAAU,UAAU;YACpE,MAAMyB,cAAcd,OAAOe,QAAQ,CAAC1B,OAAO;YAC3CuB,SAAS,CAAC9B,IAAI,GAAGkB,OAAOgB,KAAK,CAACF,eAAeZ,YAAYY;QAC3D;QAEA,IAAIhC,QAAQ,UAAUO,UAAU,GAAG;YACjC,OAAOuB,SAAS,CAAC9B,IAAI;YACrB;QACF;QAEA,IAAIO,UAAU,IAAI;YAChB,OAAOuB,SAAS,CAAC9B,IAAI;QACvB;IACF;IAEA,OAAO8B;AACT;AAEA,SAASK,cAAiBC,aAA4B,EAAEC,aAAgB;IACtE,OAAOD,kBAAkBhB,YAAYiB,gBAAgBD;AACvD;AAEA,SAASE,eAAe/B,KAAc,EAAEgC,QAAgB;IACtD,OAAO,OAAOhC,UAAU,YAAYA,QAAQ,IAAIA,QAAQgC;AAC1D;AAEA,SAASC,cAAcjC,KAAc,EAAEgC,QAAgB;IACrD,OAAO,OAAOhC,UAAU,YAAYA,QAAQ,IAAIA,QAAQgC;AAC1D;AAEA,SAASE,gBAAgBlC,KAAc;IACrC,OAAO,OAAOA,UAAU,WAAWA,QAAQ;AAC7C;AAEA,SAASmC,cAAcnC,KAAc;IACnC,IAAIQ,MAAMC,OAAO,CAACT,QAAQ;QACxB,MAAMoC,aAAapC,MAAMJ,MAAM,CAC7B,CAACwB,QAA2B,OAAOA,UAAU,YAAYA,MAAMlB,MAAM,GAAG;QAE1E,OAAOkC,WAAWlC,MAAM,GAAG,IAAIkC,WAAWC,IAAI,CAAC,OAAOxB;IACxD;IAEA,OAAO,OAAOb,UAAU,YAAYA,MAAME,MAAM,GAAG,IAAIF,QAAQa;AACjE;AAEA,SAASyB,sBAAsBC,gBAAyD;IACtF,OAAOA,iBAAiBC,SAAS,KAAK,OAAO,WAAW3B;AAC1D;AAEA,SAAS4B,eAAeF,gBAAyD;IAC/E,OAAO,OAAOA,iBAAiBG,WAAW,KAAK,WAAWH,iBAAiBG,WAAW,GAAG7B;AAC3F;AAEA,SAAS8B,qBAAqBC,IAI7B;IACC,MAAM,EAAEF,WAAW,EAAEG,kBAAkB,EAAEC,IAAI,EAAE,GAAGF;IAElD,IAAIE,MAAM;QACR,OAAOA;IACT;IAEA,IACED,sBACCH,CAAAA,gBAAgBG,sBAAsBH,gBAAgB,CAAC,CAAC,EAAEG,oBAAoB,AAAD,GAC9E;QACA,OAAOH;IACT;IAEA,OAAO7B;AACT;AAEA,SAASkC,eAAe/C,KAAc;IACpC,IAAIA,SAAS,OAAOA,UAAU,YAAY,CAACQ,MAAMC,OAAO,CAACT,QAAQ;QAC/D,OAAOA;IACT;IAEA,OAAOa;AACT;AAEA,SAASmC,gBAAgBC,KAA0B,EAAEC,aAAqB;IACxE,MAAMC,oBAAoBpC,kBAAkBkC,MAAMjC,YAAY;IAC9D,MAAMoC,kBAAmBH,MAAMI,eAAe,IAAI,CAAC;IACnD,MAAMC,cAAc;QAClB,GAAGF,eAAe;QAClB,GAAGD,iBAAiB;IACtB;IAEA,OAAO;QACL,GAAGG,WAAW;QACdC,OAAOxB,eACLH,cAAc0B,YAAYC,KAAK,EAAwBL,gBACvDA;QAEFM,MAAMvB,cACJL,cAAc0B,YAAYE,IAAI,EAAwBP,MAAMQ,IAAI,CAACD,IAAI,GACrEP,MAAMQ,IAAI,CAACD,IAAI;QAEjBE,QAAQxB,gBAAgBoB,YAAYI,MAAM;QAC1CZ,MAAMX,cAAcmB,YAAYR,IAAI,KAAKX,cAAciB,gBAAgBN,IAAI,KAAKjC;QAChF8C,OAAOZ,eAAeO,YAAYK,KAAK;IACzC;AACF;AAEA,SAASC,kBACPX,KAA0B,EAC1BY,GAAQ,EACRC,KAAgB,EAChBC,MAAe;IAEf,OAAO;QACLR,OAAO;QACPQ;QACAP,MAAM;QACNK;QACAf,MACEX,cAAc2B,MAAMhB,IAAI,KACvB,CAAA,OAAOG,MAAMV,gBAAgB,CAACG,WAAW,KAAK,WAC3CO,MAAMV,gBAAgB,CAACG,WAAW,GAClC,IAAG;IACX;AACF;AAEA,eAAesB,yBAAyBpB,IAQvC;IACC,MAAM,EAAEL,gBAAgB,EAAE0B,cAAc,EAAEC,IAAI,EAAEH,MAAM,EAAEI,OAAO,EAAEN,GAAG,EAAEO,IAAI,EAAE,GAAGxB;IAE/E,IAAI,CAACL,iBAAiB8B,QAAQ,EAAEC,UAAUJ,KAAKhE,MAAM,KAAK,GAAG;QAC3D,OAAOgE;IACT;IAEA,MAAMK,SAASL,KACZM,GAAG,CAAC,CAACC,MAAQA,IAAIC,EAAE,EACnB9E,MAAM,CAAC,CAAC8E,KAA8B,OAAOA,OAAO,YAAY,OAAOA,OAAO;IAEjF,IAAIH,OAAOrE,MAAM,KAAK,GAAG;QACvB,OAAOgE;IACT;IAEA,MAAMS,gBAAgB,MAAMR,QAAQS,IAAI,CAAC;QACvCC,YAAYZ;QACZa,OAAO;QACPC,gBAAgB;QAChBhB;QACAiB,YAAY;QACZnB;QACAoB,QAAQ;YACNC,SAAS;YACTR,IAAI;QACN;QACAN;QACAT,OAAO;YACLe,IAAI;gBACFS,IAAIZ;YACN;QACF;IACF;IAEA,OAAOnF,4BAA4B;QACjCgG,aAAaT,cAAcT,IAAI;QAC/BmB,WAAWnB;IACb;AACF;AAEA,eAAeoB,oBAAoB,EACjCrB,cAAc,EACdsB,IAAI,EACJpB,OAAO,EACPN,GAAG,EACHO,IAAI,EAOL;IAIC,MAAMoB,eAAe3G,gBAAgB;QACnC4G,QAAQtB,QAAQsB,MAAM;QACtBF,MAAMA;QACNG,WAAWvB,QAAQuB,SAAS;QAC5BtB,MAAOA,QAAQ;IACjB;IAEA,MAAMtF,qBAAqB;QACzB0G;QACAC,QAAQtB,QAAQsB,MAAM;QACtB5B;IACF;IAEA,MAAM8B,yBAAyBH,aAAaI,WAAW,CAAChB,IAAI,CAC1D,CAACC,aAAeA,WAAWgB,IAAI,KAAK5B;IAGtC,IAAI,CAAC0B,wBAAwB;QAC3B,MAAM,IAAIG,MAAM,CAAC,gDAAgD,EAAE7B,eAAe,CAAC,CAAC;IACtF;IAEA,OAAO;QACL0B;QACAH;IACF;AACF;AAEA,OAAO,eAAeO,2BAA2B9C,KAA0B;IACzE,MAAM+C,iBAAiB7G,4BAA4B8D,MAAMV,gBAAgB;IAEzE,IAAI,CAACyD,gBAAgB;QACnB,MAAM,IAAIF,MAAM,CAAC,wCAAwC,EAAE7C,MAAMgB,cAAc,CAAC,CAAC,CAAC;IACpF;IAEA,IAAI,OAAOhB,MAAMV,gBAAgB,CAAC0D,KAAK,CAACC,UAAU,KAAK,UAAU;QAC/D,MAAM,IAAIJ,MAAM,CAAC,YAAY,EAAE7C,MAAMgB,cAAc,CAAC,8BAA8B,CAAC;IACrF;IAEA,MAAMH,QAAQd,gBAAgBC,OAAO+C,eAAeG,YAAY;IAChE,MAAMtD,qBAAqBP,sBAAsBW,MAAMV,gBAAgB;IACvE,MAAMG,cAAcD,eAAeQ,MAAMV,gBAAgB;IACzD,MAAM6D,gBAAgBzD,qBAAqB;QACzCD;QACAG;QACAC,MAAMX,cAAc2B,MAAMhB,IAAI;IAChC;IACA,MAAMuD,iBAAiB;QACrB,GAAGvC,KAAK;QACRhB,MAAMsD;IACR;IACA,MAAMrC,SAASd,MAAMc,MAAM,EAAEuC;IAC7B,MAAMzC,MAAM;QACV0B,MAAMtC,MAAMsC,IAAI;QAChBxB;QACAI,SAASlB,MAAMkB,OAAO;QACtBL,OAAOuC;QACPjC,MAAMnB,MAAMmB,IAAI;IAClB;IAEA,MAAMmC,aACJtD,MAAMV,gBAAgB,CAAC0D,KAAK,EAAEM,cAActD,MAAMV,gBAAgB,CAAC0D,KAAK,EAAEO;IAC5E,MAAMC,uBAAuBF,aACzB,MAAMA,WAAW3C,kBAAkBX,OAAOY,KAAKC,OAAOC,WACtDlD;IACJ,MAAM6F,cAAc3H,wBAAwB;QAC1CC,wBAAwB;YACtBuD,kBAAkBU,MAAMV,gBAAgB;YACxCmB,QAAQxB,gBAAgB4B,MAAMJ,MAAM;YACpCC,OAAOZ,eAAee,MAAMH,KAAK;QACnC;QACA8C,wBAAwB5F;KACzB;IACD,MAAM8C,QAAQzC,OAAOM,IAAI,CAACkF,aAAaxG,MAAM,GAAG,IAAIwG,cAAc7F;IAElE,MAAM8F,aAAa,MAAM1D,MAAMkB,OAAO,CAACS,IAAI,CAAC;QAC1CC,YAAY5B,MAAMgB,cAAc;QAChCa,OAAO;QACP8B,OAAO3D,MAAMV,gBAAgB,CAAC8B,QAAQ,EAAEC,SAAS,OAAOzD;QACxDkE,gBAAgB;QAChB8B,mBAAmB;QACnB9C;QACAiB,YAAY;QACZnB;QACAf,MACEX,cAAc2B,MAAMhB,IAAI,KACxBJ;QACF0B,MAAMnB,MAAMmB,IAAI;QAChBT;IACF;IACA,MAAMmD,iBAAiB,MAAM9C,yBAAyB;QACpDzB,kBAAkBU,MAAMV,gBAAgB;QACxC0B,gBAAgBhB,MAAMgB,cAAc;QACpCC,MAAMyC,WAAWzC,IAAI;QACrBH;QACAI,SAASlB,MAAMkB,OAAO;QACtBN;QACAO,MAAMnB,MAAMmB,IAAI;IAClB;IAEA,MAAM2C,cAAc7H,kBAAkB4H,gBAAgB;QACpDE,iBAAiBhB,eAAegB,eAAe;QAC/ClE,MAAMsD;IACR;IACA,MAAMa,cAA6B;QACjC/C,MAAM6C;QACNG,aAAa;QACbC,aAAa;QACb5D,OAAOxB,eAAe+B,MAAMP,KAAK,EAAEyC,eAAeG,YAAY;QAC9DiB,UAAU;QACV5D,MAAM;QACN6D,eAAeN,YAAY7G,MAAM,GAAG,IAAI,IAAI;QAC5CoH,UAAU;QACVC,WAAWR,YAAY7G,MAAM;QAC7BsH,YAAY;IACd;IACA,MAAM,EAAE7B,sBAAsB,EAAEH,YAAY,EAAE,GAAG,MAAMF,oBAAoB;QACzErB,gBAAgBhB,MAAMgB,cAAc;QACpCsB,MAAMtC,MAAMsC,IAAI;QAChBpB,SAASlB,MAAMkB,OAAO;QACtBN;QACAO,MAAMnB,MAAMmB,IAAI;IAClB;IACA,MAAMqD,oBAAwC,AAACxE,MAAMyE,WAAW,CAG5DlD,GAAG,CAAC,CAAC,EAAEmD,QAAQ,EAAEC,MAAM,EAAE,GAAM,CAAA;YACjCD;YACAC,QAAQD,aAAa1E,MAAMV,gBAAgB,CAAC0D,KAAK,CAACC,UAAU,GAAG,OAAO0B;QACxE,CAAA;IACA,MAAMC,UAAUlJ,WAAW;QACzB6G;QACAjD,kBAAkBoD;QAClB1B,gBAAgBhB,MAAMgB,cAAc;QACpC4D,SAASJ;QACTlC,MAAMtC,MAAMsC,IAAI;QAChBuC,aAAa7E,MAAM6E,WAAW;IAChC;IACA,MAAMC,mBAAmB9E,MAAM6E,WAAW,EAAElC,aAAa,CAAC3C,MAAMgB,cAAc,CAAC,EAAE+D,UAAU;IAC3F,MAAMC,gBAAgB,MAAMrJ,YAAY;QACtC+G;QACAH;QACAjD,kBAAkBU,MAAMV,gBAAgB;QACxCsF;QACApE,MAAMwD;QACNiB,qBAAqBrI,QAAQoD,MAAMiF,mBAAmB;QACtDH;QACAxC,MAAMtC,MAAMsC,IAAI;QAChB1C,oBAAoBA,sBAAsB;QAC1CsB,SAASlB,MAAMkB,OAAO;QACtBL,OAAOuC;QACPxC;QACAsE,iBAAiB;QACjBjC,YAAYjD,MAAMV,gBAAgB,CAAC0D,KAAK,CAACC,UAAU;QACnDkC,UAAUnF,MAAMmF,QAAQ;IAC1B;IACA,MAAMC,cAAkE;QACtEC,WAAWrF,MAAMqF,SAAS;QAC1BC,gBAAgBtF,MAAMsF,cAAc;QACpCC,YAAYvF,MAAMuF,UAAU;QAC5BC,iBAAiBxF,MAAMwF,eAAe;QACtCC,aAAazF,MAAMyF,WAAW;QAC9BC,eAAe1F,MAAM0F,aAAa;QAClC1E,gBAAgBhB,MAAMgB,cAAc;QACpC2E,mBAAmB3F,MAAM2F,iBAAiB;QAC1CC,iBAAiB5F,MAAM4F,eAAe;QACtCC,qBAAqB7F,MAAM6F,mBAAmB;QAC9CZ,qBAAqBjF,MAAMiF,mBAAmB;QAC9Ca,qBAAqB9F,MAAM8F,mBAAmB;QAC9CC,qBAAqB/F,MAAM+F,mBAAmB;QAC9CC,oBAAoBhG,MAAMgG,kBAAkB;QAC5CC,eAAejG,MAAMiG,aAAa;QAClC7F,iBAAiBJ,MAAMI,eAAe;QACtC8F,gBAAgBlG,MAAMkG,cAAc;QACpCC,eAAenG,MAAMmG,aAAa;QAClCC,aAAapG,MAAMoG,WAAW;QAC9BC,wBAAwBrG,MAAMqG,sBAAsB;QACpDC,iBAAiBtG,MAAMsG,eAAe;QACtCC,uBAAuBvG,MAAMuG,qBAAqB;QAClDpB,UAAUnF,MAAMmF,QAAQ;IAC1B;IACA,MAAMqB,cAAc5J,QAAQoD,MAAM6E,WAAW,EAAElC,aAAa,CAAC3C,MAAMgB,cAAc,CAAC,EAAEyF;IAEpF,qBACE,KAACzK;QACE,GAAGoJ,WAAW;QACfsB,SAAS5C;QACT6C,aAAa5D,eAAe6D,MAAM;QAClCJ,aAAaA;QACb/B,aAAaO,cAAcP,WAAW;QACtC7E,oBAAoBA;QACpBmE,iBAAiBhB,eAAegB,eAAe;QAC/ClD,OAAOuC;QACPyD,YAAYhD;QACZZ,YAAYjD,MAAMV,gBAAgB,CAAC0D,KAAK,CAACC,UAAU;;AAGzD;AAEA,eAAeH,2BAA0B"}
1
+ {"version":3,"sources":["../../src/components/PageTreeListView.server.tsx"],"sourcesContent":["import type {\r\n ColumnPreference,\r\n ListQuery,\r\n ListViewClientProps,\r\n PaginatedDocs,\r\n Params,\r\n} from 'payload'\r\n\r\nimport React from 'react'\r\nimport { getColumns, renderTable } from '@payloadcms/ui/rsc'\r\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\r\nimport { applyLocaleFiltering, combineWhereConstraints, mergeListSearchAndWhere } from 'payload/shared'\r\n\r\nimport PageTreeListViewClient from './PageTreeListView.client.js'\r\nimport { buildPageTreeDocs } from '../utilities/pageTree.js'\r\nimport { getCollectionPageTreeConfig } from '../utilities/pageTreeConfig.js'\r\nimport { withPageTreeDisplayStatuses } from '../utilities/status.js'\r\nimport type { PageTreeSourceDoc } from '../types.js'\r\n\r\ntype ParsedQuery = Partial<ListQuery> & Record<string, unknown>\r\ntype ServerListViewProps = Record<string, any>\r\n\r\nfunction isNumericSegment(segment: string): boolean {\r\n return /^\\d+$/.test(segment)\r\n}\r\n\r\nfunction getKeySegments(key: string): string[] {\r\n const matches = key.match(/([^[\\]]+)/g)\r\n return matches ? matches.filter(Boolean) : [key]\r\n}\r\n\r\nfunction setNestedValue(target: Record<string, unknown>, key: string, value: string): void {\r\n const segments = getKeySegments(key)\r\n\r\n if (segments.length === 0) {\r\n return\r\n }\r\n\r\n let current: Record<string, unknown> | unknown[] = target\r\n\r\n for (let index = 0; index < segments.length; index += 1) {\r\n const segment = segments[index]\r\n const isLastSegment = index === segments.length - 1\r\n const nextSegment = segments[index + 1]\r\n const nextContainer: Record<string, unknown> | unknown[] = isNumericSegment(nextSegment ?? '')\r\n ? []\r\n : {}\r\n\r\n if (isLastSegment) {\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n current[arrayIndex] = value\r\n } else {\r\n const existingValue = current[segment]\r\n\r\n if (existingValue === undefined) {\r\n current[segment] = value\r\n } else if (Array.isArray(existingValue)) {\r\n existingValue.push(value)\r\n } else {\r\n current[segment] = [existingValue, value]\r\n }\r\n }\r\n\r\n return\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n const arrayIndex = Number(segment)\r\n const existingValue = current[arrayIndex]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[arrayIndex] = nextContainer\r\n }\r\n\r\n current = current[arrayIndex] as Record<string, unknown> | unknown[]\r\n continue\r\n }\r\n\r\n const existingValue = current[segment]\r\n\r\n if (\r\n typeof existingValue !== 'object' ||\r\n existingValue === null ||\r\n Array.isArray(existingValue) !== Array.isArray(nextContainer)\r\n ) {\r\n current[segment] = nextContainer\r\n }\r\n\r\n current = current[segment] as Record<string, unknown> | unknown[]\r\n }\r\n}\r\n\r\nfunction parseSearchParams(searchParams?: Params): ParsedQuery {\r\n const parsed: ParsedQuery = {}\r\n\r\n for (const [key, value] of Object.entries(searchParams ?? {})) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n if (typeof entry === 'string') {\r\n setNestedValue(parsed, key, entry)\r\n }\r\n }\r\n } else if (typeof value === 'string') {\r\n setNestedValue(parsed, key, value)\r\n }\r\n }\r\n\r\n for (const key of ['columns', 'queryByGroup']) {\r\n if (typeof parsed[key] === 'string') {\r\n try {\r\n parsed[key] = JSON.parse(parsed[key] as string)\r\n } catch {\r\n // Leave invalid persisted values untouched and let Payload ignore them.\r\n }\r\n }\r\n }\r\n\r\n const sanitized: ParsedQuery = { ...parsed }\r\n\r\n for (const [key, value] of Object.entries(sanitized)) {\r\n if (\r\n key === 'columns' &&\r\n ((typeof value === 'string' && value === '[]') ||\r\n (Array.isArray(value) && value.length === 0))\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (\r\n key === 'where' &&\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Object.keys(value).length\r\n ) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if ((key === 'limit' || key === 'page') && typeof value === 'string') {\r\n const parsedValue = Number.parseInt(value, 10)\r\n sanitized[key] = Number.isNaN(parsedValue) ? undefined : parsedValue\r\n }\r\n\r\n if (key === 'page' && value === 0) {\r\n delete sanitized[key]\r\n continue\r\n }\r\n\r\n if (value === '') {\r\n delete sanitized[key]\r\n }\r\n }\r\n\r\n return sanitized\r\n}\r\n\r\nfunction getQueryValue<T>(incomingValue: T | undefined, fallbackValue: T): T {\r\n return incomingValue === undefined ? fallbackValue : incomingValue\r\n}\r\n\r\nfunction normalizeLimit(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizePage(value: unknown, fallback: number): number {\r\n return typeof value === 'number' && value > 0 ? value : fallback\r\n}\r\n\r\nfunction normalizeSearch(value: unknown): string {\r\n return typeof value === 'string' ? value : ''\r\n}\r\n\r\nfunction normalizeSort(value: unknown): string | undefined {\r\n if (Array.isArray(value)) {\r\n const sortValues = value.filter(\r\n (entry): entry is string => typeof entry === 'string' && entry.length > 0,\r\n )\r\n return sortValues.length > 0 ? sortValues.join(',') : undefined\r\n }\r\n\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\nfunction getOrderableFieldName(collectionConfig: ServerListViewProps['collectionConfig']) {\r\n return collectionConfig.orderable === true ? '_order' : undefined\r\n}\r\n\r\nfunction getDefaultSort(collectionConfig: ServerListViewProps['collectionConfig']) {\r\n return typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined\r\n}\r\n\r\nfunction getEffectiveTreeSort(args: {\r\n defaultSort?: string\r\n orderableFieldName?: string\r\n sort?: string\r\n}): string | undefined {\r\n const { defaultSort, orderableFieldName, sort } = args\r\n\r\n if (sort) {\r\n return sort\r\n }\r\n\r\n if (\r\n orderableFieldName &&\r\n (defaultSort === orderableFieldName || defaultSort === `-${orderableFieldName}`)\r\n ) {\r\n return defaultSort\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction normalizeWhere(value: unknown): any {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nfunction getCurrentQuery(props: ServerListViewProps, fallbackLimit: number): ListQuery {\r\n const parsedSearchQuery = parseSearchParams(props.searchParams)\r\n const preferenceQuery = (props.listPreferences ?? {}) as Partial<ListQuery>\r\n const mergedQuery = {\r\n ...preferenceQuery,\r\n ...parsedSearchQuery,\r\n } as ParsedQuery\r\n\r\n return {\r\n ...mergedQuery,\r\n limit: normalizeLimit(\r\n getQueryValue(mergedQuery.limit as number | undefined, fallbackLimit),\r\n fallbackLimit,\r\n ),\r\n page: normalizePage(\r\n getQueryValue(mergedQuery.page as number | undefined, props.data.page),\r\n props.data.page,\r\n ),\r\n search: normalizeSearch(mergedQuery.search),\r\n sort: normalizeSort(mergedQuery.sort) ?? normalizeSort(preferenceQuery.sort) ?? undefined,\r\n where: normalizeWhere(mergedQuery.where),\r\n }\r\n}\r\n\r\nfunction getBaseFilterArgs(\r\n props: ServerListViewProps,\r\n req: any,\r\n query: ListQuery,\r\n locale?: string,\r\n) {\r\n return {\r\n limit: 0,\r\n locale,\r\n page: 1,\r\n req,\r\n sort:\r\n normalizeSort(query.sort) ??\r\n (typeof props.collectionConfig.defaultSort === 'string'\r\n ? props.collectionConfig.defaultSort\r\n : 'id'),\r\n }\r\n}\r\n\r\nasync function getDocsWithDisplayStatus(args: {\r\n collectionConfig: ServerListViewProps['collectionConfig']\r\n collectionSlug: string\r\n docs: PageTreeSourceDoc[]\r\n locale?: string\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<PageTreeSourceDoc[]> {\r\n const { collectionConfig, collectionSlug, docs, locale, payload, req, user } = args\r\n\r\n if (!collectionConfig.versions?.drafts || docs.length === 0) {\r\n return docs\r\n }\r\n\r\n const docIDs = docs\r\n .map((doc) => doc.id)\r\n .filter((id): id is number | string => typeof id === 'number' || typeof id === 'string')\r\n\r\n if (docIDs.length === 0) {\r\n return docs\r\n }\r\n\r\n const currentResult = await payload.find({\r\n collection: collectionSlug,\r\n depth: 0,\r\n fallbackLocale: false,\r\n locale,\r\n pagination: false,\r\n req,\r\n select: {\r\n _status: true,\r\n id: true,\r\n },\r\n user,\r\n where: {\r\n id: {\r\n in: docIDs,\r\n },\r\n },\r\n } as never)\r\n\r\n return withPageTreeDisplayStatuses({\r\n currentDocs: currentResult.docs as Pick<PageTreeSourceDoc, '_status' | 'id'>[],\r\n draftDocs: docs,\r\n })\r\n}\r\n\r\nasync function getListClientConfig({\r\n collectionSlug,\r\n i18n,\r\n payload,\r\n req,\r\n user,\r\n}: {\r\n collectionSlug: string\r\n i18n: unknown\r\n payload: any\r\n req: any\r\n user: unknown\r\n}): Promise<{\r\n clientCollectionConfig: any\r\n clientConfig: any\r\n}> {\r\n const clientConfig = getClientConfig({\r\n config: payload.config,\r\n i18n: i18n as never,\r\n importMap: payload.importMap,\r\n user: (user ?? true) as never,\r\n } as never)\r\n\r\n await applyLocaleFiltering({\r\n clientConfig,\r\n config: payload.config,\r\n req,\r\n } as never)\r\n\r\n const clientCollectionConfig = clientConfig.collections.find(\r\n (collection) => collection.slug === collectionSlug,\r\n )\r\n\r\n if (!clientCollectionConfig) {\r\n throw new Error(`Could not resolve client collection config for \"${collectionSlug}\"`)\r\n }\r\n\r\n return {\r\n clientCollectionConfig,\r\n clientConfig,\r\n }\r\n}\r\n\r\nexport async function NestedDocsPageTreeListView(props: ServerListViewProps) {\r\n const pageTreeConfig = getCollectionPageTreeConfig(props.collectionConfig)\r\n\r\n if (!pageTreeConfig) {\r\n throw new Error(`Could not resolve page tree config for \"${props.collectionSlug}\"`)\r\n }\r\n\r\n if (typeof props.collectionConfig.admin.useAsTitle !== 'string') {\r\n throw new Error(`Collection \"${props.collectionSlug}\" must define admin.useAsTitle`)\r\n }\r\n\r\n const query = getCurrentQuery(props, pageTreeConfig.defaultLimit)\r\n const orderableFieldName = getOrderableFieldName(props.collectionConfig)\r\n const defaultSort = getDefaultSort(props.collectionConfig)\r\n const effectiveSort = getEffectiveTreeSort({\r\n defaultSort,\r\n orderableFieldName,\r\n sort: normalizeSort(query.sort),\r\n })\r\n const effectiveQuery = {\r\n ...query,\r\n sort: effectiveSort,\r\n }\r\n const locale = props.locale?.code\r\n const req = {\r\n i18n: props.i18n,\r\n locale,\r\n payload: props.payload,\r\n query: effectiveQuery,\r\n user: props.user,\r\n }\r\n\r\n const baseFilter =\r\n props.collectionConfig.admin?.baseFilter ?? props.collectionConfig.admin?.baseListFilter\r\n const baseFilterConstraint = baseFilter\r\n ? await baseFilter(getBaseFilterArgs(props, req, query, locale))\r\n : undefined\r\n const mergedWhere = combineWhereConstraints([\r\n mergeListSearchAndWhere({\r\n collectionConfig: props.collectionConfig,\r\n search: normalizeSearch(query.search),\r\n where: normalizeWhere(query.where),\r\n } as never),\r\n baseFilterConstraint ?? undefined,\r\n ])\r\n const where = Object.keys(mergedWhere).length > 0 ? mergedWhere : undefined\r\n\r\n const fullResult = await props.payload.find({\r\n collection: props.collectionSlug,\r\n depth: 0,\r\n draft: props.collectionConfig.versions?.drafts ? true : undefined,\r\n fallbackLocale: false,\r\n includeLockStatus: true,\r\n locale,\r\n pagination: false,\r\n req,\r\n sort:\r\n normalizeSort(query.sort) ??\r\n defaultSort,\r\n user: props.user,\r\n where,\r\n } as never)\r\n const treeSourceDocs = await getDocsWithDisplayStatus({\r\n collectionConfig: props.collectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n docs: fullResult.docs as unknown as PageTreeSourceDoc[],\r\n locale,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n\r\n const orderedDocs = buildPageTreeDocs(treeSourceDocs, {\r\n parentFieldSlug: pageTreeConfig.parentFieldSlug,\r\n sort: effectiveSort,\r\n })\r\n const orderedData: PaginatedDocs = {\r\n docs: orderedDocs,\r\n hasNextPage: false,\r\n hasPrevPage: false,\r\n limit: normalizeLimit(query.limit, pageTreeConfig.defaultLimit),\r\n nextPage: null,\r\n page: 1,\r\n pagingCounter: orderedDocs.length > 0 ? 1 : 0,\r\n prevPage: null,\r\n totalDocs: orderedDocs.length,\r\n totalPages: 1,\r\n }\r\n const { clientCollectionConfig, clientConfig } = await getListClientConfig({\r\n collectionSlug: props.collectionSlug,\r\n i18n: props.i18n,\r\n payload: props.payload,\r\n req,\r\n user: props.user,\r\n })\r\n const columnPreferences: ColumnPreference[] = (props.columnState as Array<{\r\n accessor: string\r\n active: boolean\r\n }>).map(({ accessor, active }) => ({\r\n accessor,\r\n active: accessor === props.collectionConfig.admin.useAsTitle ? true : active,\r\n }))\r\n const columns = getColumns({\r\n clientConfig,\r\n collectionConfig: clientCollectionConfig,\r\n collectionSlug: props.collectionSlug,\r\n columns: columnPreferences,\r\n i18n: props.i18n,\r\n permissions: props.permissions,\r\n } as never)\r\n const fieldPermissions = props.permissions?.collections?.[props.collectionSlug]?.fields ?? true\r\n const renderedTable = await renderTable({\r\n clientCollectionConfig,\r\n clientConfig,\r\n collectionConfig: props.collectionConfig,\r\n columns,\r\n data: orderedData,\r\n enableRowSelections: Boolean(props.enableRowSelections),\r\n fieldPermissions,\r\n i18n: props.i18n,\r\n orderableFieldName: orderableFieldName ?? '',\r\n payload: props.payload,\r\n query: effectiveQuery,\r\n req,\r\n tableAppearance: 'default',\r\n useAsTitle: props.collectionConfig.admin.useAsTitle,\r\n viewType: props.viewType,\r\n } as never)\r\n const clientProps: Omit<ListViewClientProps, 'Table' | 'columnState'> = {\r\n AfterList: props.AfterList,\r\n AfterListTable: props.AfterListTable,\r\n BeforeList: props.BeforeList,\r\n BeforeListTable: props.BeforeListTable,\r\n Description: props.Description,\r\n beforeActions: props.beforeActions,\r\n collectionSlug: props.collectionSlug,\r\n disableBulkDelete: props.disableBulkDelete,\r\n disableBulkEdit: props.disableBulkEdit,\r\n disableQueryPresets: props.disableQueryPresets,\r\n enableRowSelections: props.enableRowSelections,\r\n hasCreatePermission: props.hasCreatePermission,\r\n hasDeletePermission: props.hasDeletePermission,\r\n hasTrashPermission: props.hasTrashPermission,\r\n listMenuItems: props.listMenuItems,\r\n listPreferences: props.listPreferences,\r\n newDocumentURL: props.newDocumentURL,\r\n preferenceKey: props.preferenceKey,\r\n queryPreset: props.queryPreset,\r\n queryPresetPermissions: props.queryPresetPermissions,\r\n renderedFilters: props.renderedFilters,\r\n resolvedFilterOptions: props.resolvedFilterOptions,\r\n viewType: props.viewType,\r\n }\r\n const canMoveDocs = Boolean(props.permissions?.collections?.[props.collectionSlug]?.update)\r\n\r\n return (\r\n <PageTreeListViewClient\r\n {...clientProps}\r\n allDocs={orderedDocs}\n badgeConfig={pageTreeConfig.badges}\n canMoveDocs={canMoveDocs}\n columnState={renderedTable.columnState}\n homeIndicatorEnabled={pageTreeConfig.homeIndicator.enabled}\n orderableFieldName={orderableFieldName}\n parentFieldSlug={pageTreeConfig.parentFieldSlug}\n query={effectiveQuery}\n sourceDocs={treeSourceDocs}\r\n useAsTitle={props.collectionConfig.admin.useAsTitle}\r\n />\r\n )\r\n}\r\n\r\nexport default NestedDocsPageTreeListView\r\n"],"names":["React","getColumns","renderTable","getClientConfig","applyLocaleFiltering","combineWhereConstraints","mergeListSearchAndWhere","PageTreeListViewClient","buildPageTreeDocs","getCollectionPageTreeConfig","withPageTreeDisplayStatuses","isNumericSegment","segment","test","getKeySegments","key","matches","match","filter","Boolean","setNestedValue","target","value","segments","length","current","index","isLastSegment","nextSegment","nextContainer","Array","isArray","arrayIndex","Number","existingValue","undefined","push","parseSearchParams","searchParams","parsed","Object","entries","entry","JSON","parse","sanitized","keys","parsedValue","parseInt","isNaN","getQueryValue","incomingValue","fallbackValue","normalizeLimit","fallback","normalizePage","normalizeSearch","normalizeSort","sortValues","join","getOrderableFieldName","collectionConfig","orderable","getDefaultSort","defaultSort","getEffectiveTreeSort","args","orderableFieldName","sort","normalizeWhere","getCurrentQuery","props","fallbackLimit","parsedSearchQuery","preferenceQuery","listPreferences","mergedQuery","limit","page","data","search","where","getBaseFilterArgs","req","query","locale","getDocsWithDisplayStatus","collectionSlug","docs","payload","user","versions","drafts","docIDs","map","doc","id","currentResult","find","collection","depth","fallbackLocale","pagination","select","_status","in","currentDocs","draftDocs","getListClientConfig","i18n","clientConfig","config","importMap","clientCollectionConfig","collections","slug","Error","NestedDocsPageTreeListView","pageTreeConfig","admin","useAsTitle","defaultLimit","effectiveSort","effectiveQuery","code","baseFilter","baseListFilter","baseFilterConstraint","mergedWhere","fullResult","draft","includeLockStatus","treeSourceDocs","orderedDocs","parentFieldSlug","orderedData","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","totalDocs","totalPages","columnPreferences","columnState","accessor","active","columns","permissions","fieldPermissions","fields","renderedTable","enableRowSelections","tableAppearance","viewType","clientProps","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","beforeActions","disableBulkDelete","disableBulkEdit","disableQueryPresets","hasCreatePermission","hasDeletePermission","hasTrashPermission","listMenuItems","newDocumentURL","preferenceKey","queryPreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","canMoveDocs","update","allDocs","badgeConfig","badges","homeIndicatorEnabled","homeIndicator","enabled","sourceDocs"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { PageTreeDoc } from '../utilities/pageTree.js';
3
- export declare function PageTreeTitleCell({ children, doc, }: {
3
+ export declare function PageTreeTitleCell({ children, doc, homeIndicatorEnabled, }: {
4
4
  children: React.ReactNode;
5
5
  doc: PageTreeDoc;
6
+ homeIndicatorEnabled: boolean;
6
7
  }): import("react/jsx-runtime").JSX.Element;
@@ -1,10 +1,14 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import React from 'react';
4
3
  import { useDraggable } from '@dnd-kit/core';
5
4
  import { ChevronIcon, DragHandleIcon } from '@payloadcms/ui';
5
+ import React from 'react';
6
6
  import { usePageTree } from './PageTreeContext.js';
7
- export function PageTreeTitleCell({ children, doc }) {
7
+ const HOME_PAGE_SLUG = 'home';
8
+ function isHomePageDoc(doc) {
9
+ return doc.__pageTreeParentID === null && doc.slug?.trim() === HOME_PAGE_SLUG;
10
+ }
11
+ export function PageTreeTitleCell({ children, doc, homeIndicatorEnabled }) {
8
12
  const { activeDragRowID, canMoveDocs, collapsedIDs, disableMoveDrag, pendingMoveRowID, toggleRow } = usePageTree();
9
13
  const depth = doc.__pageTreeDepth;
10
14
  const hasChildren = doc.__pageTreeHasChildren;
@@ -12,13 +16,14 @@ export function PageTreeTitleCell({ children, doc }) {
12
16
  const rowID = doc.__pageTreeID;
13
17
  const isCollapsed = hasChildren && collapsedIDs.has(rowID);
14
18
  const dragIsDisabled = disableMoveDrag || !canMoveDocs || !rowID || pendingMoveRowID !== null;
19
+ const showHomeIcon = homeIndicatorEnabled && isHomePageDoc(doc);
15
20
  const { attributes, isDragging, listeners, setNodeRef } = useDraggable({
21
+ id: `page-drag:${rowID}`,
16
22
  data: {
17
23
  dragType: 'move',
18
24
  rowID
19
25
  },
20
- disabled: dragIsDisabled,
21
- id: `page-drag:${rowID}`
26
+ disabled: dragIsDisabled
22
27
  });
23
28
  const isActiveDragRow = activeDragRowID === rowID;
24
29
  return /*#__PURE__*/ _jsxs("div", {
@@ -26,6 +31,7 @@ export function PageTreeTitleCell({ children, doc }) {
26
31
  "data-row-dragging": isDragging || isActiveDragRow ? 'true' : 'false',
27
32
  "data-tree-depth": depth,
28
33
  "data-tree-has-children": hasChildren ? 'true' : 'false',
34
+ "data-tree-home": showHomeIcon ? 'true' : undefined,
29
35
  "data-tree-shade-level": shadeLevel,
30
36
  style: {
31
37
  '--pages-tree-depth': String(depth)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PageTreeTitleCell.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport { ChevronIcon, DragHandleIcon } from '@payloadcms/ui'\n\nimport { usePageTree } from './PageTreeContext.js'\nimport type { PageTreeDoc } from '../utilities/pageTree.js'\n\nexport function PageTreeTitleCell({\n children,\n doc,\n}: {\n children: React.ReactNode\n doc: PageTreeDoc\n}) {\n const {\n activeDragRowID,\n canMoveDocs,\n collapsedIDs,\n disableMoveDrag,\n pendingMoveRowID,\n toggleRow,\n } = usePageTree()\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 = disableMoveDrag || !canMoveDocs || !rowID || pendingMoveRowID !== null\n const { attributes, isDragging, listeners, setNodeRef } = useDraggable({\n data: {\n dragType: 'move',\n rowID,\n },\n disabled: dragIsDisabled,\n id: `page-drag:${rowID}`,\n })\n const isActiveDragRow = activeDragRowID === rowID\n\n return (\n <div\n className=\"pages-hierarchy-cell\"\n data-row-dragging={isDragging || isActiveDragRow ? 'true' : 'false'}\n data-tree-depth={depth}\n data-tree-has-children={hasChildren ? 'true' : 'false'}\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 {canMoveDocs ? (\n <button\n {...attributes}\n {...listeners}\n aria-label=\"Move document\"\n className={[\n 'pages-hierarchy-cell__drag-handle',\n isDragging || isActiveDragRow ? 'pages-hierarchy-cell__drag-handle--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={dragIsDisabled}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n ref={setNodeRef}\n type=\"button\"\n >\n <DragHandleIcon />\n </button>\n ) : (\n <span className=\"pages-hierarchy-cell__drag-spacer\" />\n )}\n <span className=\"pages-hierarchy-cell__content\">{children}</span>\n </div>\n )\n}\n"],"names":["React","useDraggable","ChevronIcon","DragHandleIcon","usePageTree","PageTreeTitleCell","children","doc","activeDragRowID","canMoveDocs","collapsedIDs","disableMoveDrag","pendingMoveRowID","toggleRow","depth","__pageTreeDepth","hasChildren","__pageTreeHasChildren","shadeLevel","Math","min","__pageTreeShadeLevel","rowID","__pageTreeID","isCollapsed","has","dragIsDisabled","attributes","isDragging","listeners","setNodeRef","data","dragType","disabled","id","isActiveDragRow","div","className","data-row-dragging","data-tree-depth","data-tree-has-children","data-tree-shade-level","style","String","button","aria-expanded","aria-label","onClick","event","preventDefault","stopPropagation","type","filter","Boolean","join","span","ref"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AACzB,SAASC,YAAY,QAAQ,gBAAe;AAC5C,SAASC,WAAW,EAAEC,cAAc,QAAQ,iBAAgB;AAE5D,SAASC,WAAW,QAAQ,uBAAsB;AAGlD,OAAO,SAASC,kBAAkB,EAChCC,QAAQ,EACRC,GAAG,EAIJ;IACC,MAAM,EACJC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,eAAe,EACfC,gBAAgB,EAChBC,SAAS,EACV,GAAGT;IACJ,MAAMU,QAAQP,IAAIQ,eAAe;IACjC,MAAMC,cAAcT,IAAIU,qBAAqB;IAC7C,MAAMC,aAAaC,KAAKC,GAAG,CAACb,IAAIc,oBAAoB,EAAE;IACtD,MAAMC,QAAQf,IAAIgB,YAAY;IAC9B,MAAMC,cAAcR,eAAeN,aAAae,GAAG,CAACH;IACpD,MAAMI,iBAAiBf,mBAAmB,CAACF,eAAe,CAACa,SAASV,qBAAqB;IACzF,MAAM,EAAEe,UAAU,EAAEC,UAAU,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAG7B,aAAa;QACrE8B,MAAM;YACJC,UAAU;YACVV;QACF;QACAW,UAAUP;QACVQ,IAAI,CAAC,UAAU,EAAEZ,OAAO;IAC1B;IACA,MAAMa,kBAAkB3B,oBAAoBc;IAE5C,qBACE,MAACc;QACCC,WAAU;QACVC,qBAAmBV,cAAcO,kBAAkB,SAAS;QAC5DI,mBAAiBzB;QACjB0B,0BAAwBxB,cAAc,SAAS;QAC/CyB,yBAAuBvB;QACvBwB,OAAO;YAAE,sBAAsBC,OAAO7B;QAAO;;YAE5CE,4BACC,KAAC4B;gBACCC,iBAAe,CAACrB;gBAChBsB,cAAYtB,cAAc,wBAAwB;gBAClDa,WAAU;gBACVU,SAAS,CAACC;oBACRA,MAAMC,cAAc;oBACpBD,MAAME,eAAe;oBACrBrC,UAAUS;gBACZ;gBACA6B,MAAK;0BAEL,cAAA,KAACjD;oBACCmC,WAAW;wBACT;wBACAb,cAAc,6CAA6C;qBAC5D,CACE4B,MAAM,CAACC,SACPC,IAAI,CAAC;;+BAIZ,KAACC;gBAAKlB,WAAU;;YAEjB5B,4BACC,KAACmC;gBACE,GAAGjB,UAAU;gBACb,GAAGE,SAAS;gBACbiB,cAAW;gBACXT,WAAW;oBACT;oBACAT,cAAcO,kBAAkB,8CAA8C;iBAC/E,CACEiB,MAAM,CAACC,SACPC,IAAI,CAAC;gBACRrB,UAAUP;gBACVqB,SAAS,CAACC;oBACRA,MAAMC,cAAc;oBACpBD,MAAME,eAAe;gBACvB;gBACAM,KAAK1B;gBACLqB,MAAK;0BAEL,cAAA,KAAChD;+BAGH,KAACoD;gBAAKlB,WAAU;;0BAElB,KAACkB;gBAAKlB,WAAU;0BAAiC/B;;;;AAGvD"}
1
+ {"version":3,"sources":["../../src/components/PageTreeTitleCell.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useDraggable } from '@dnd-kit/core'\r\nimport { ChevronIcon, DragHandleIcon } from '@payloadcms/ui'\r\nimport React from 'react'\r\n\r\nimport type { PageTreeDoc } from '../utilities/pageTree.js'\r\n\r\nimport { usePageTree } from './PageTreeContext.js'\r\n\r\nconst HOME_PAGE_SLUG = 'home'\r\n\r\nfunction isHomePageDoc(doc: PageTreeDoc): boolean {\n return doc.__pageTreeParentID === null && doc.slug?.trim() === HOME_PAGE_SLUG\n}\n\r\nexport function PageTreeTitleCell({\n children,\n doc,\n homeIndicatorEnabled,\n}: {\n children: React.ReactNode\n doc: PageTreeDoc\n homeIndicatorEnabled: boolean\n}) {\n const {\r\n activeDragRowID,\r\n canMoveDocs,\r\n collapsedIDs,\r\n disableMoveDrag,\r\n pendingMoveRowID,\r\n toggleRow,\r\n } = usePageTree()\r\n const depth = doc.__pageTreeDepth\r\n const hasChildren = doc.__pageTreeHasChildren\r\n const shadeLevel = Math.min(doc.__pageTreeShadeLevel, 6)\r\n const rowID = doc.__pageTreeID\n const isCollapsed = hasChildren && collapsedIDs.has(rowID)\n const dragIsDisabled = disableMoveDrag || !canMoveDocs || !rowID || pendingMoveRowID !== null\n const showHomeIcon = homeIndicatorEnabled && isHomePageDoc(doc)\n const { attributes, isDragging, listeners, setNodeRef } = useDraggable({\r\n id: `page-drag:${rowID}`,\r\n data: {\r\n dragType: 'move',\r\n rowID,\r\n },\r\n disabled: dragIsDisabled,\r\n })\r\n const isActiveDragRow = activeDragRowID === rowID\r\n\r\n return (\r\n <div\r\n className=\"pages-hierarchy-cell\"\r\n data-row-dragging={isDragging || isActiveDragRow ? 'true' : 'false'}\r\n data-tree-depth={depth}\r\n data-tree-has-children={hasChildren ? 'true' : 'false'}\r\n data-tree-home={showHomeIcon ? 'true' : undefined}\r\n data-tree-shade-level={shadeLevel}\r\n style={{ '--pages-tree-depth': String(depth) } as React.CSSProperties}\r\n >\r\n {hasChildren ? (\r\n <button\r\n aria-expanded={!isCollapsed}\r\n aria-label={isCollapsed ? 'Expand nested items' : 'Collapse nested items'}\r\n className=\"pages-hierarchy-cell__toggle\"\r\n onClick={(event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n toggleRow(rowID)\r\n }}\r\n type=\"button\"\r\n >\r\n <ChevronIcon\r\n className={[\r\n 'pages-hierarchy-cell__chevron',\r\n isCollapsed ? 'pages-hierarchy-cell__chevron--collapsed' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n />\r\n </button>\r\n ) : (\r\n <span className=\"pages-hierarchy-cell__spacer\" />\r\n )}\r\n {canMoveDocs ? (\r\n <button\r\n {...attributes}\r\n {...listeners}\r\n aria-label=\"Move document\"\r\n className={[\r\n 'pages-hierarchy-cell__drag-handle',\r\n isDragging || isActiveDragRow ? 'pages-hierarchy-cell__drag-handle--active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n disabled={dragIsDisabled}\r\n onClick={(event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }}\r\n ref={setNodeRef}\r\n type=\"button\"\r\n >\r\n <DragHandleIcon />\r\n </button>\r\n ) : (\r\n <span className=\"pages-hierarchy-cell__drag-spacer\" />\r\n )}\r\n <span className=\"pages-hierarchy-cell__content\">{children}</span>\r\n </div>\r\n )\r\n}\r\n"],"names":["useDraggable","ChevronIcon","DragHandleIcon","React","usePageTree","HOME_PAGE_SLUG","isHomePageDoc","doc","__pageTreeParentID","slug","trim","PageTreeTitleCell","children","homeIndicatorEnabled","activeDragRowID","canMoveDocs","collapsedIDs","disableMoveDrag","pendingMoveRowID","toggleRow","depth","__pageTreeDepth","hasChildren","__pageTreeHasChildren","shadeLevel","Math","min","__pageTreeShadeLevel","rowID","__pageTreeID","isCollapsed","has","dragIsDisabled","showHomeIcon","attributes","isDragging","listeners","setNodeRef","id","data","dragType","disabled","isActiveDragRow","div","className","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","Boolean","join","span","ref"],"mappings":"AAAA;;AAEA,SAASA,YAAY,QAAQ,gBAAe;AAC5C,SAASC,WAAW,EAAEC,cAAc,QAAQ,iBAAgB;AAC5D,OAAOC,WAAW,QAAO;AAIzB,SAASC,WAAW,QAAQ,uBAAsB;AAElD,MAAMC,iBAAiB;AAEvB,SAASC,cAAcC,GAAgB;IACrC,OAAOA,IAAIC,kBAAkB,KAAK,QAAQD,IAAIE,IAAI,EAAEC,WAAWL;AACjE;AAEA,OAAO,SAASM,kBAAkB,EAChCC,QAAQ,EACRL,GAAG,EACHM,oBAAoB,EAKrB;IACC,MAAM,EACJC,eAAe,EACfC,WAAW,EACXC,YAAY,EACZC,eAAe,EACfC,gBAAgB,EAChBC,SAAS,EACV,GAAGf;IACJ,MAAMgB,QAAQb,IAAIc,eAAe;IACjC,MAAMC,cAAcf,IAAIgB,qBAAqB;IAC7C,MAAMC,aAAaC,KAAKC,GAAG,CAACnB,IAAIoB,oBAAoB,EAAE;IACtD,MAAMC,QAAQrB,IAAIsB,YAAY;IAC9B,MAAMC,cAAcR,eAAeN,aAAae,GAAG,CAACH;IACpD,MAAMI,iBAAiBf,mBAAmB,CAACF,eAAe,CAACa,SAASV,qBAAqB;IACzF,MAAMe,eAAepB,wBAAwBP,cAAcC;IAC3D,MAAM,EAAE2B,UAAU,EAAEC,UAAU,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGrC,aAAa;QACrEsC,IAAI,CAAC,UAAU,EAAEV,OAAO;QACxBW,MAAM;YACJC,UAAU;YACVZ;QACF;QACAa,UAAUT;IACZ;IACA,MAAMU,kBAAkB5B,oBAAoBc;IAE5C,qBACE,MAACe;QACCC,WAAU;QACVC,qBAAmBV,cAAcO,kBAAkB,SAAS;QAC5DI,mBAAiB1B;QACjB2B,0BAAwBzB,cAAc,SAAS;QAC/C0B,kBAAgBf,eAAe,SAASgB;QACxCC,yBAAuB1B;QACvB2B,OAAO;YAAE,sBAAsBC,OAAOhC;QAAO;;YAE5CE,4BACC,KAAC+B;gBACCC,iBAAe,CAACxB;gBAChByB,cAAYzB,cAAc,wBAAwB;gBAClDc,WAAU;gBACVY,SAAS,CAACC;oBACRA,MAAMC,cAAc;oBACpBD,MAAME,eAAe;oBACrBxC,UAAUS;gBACZ;gBACAgC,MAAK;0BAEL,cAAA,KAAC3D;oBACC2C,WAAW;wBACT;wBACAd,cAAc,6CAA6C;qBAC5D,CACE+B,MAAM,CAACC,SACPC,IAAI,CAAC;;+BAIZ,KAACC;gBAAKpB,WAAU;;YAEjB7B,4BACC,KAACsC;gBACE,GAAGnB,UAAU;gBACb,GAAGE,SAAS;gBACbmB,cAAW;gBACXX,WAAW;oBACT;oBACAT,cAAcO,kBAAkB,8CAA8C;iBAC/E,CACEmB,MAAM,CAACC,SACPC,IAAI,CAAC;gBACRtB,UAAUT;gBACVwB,SAAS,CAACC;oBACRA,MAAMC,cAAc;oBACpBD,MAAME,eAAe;gBACvB;gBACAM,KAAK5B;gBACLuB,MAAK;0BAEL,cAAA,KAAC1D;+BAGH,KAAC8D;gBAAKpB,WAAU;;0BAElB,KAACoB;gBAAKpB,WAAU;0BAAiChC;;;;AAGvD"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import type { Config } from 'payload';
2
2
  import type { NestedDocsPageTreePluginConfig } from './types.js';
3
- export type { NestedDocsPageTreePluginBadgeConfig, NestedDocsPageTreePluginBadgeMap, NestedDocsPageTreePluginBadgeStatus, NestedDocsPageTreePluginConfig, } from './types.js';
3
+ export type { NestedDocsPageTreePluginBadgeConfig, NestedDocsPageTreePluginBadgeMap, NestedDocsPageTreePluginBadgeStatus, NestedDocsPageTreePluginConfig, NestedDocsPageTreePluginHomeIndicatorConfig, } from './types.js';
4
4
  export declare const nestedDocsPageTreePlugin: (pluginOptions: NestedDocsPageTreePluginConfig) => (config: Config) => Config;
package/dist/index.js CHANGED
@@ -2,6 +2,9 @@ import { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js';
2
2
  import { nestedDocsPageTreePluginCustomKey } from './types.js';
3
3
  import { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js';
4
4
  const DEFAULT_BREADCRUMBS_FIELD_SLUG = 'breadcrumbs';
5
+ const DEFAULT_HOME_INDICATOR_COLLECTIONS = [
6
+ 'pages'
7
+ ];
5
8
  const DEFAULT_LIMIT = 100;
6
9
  const DEFAULT_PARENT_FIELD_SLUG = 'parent';
7
10
  const PAGE_TREE_LIST_VIEW_PATH = 'payload-nested-docs-page-tree/rsc#NestedDocsPageTreeListView';
@@ -50,15 +53,22 @@ function validateTargetCollection(args) {
50
53
  }
51
54
  }
52
55
  function buildCollectionCustom(args) {
53
- const { badges, breadcrumbsFieldSlug, defaultLimit, hideBreadcrumbs, parentFieldSlug } = args;
56
+ const { badges, breadcrumbsFieldSlug, defaultLimit, hideBreadcrumbs, homeIndicator, parentFieldSlug } = args;
54
57
  return {
55
58
  badges,
56
59
  breadcrumbsFieldSlug,
57
60
  defaultLimit,
58
61
  hideBreadcrumbs,
62
+ homeIndicator,
59
63
  parentFieldSlug
60
64
  };
61
65
  }
66
+ function getHomeIndicatorCollectionSlugs(homeIndicator) {
67
+ if (homeIndicator === false) {
68
+ return new Set();
69
+ }
70
+ return new Set(homeIndicator?.collections ?? DEFAULT_HOME_INDICATOR_COLLECTIONS);
71
+ }
62
72
  export const nestedDocsPageTreePlugin = (pluginOptions)=>(config)=>{
63
73
  if (!pluginOptions.collections?.length) {
64
74
  throw new Error('payload-nested-docs-page-tree requires at least one collection slug.');
@@ -71,6 +81,7 @@ export const nestedDocsPageTreePlugin = (pluginOptions)=>(config)=>{
71
81
  const hideBreadcrumbs = pluginOptions.hideBreadcrumbs ?? true;
72
82
  const parentFieldSlug = pluginOptions.parentFieldSlug ?? DEFAULT_PARENT_FIELD_SLUG;
73
83
  const badges = normalizeNestedDocsPageTreePluginBadgeConfig(pluginOptions.badges);
84
+ const homeIndicatorCollectionSlugs = getHomeIndicatorCollectionSlugs(pluginOptions.homeIndicator);
74
85
  const targetedCollectionSlugs = new Set(pluginOptions.collections);
75
86
  if (!config.collections?.length) {
76
87
  throw new Error('payload-nested-docs-page-tree could not find any collections to patch.');
@@ -112,6 +123,9 @@ export const nestedDocsPageTreePlugin = (pluginOptions)=>(config)=>{
112
123
  breadcrumbsFieldSlug,
113
124
  defaultLimit,
114
125
  hideBreadcrumbs,
126
+ homeIndicator: {
127
+ enabled: homeIndicatorCollectionSlugs.has(collection.slug)
128
+ },
115
129
  parentFieldSlug
116
130
  })
117
131
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js'\nimport type {\n NestedDocsPageTreePluginCollectionCustom,\n NestedDocsPageTreePluginConfig,\n} from './types.js'\nimport { nestedDocsPageTreePluginCustomKey } from './types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js'\n\nconst DEFAULT_BREADCRUMBS_FIELD_SLUG = 'breadcrumbs'\nconst DEFAULT_LIMIT = 100\nconst DEFAULT_PARENT_FIELD_SLUG = 'parent'\nconst PAGE_TREE_LIST_VIEW_PATH =\n 'payload-nested-docs-page-tree/rsc#NestedDocsPageTreeListView'\ntype CollectionEndpoint = NonNullable<Exclude<CollectionConfig['endpoints'], false>>[number]\n\nfunction getTopLevelField(\n collection: Pick<CollectionConfig, 'fields'>,\n fieldName: string,\n) {\n return collection.fields.find((field) => 'name' in field && field.name === fieldName)\n}\n\nfunction getCollectionEndpoints(collection: CollectionConfig): CollectionEndpoint[] {\n return Array.isArray(collection.endpoints) ? [...collection.endpoints] : []\n}\n\nfunction patchBreadcrumbField<TField extends CollectionConfig['fields'][number]>(args: {\n breadcrumbsFieldSlug: string\n field: TField\n hideBreadcrumbs: boolean\n}): TField {\n const { breadcrumbsFieldSlug, field, hideBreadcrumbs } = args\n\n if (!('name' in field) || field.name !== breadcrumbsFieldSlug) {\n return field\n }\n\n return {\n ...field,\n admin: {\n ...(field.admin ?? {}),\n hidden: hideBreadcrumbs,\n },\n } as TField\n}\n\nfunction validateTargetCollection(args: {\n breadcrumbsFieldSlug: string\n collection: CollectionConfig\n parentFieldSlug: string\n}) {\n const { breadcrumbsFieldSlug, collection, parentFieldSlug } = args\n\n if (typeof collection.admin?.useAsTitle !== 'string' || collection.admin.useAsTitle.includes('.')) {\n throw new Error(\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to define a top-level admin.useAsTitle field.`,\n )\n }\n\n if (!getTopLevelField(collection, collection.admin.useAsTitle)) {\n throw new Error(\n `payload-nested-docs-page-tree could not find the useAsTitle field \"${collection.admin.useAsTitle}\" on \"${collection.slug}\".`,\n )\n }\n\n if (!getTopLevelField(collection, parentFieldSlug)) {\n throw new Error(\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to already define the nested docs parent field \"${parentFieldSlug}\". Register @payloadcms/plugin-nested-docs before payload-nested-docs-page-tree.`,\n )\n }\n\n if (!getTopLevelField(collection, breadcrumbsFieldSlug)) {\n throw new Error(\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to already define the nested docs breadcrumbs field \"${breadcrumbsFieldSlug}\". Register @payloadcms/plugin-nested-docs before payload-nested-docs-page-tree.`,\n )\n }\n\n const existingListView = collection.admin?.components?.views?.list?.Component\n\n if (existingListView && existingListView !== PAGE_TREE_LIST_VIEW_PATH) {\n throw new Error(\n `payload-nested-docs-page-tree cannot own the \"${collection.slug}\" list view because the collection already defines a custom admin.components.views.list.Component.`,\n )\n }\n\n const existingMoveEndpoint = getCollectionEndpoints(collection).find(\n (endpoint) => endpoint.path === '/:id/move',\n )\n\n if (existingMoveEndpoint) {\n throw new Error(\n `payload-nested-docs-page-tree cannot add the move endpoint to \"${collection.slug}\" because the collection already defines POST /:id/move.`,\n )\n }\n}\n\nfunction buildCollectionCustom(args: {\n badges: NestedDocsPageTreePluginCollectionCustom['badges']\n breadcrumbsFieldSlug: string\n defaultLimit: number\n hideBreadcrumbs: boolean\n parentFieldSlug: string\n}): NestedDocsPageTreePluginCollectionCustom {\n const { badges, breadcrumbsFieldSlug, defaultLimit, hideBreadcrumbs, parentFieldSlug } = args\n\n return {\n badges,\n breadcrumbsFieldSlug,\n defaultLimit,\n hideBreadcrumbs,\n parentFieldSlug,\n }\n}\n\nexport type {\n NestedDocsPageTreePluginBadgeConfig,\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n NestedDocsPageTreePluginConfig,\n} from './types.js'\n\nexport const nestedDocsPageTreePlugin =\n (pluginOptions: NestedDocsPageTreePluginConfig) =>\n (config: Config): Config => {\n if (!pluginOptions.collections?.length) {\n throw new Error('payload-nested-docs-page-tree requires at least one collection slug.')\n }\n\n if (pluginOptions.disabled) {\n return config\n }\n\n const breadcrumbsFieldSlug =\n pluginOptions.breadcrumbsFieldSlug ?? DEFAULT_BREADCRUMBS_FIELD_SLUG\n const defaultLimit = pluginOptions.defaultLimit ?? DEFAULT_LIMIT\n const hideBreadcrumbs = pluginOptions.hideBreadcrumbs ?? true\n const parentFieldSlug = pluginOptions.parentFieldSlug ?? DEFAULT_PARENT_FIELD_SLUG\n const badges = normalizeNestedDocsPageTreePluginBadgeConfig(pluginOptions.badges)\n const targetedCollectionSlugs = new Set<string>(pluginOptions.collections)\n\n if (!config.collections?.length) {\n throw new Error('payload-nested-docs-page-tree could not find any collections to patch.')\n }\n\n const foundCollectionSlugs = new Set<string>()\n const nextCollections = config.collections.map((collection) => {\n if (!targetedCollectionSlugs.has(collection.slug)) {\n return collection\n }\n\n foundCollectionSlugs.add(collection.slug)\n validateTargetCollection({\n breadcrumbsFieldSlug,\n collection,\n parentFieldSlug,\n })\n\n return {\n ...collection,\n admin: {\n ...(collection.admin ?? {}),\n components: {\n ...(collection.admin?.components ?? {}),\n views: {\n ...(collection.admin?.components?.views ?? {}),\n list: {\n ...(collection.admin?.components?.views?.list ?? {}),\n Component: PAGE_TREE_LIST_VIEW_PATH,\n },\n },\n },\n pagination: {\n ...(collection.admin?.pagination ?? {}),\n defaultLimit:\n collection.admin?.pagination?.defaultLimit === undefined\n ? defaultLimit\n : collection.admin.pagination.defaultLimit,\n },\n },\n custom: {\n ...(collection.custom ?? {}),\n [nestedDocsPageTreePluginCustomKey]: buildCollectionCustom({\n badges,\n breadcrumbsFieldSlug,\n defaultLimit,\n hideBreadcrumbs,\n parentFieldSlug,\n }),\n },\n endpoints: [\n ...getCollectionEndpoints(collection),\n createMovePageEndpoint({\n collectionSlug: collection.slug,\n parentFieldSlug,\n }),\n ],\n fields: collection.fields.map((field) =>\n patchBreadcrumbField({\n breadcrumbsFieldSlug,\n field,\n hideBreadcrumbs,\n }),\n ),\n }\n })\n\n const missingCollections = pluginOptions.collections.filter(\n (collectionSlug) => !foundCollectionSlugs.has(collectionSlug),\n )\n\n if (missingCollections.length > 0) {\n throw new Error(\n `payload-nested-docs-page-tree could not find the following collections: ${missingCollections.join(', ')}`,\n )\n }\n\n return {\n ...config,\n collections: nextCollections as CollectionConfig[],\n }\n }\n"],"names":["createMovePageEndpoint","nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","DEFAULT_BREADCRUMBS_FIELD_SLUG","DEFAULT_LIMIT","DEFAULT_PARENT_FIELD_SLUG","PAGE_TREE_LIST_VIEW_PATH","getTopLevelField","collection","fieldName","fields","find","field","name","getCollectionEndpoints","Array","isArray","endpoints","patchBreadcrumbField","args","breadcrumbsFieldSlug","hideBreadcrumbs","admin","hidden","validateTargetCollection","parentFieldSlug","useAsTitle","includes","Error","slug","existingListView","components","views","list","Component","existingMoveEndpoint","endpoint","path","buildCollectionCustom","badges","defaultLimit","nestedDocsPageTreePlugin","pluginOptions","config","collections","length","disabled","targetedCollectionSlugs","Set","foundCollectionSlugs","nextCollections","map","has","add","pagination","undefined","custom","collectionSlug","missingCollections","filter","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\r\n\r\nimport { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js'\r\nimport type {\r\n NestedDocsPageTreePluginCollectionCustom,\r\n NestedDocsPageTreePluginConfig,\r\n} from './types.js'\r\nimport { nestedDocsPageTreePluginCustomKey } from './types.js'\r\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js'\r\n\r\nconst DEFAULT_BREADCRUMBS_FIELD_SLUG = 'breadcrumbs'\nconst DEFAULT_HOME_INDICATOR_COLLECTIONS = ['pages']\nconst DEFAULT_LIMIT = 100\nconst DEFAULT_PARENT_FIELD_SLUG = 'parent'\nconst PAGE_TREE_LIST_VIEW_PATH =\n 'payload-nested-docs-page-tree/rsc#NestedDocsPageTreeListView'\ntype CollectionEndpoint = NonNullable<Exclude<CollectionConfig['endpoints'], false>>[number]\n\r\nfunction getTopLevelField(\r\n collection: Pick<CollectionConfig, 'fields'>,\r\n fieldName: string,\r\n) {\r\n return collection.fields.find((field) => 'name' in field && field.name === fieldName)\r\n}\r\n\r\nfunction getCollectionEndpoints(collection: CollectionConfig): CollectionEndpoint[] {\r\n return Array.isArray(collection.endpoints) ? [...collection.endpoints] : []\r\n}\r\n\r\nfunction patchBreadcrumbField<TField extends CollectionConfig['fields'][number]>(args: {\r\n breadcrumbsFieldSlug: string\r\n field: TField\r\n hideBreadcrumbs: boolean\r\n}): TField {\r\n const { breadcrumbsFieldSlug, field, hideBreadcrumbs } = args\r\n\r\n if (!('name' in field) || field.name !== breadcrumbsFieldSlug) {\r\n return field\r\n }\r\n\r\n return {\r\n ...field,\r\n admin: {\r\n ...(field.admin ?? {}),\r\n hidden: hideBreadcrumbs,\r\n },\r\n } as TField\r\n}\r\n\r\nfunction validateTargetCollection(args: {\r\n breadcrumbsFieldSlug: string\r\n collection: CollectionConfig\r\n parentFieldSlug: string\r\n}) {\r\n const { breadcrumbsFieldSlug, collection, parentFieldSlug } = args\r\n\r\n if (typeof collection.admin?.useAsTitle !== 'string' || collection.admin.useAsTitle.includes('.')) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to define a top-level admin.useAsTitle field.`,\r\n )\r\n }\r\n\r\n if (!getTopLevelField(collection, collection.admin.useAsTitle)) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree could not find the useAsTitle field \"${collection.admin.useAsTitle}\" on \"${collection.slug}\".`,\r\n )\r\n }\r\n\r\n if (!getTopLevelField(collection, parentFieldSlug)) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to already define the nested docs parent field \"${parentFieldSlug}\". Register @payloadcms/plugin-nested-docs before payload-nested-docs-page-tree.`,\r\n )\r\n }\r\n\r\n if (!getTopLevelField(collection, breadcrumbsFieldSlug)) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree requires \"${collection.slug}\" to already define the nested docs breadcrumbs field \"${breadcrumbsFieldSlug}\". Register @payloadcms/plugin-nested-docs before payload-nested-docs-page-tree.`,\r\n )\r\n }\r\n\r\n const existingListView = collection.admin?.components?.views?.list?.Component\r\n\r\n if (existingListView && existingListView !== PAGE_TREE_LIST_VIEW_PATH) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree cannot own the \"${collection.slug}\" list view because the collection already defines a custom admin.components.views.list.Component.`,\r\n )\r\n }\r\n\r\n const existingMoveEndpoint = getCollectionEndpoints(collection).find(\r\n (endpoint) => endpoint.path === '/:id/move',\r\n )\r\n\r\n if (existingMoveEndpoint) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree cannot add the move endpoint to \"${collection.slug}\" because the collection already defines POST /:id/move.`,\r\n )\r\n }\r\n}\r\n\r\nfunction buildCollectionCustom(args: {\n badges: NestedDocsPageTreePluginCollectionCustom['badges']\n breadcrumbsFieldSlug: string\n defaultLimit: number\n hideBreadcrumbs: boolean\n homeIndicator: NestedDocsPageTreePluginCollectionCustom['homeIndicator']\n parentFieldSlug: string\n}): NestedDocsPageTreePluginCollectionCustom {\n const {\n badges,\n breadcrumbsFieldSlug,\n defaultLimit,\n hideBreadcrumbs,\n homeIndicator,\n parentFieldSlug,\n } = args\n\n return {\n badges,\n breadcrumbsFieldSlug,\n defaultLimit,\n hideBreadcrumbs,\n homeIndicator,\n parentFieldSlug,\n }\n}\n\nfunction getHomeIndicatorCollectionSlugs(\n homeIndicator: NestedDocsPageTreePluginConfig['homeIndicator'],\n): Set<string> {\n if (homeIndicator === false) {\n return new Set()\n }\n\n return new Set(homeIndicator?.collections ?? DEFAULT_HOME_INDICATOR_COLLECTIONS)\n}\n\r\nexport type {\r\n NestedDocsPageTreePluginBadgeConfig,\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n NestedDocsPageTreePluginConfig,\n NestedDocsPageTreePluginHomeIndicatorConfig,\n} from './types.js'\n\r\nexport const nestedDocsPageTreePlugin =\r\n (pluginOptions: NestedDocsPageTreePluginConfig) =>\r\n (config: Config): Config => {\r\n if (!pluginOptions.collections?.length) {\r\n throw new Error('payload-nested-docs-page-tree requires at least one collection slug.')\r\n }\r\n\r\n if (pluginOptions.disabled) {\r\n return config\r\n }\r\n\r\n const breadcrumbsFieldSlug =\r\n pluginOptions.breadcrumbsFieldSlug ?? DEFAULT_BREADCRUMBS_FIELD_SLUG\r\n const defaultLimit = pluginOptions.defaultLimit ?? DEFAULT_LIMIT\r\n const hideBreadcrumbs = pluginOptions.hideBreadcrumbs ?? true\n const parentFieldSlug = pluginOptions.parentFieldSlug ?? DEFAULT_PARENT_FIELD_SLUG\n const badges = normalizeNestedDocsPageTreePluginBadgeConfig(pluginOptions.badges)\n const homeIndicatorCollectionSlugs = getHomeIndicatorCollectionSlugs(\n pluginOptions.homeIndicator,\n )\n const targetedCollectionSlugs = new Set<string>(pluginOptions.collections)\n\r\n if (!config.collections?.length) {\r\n throw new Error('payload-nested-docs-page-tree could not find any collections to patch.')\r\n }\r\n\r\n const foundCollectionSlugs = new Set<string>()\r\n const nextCollections = config.collections.map((collection) => {\r\n if (!targetedCollectionSlugs.has(collection.slug)) {\r\n return collection\r\n }\r\n\r\n foundCollectionSlugs.add(collection.slug)\r\n validateTargetCollection({\r\n breadcrumbsFieldSlug,\r\n collection,\r\n parentFieldSlug,\r\n })\r\n\r\n return {\r\n ...collection,\r\n admin: {\r\n ...(collection.admin ?? {}),\r\n components: {\r\n ...(collection.admin?.components ?? {}),\r\n views: {\r\n ...(collection.admin?.components?.views ?? {}),\r\n list: {\r\n ...(collection.admin?.components?.views?.list ?? {}),\r\n Component: PAGE_TREE_LIST_VIEW_PATH,\r\n },\r\n },\r\n },\r\n pagination: {\r\n ...(collection.admin?.pagination ?? {}),\r\n defaultLimit:\r\n collection.admin?.pagination?.defaultLimit === undefined\r\n ? defaultLimit\r\n : collection.admin.pagination.defaultLimit,\r\n },\r\n },\r\n custom: {\r\n ...(collection.custom ?? {}),\r\n [nestedDocsPageTreePluginCustomKey]: buildCollectionCustom({\n badges,\n breadcrumbsFieldSlug,\n defaultLimit,\n hideBreadcrumbs,\n homeIndicator: {\n enabled: homeIndicatorCollectionSlugs.has(collection.slug),\n },\n parentFieldSlug,\n }),\n },\n endpoints: [\r\n ...getCollectionEndpoints(collection),\r\n createMovePageEndpoint({\r\n collectionSlug: collection.slug,\r\n parentFieldSlug,\r\n }),\r\n ],\r\n fields: collection.fields.map((field) =>\r\n patchBreadcrumbField({\r\n breadcrumbsFieldSlug,\r\n field,\r\n hideBreadcrumbs,\r\n }),\r\n ),\r\n }\r\n })\r\n\r\n const missingCollections = pluginOptions.collections.filter(\r\n (collectionSlug) => !foundCollectionSlugs.has(collectionSlug),\r\n )\r\n\r\n if (missingCollections.length > 0) {\r\n throw new Error(\r\n `payload-nested-docs-page-tree could not find the following collections: ${missingCollections.join(', ')}`,\r\n )\r\n }\r\n\r\n return {\r\n ...config,\r\n collections: nextCollections as CollectionConfig[],\r\n }\r\n }\r\n"],"names":["createMovePageEndpoint","nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","DEFAULT_BREADCRUMBS_FIELD_SLUG","DEFAULT_HOME_INDICATOR_COLLECTIONS","DEFAULT_LIMIT","DEFAULT_PARENT_FIELD_SLUG","PAGE_TREE_LIST_VIEW_PATH","getTopLevelField","collection","fieldName","fields","find","field","name","getCollectionEndpoints","Array","isArray","endpoints","patchBreadcrumbField","args","breadcrumbsFieldSlug","hideBreadcrumbs","admin","hidden","validateTargetCollection","parentFieldSlug","useAsTitle","includes","Error","slug","existingListView","components","views","list","Component","existingMoveEndpoint","endpoint","path","buildCollectionCustom","badges","defaultLimit","homeIndicator","getHomeIndicatorCollectionSlugs","Set","collections","nestedDocsPageTreePlugin","pluginOptions","config","length","disabled","homeIndicatorCollectionSlugs","targetedCollectionSlugs","foundCollectionSlugs","nextCollections","map","has","add","pagination","undefined","custom","enabled","collectionSlug","missingCollections","filter","join"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -10,6 +10,12 @@ export type NestedDocsPageTreePluginResolvedBadgeConfig = {
10
10
  colors: NestedDocsPageTreePluginBadgeMap;
11
11
  labels: NestedDocsPageTreePluginBadgeMap;
12
12
  };
13
+ export type NestedDocsPageTreePluginHomeIndicatorConfig = false | {
14
+ collections?: CollectionSlug[];
15
+ };
16
+ export type NestedDocsPageTreePluginResolvedHomeIndicatorConfig = {
17
+ enabled: boolean;
18
+ };
13
19
  export type NestedDocsPageTreePluginConfig = {
14
20
  badges?: NestedDocsPageTreePluginBadgeConfig;
15
21
  breadcrumbsFieldSlug?: string;
@@ -17,6 +23,7 @@ export type NestedDocsPageTreePluginConfig = {
17
23
  defaultLimit?: number;
18
24
  disabled?: boolean;
19
25
  hideBreadcrumbs?: boolean;
26
+ homeIndicator?: NestedDocsPageTreePluginHomeIndicatorConfig;
20
27
  parentFieldSlug?: string;
21
28
  };
22
29
  export type NestedDocsPageTreePluginCollectionCustom = {
@@ -24,6 +31,7 @@ export type NestedDocsPageTreePluginCollectionCustom = {
24
31
  breadcrumbsFieldSlug: string;
25
32
  defaultLimit: number;
26
33
  hideBreadcrumbs: boolean;
34
+ homeIndicator: NestedDocsPageTreePluginResolvedHomeIndicatorConfig;
27
35
  parentFieldSlug: string;
28
36
  };
29
37
  export type PageTreeSourceDoc = Record<string, unknown> & {
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug } from 'payload'\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}\n\nexport type NestedDocsPageTreePluginResolvedBadgeConfig = {\n colors: NestedDocsPageTreePluginBadgeMap\n labels: NestedDocsPageTreePluginBadgeMap\n}\n\nexport type NestedDocsPageTreePluginConfig = {\n badges?: NestedDocsPageTreePluginBadgeConfig\n breadcrumbsFieldSlug?: string\n collections: CollectionSlug[]\n defaultLimit?: number\n disabled?: boolean\r\n hideBreadcrumbs?: boolean\r\n parentFieldSlug?: string\n}\n\nexport type NestedDocsPageTreePluginCollectionCustom = {\n badges: NestedDocsPageTreePluginResolvedBadgeConfig\n breadcrumbsFieldSlug: string\n defaultLimit: number\n hideBreadcrumbs: boolean\n parentFieldSlug: string\r\n}\r\n\r\nexport type PageTreeSourceDoc = Record<string, unknown> & {\n _displayStatus?: null | string\n _status?: null | string\n id?: number | string\n slug?: null | string\n}\n\nexport const nestedDocsPageTreePluginCustomKey = 'nestedDocsPageTreePlugin'\n"],"names":["nestedDocsPageTreePluginBadgeStatuses","nestedDocsPageTreePluginCustomKey"],"mappings":"AAEA,OAAO,MAAMA,wCAAwC;IAAC;IAAa;IAAW;CAAQ,CAAS;AA4C/F,OAAO,MAAMC,oCAAoC,2BAA0B"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug } from 'payload'\r\n\r\nexport const nestedDocsPageTreePluginBadgeStatuses = ['published', 'changed', 'draft'] as const\r\n\r\nexport type NestedDocsPageTreePluginBadgeStatus =\r\n (typeof nestedDocsPageTreePluginBadgeStatuses)[number]\r\n\r\nexport type NestedDocsPageTreePluginBadgeMap = Partial<\r\n Record<NestedDocsPageTreePluginBadgeStatus, string>\r\n>\r\n\r\nexport type NestedDocsPageTreePluginBadgeConfig = {\r\n colors?: NestedDocsPageTreePluginBadgeMap\r\n labels?: NestedDocsPageTreePluginBadgeMap\r\n}\r\n\r\nexport type NestedDocsPageTreePluginResolvedBadgeConfig = {\n colors: NestedDocsPageTreePluginBadgeMap\n labels: NestedDocsPageTreePluginBadgeMap\n}\n\nexport type NestedDocsPageTreePluginHomeIndicatorConfig =\n | false\n | {\n collections?: CollectionSlug[]\n }\n\nexport type NestedDocsPageTreePluginResolvedHomeIndicatorConfig = {\n enabled: boolean\n}\n\nexport type NestedDocsPageTreePluginConfig = {\n badges?: NestedDocsPageTreePluginBadgeConfig\n breadcrumbsFieldSlug?: string\n collections: CollectionSlug[]\n defaultLimit?: number\n disabled?: boolean\n hideBreadcrumbs?: boolean\n homeIndicator?: NestedDocsPageTreePluginHomeIndicatorConfig\n parentFieldSlug?: string\n}\n\nexport type NestedDocsPageTreePluginCollectionCustom = {\n badges: NestedDocsPageTreePluginResolvedBadgeConfig\n breadcrumbsFieldSlug: string\n defaultLimit: number\n hideBreadcrumbs: boolean\n homeIndicator: NestedDocsPageTreePluginResolvedHomeIndicatorConfig\n parentFieldSlug: string\n}\n\r\nexport type PageTreeSourceDoc = Record<string, unknown> & {\r\n _displayStatus?: null | string\r\n _status?: null | string\r\n id?: number | string\r\n slug?: null | string\r\n}\r\n\r\nexport const nestedDocsPageTreePluginCustomKey = 'nestedDocsPageTreePlugin'\r\n"],"names":["nestedDocsPageTreePluginBadgeStatuses","nestedDocsPageTreePluginCustomKey"],"mappings":"AAEA,OAAO,MAAMA,wCAAwC;IAAC;IAAa;IAAW;CAAQ,CAAS;AAwD/F,OAAO,MAAMC,oCAAoC,2BAA0B"}
@@ -6,7 +6,7 @@ export function getCollectionPageTreeConfig(collection) {
6
6
  return null;
7
7
  }
8
8
  const config = value;
9
- if (typeof config.breadcrumbsFieldSlug !== 'string' || typeof config.defaultLimit !== 'number' || typeof config.hideBreadcrumbs !== 'boolean' || typeof config.parentFieldSlug !== 'string') {
9
+ if (typeof config.breadcrumbsFieldSlug !== 'string' || typeof config.defaultLimit !== 'number' || typeof config.hideBreadcrumbs !== 'boolean' || !config.homeIndicator || typeof config.homeIndicator !== 'object' || Array.isArray(config.homeIndicator) || typeof config.homeIndicator.enabled !== 'boolean' || typeof config.parentFieldSlug !== 'string') {
10
10
  return null;
11
11
  }
12
12
  return {
@@ -14,6 +14,9 @@ export function getCollectionPageTreeConfig(collection) {
14
14
  breadcrumbsFieldSlug: config.breadcrumbsFieldSlug,
15
15
  defaultLimit: config.defaultLimit,
16
16
  hideBreadcrumbs: config.hideBreadcrumbs,
17
+ homeIndicator: {
18
+ enabled: config.homeIndicator.enabled
19
+ },
17
20
  parentFieldSlug: config.parentFieldSlug
18
21
  };
19
22
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/pageTreeConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { NestedDocsPageTreePluginCollectionCustom } from '../types.js'\nimport { nestedDocsPageTreePluginCustomKey } from '../types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './badgeConfig.js'\n\nexport function getCollectionPageTreeConfig(\n collection: Pick<CollectionConfig, 'custom'>,\n): null | NestedDocsPageTreePluginCollectionCustom {\n const value = collection.custom?.[nestedDocsPageTreePluginCustomKey]\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const config = value as Partial<NestedDocsPageTreePluginCollectionCustom>\n\n if (\n typeof config.breadcrumbsFieldSlug !== 'string' ||\n typeof config.defaultLimit !== 'number' ||\n typeof config.hideBreadcrumbs !== 'boolean' ||\n typeof config.parentFieldSlug !== 'string'\n ) {\n return null\n }\n\n return {\n badges: normalizeNestedDocsPageTreePluginBadgeConfig(config.badges),\n breadcrumbsFieldSlug: config.breadcrumbsFieldSlug,\n defaultLimit: config.defaultLimit,\n hideBreadcrumbs: config.hideBreadcrumbs,\n parentFieldSlug: config.parentFieldSlug,\n }\n}\n"],"names":["nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","getCollectionPageTreeConfig","collection","value","custom","Array","isArray","config","breadcrumbsFieldSlug","defaultLimit","hideBreadcrumbs","parentFieldSlug","badges"],"mappings":"AAGA,SAASA,iCAAiC,QAAQ,cAAa;AAC/D,SAASC,4CAA4C,QAAQ,mBAAkB;AAE/E,OAAO,SAASC,4BACdC,UAA4C;IAE5C,MAAMC,QAAQD,WAAWE,MAAM,EAAE,CAACL,kCAAkC;IAEpE,IAAI,CAACI,SAAS,OAAOA,UAAU,YAAYE,MAAMC,OAAO,CAACH,QAAQ;QAC/D,OAAO;IACT;IAEA,MAAMI,SAASJ;IAEf,IACE,OAAOI,OAAOC,oBAAoB,KAAK,YACvC,OAAOD,OAAOE,YAAY,KAAK,YAC/B,OAAOF,OAAOG,eAAe,KAAK,aAClC,OAAOH,OAAOI,eAAe,KAAK,UAClC;QACA,OAAO;IACT;IAEA,OAAO;QACLC,QAAQZ,6CAA6CO,OAAOK,MAAM;QAClEJ,sBAAsBD,OAAOC,oBAAoB;QACjDC,cAAcF,OAAOE,YAAY;QACjCC,iBAAiBH,OAAOG,eAAe;QACvCC,iBAAiBJ,OAAOI,eAAe;IACzC;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/pageTreeConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\r\n\r\nimport type { NestedDocsPageTreePluginCollectionCustom } from '../types.js'\r\nimport { nestedDocsPageTreePluginCustomKey } from '../types.js'\r\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './badgeConfig.js'\r\n\r\nexport function getCollectionPageTreeConfig(\r\n collection: Pick<CollectionConfig, 'custom'>,\r\n): null | NestedDocsPageTreePluginCollectionCustom {\r\n const value = collection.custom?.[nestedDocsPageTreePluginCustomKey]\r\n\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\r\n return null\r\n }\r\n\r\n const config = value as Partial<NestedDocsPageTreePluginCollectionCustom>\r\n\r\n if (\r\n typeof config.breadcrumbsFieldSlug !== 'string' ||\n typeof config.defaultLimit !== 'number' ||\n typeof config.hideBreadcrumbs !== 'boolean' ||\n !config.homeIndicator ||\n typeof config.homeIndicator !== 'object' ||\n Array.isArray(config.homeIndicator) ||\n typeof config.homeIndicator.enabled !== 'boolean' ||\n typeof config.parentFieldSlug !== 'string'\n ) {\n return null\n }\n\r\n return {\r\n badges: normalizeNestedDocsPageTreePluginBadgeConfig(config.badges),\r\n breadcrumbsFieldSlug: config.breadcrumbsFieldSlug,\n defaultLimit: config.defaultLimit,\n hideBreadcrumbs: config.hideBreadcrumbs,\n homeIndicator: {\n enabled: config.homeIndicator.enabled,\n },\n parentFieldSlug: config.parentFieldSlug,\n }\n}\n"],"names":["nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","getCollectionPageTreeConfig","collection","value","custom","Array","isArray","config","breadcrumbsFieldSlug","defaultLimit","hideBreadcrumbs","homeIndicator","enabled","parentFieldSlug","badges"],"mappings":"AAGA,SAASA,iCAAiC,QAAQ,cAAa;AAC/D,SAASC,4CAA4C,QAAQ,mBAAkB;AAE/E,OAAO,SAASC,4BACdC,UAA4C;IAE5C,MAAMC,QAAQD,WAAWE,MAAM,EAAE,CAACL,kCAAkC;IAEpE,IAAI,CAACI,SAAS,OAAOA,UAAU,YAAYE,MAAMC,OAAO,CAACH,QAAQ;QAC/D,OAAO;IACT;IAEA,MAAMI,SAASJ;IAEf,IACE,OAAOI,OAAOC,oBAAoB,KAAK,YACvC,OAAOD,OAAOE,YAAY,KAAK,YAC/B,OAAOF,OAAOG,eAAe,KAAK,aAClC,CAACH,OAAOI,aAAa,IACrB,OAAOJ,OAAOI,aAAa,KAAK,YAChCN,MAAMC,OAAO,CAACC,OAAOI,aAAa,KAClC,OAAOJ,OAAOI,aAAa,CAACC,OAAO,KAAK,aACxC,OAAOL,OAAOM,eAAe,KAAK,UAClC;QACA,OAAO;IACT;IAEA,OAAO;QACLC,QAAQd,6CAA6CO,OAAOO,MAAM;QAClEN,sBAAsBD,OAAOC,oBAAoB;QACjDC,cAAcF,OAAOE,YAAY;QACjCC,iBAAiBH,OAAOG,eAAe;QACvCC,eAAe;YACbC,SAASL,OAAOI,aAAa,CAACC,OAAO;QACvC;QACAC,iBAAiBN,OAAOM,eAAe;IACzC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-nested-docs-page-tree",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Page tree plugin for Payload nested docs collections",
5
5
  "license": "MIT",
6
6
  "author": "WLF Studios",