payload-nested-docs-page-tree 1.4.1 → 1.4.3

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
@@ -27,6 +27,8 @@ pnpm add payload-nested-docs-page-tree
27
27
  - a nested docs breadcrumbs field
28
28
  - a top-level `admin.useAsTitle` field
29
29
 
30
+ These fields may live inside presentational containers — tabs, rows, collapsibles, and unnamed groups — because Payload still stores them at the top level of the document. Fields inside a **named** tab or **named** group are nested in the data and are not supported.
31
+
30
32
  Add `nestedDocsPageTreePlugin(...)` right after `nestedDocsPlugin(...)`:
31
33
 
32
34
  ```ts
@@ -331,6 +333,13 @@ pnpm generate:types
331
333
  pnpm generate:importmap
332
334
  ```
333
335
 
336
+ Open [http://localhost:3000/admin](http://localhost:3000/admin) and sign in with:
337
+
338
+ - email: `admin@email.com`
339
+ - password: `password`
340
+
341
+ The dev app creates this user automatically on startup. After signing in, use the **seed the database** button on the dashboard to add the sample pages.
342
+
334
343
  Plugin source is in `src/`. The internal test app is in `dev/`.
335
344
 
336
345
  For checks:
@@ -1,10 +1,11 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { DndContext, DragOverlay, PointerSensor, useDroppable, useSensor, useSensors } from '@dnd-kit/core';
4
4
  import { arrayMove, SortableContext, useSortable } from '@dnd-kit/sortable';
5
- import { DefaultListView, ListQueryProvider, Pill, SelectAll, SelectRow, SortHeader, toast, useConfig, useLocale, usePreferences, useTranslation } from '@payloadcms/ui';
5
+ import { DefaultListView, ListQueryProvider, Pill, SelectAll, SelectRow, SortHeader, toast, useConfig, useLocale, usePreferences, useTranslation, useWindowInfo } from '@payloadcms/ui';
6
6
  import { useRouter, useSearchParams } from 'next/navigation';
7
7
  import React from 'react';
8
+ import { createPortal } from 'react-dom';
8
9
  import { buildInsertDropTargets, getDropTargetParentDoc } from '../utilities/dropTargets.js';
9
10
  import { CANCEL_DRAG_MESSAGE, getDropValidation } from '../utilities/moveValidation.js';
10
11
  import { buildDocSlugPath, buildPageTreeDocs, buildProspectiveDocSlugPath, getDocDisplayLabel, getVisibleTreeDocs } from '../utilities/pageTree.js';
@@ -418,7 +419,12 @@ function renderStatusBadge(args) {
418
419
  }, doc.__pageTreeID ?? index);
419
420
  }
420
421
  function ParentMoveToggle({ collectionSlug, enabled, onToggle }) {
421
- return /*#__PURE__*/ _jsx(Pill, {
422
+ const { breakpoints: { s: smallBreak } } = useWindowInfo();
423
+ const [mobileActions, setMobileActions] = React.useState(null);
424
+ const setMobileMount = React.useCallback((node)=>{
425
+ setMobileActions(node?.closest('.collection-list')?.querySelector('.search-bar__actions') ?? null);
426
+ }, []);
427
+ const toggle = /*#__PURE__*/ _jsx(Pill, {
422
428
  "aria-checked": enabled,
423
429
  "aria-label": `${enabled ? 'Hide' : 'Show'} edit hierarchy handles`,
424
430
  className: "pages-hierarchy-parent-move-toggle",
@@ -428,6 +434,18 @@ function ParentMoveToggle({ collectionSlug, enabled, onToggle }) {
428
434
  size: "small",
429
435
  children: "Edit Hierarchy"
430
436
  });
437
+ if (smallBreak) {
438
+ return /*#__PURE__*/ _jsxs(_Fragment, {
439
+ children: [
440
+ /*#__PURE__*/ _jsx("span", {
441
+ hidden: true,
442
+ ref: setMobileMount
443
+ }),
444
+ mobileActions ? /*#__PURE__*/ createPortal(toggle, mobileActions) : null
445
+ ]
446
+ });
447
+ }
448
+ return toggle;
431
449
  }
432
450
  function buildTableColumns(args) {
433
451
  const { badgeConfig, columnState, docs, enableRowSelections, homeIndicatorEnabled, orderableFieldName, parentFieldSlug, t, useAsTitle } = args;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PageTreeListView.client.tsx"],"sourcesContent":["'use client'\n\nimport type { Column, ListQuery, ListViewClientProps, PaginatedDocs } from 'payload'\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n PointerSensor,\n useDroppable,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n type SortingStrategy,\n useSortable,\n} from '@dnd-kit/sortable'\nimport {\n DefaultListView,\n ListQueryProvider,\n Pill,\n SelectAll,\n SelectRow,\n SortHeader,\n toast,\n useConfig,\n useLocale,\n usePreferences,\n useTranslation,\n} from '@payloadcms/ui'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport React from 'react'\n\nimport type { NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeSourceDoc } from '../types.js'\n\nimport {\n buildInsertDropTargets,\n getDropTargetParentDoc,\n type PageTreeDropTarget,\n} from '../utilities/dropTargets.js'\nimport {\n CANCEL_DRAG_MESSAGE,\n getDropValidation,\n type PageTreeDropValidation,\n} from '../utilities/moveValidation.js'\nimport {\n buildDocSlugPath,\n buildPageTreeDocs,\n buildProspectiveDocSlugPath,\n getDocDisplayLabel,\n getVisibleTreeDocs,\n type PageTreeDoc,\n} from '../utilities/pageTree.js'\nimport { pageTreeCollisionDetectionStrategy } from '../utilities/pageTreeCollision.js'\nimport {\n getPageTreeBadgeColor,\n getPageTreeBadgeLabel,\n getPageTreeDisplayStatus,\n type PageTreeDisplayStatus,\n} from '../utilities/status.js'\nimport { PageTreeProvider, PageTreeRowDndProvider } from './PageTreeContext.js'\nimport styles from './PageTreeListView.module.css'\nimport { PageTreeTitleCell } from './PageTreeTitleCell.js'\n\ntype PageTreeListViewClientProps = {\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\n} & Omit<ListViewClientProps, 'columnState' | 'Table'>\n\ntype SelectableRowData = React.ComponentProps<typeof SelectRow>['rowData']\ntype PageTreeDragType = 'move' | 'order'\n\ntype PageTreeDragData = {\n dragType?: PageTreeDragType\n parentID?: null | string\n rowID?: string\n}\n\ntype PageTreeSortableTransform = ReturnType<typeof useSortable>['transform']\n\ntype PageTreeReorderRequestBody = {\n docsToMove: string[]\n frontendOrder?: PageTreeReorderFrontendOrder\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: null | string\n }\n}\n\ntype PageTreeReorderFrontendOrder = {\n activeSlug: null | string\n after: PageTreeReorderFrontendOrderEntry[]\n before: PageTreeReorderFrontendOrderEntry[]\n moveFromIndex: number\n moveToIndex: number\n newAfterRowSlug: null | string\n newBeforeRowSlug: null | string\n sort: null | string\n targetSlug: null | string\n}\n\ntype PageTreeReorderFrontendOrderEntry = {\n index: number\n orderKey: null | string\n slug: null | string\n}\n\ntype PageTreeIndexRange = {\n end: number\n start: number\n}\n\ntype PageTreeRangeRect = {\n bottom: number\n height: number\n top: number\n}\n\nconst SILENT_MOVE_MESSAGES = new Set([CANCEL_DRAG_MESSAGE])\nconst ALREADY_ROOT_MESSAGE = 'This page is already in root level.'\n\nfunction getParentMovePreferenceKey(collectionSlug: string): string {\n return `payload-nested-docs-page-tree:${collectionSlug}:parentMoveHandle`\n}\n\nfunction getRowDropID(rowID: string): string {\n return `page-drop:${rowID}`\n}\n\nfunction getSortableRowID(rowID: string): string {\n return `page-sort:${rowID}`\n}\n\nfunction getDiagnosticString(value: unknown): null | string {\n return typeof value === 'string' && value.length > 0 ? value : null\n}\n\nfunction getPageTreeDragData(value: unknown): PageTreeDragData {\n if (!value || typeof value !== 'object') {\n return {}\n }\n\n const data = value as Record<string, unknown>\n const dragType = data.dragType === 'move' || data.dragType === 'order' ? data.dragType : undefined\n const parentID =\n data.parentID === null || typeof data.parentID === 'string' ? data.parentID : undefined\n const rowID = typeof data.rowID === 'string' ? data.rowID : undefined\n\n return {\n dragType,\n parentID,\n rowID,\n }\n}\n\nfunction getSortableTransform(transform: PageTreeSortableTransform): string | undefined {\n if (!transform) {\n return undefined\n }\n\n const scaleX = transform.scaleX ?? 1\n const scaleY = transform.scaleY ?? 1\n\n return `translate3d(${transform.x}px, ${transform.y}px, 0) scaleX(${scaleX}) scaleY(${scaleY})`\n}\n\nfunction getVisibleSubtreeIndexRange(docs: PageTreeDoc[], rootIndex: number): null | PageTreeIndexRange {\n const rootDoc = docs[rootIndex]\n\n if (!rootDoc) {\n return null\n }\n\n let end = rootIndex\n\n for (let index = rootIndex + 1; index < docs.length; index += 1) {\n if (!docs[index]?.__pageTreeAncestorIDs.includes(rootDoc.__pageTreeID)) {\n break\n }\n\n end = index\n }\n\n return {\n end,\n start: rootIndex,\n }\n}\n\nfunction getRangeRect(args: {\n activeNodeRect: Parameters<SortingStrategy>[0]['activeNodeRect']\n activeRange: PageTreeIndexRange\n range: PageTreeIndexRange\n rects: Parameters<SortingStrategy>[0]['rects']\n}): null | PageTreeRangeRect {\n const { activeNodeRect, activeRange, range, rects } = args\n const firstRect =\n rects[range.start] ?? (range.start === activeRange.start ? activeNodeRect : undefined)\n const lastRect = rects[range.end] ?? (range.end === activeRange.end ? activeNodeRect : undefined)\n\n if (!firstRect || !lastRect) {\n return null\n }\n\n return {\n bottom: lastRect.top + lastRect.height,\n height: lastRect.top + lastRect.height - firstRect.top,\n top: firstRect.top,\n }\n}\n\nfunction isIndexInRange(index: number, range: PageTreeIndexRange): boolean {\n return index >= range.start && index <= range.end\n}\n\nfunction buildPageTreeSortingStrategy(docs: PageTreeDoc[]): SortingStrategy {\n return ({ activeIndex, activeNodeRect, index, overIndex, rects }) => {\n const activeRange = getVisibleSubtreeIndexRange(docs, activeIndex)\n const overRange = getVisibleSubtreeIndexRange(docs, overIndex)\n\n if (!activeRange || !overRange || activeRange.start === overRange.start) {\n return null\n }\n\n const activeRect = getRangeRect({\n activeNodeRect,\n activeRange,\n range: activeRange,\n rects,\n })\n const overRect = getRangeRect({\n activeNodeRect,\n activeRange,\n range: overRange,\n rects,\n })\n\n if (!activeRect || !overRect) {\n return null\n }\n\n if (isIndexInRange(index, activeRange)) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y:\n activeRange.start < overRange.start\n ? overRect.bottom - activeRect.bottom\n : overRect.top - activeRect.top,\n }\n }\n\n if (activeRange.start < overRange.start && index > activeRange.end && index <= overRange.end) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: -activeRect.height,\n }\n }\n\n if (activeRange.start > overRange.start && index >= overRange.start && index < activeRange.start) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: activeRect.height,\n }\n }\n\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: 0,\n }\n }\n}\n\nfunction buildPaginatedData(\n docs: PageTreeDoc[],\n limit: number,\n requestedPage: number,\n): PaginatedDocs {\n const totalDocs = docs.length\n const totalPages = totalDocs > 0 ? Math.max(1, Math.ceil(totalDocs / limit)) : 1\n const page = Math.min(Math.max(requestedPage, 1), totalPages)\n const startIndex = (page - 1) * limit\n const pageDocs = docs.slice(startIndex, startIndex + limit)\n\n return {\n docs: pageDocs,\n hasNextPage: page < totalPages,\n hasPrevPage: page > 1,\n limit,\n nextPage: page < totalPages ? page + 1 : null,\n page,\n pagingCounter: totalDocs === 0 ? 0 : startIndex + 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) {\n const sortValues = value.filter((entry) => typeof entry === 'string' && entry.length > 0)\n return sortValues.length > 0 ? sortValues.join(',') : undefined\n }\n\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction normalizePositiveInt(value: null | string, fallback: number): number {\n if (typeof value !== 'string') {\n return fallback\n }\n\n const parsedValue = Number.parseInt(value, 10)\n return Number.isNaN(parsedValue) || parsedValue <= 0 ? fallback : parsedValue\n}\n\nfunction isOrderableSortActive(args: { orderableFieldName?: string; sort?: string }): boolean {\n const { orderableFieldName, sort } = args\n\n return Boolean(\n orderableFieldName && (sort === orderableFieldName || sort === `-${orderableFieldName}`),\n )\n}\n\nfunction ensureUseAsTitleColumn(columnState: Column[], useAsTitle: string): Column[] {\n return columnState.map((column) =>\n column.accessor === useAsTitle\n ? {\n ...column,\n active: true,\n }\n : column,\n )\n}\n\nfunction sliceColumnState(\n columnState: Column[],\n docs: PageTreeDoc[],\n renderedCellIndexByDocID: ReadonlyMap<string, number>,\n): Column[] {\n return columnState.map((column) => ({\n ...column,\n renderedCells: docs.map((doc) => {\n const renderedCellIndex =\n renderedCellIndexByDocID.get(doc.__pageTreeID) ?? doc.__pageTreeOrderIndex\n\n return column.renderedCells?.[renderedCellIndex] ?? null\n }),\n }))\n}\n\nfunction getSelectableRowData(doc: PageTreeDoc): SelectableRowData {\n const record = doc as Record<string, unknown>\n\n return {\n id: String(doc.id ?? doc.__pageTreeID),\n _isLocked: Boolean(record._isLocked),\n _userEditing: record._userEditing as SelectableRowData['_userEditing'],\n }\n}\n\nfunction shouldSilenceMoveMessage(message?: string): boolean {\n return typeof message === 'string' && SILENT_MOVE_MESSAGES.has(message)\n}\n\nfunction getVisibleSubtreeRowIDs(docs: PageTreeDoc[], rowID: string): string[] {\n const rootIndex = docs.findIndex((doc) => doc.__pageTreeID === rowID)\n\n if (rootIndex < 0) {\n return []\n }\n\n const rowIDs = [rowID]\n\n for (const doc of docs.slice(rootIndex + 1)) {\n if (!doc.__pageTreeAncestorIDs.includes(rowID)) {\n break\n }\n\n rowIDs.push(doc.__pageTreeID)\n }\n\n return rowIDs\n}\n\nfunction buildOptimisticOrderRowIDs(args: {\n activeRowID: string\n docs: PageTreeDoc[]\n targetRowID: string\n}): null | string[] {\n const { activeRowID, docs, targetRowID } = args\n\n if (activeRowID === targetRowID) {\n return null\n }\n\n const activeDoc = docs.find((doc) => doc.__pageTreeID === activeRowID)\n const targetDoc = docs.find((doc) => doc.__pageTreeID === targetRowID)\n\n if (!activeDoc || !targetDoc || activeDoc.__pageTreeParentID !== targetDoc.__pageTreeParentID) {\n return null\n }\n\n const activeBlockIDs = getVisibleSubtreeRowIDs(docs, activeRowID)\n const targetBlockIDs = getVisibleSubtreeRowIDs(docs, targetRowID)\n\n if (\n activeBlockIDs.length === 0 ||\n targetBlockIDs.length === 0 ||\n targetBlockIDs.includes(activeRowID)\n ) {\n return null\n }\n\n const currentRowIDs = docs.map((doc) => doc.__pageTreeID)\n\n if (activeBlockIDs.length === 1 && targetBlockIDs.length === 1) {\n const activeIndex = currentRowIDs.indexOf(activeRowID)\n const targetIndex = currentRowIDs.indexOf(targetRowID)\n\n return activeIndex < 0 || targetIndex < 0\n ? null\n : arrayMove(currentRowIDs, activeIndex, targetIndex)\n }\n\n const remainingRowIDs = currentRowIDs.filter((rowID) => !activeBlockIDs.includes(rowID))\n const activeIndex = currentRowIDs.indexOf(activeRowID)\n const targetIndex = currentRowIDs.indexOf(targetRowID)\n const targetAnchorID =\n activeIndex < targetIndex ? targetBlockIDs[targetBlockIDs.length - 1] : targetBlockIDs[0]\n\n if (!targetAnchorID) {\n return null\n }\n\n const targetAnchorIndex = remainingRowIDs.indexOf(targetAnchorID)\n\n if (targetAnchorIndex < 0) {\n return null\n }\n\n const insertIndex = activeIndex < targetIndex ? targetAnchorIndex + 1 : targetAnchorIndex\n\n return [\n ...remainingRowIDs.slice(0, insertIndex),\n ...activeBlockIDs,\n ...remainingRowIDs.slice(insertIndex),\n ]\n}\n\nfunction buildReorderRequestBody(args: {\n activeRowID: string\n docs: PageTreeDoc[]\n orderableFieldName?: string\n sort?: string\n targetRowID: string\n}): null | PageTreeReorderRequestBody {\n const { activeRowID, docs, orderableFieldName, sort, targetRowID } = args\n\n if (!orderableFieldName || (sort !== orderableFieldName && sort !== `-${orderableFieldName}`)) {\n return null\n }\n\n if (activeRowID === targetRowID) {\n return null\n }\n\n const activeDoc = docs.find((doc) => doc.__pageTreeID === activeRowID)\n const targetDoc = docs.find((doc) => doc.__pageTreeID === targetRowID)\n\n if (!activeDoc || !targetDoc || activeDoc.__pageTreeParentID !== targetDoc.__pageTreeParentID) {\n return null\n }\n\n const siblingDocs = docs.filter(\n (doc) => doc.__pageTreeParentID === activeDoc.__pageTreeParentID,\n )\n const moveFromIndex = siblingDocs.findIndex((doc) => doc.__pageTreeID === activeRowID)\n const moveToIndex = siblingDocs.findIndex((doc) => doc.__pageTreeID === targetRowID)\n\n if (moveFromIndex < 0 || moveToIndex < 0 || moveFromIndex === moveToIndex) {\n return null\n }\n\n const newBeforeRow =\n moveToIndex > moveFromIndex ? siblingDocs[moveToIndex] : siblingDocs[moveToIndex - 1]\n const newAfterRow =\n moveToIndex > moveFromIndex ? siblingDocs[moveToIndex + 1] : siblingDocs[moveToIndex]\n const target = newBeforeRow ?? newAfterRow\n\n if (!target) {\n return null\n }\n\n const getFrontendOrderEntry = (\n doc: PageTreeDoc,\n index: number,\n ): PageTreeReorderFrontendOrderEntry => {\n const orderKey = doc[orderableFieldName]\n\n return {\n slug: getDiagnosticString(doc.slug),\n index,\n orderKey: typeof orderKey === 'string' && orderKey.length > 0 ? orderKey : null,\n }\n }\n const siblingDocsAfter = [...siblingDocs]\n const [movedSiblingDoc] = siblingDocsAfter.splice(moveFromIndex, 1)\n\n if (!movedSiblingDoc) {\n return null\n }\n\n siblingDocsAfter.splice(moveToIndex, 0, movedSiblingDoc)\n\n const targetKey = target[orderableFieldName]\n const newKeyWillBe =\n (newBeforeRow && sort === orderableFieldName) ||\n (!newBeforeRow && sort === `-${orderableFieldName}`)\n ? 'greater'\n : 'less'\n\n return {\n docsToMove: [activeRowID],\n frontendOrder: {\n activeSlug: getDiagnosticString(activeDoc.slug),\n after: siblingDocsAfter.map(getFrontendOrderEntry),\n before: siblingDocs.map(getFrontendOrderEntry),\n moveFromIndex,\n moveToIndex,\n newAfterRowSlug: newAfterRow ? getDiagnosticString(newAfterRow.slug) : null,\n newBeforeRowSlug: newBeforeRow ? getDiagnosticString(newBeforeRow.slug) : null,\n sort: sort ?? null,\n targetSlug: getDiagnosticString(targetDoc.slug),\n },\n newKeyWillBe,\n orderableFieldName,\n target: {\n id: target.__pageTreeID,\n key: typeof targetKey === 'string' && targetKey.length > 0 ? targetKey : null,\n },\n }\n}\n\nfunction orderDocsByRowIDs(docs: PageTreeDoc[], orderRowIDs: null | string[]): PageTreeDoc[] {\n if (!orderRowIDs) {\n return docs\n }\n\n const docsByID = new Map(docs.map((doc) => [doc.__pageTreeID, doc]))\n const orderedDocs = orderRowIDs.flatMap((rowID) => {\n const doc = docsByID.get(rowID)\n\n return doc ? [doc] : []\n })\n\n return orderedDocs.length === docs.length ? orderedDocs : docs\n}\n\nfunction getDropTargetValidation(args: {\n activeDoc: PageTreeDoc\n docsByID: ReadonlyMap<string, PageTreeDoc>\n dropTarget: PageTreeDropTarget\n}): PageTreeDropValidation {\n const { activeDoc, docsByID, dropTarget } = args\n\n if (dropTarget.dropType === 'row') {\n return getDropValidation({\n activeDoc,\n targetDoc: docsByID.get(dropTarget.rowID) ?? undefined,\n })\n }\n\n if (dropTarget.parentID === null) {\n if (activeDoc.__pageTreeParentID === null) {\n return {\n isValid: false,\n message: ALREADY_ROOT_MESSAGE,\n parentID: null,\n }\n }\n\n return {\n isValid: true,\n parentID: null,\n }\n }\n\n const targetDoc = docsByID.get(dropTarget.parentID)\n\n if (!targetDoc) {\n return {\n isValid: false,\n message: 'Could not resolve drop target.',\n parentID: dropTarget.parentID,\n }\n }\n\n if (targetDoc.__pageTreeID === activeDoc.__pageTreeID) {\n return {\n isValid: false,\n message: CANCEL_DRAG_MESSAGE,\n parentID: targetDoc.__pageTreeID,\n }\n }\n\n if (targetDoc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID)) {\n return {\n isValid: false,\n message: 'A document cannot be moved under one of its descendants.',\n parentID: targetDoc.__pageTreeID,\n }\n }\n\n return {\n isValid: true,\n parentID: targetDoc.__pageTreeID,\n }\n}\n\nfunction getStatusClassName(\n status: PageTreeDisplayStatus,\n): 'changed' | 'draft' | 'published' | 'unknown' {\n if (status === 'changed' || status === 'draft' || status === 'published') {\n return status\n }\n\n return 'unknown'\n}\n\nfunction renderStatusBadge(args: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n doc: PageTreeDoc\n index: number\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\n}): React.ReactNode {\n const { badgeConfig, doc, index, t } = args\n const status = getPageTreeDisplayStatus(doc)\n const customColor = getPageTreeBadgeColor({\n badgeColors: badgeConfig.colors,\n status,\n })\n const statusClass = getStatusClassName(status)\n const style = customColor\n ? ({ '--page-tree-badge-base': customColor } as React.CSSProperties)\n : undefined\n\n return (\n <span\n className={[\n 'pages-hierarchy-status-badge',\n `pages-hierarchy-status-badge--${statusClass}`,\n ].join(' ')}\n data-custom-color={customColor ? 'true' : undefined}\n key={doc.__pageTreeID ?? index}\n style={style}\n >\n {getPageTreeBadgeLabel({\n badgeLabels: badgeConfig.labels,\n status,\n t,\n })}\n </span>\n )\n}\n\nfunction ParentMoveToggle({\n collectionSlug,\n enabled,\n onToggle,\n}: {\n collectionSlug: string\n enabled: boolean\n onToggle: () => void\n}) {\n return (\n <Pill\n aria-checked={enabled}\n aria-label={`${enabled ? 'Hide' : 'Show'} edit hierarchy handles`}\n className=\"pages-hierarchy-parent-move-toggle\"\n id={`pages-hierarchy-parent-move-toggle-${collectionSlug}`}\n onClick={onToggle}\n pillStyle={enabled ? 'dark' : 'light'}\n size=\"small\"\n >\n Edit Hierarchy\n </Pill>\n )\n}\n\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[] {\n const {\n badgeConfig,\n columnState,\n docs,\n enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t,\n useAsTitle,\n } = args\n const columnsToUse = columnState.map((column) => {\n if (column.accessor === useAsTitle) {\n return {\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 }\n }\n\n if (column.accessor === '_status') {\n return {\n ...column,\n renderedCells: docs.map((doc, index) =>\n renderStatusBadge({\n badgeConfig,\n doc,\n index,\n t,\n }),\n ),\n }\n }\n\n if (column.accessor === parentFieldSlug) {\n return {\n ...column,\n renderedCells: docs.map((doc, index) =>\n doc.__pageTreeParentID !== null ? (\n (column.renderedCells?.[index] ?? null)\n ) : (\n <span className=\"pages-hierarchy-empty-cell\" key={doc.__pageTreeID ?? index}>\n -\n </span>\n ),\n ),\n }\n }\n\n return column\n })\n\n if (enableRowSelections) {\n columnsToUse.unshift({\n accessor: '_select',\n active: true,\n field: { hidden: true } as Column['field'],\n Heading: <SelectAll />,\n renderedCells: docs.map((doc, index) => (\n <SelectRow key={doc.__pageTreeID ?? index} rowData={getSelectableRowData(doc)} />\n )),\n })\n }\n\n if (orderableFieldName) {\n const orderableColumn = {\n accessor: '_pageTreeOrderSort',\n active: true,\n field: { hidden: true } as Column['field'],\n Heading: <SortHeader />,\n renderedCells: docs.map((doc, index) => (\n <span\n aria-hidden=\"true\"\n className=\"pages-hierarchy-order-sort-spacer\"\n key={doc.__pageTreeID ?? index}\n />\n )),\n } satisfies Column\n const selectColumnIndex = columnsToUse.findIndex((column) => column.accessor === '_select')\n\n columnsToUse.splice(selectColumnIndex >= 0 ? selectColumnIndex + 1 : 0, 0, orderableColumn)\n }\n\n return columnsToUse\n}\n\nfunction HierarchyInsertRow({\n activeColumnsCount,\n activeDragRowID,\n activeDropTargetID,\n dropTarget,\n dropValidation,\n isMovePending,\n}: {\n activeColumnsCount: number\n activeDragRowID: null | string\n activeDropTargetID: null | string\n dropTarget: Extract<PageTreeDropTarget, { dropType: 'insert' }>\n dropValidation?: PageTreeDropValidation\n isMovePending: boolean\n}) {\n const { isOver, setNodeRef } = useDroppable({\n id: dropTarget.dropID,\n data: dropTarget,\n disabled: isMovePending,\n })\n const hasActiveDrag = Boolean(activeDragRowID)\n const showInsertLine = isOver && activeDropTargetID === dropTarget.dropID\n\n return (\n <tr\n className=\"pages-hierarchy-insert-row\"\n data-drag-over={showInsertLine ? 'true' : 'false'}\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\n data-page-tree-insert=\"true\"\n >\n {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}\n <td colSpan={activeColumnsCount}>\n <div\n className=\"pages-hierarchy-insert-row__target\"\n data-insert-depth={dropTarget.depth}\n ref={setNodeRef}\n />\n </td>\n </tr>\n )\n}\n\nfunction HierarchyTableRow({\n activeColumns,\n activeDragRowID,\n activeDragType,\n canReorderRows,\n doc,\n dropValidation,\n insertAfterDropID,\n insertBeforeDropID,\n isMovePending,\n rowIndex,\n titleCellAccessor,\n}: {\n activeColumns: Column[]\n activeDragRowID: null | string\n activeDragType: null | PageTreeDragType\n canReorderRows: boolean\n doc: PageTreeDoc\n dropValidation?: PageTreeDropValidation\n insertAfterDropID: null | string\n insertBeforeDropID: null | string\n isMovePending: boolean\n rowIndex: number\n titleCellAccessor: string\n}) {\n const { isOver, setNodeRef } = useDroppable({\n id: getRowDropID(doc.__pageTreeID),\n data: {\n dropType: 'row',\n insertAfterDropID,\n insertBeforeDropID,\n rowID: doc.__pageTreeID,\n } satisfies Extract<PageTreeDropTarget, { dropType: 'row' }>,\n disabled: isMovePending,\n })\n const sortable = useSortable({\n id: getSortableRowID(doc.__pageTreeID),\n data: {\n dragType: 'order',\n parentID: doc.__pageTreeParentID,\n rowID: doc.__pageTreeID,\n } satisfies PageTreeDragData,\n disabled: !canReorderRows || isMovePending || activeDragType === 'move',\n })\n const hasActiveMoveDrag = activeDragType === 'move' && Boolean(activeDragRowID)\n const isActiveDragRow = activeDragRowID === doc.__pageTreeID\n const setRowRef = React.useCallback(\n (element: HTMLTableRowElement | null) => {\n setNodeRef(element)\n sortable.setNodeRef(element)\n },\n [setNodeRef, sortable],\n )\n const rowDndValue = React.useMemo(\n () => ({\n isOrderDragging: sortable.isDragging,\n orderHandleAttributes: sortable.attributes,\n orderHandleListeners: sortable.listeners,\n orderHandleRef: sortable.setActivatorNodeRef,\n }),\n [sortable.attributes, sortable.isDragging, sortable.listeners, sortable.setActivatorNodeRef],\n )\n const sortableStyle = React.useMemo(\n () =>\n ({\n position: sortable.isDragging ? 'relative' : undefined,\n transform: getSortableTransform(sortable.transform),\n transition: activeDragType === 'order' ? sortable.transition : undefined,\n zIndex: sortable.isDragging ? 1 : undefined,\n }) as React.CSSProperties,\n [activeDragType, sortable.isDragging, sortable.transform, sortable.transition],\n )\n\n return (\n <tr\n className={`row-${rowIndex + 1}`}\n data-drag-over={activeDragType === 'move' && isOver ? 'true' : 'false'}\n data-drop-valid={hasActiveMoveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\n data-id={doc.id}\n data-is-drag-source={activeDragType === 'move' && isActiveDragRow ? 'true' : 'false'}\n data-is-order-drag-source={sortable.isDragging ? 'true' : 'false'}\n data-page-tree-row=\"true\"\n ref={setRowRef}\n style={sortableStyle}\n >\n <PageTreeRowDndProvider value={rowDndValue}>\n {activeColumns.map((column, columnIndex) => {\n const { accessor } = column\n\n return (\n <td\n className={`cell-${accessor.replace(/\\./g, '__')}`}\n data-page-tree-title-cell={accessor === titleCellAccessor ? 'true' : undefined}\n key={columnIndex}\n >\n {column.renderedCells?.[rowIndex] ?? null}\n </td>\n )\n })}\n </PageTreeRowDndProvider>\n </tr>\n )\n}\n\nfunction HierarchyTable({\n activeDragRowID,\n activeDragType,\n activeDropTarget,\n allDocsByID,\n canReorderRows,\n columns,\n data,\n isMovePending,\n titleCellAccessor,\n}: {\n activeDragRowID: null | string\n activeDragType: null | PageTreeDragType\n activeDropTarget: null | PageTreeDropTarget\n allDocsByID: ReadonlyMap<string, PageTreeDoc>\n canReorderRows: boolean\n columns: Column[]\n data: PageTreeDoc[]\n isMovePending: boolean\n titleCellAccessor: string\n}) {\n const activeColumns = React.useMemo(() => columns.filter((column) => column?.active), [columns])\n const sortableItems = React.useMemo(\n () => data.map((doc) => getSortableRowID(doc.__pageTreeID)),\n [data],\n )\n const sortingStrategy = React.useMemo(() => buildPageTreeSortingStrategy(data), [data])\n const insertDropTargets = React.useMemo(() => buildInsertDropTargets(data), [data])\n const insertDropTargetsByReferenceRowID = React.useMemo(\n () => new Map(insertDropTargets.map((dropTarget) => [dropTarget.referenceRowID, dropTarget])),\n [insertDropTargets],\n )\n const activeDropTargetID =\n activeDropTarget?.dropType === 'insert' ? activeDropTarget.dropID : null\n const activeDoc =\n activeDragType === 'move' && activeDragRowID ? (allDocsByID.get(activeDragRowID) ?? null) : null\n const rowDropValidationByID = React.useMemo(() => {\n if (!activeDoc) {\n return new Map<string, PageTreeDropValidation>()\n }\n\n return new Map(\n data.map((doc) => [\n doc.__pageTreeID,\n getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget: {\n dropType: 'row',\n insertAfterDropID: null,\n insertBeforeDropID: null,\n rowID: doc.__pageTreeID,\n },\n }),\n ]),\n )\n }, [activeDoc, allDocsByID, data])\n const insertDropValidationByID = React.useMemo(() => {\n if (!activeDoc) {\n return new Map<string, PageTreeDropValidation>()\n }\n\n return new Map(\n insertDropTargets.map((dropTarget) => [\n dropTarget.dropID,\n getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget,\n }),\n ]),\n )\n }, [activeDoc, allDocsByID, insertDropTargets])\n\n if (activeColumns.length === 0) {\n return <div>No columns selected</div>\n }\n\n return (\n <div\n className={[\n 'table-wrap pages-hierarchy-table',\n activeDoc ? 'pages-hierarchy-table--dragging' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"table table--appearance-default\">\n <table cellPadding=\"0\" cellSpacing=\"0\">\n <thead>\n <tr>\n {activeColumns.map((column, index) => (\n <th\n data-page-tree-title-cell={\n column.accessor === titleCellAccessor ? 'true' : undefined\n }\n id={`heading-${column.accessor.replace(/\\./g, '__')}`}\n key={index}\n >\n {column.Heading}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n <SortableContext items={sortableItems} strategy={sortingStrategy}>\n {data.map((doc, rowIndex) => {\n const rootInsertBeforeDropTarget =\n doc.__pageTreeParentID === null\n ? insertDropTargetsByReferenceRowID.get(doc.__pageTreeID)\n : undefined\n const rootInsertTargetIndex =\n rootInsertBeforeDropTarget !== undefined\n ? insertDropTargets.indexOf(rootInsertBeforeDropTarget)\n : -1\n const rootInsertAfterDropTarget =\n rootInsertTargetIndex >= 0\n ? insertDropTargets[rootInsertTargetIndex + 1]\n : undefined\n const isTrailingRootInsert =\n rootInsertAfterDropTarget === insertDropTargets[insertDropTargets.length - 1]\n const nextVisibleDoc = data[rowIndex + 1]\n const hasVisibleDescendantAfter =\n nextVisibleDoc?.__pageTreeAncestorIDs.includes(doc.__pageTreeID) ?? false\n\n return (\n <React.Fragment key={doc.__pageTreeID}>\n {rootInsertBeforeDropTarget ? (\n <HierarchyInsertRow\n activeColumnsCount={activeColumns.length}\n activeDragRowID={activeDoc ? activeDragRowID : null}\n activeDropTargetID={activeDropTargetID}\n dropTarget={rootInsertBeforeDropTarget}\n dropValidation={insertDropValidationByID.get(\n rootInsertBeforeDropTarget.dropID,\n )}\n isMovePending={isMovePending}\n key={rootInsertBeforeDropTarget.dropID}\n />\n ) : null}\n <HierarchyTableRow\n activeColumns={activeColumns}\n activeDragRowID={activeDragRowID}\n activeDragType={activeDragType}\n canReorderRows={canReorderRows}\n doc={doc}\n dropValidation={rowDropValidationByID.get(doc.__pageTreeID)}\n insertAfterDropID={\n hasVisibleDescendantAfter || isTrailingRootInsert\n ? null\n : (rootInsertAfterDropTarget?.dropID ?? null)\n }\n insertBeforeDropID={rootInsertBeforeDropTarget?.dropID ?? null}\n isMovePending={isMovePending}\n rowIndex={rowIndex}\n titleCellAccessor={titleCellAccessor}\n />\n </React.Fragment>\n )\n })}\n </SortableContext>\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport default function PageTreeListViewClient({\n allDocs,\n badgeConfig,\n canMoveDocs,\n columnState,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n query,\n sourceDocs,\n useAsTitle,\n ...props\n}: PageTreeListViewClientProps) {\n const router = useRouter()\n const searchParams = useSearchParams()\n const { config } = useConfig()\n const locale = useLocale()\n const { i18n } = useTranslation()\n const [activeDragRowID, setActiveDragRowID] = React.useState<null | string>(null)\n const [activeDragType, setActiveDragType] = React.useState<null | PageTreeDragType>(null)\n const [activeDropTarget, setActiveDropTarget] = React.useState<null | PageTreeDropTarget>(null)\n const [collapsedIDs, setCollapsedIDs] = React.useState<Set<string>>(() => new Set())\n const [optimisticOrderRowIDs, setOptimisticOrderRowIDs] = React.useState<null | string[]>(null)\n const [parentMoveEnabled, setParentMoveEnabled] = React.useState(false)\n const [pendingMoveRowID, setPendingMoveRowID] = React.useState<null | string>(null)\n const { getPreference, setPreference } = usePreferences()\n const parentMovePreferenceKey = React.useMemo(\n () => getParentMovePreferenceKey(props.collectionSlug),\n [props.collectionSlug],\n )\n\n const toggleRow = React.useCallback((rowID: string) => {\n setCollapsedIDs((currentState) => {\n const nextState = new Set(currentState)\n\n if (nextState.has(rowID)) {\n nextState.delete(rowID)\n } else {\n nextState.add(rowID)\n }\n\n return nextState\n })\n }, [])\n const handleParentMoveToggle = React.useCallback(() => {\n setParentMoveEnabled((currentValue) => {\n const nextValue = !currentValue\n\n void setPreference(parentMovePreferenceKey, nextValue)\n\n return nextValue\n })\n }, [parentMovePreferenceKey, setPreference])\n const currentSort = React.useMemo(() => {\n const searchParamSort = searchParams.getAll('sort')\n\n if (searchParamSort.length > 0) {\n return normalizeSort(searchParamSort)\n }\n\n return normalizeSort(query.sort as string | string[] | undefined)\n }, [query.sort, searchParams])\n const canReorderRows =\n canMoveDocs && isOrderableSortActive({ orderableFieldName, sort: currentSort })\n const currentLimit = React.useMemo(\n () =>\n normalizePositiveInt(\n searchParams.get('limit'),\n typeof query.limit === 'number' && query.limit > 0 ? query.limit : 10,\n ),\n [query.limit, searchParams],\n )\n const currentRequestedPage = React.useMemo(\n () =>\n normalizePositiveInt(\n searchParams.get('page'),\n typeof query.page === 'number' && query.page > 0 ? query.page : 1,\n ),\n [query.page, searchParams],\n )\n const liveAllDocs = React.useMemo(\n () =>\n buildPageTreeDocs(sourceDocs, {\n parentFieldSlug,\n sort: currentSort,\n }),\n [currentSort, parentFieldSlug, sourceDocs],\n )\n const collapseResetKey = React.useMemo(\n () => JSON.stringify([props.collectionSlug, props.viewType, searchParams.toString()]),\n [props.collectionSlug, props.viewType, searchParams],\n )\n const hierarchyValue = React.useMemo(\n () => ({\n activeDragRowID,\n canMoveDocs,\n collapsedIDs,\n parentMoveEnabled,\n pendingMoveRowID,\n toggleRow,\n }),\n [activeDragRowID, canMoveDocs, collapsedIDs, parentMoveEnabled, pendingMoveRowID, toggleRow],\n )\n\n React.useEffect(() => {\n let isMounted = true\n\n void getPreference<boolean>(parentMovePreferenceKey).then((storedValue) => {\n if (isMounted) {\n setParentMoveEnabled(storedValue === true)\n }\n })\n\n return () => {\n isMounted = false\n }\n }, [getPreference, parentMovePreferenceKey])\n\n React.useEffect(() => {\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n setCollapsedIDs(new Set())\n setOptimisticOrderRowIDs(null)\n }, [collapseResetKey])\n\n const visibleDocs = React.useMemo(\n () => getVisibleTreeDocs(liveAllDocs, collapsedIDs),\n [liveAllDocs, collapsedIDs],\n )\n const paginatedData = React.useMemo(\n () => buildPaginatedData(visibleDocs, currentLimit, currentRequestedPage),\n [currentLimit, currentRequestedPage, visibleDocs],\n )\n const paginatedDocs = paginatedData.docs as PageTreeDoc[]\n const paginatedServerOrderKey = React.useMemo(\n () => paginatedDocs.map((doc) => doc.__pageTreeID).join('\\0'),\n [paginatedDocs],\n )\n const displayedPaginatedDocs = React.useMemo(\n () => orderDocsByRowIDs(paginatedDocs, optimisticOrderRowIDs),\n [optimisticOrderRowIDs, paginatedDocs],\n )\n const displayedPaginatedData = React.useMemo(\n () => ({\n ...paginatedData,\n docs: displayedPaginatedDocs,\n }),\n [displayedPaginatedDocs, paginatedData],\n )\n\n React.useEffect(() => {\n setOptimisticOrderRowIDs(null)\n }, [paginatedServerOrderKey])\n\n const allDocsByID = React.useMemo(\n () => new Map(liveAllDocs.map((doc) => [doc.__pageTreeID, doc])),\n [liveAllDocs],\n )\n const paginatedDocsByID = React.useMemo(\n () => new Map(displayedPaginatedDocs.map((doc) => [doc.__pageTreeID, doc])),\n [displayedPaginatedDocs],\n )\n const renderedCellIndexByDocID = React.useMemo(\n () => new Map(allDocs.map((doc, index) => [doc.__pageTreeID, index])),\n [allDocs],\n )\n const normalizedColumnState = React.useMemo(\n () => ensureUseAsTitleColumn(columnState, useAsTitle),\n [columnState, useAsTitle],\n )\n const paginatedColumnState = React.useMemo(\n () => sliceColumnState(normalizedColumnState, displayedPaginatedDocs, renderedCellIndexByDocID),\n [displayedPaginatedDocs, normalizedColumnState, renderedCellIndexByDocID],\n )\n const tableColumns = React.useMemo(\n () =>\n buildTableColumns({\n badgeConfig,\n columnState: paginatedColumnState,\n docs: displayedPaginatedDocs,\n enableRowSelections: props.enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t: i18n.t,\n useAsTitle,\n }),\n [\n paginatedColumnState,\n displayedPaginatedDocs,\n badgeConfig,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n props.enableRowSelections,\n i18n.t,\n useAsTitle,\n ],\n )\n const activeDragDoc = activeDragRowID ? (paginatedDocsByID.get(activeDragRowID) ?? null) : null\n const activeDragPreviewPath = React.useMemo(() => {\n if (!activeDragDoc || activeDragType !== 'move') {\n return null\n }\n\n if (!activeDropTarget) {\n return buildDocSlugPath({\n doc: activeDragDoc,\n docsByID: allDocsByID,\n })\n }\n\n const targetDoc = getDropTargetParentDoc({\n docsByID: allDocsByID,\n dropTarget: activeDropTarget,\n })\n const dropValidation = getDropTargetValidation({\n activeDoc: activeDragDoc,\n docsByID: allDocsByID,\n dropTarget: activeDropTarget,\n })\n\n if (!dropValidation.isValid) {\n return buildDocSlugPath({\n doc: activeDragDoc,\n docsByID: allDocsByID,\n })\n }\n\n return buildProspectiveDocSlugPath({\n activeDoc: activeDragDoc,\n docsByID: allDocsByID,\n targetDoc: targetDoc ?? undefined,\n })\n }, [activeDragDoc, activeDragType, activeDropTarget, allDocsByID])\n const isMovePending = pendingMoveRowID !== null\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 2,\n },\n }),\n )\n const handleDragCancel = React.useCallback(() => {\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n }, [])\n const handleDragStart = React.useCallback(\n (event: DragStartEvent) => {\n if (!canMoveDocs || isMovePending) {\n return\n }\n\n const dragData = getPageTreeDragData(event.active.data.current)\n const { dragType, rowID } = dragData\n\n if (\n typeof rowID === 'string' &&\n dragType &&\n paginatedDocsByID.has(rowID) &&\n (dragType !== 'order' || canReorderRows)\n ) {\n setActiveDragRowID(rowID)\n setActiveDragType(dragType)\n setActiveDropTarget(null)\n }\n },\n [canMoveDocs, canReorderRows, isMovePending, paginatedDocsByID],\n )\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const dragData = getPageTreeDragData(event.active.data.current)\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\n\n if (dragData.dragType === 'order') {\n setActiveDropTarget(null)\n return\n }\n\n if (dragData.dragType !== 'move' || !overData) {\n setActiveDropTarget(null)\n return\n }\n\n if (overData.dropType === 'insert') {\n setActiveDropTarget(overData)\n return\n }\n\n if (overData.dropType === 'row') {\n setActiveDropTarget(overData)\n return\n }\n\n setActiveDropTarget(null)\n }, [])\n const handleDragEnd = React.useCallback(\n async (event: DragEndEvent) => {\n const dragData = getPageTreeDragData(event.active.data.current)\n const { dragType, rowID } = dragData\n const activeDoc = typeof rowID === 'string' ? (paginatedDocsByID.get(rowID) ?? null) : null\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\n const overDragData = getPageTreeDragData(event.over?.data.current)\n\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n\n if (dragType === 'order') {\n if (typeof rowID === 'string' && typeof overDragData.rowID === 'string') {\n const nextOrderRowIDs = buildOptimisticOrderRowIDs({\n activeRowID: rowID,\n docs: displayedPaginatedDocs,\n targetRowID: overDragData.rowID,\n })\n const reorderRequestBody = buildReorderRequestBody({\n activeRowID: rowID,\n docs: displayedPaginatedDocs,\n orderableFieldName,\n sort: currentSort,\n targetRowID: overDragData.rowID,\n })\n\n if (!nextOrderRowIDs || !reorderRequestBody) {\n return\n }\n\n const apiRoute = config.routes.api\n const params = new URLSearchParams()\n\n if (locale?.code) {\n params.set('locale', locale.code)\n }\n\n setOptimisticOrderRowIDs(nextOrderRowIDs)\n setPendingMoveRowID(rowID)\n\n try {\n const response = await fetch(\n `${apiRoute}/${props.collectionSlug}/${encodeURIComponent(rowID)}/reorder${\n params.size > 0 ? `?${params.toString()}` : ''\n }`,\n {\n body: JSON.stringify(reorderRequestBody),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n const result = (await response.json().catch(() => null)) as {\n message?: string\n } | null\n\n if (!response.ok) {\n setOptimisticOrderRowIDs(null)\n toast.error(result?.message ?? 'Could not reorder document.')\n return\n }\n\n if (result?.message === 'initial migration') {\n setOptimisticOrderRowIDs(null)\n }\n\n React.startTransition(() => {\n router.refresh()\n })\n } catch (error) {\n const message =\n error instanceof Error && error.message\n ? error.message\n : 'Could not reorder document.'\n\n setOptimisticOrderRowIDs(null)\n toast.error(message)\n } finally {\n setPendingMoveRowID(null)\n }\n }\n\n return\n }\n\n if (dragType !== 'move' || typeof rowID !== 'string' || !activeDoc || !overData) {\n return\n }\n\n const dropValidation = getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget: overData,\n })\n\n if (!dropValidation.isValid) {\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\n toast.error(dropValidation.message ?? 'Could not move document.')\n }\n\n return\n }\n\n if (\n overData.dropType === 'insert' &&\n activeDoc.__pageTreeParentID === dropValidation.parentID\n ) {\n return\n }\n\n const apiRoute = config.routes.api\n const params = new URLSearchParams()\n\n if (locale?.code) {\n params.set('locale', locale.code)\n }\n\n setPendingMoveRowID(rowID)\n\n try {\n const response = await fetch(\n `${apiRoute}/${props.collectionSlug}/${encodeURIComponent(rowID)}/move${\n params.size > 0 ? `?${params.toString()}` : ''\n }`,\n {\n body: JSON.stringify({\n parentID: dropValidation.parentID,\n }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n const result = (await response.json().catch(() => null)) as {\n message?: string\n } | null\n\n if (!response.ok) {\n if (shouldSilenceMoveMessage(result?.message)) {\n return\n }\n\n toast.error(result?.message ?? 'Could not move document.')\n return\n }\n\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\n React.startTransition(() => {\n router.refresh()\n })\n } catch (error) {\n const message =\n error instanceof Error && error.message ? error.message : 'Could not move document.'\n\n toast.error(message)\n } finally {\n setPendingMoveRowID(null)\n }\n },\n [\n allDocsByID,\n config.routes.api,\n currentSort,\n displayedPaginatedDocs,\n i18n.language,\n locale?.code,\n orderableFieldName,\n paginatedDocsByID,\n props.collectionSlug,\n router,\n ],\n )\n const handleDragEndSync = React.useCallback(\n (event: DragEndEvent) => {\n void handleDragEnd(event)\n },\n [handleDragEnd],\n )\n\n const tableNode = React.useMemo(\n () => (\n <DndContext\n collisionDetection={pageTreeCollisionDetectionStrategy}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEndSync}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n sensors={sensors}\n >\n <HierarchyTable\n activeDragRowID={activeDragRowID}\n activeDragType={activeDragType}\n activeDropTarget={activeDropTarget}\n allDocsByID={allDocsByID}\n canReorderRows={canReorderRows}\n columns={tableColumns}\n data={displayedPaginatedDocs}\n isMovePending={isMovePending}\n titleCellAccessor={useAsTitle}\n />\n <DragOverlay dropAnimation={null} style={{ cursor: 'grabbing' }}>\n {activeDragPreviewPath ? (\n <div className=\"pages-hierarchy-drag-overlay\">{activeDragPreviewPath}</div>\n ) : null}\n </DragOverlay>\n </DndContext>\n ),\n [\n activeDragPreviewPath,\n activeDragRowID,\n activeDragType,\n activeDropTarget,\n allDocsByID,\n canReorderRows,\n displayedPaginatedDocs,\n handleDragCancel,\n handleDragEndSync,\n handleDragOver,\n handleDragStart,\n isMovePending,\n sensors,\n tableColumns,\n useAsTitle,\n ],\n )\n const beforeActions = React.useMemo(() => {\n const actions = props.beforeActions ? [...props.beforeActions] : []\n\n if (canMoveDocs) {\n actions.unshift(\n <ParentMoveToggle\n collectionSlug={props.collectionSlug}\n enabled={parentMoveEnabled}\n key=\"parent-move-toggle\"\n onToggle={handleParentMoveToggle}\n />,\n )\n }\n\n return actions.length > 0 ? actions : undefined\n }, [\n canMoveDocs,\n handleParentMoveToggle,\n parentMoveEnabled,\n props.beforeActions,\n props.collectionSlug,\n ])\n\n return (\n <div className={styles.root}>\n <PageTreeProvider value={hierarchyValue}>\n <ListQueryProvider\n collectionSlug={props.collectionSlug}\n data={displayedPaginatedData}\n modifySearchParams\n orderableFieldName={orderableFieldName}\n query={{\n ...query,\n limit: currentLimit,\n page: displayedPaginatedData.page,\n sort: currentSort,\n }}\n >\n <DefaultListView\n {...props}\n beforeActions={beforeActions}\n columnState={paginatedColumnState}\n Table={tableNode}\n />\n </ListQueryProvider>\n </PageTreeProvider>\n </div>\n )\n}\n"],"names":["DndContext","DragOverlay","PointerSensor","useDroppable","useSensor","useSensors","arrayMove","SortableContext","useSortable","DefaultListView","ListQueryProvider","Pill","SelectAll","SelectRow","SortHeader","toast","useConfig","useLocale","usePreferences","useTranslation","useRouter","useSearchParams","React","buildInsertDropTargets","getDropTargetParentDoc","CANCEL_DRAG_MESSAGE","getDropValidation","buildDocSlugPath","buildPageTreeDocs","buildProspectiveDocSlugPath","getDocDisplayLabel","getVisibleTreeDocs","pageTreeCollisionDetectionStrategy","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeProvider","PageTreeRowDndProvider","styles","PageTreeTitleCell","SILENT_MOVE_MESSAGES","Set","ALREADY_ROOT_MESSAGE","getParentMovePreferenceKey","collectionSlug","getRowDropID","rowID","getSortableRowID","getDiagnosticString","value","length","getPageTreeDragData","data","dragType","undefined","parentID","getSortableTransform","transform","scaleX","scaleY","x","y","getVisibleSubtreeIndexRange","docs","rootIndex","rootDoc","end","index","__pageTreeAncestorIDs","includes","__pageTreeID","start","getRangeRect","args","activeNodeRect","activeRange","range","rects","firstRect","lastRect","bottom","top","height","isIndexInRange","buildPageTreeSortingStrategy","activeIndex","overIndex","overRange","activeRect","overRect","buildPaginatedData","limit","requestedPage","totalDocs","totalPages","Math","max","ceil","page","min","startIndex","pageDocs","slice","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","normalizeSort","Array","isArray","sortValues","filter","entry","join","normalizePositiveInt","fallback","parsedValue","Number","parseInt","isNaN","isOrderableSortActive","orderableFieldName","sort","Boolean","ensureUseAsTitleColumn","columnState","useAsTitle","map","column","accessor","active","sliceColumnState","renderedCellIndexByDocID","renderedCells","doc","renderedCellIndex","get","__pageTreeOrderIndex","getSelectableRowData","record","id","String","_isLocked","_userEditing","shouldSilenceMoveMessage","message","has","getVisibleSubtreeRowIDs","findIndex","rowIDs","push","buildOptimisticOrderRowIDs","activeRowID","targetRowID","activeDoc","find","targetDoc","__pageTreeParentID","activeBlockIDs","targetBlockIDs","currentRowIDs","indexOf","targetIndex","remainingRowIDs","targetAnchorID","targetAnchorIndex","insertIndex","buildReorderRequestBody","siblingDocs","moveFromIndex","moveToIndex","newBeforeRow","newAfterRow","target","getFrontendOrderEntry","orderKey","slug","siblingDocsAfter","movedSiblingDoc","splice","targetKey","newKeyWillBe","docsToMove","frontendOrder","activeSlug","after","before","newAfterRowSlug","newBeforeRowSlug","targetSlug","key","orderDocsByRowIDs","orderRowIDs","docsByID","Map","orderedDocs","flatMap","getDropTargetValidation","dropTarget","dropType","isValid","getStatusClassName","status","renderStatusBadge","badgeConfig","t","customColor","badgeColors","colors","statusClass","style","span","className","data-custom-color","badgeLabels","labels","ParentMoveToggle","enabled","onToggle","aria-checked","aria-label","onClick","pillStyle","size","buildTableColumns","enableRowSelections","homeIndicatorEnabled","parentFieldSlug","columnsToUse","unshift","field","hidden","Heading","rowData","orderableColumn","aria-hidden","selectColumnIndex","HierarchyInsertRow","activeColumnsCount","activeDragRowID","activeDropTargetID","dropValidation","isMovePending","isOver","setNodeRef","dropID","disabled","hasActiveDrag","showInsertLine","tr","data-drag-over","data-drop-valid","data-page-tree-insert","td","colSpan","div","data-insert-depth","depth","ref","HierarchyTableRow","activeColumns","activeDragType","canReorderRows","insertAfterDropID","insertBeforeDropID","rowIndex","titleCellAccessor","sortable","hasActiveMoveDrag","isActiveDragRow","setRowRef","useCallback","element","rowDndValue","useMemo","isOrderDragging","isDragging","orderHandleAttributes","attributes","orderHandleListeners","listeners","orderHandleRef","setActivatorNodeRef","sortableStyle","position","transition","zIndex","data-id","data-is-drag-source","data-is-order-drag-source","data-page-tree-row","columnIndex","replace","data-page-tree-title-cell","HierarchyTable","activeDropTarget","allDocsByID","columns","sortableItems","sortingStrategy","insertDropTargets","insertDropTargetsByReferenceRowID","referenceRowID","rowDropValidationByID","insertDropValidationByID","table","cellPadding","cellSpacing","thead","th","tbody","items","strategy","rootInsertBeforeDropTarget","rootInsertTargetIndex","rootInsertAfterDropTarget","isTrailingRootInsert","nextVisibleDoc","hasVisibleDescendantAfter","Fragment","PageTreeListViewClient","allDocs","canMoveDocs","query","sourceDocs","props","router","searchParams","config","locale","i18n","setActiveDragRowID","useState","setActiveDragType","setActiveDropTarget","collapsedIDs","setCollapsedIDs","optimisticOrderRowIDs","setOptimisticOrderRowIDs","parentMoveEnabled","setParentMoveEnabled","pendingMoveRowID","setPendingMoveRowID","getPreference","setPreference","parentMovePreferenceKey","toggleRow","currentState","nextState","delete","add","handleParentMoveToggle","currentValue","nextValue","currentSort","searchParamSort","getAll","currentLimit","currentRequestedPage","liveAllDocs","collapseResetKey","JSON","stringify","viewType","toString","hierarchyValue","useEffect","isMounted","then","storedValue","visibleDocs","paginatedData","paginatedDocs","paginatedServerOrderKey","displayedPaginatedDocs","displayedPaginatedData","paginatedDocsByID","normalizedColumnState","paginatedColumnState","tableColumns","activeDragDoc","activeDragPreviewPath","sensors","activationConstraint","distance","handleDragCancel","handleDragStart","event","dragData","current","handleDragOver","overData","over","handleDragEnd","overDragData","nextOrderRowIDs","reorderRequestBody","apiRoute","routes","api","params","URLSearchParams","code","set","response","fetch","encodeURIComponent","body","credentials","headers","language","method","result","json","catch","ok","error","startTransition","refresh","Error","success","handleDragEndSync","tableNode","collisionDetection","onDragCancel","onDragEnd","onDragOver","onDragStart","dropAnimation","cursor","beforeActions","actions","root","modifySearchParams","Table"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/PageTreeListView.client.tsx"],"sourcesContent":["'use client'\n\nimport type { Column, ListQuery, ListViewClientProps, PaginatedDocs } from 'payload'\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n PointerSensor,\n useDroppable,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n type SortingStrategy,\n useSortable,\n} from '@dnd-kit/sortable'\nimport {\n DefaultListView,\n ListQueryProvider,\n Pill,\n SelectAll,\n SelectRow,\n SortHeader,\n toast,\n useConfig,\n useLocale,\n usePreferences,\n useTranslation,\n useWindowInfo,\n} from '@payloadcms/ui'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { NestedDocsPageTreePluginResolvedBadgeConfig, PageTreeSourceDoc } from '../types.js'\n\nimport {\n buildInsertDropTargets,\n getDropTargetParentDoc,\n type PageTreeDropTarget,\n} from '../utilities/dropTargets.js'\nimport {\n CANCEL_DRAG_MESSAGE,\n getDropValidation,\n type PageTreeDropValidation,\n} from '../utilities/moveValidation.js'\nimport {\n buildDocSlugPath,\n buildPageTreeDocs,\n buildProspectiveDocSlugPath,\n getDocDisplayLabel,\n getVisibleTreeDocs,\n type PageTreeDoc,\n} from '../utilities/pageTree.js'\nimport { pageTreeCollisionDetectionStrategy } from '../utilities/pageTreeCollision.js'\nimport {\n getPageTreeBadgeColor,\n getPageTreeBadgeLabel,\n getPageTreeDisplayStatus,\n type PageTreeDisplayStatus,\n} from '../utilities/status.js'\nimport { PageTreeProvider, PageTreeRowDndProvider } from './PageTreeContext.js'\nimport styles from './PageTreeListView.module.css'\nimport { PageTreeTitleCell } from './PageTreeTitleCell.js'\n\ntype PageTreeListViewClientProps = {\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\n} & Omit<ListViewClientProps, 'columnState' | 'Table'>\n\ntype SelectableRowData = React.ComponentProps<typeof SelectRow>['rowData']\ntype PageTreeDragType = 'move' | 'order'\n\ntype PageTreeDragData = {\n dragType?: PageTreeDragType\n parentID?: null | string\n rowID?: string\n}\n\ntype PageTreeSortableTransform = ReturnType<typeof useSortable>['transform']\n\ntype PageTreeReorderRequestBody = {\n docsToMove: string[]\n frontendOrder?: PageTreeReorderFrontendOrder\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: null | string\n }\n}\n\ntype PageTreeReorderFrontendOrder = {\n activeSlug: null | string\n after: PageTreeReorderFrontendOrderEntry[]\n before: PageTreeReorderFrontendOrderEntry[]\n moveFromIndex: number\n moveToIndex: number\n newAfterRowSlug: null | string\n newBeforeRowSlug: null | string\n sort: null | string\n targetSlug: null | string\n}\n\ntype PageTreeReorderFrontendOrderEntry = {\n index: number\n orderKey: null | string\n slug: null | string\n}\n\ntype PageTreeIndexRange = {\n end: number\n start: number\n}\n\ntype PageTreeRangeRect = {\n bottom: number\n height: number\n top: number\n}\n\nconst SILENT_MOVE_MESSAGES = new Set([CANCEL_DRAG_MESSAGE])\nconst ALREADY_ROOT_MESSAGE = 'This page is already in root level.'\n\nfunction getParentMovePreferenceKey(collectionSlug: string): string {\n return `payload-nested-docs-page-tree:${collectionSlug}:parentMoveHandle`\n}\n\nfunction getRowDropID(rowID: string): string {\n return `page-drop:${rowID}`\n}\n\nfunction getSortableRowID(rowID: string): string {\n return `page-sort:${rowID}`\n}\n\nfunction getDiagnosticString(value: unknown): null | string {\n return typeof value === 'string' && value.length > 0 ? value : null\n}\n\nfunction getPageTreeDragData(value: unknown): PageTreeDragData {\n if (!value || typeof value !== 'object') {\n return {}\n }\n\n const data = value as Record<string, unknown>\n const dragType = data.dragType === 'move' || data.dragType === 'order' ? data.dragType : undefined\n const parentID =\n data.parentID === null || typeof data.parentID === 'string' ? data.parentID : undefined\n const rowID = typeof data.rowID === 'string' ? data.rowID : undefined\n\n return {\n dragType,\n parentID,\n rowID,\n }\n}\n\nfunction getSortableTransform(transform: PageTreeSortableTransform): string | undefined {\n if (!transform) {\n return undefined\n }\n\n const scaleX = transform.scaleX ?? 1\n const scaleY = transform.scaleY ?? 1\n\n return `translate3d(${transform.x}px, ${transform.y}px, 0) scaleX(${scaleX}) scaleY(${scaleY})`\n}\n\nfunction getVisibleSubtreeIndexRange(docs: PageTreeDoc[], rootIndex: number): null | PageTreeIndexRange {\n const rootDoc = docs[rootIndex]\n\n if (!rootDoc) {\n return null\n }\n\n let end = rootIndex\n\n for (let index = rootIndex + 1; index < docs.length; index += 1) {\n if (!docs[index]?.__pageTreeAncestorIDs.includes(rootDoc.__pageTreeID)) {\n break\n }\n\n end = index\n }\n\n return {\n end,\n start: rootIndex,\n }\n}\n\nfunction getRangeRect(args: {\n activeNodeRect: Parameters<SortingStrategy>[0]['activeNodeRect']\n activeRange: PageTreeIndexRange\n range: PageTreeIndexRange\n rects: Parameters<SortingStrategy>[0]['rects']\n}): null | PageTreeRangeRect {\n const { activeNodeRect, activeRange, range, rects } = args\n const firstRect =\n rects[range.start] ?? (range.start === activeRange.start ? activeNodeRect : undefined)\n const lastRect = rects[range.end] ?? (range.end === activeRange.end ? activeNodeRect : undefined)\n\n if (!firstRect || !lastRect) {\n return null\n }\n\n return {\n bottom: lastRect.top + lastRect.height,\n height: lastRect.top + lastRect.height - firstRect.top,\n top: firstRect.top,\n }\n}\n\nfunction isIndexInRange(index: number, range: PageTreeIndexRange): boolean {\n return index >= range.start && index <= range.end\n}\n\nfunction buildPageTreeSortingStrategy(docs: PageTreeDoc[]): SortingStrategy {\n return ({ activeIndex, activeNodeRect, index, overIndex, rects }) => {\n const activeRange = getVisibleSubtreeIndexRange(docs, activeIndex)\n const overRange = getVisibleSubtreeIndexRange(docs, overIndex)\n\n if (!activeRange || !overRange || activeRange.start === overRange.start) {\n return null\n }\n\n const activeRect = getRangeRect({\n activeNodeRect,\n activeRange,\n range: activeRange,\n rects,\n })\n const overRect = getRangeRect({\n activeNodeRect,\n activeRange,\n range: overRange,\n rects,\n })\n\n if (!activeRect || !overRect) {\n return null\n }\n\n if (isIndexInRange(index, activeRange)) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y:\n activeRange.start < overRange.start\n ? overRect.bottom - activeRect.bottom\n : overRect.top - activeRect.top,\n }\n }\n\n if (activeRange.start < overRange.start && index > activeRange.end && index <= overRange.end) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: -activeRect.height,\n }\n }\n\n if (activeRange.start > overRange.start && index >= overRange.start && index < activeRange.start) {\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: activeRect.height,\n }\n }\n\n return {\n scaleX: 1,\n scaleY: 1,\n x: 0,\n y: 0,\n }\n }\n}\n\nfunction buildPaginatedData(\n docs: PageTreeDoc[],\n limit: number,\n requestedPage: number,\n): PaginatedDocs {\n const totalDocs = docs.length\n const totalPages = totalDocs > 0 ? Math.max(1, Math.ceil(totalDocs / limit)) : 1\n const page = Math.min(Math.max(requestedPage, 1), totalPages)\n const startIndex = (page - 1) * limit\n const pageDocs = docs.slice(startIndex, startIndex + limit)\n\n return {\n docs: pageDocs,\n hasNextPage: page < totalPages,\n hasPrevPage: page > 1,\n limit,\n nextPage: page < totalPages ? page + 1 : null,\n page,\n pagingCounter: totalDocs === 0 ? 0 : startIndex + 1,\n prevPage: page > 1 ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n\nfunction normalizeSort(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) {\n const sortValues = value.filter((entry) => typeof entry === 'string' && entry.length > 0)\n return sortValues.length > 0 ? sortValues.join(',') : undefined\n }\n\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction normalizePositiveInt(value: null | string, fallback: number): number {\n if (typeof value !== 'string') {\n return fallback\n }\n\n const parsedValue = Number.parseInt(value, 10)\n return Number.isNaN(parsedValue) || parsedValue <= 0 ? fallback : parsedValue\n}\n\nfunction isOrderableSortActive(args: { orderableFieldName?: string; sort?: string }): boolean {\n const { orderableFieldName, sort } = args\n\n return Boolean(\n orderableFieldName && (sort === orderableFieldName || sort === `-${orderableFieldName}`),\n )\n}\n\nfunction ensureUseAsTitleColumn(columnState: Column[], useAsTitle: string): Column[] {\n return columnState.map((column) =>\n column.accessor === useAsTitle\n ? {\n ...column,\n active: true,\n }\n : column,\n )\n}\n\nfunction sliceColumnState(\n columnState: Column[],\n docs: PageTreeDoc[],\n renderedCellIndexByDocID: ReadonlyMap<string, number>,\n): Column[] {\n return columnState.map((column) => ({\n ...column,\n renderedCells: docs.map((doc) => {\n const renderedCellIndex =\n renderedCellIndexByDocID.get(doc.__pageTreeID) ?? doc.__pageTreeOrderIndex\n\n return column.renderedCells?.[renderedCellIndex] ?? null\n }),\n }))\n}\n\nfunction getSelectableRowData(doc: PageTreeDoc): SelectableRowData {\n const record = doc as Record<string, unknown>\n\n return {\n id: String(doc.id ?? doc.__pageTreeID),\n _isLocked: Boolean(record._isLocked),\n _userEditing: record._userEditing as SelectableRowData['_userEditing'],\n }\n}\n\nfunction shouldSilenceMoveMessage(message?: string): boolean {\n return typeof message === 'string' && SILENT_MOVE_MESSAGES.has(message)\n}\n\nfunction getVisibleSubtreeRowIDs(docs: PageTreeDoc[], rowID: string): string[] {\n const rootIndex = docs.findIndex((doc) => doc.__pageTreeID === rowID)\n\n if (rootIndex < 0) {\n return []\n }\n\n const rowIDs = [rowID]\n\n for (const doc of docs.slice(rootIndex + 1)) {\n if (!doc.__pageTreeAncestorIDs.includes(rowID)) {\n break\n }\n\n rowIDs.push(doc.__pageTreeID)\n }\n\n return rowIDs\n}\n\nfunction buildOptimisticOrderRowIDs(args: {\n activeRowID: string\n docs: PageTreeDoc[]\n targetRowID: string\n}): null | string[] {\n const { activeRowID, docs, targetRowID } = args\n\n if (activeRowID === targetRowID) {\n return null\n }\n\n const activeDoc = docs.find((doc) => doc.__pageTreeID === activeRowID)\n const targetDoc = docs.find((doc) => doc.__pageTreeID === targetRowID)\n\n if (!activeDoc || !targetDoc || activeDoc.__pageTreeParentID !== targetDoc.__pageTreeParentID) {\n return null\n }\n\n const activeBlockIDs = getVisibleSubtreeRowIDs(docs, activeRowID)\n const targetBlockIDs = getVisibleSubtreeRowIDs(docs, targetRowID)\n\n if (\n activeBlockIDs.length === 0 ||\n targetBlockIDs.length === 0 ||\n targetBlockIDs.includes(activeRowID)\n ) {\n return null\n }\n\n const currentRowIDs = docs.map((doc) => doc.__pageTreeID)\n\n if (activeBlockIDs.length === 1 && targetBlockIDs.length === 1) {\n const activeIndex = currentRowIDs.indexOf(activeRowID)\n const targetIndex = currentRowIDs.indexOf(targetRowID)\n\n return activeIndex < 0 || targetIndex < 0\n ? null\n : arrayMove(currentRowIDs, activeIndex, targetIndex)\n }\n\n const remainingRowIDs = currentRowIDs.filter((rowID) => !activeBlockIDs.includes(rowID))\n const activeIndex = currentRowIDs.indexOf(activeRowID)\n const targetIndex = currentRowIDs.indexOf(targetRowID)\n const targetAnchorID =\n activeIndex < targetIndex ? targetBlockIDs[targetBlockIDs.length - 1] : targetBlockIDs[0]\n\n if (!targetAnchorID) {\n return null\n }\n\n const targetAnchorIndex = remainingRowIDs.indexOf(targetAnchorID)\n\n if (targetAnchorIndex < 0) {\n return null\n }\n\n const insertIndex = activeIndex < targetIndex ? targetAnchorIndex + 1 : targetAnchorIndex\n\n return [\n ...remainingRowIDs.slice(0, insertIndex),\n ...activeBlockIDs,\n ...remainingRowIDs.slice(insertIndex),\n ]\n}\n\nfunction buildReorderRequestBody(args: {\n activeRowID: string\n docs: PageTreeDoc[]\n orderableFieldName?: string\n sort?: string\n targetRowID: string\n}): null | PageTreeReorderRequestBody {\n const { activeRowID, docs, orderableFieldName, sort, targetRowID } = args\n\n if (!orderableFieldName || (sort !== orderableFieldName && sort !== `-${orderableFieldName}`)) {\n return null\n }\n\n if (activeRowID === targetRowID) {\n return null\n }\n\n const activeDoc = docs.find((doc) => doc.__pageTreeID === activeRowID)\n const targetDoc = docs.find((doc) => doc.__pageTreeID === targetRowID)\n\n if (!activeDoc || !targetDoc || activeDoc.__pageTreeParentID !== targetDoc.__pageTreeParentID) {\n return null\n }\n\n const siblingDocs = docs.filter(\n (doc) => doc.__pageTreeParentID === activeDoc.__pageTreeParentID,\n )\n const moveFromIndex = siblingDocs.findIndex((doc) => doc.__pageTreeID === activeRowID)\n const moveToIndex = siblingDocs.findIndex((doc) => doc.__pageTreeID === targetRowID)\n\n if (moveFromIndex < 0 || moveToIndex < 0 || moveFromIndex === moveToIndex) {\n return null\n }\n\n const newBeforeRow =\n moveToIndex > moveFromIndex ? siblingDocs[moveToIndex] : siblingDocs[moveToIndex - 1]\n const newAfterRow =\n moveToIndex > moveFromIndex ? siblingDocs[moveToIndex + 1] : siblingDocs[moveToIndex]\n const target = newBeforeRow ?? newAfterRow\n\n if (!target) {\n return null\n }\n\n const getFrontendOrderEntry = (\n doc: PageTreeDoc,\n index: number,\n ): PageTreeReorderFrontendOrderEntry => {\n const orderKey = doc[orderableFieldName]\n\n return {\n slug: getDiagnosticString(doc.slug),\n index,\n orderKey: typeof orderKey === 'string' && orderKey.length > 0 ? orderKey : null,\n }\n }\n const siblingDocsAfter = [...siblingDocs]\n const [movedSiblingDoc] = siblingDocsAfter.splice(moveFromIndex, 1)\n\n if (!movedSiblingDoc) {\n return null\n }\n\n siblingDocsAfter.splice(moveToIndex, 0, movedSiblingDoc)\n\n const targetKey = target[orderableFieldName]\n const newKeyWillBe =\n (newBeforeRow && sort === orderableFieldName) ||\n (!newBeforeRow && sort === `-${orderableFieldName}`)\n ? 'greater'\n : 'less'\n\n return {\n docsToMove: [activeRowID],\n frontendOrder: {\n activeSlug: getDiagnosticString(activeDoc.slug),\n after: siblingDocsAfter.map(getFrontendOrderEntry),\n before: siblingDocs.map(getFrontendOrderEntry),\n moveFromIndex,\n moveToIndex,\n newAfterRowSlug: newAfterRow ? getDiagnosticString(newAfterRow.slug) : null,\n newBeforeRowSlug: newBeforeRow ? getDiagnosticString(newBeforeRow.slug) : null,\n sort: sort ?? null,\n targetSlug: getDiagnosticString(targetDoc.slug),\n },\n newKeyWillBe,\n orderableFieldName,\n target: {\n id: target.__pageTreeID,\n key: typeof targetKey === 'string' && targetKey.length > 0 ? targetKey : null,\n },\n }\n}\n\nfunction orderDocsByRowIDs(docs: PageTreeDoc[], orderRowIDs: null | string[]): PageTreeDoc[] {\n if (!orderRowIDs) {\n return docs\n }\n\n const docsByID = new Map(docs.map((doc) => [doc.__pageTreeID, doc]))\n const orderedDocs = orderRowIDs.flatMap((rowID) => {\n const doc = docsByID.get(rowID)\n\n return doc ? [doc] : []\n })\n\n return orderedDocs.length === docs.length ? orderedDocs : docs\n}\n\nfunction getDropTargetValidation(args: {\n activeDoc: PageTreeDoc\n docsByID: ReadonlyMap<string, PageTreeDoc>\n dropTarget: PageTreeDropTarget\n}): PageTreeDropValidation {\n const { activeDoc, docsByID, dropTarget } = args\n\n if (dropTarget.dropType === 'row') {\n return getDropValidation({\n activeDoc,\n targetDoc: docsByID.get(dropTarget.rowID) ?? undefined,\n })\n }\n\n if (dropTarget.parentID === null) {\n if (activeDoc.__pageTreeParentID === null) {\n return {\n isValid: false,\n message: ALREADY_ROOT_MESSAGE,\n parentID: null,\n }\n }\n\n return {\n isValid: true,\n parentID: null,\n }\n }\n\n const targetDoc = docsByID.get(dropTarget.parentID)\n\n if (!targetDoc) {\n return {\n isValid: false,\n message: 'Could not resolve drop target.',\n parentID: dropTarget.parentID,\n }\n }\n\n if (targetDoc.__pageTreeID === activeDoc.__pageTreeID) {\n return {\n isValid: false,\n message: CANCEL_DRAG_MESSAGE,\n parentID: targetDoc.__pageTreeID,\n }\n }\n\n if (targetDoc.__pageTreeAncestorIDs.includes(activeDoc.__pageTreeID)) {\n return {\n isValid: false,\n message: 'A document cannot be moved under one of its descendants.',\n parentID: targetDoc.__pageTreeID,\n }\n }\n\n return {\n isValid: true,\n parentID: targetDoc.__pageTreeID,\n }\n}\n\nfunction getStatusClassName(\n status: PageTreeDisplayStatus,\n): 'changed' | 'draft' | 'published' | 'unknown' {\n if (status === 'changed' || status === 'draft' || status === 'published') {\n return status\n }\n\n return 'unknown'\n}\n\nfunction renderStatusBadge(args: {\n badgeConfig: NestedDocsPageTreePluginResolvedBadgeConfig\n doc: PageTreeDoc\n index: number\n t: (key: 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published') => string\n}): React.ReactNode {\n const { badgeConfig, doc, index, t } = args\n const status = getPageTreeDisplayStatus(doc)\n const customColor = getPageTreeBadgeColor({\n badgeColors: badgeConfig.colors,\n status,\n })\n const statusClass = getStatusClassName(status)\n const style = customColor\n ? ({ '--page-tree-badge-base': customColor } as React.CSSProperties)\n : undefined\n\n return (\n <span\n className={[\n 'pages-hierarchy-status-badge',\n `pages-hierarchy-status-badge--${statusClass}`,\n ].join(' ')}\n data-custom-color={customColor ? 'true' : undefined}\n key={doc.__pageTreeID ?? index}\n style={style}\n >\n {getPageTreeBadgeLabel({\n badgeLabels: badgeConfig.labels,\n status,\n t,\n })}\n </span>\n )\n}\n\nfunction ParentMoveToggle({\n collectionSlug,\n enabled,\n onToggle,\n}: {\n collectionSlug: string\n enabled: boolean\n onToggle: () => void\n}) {\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n const [mobileActions, setMobileActions] = React.useState<Element | null>(null)\n const setMobileMount = React.useCallback((node: HTMLSpanElement | null) => {\n setMobileActions(\n node?.closest('.collection-list')?.querySelector('.search-bar__actions') ?? null,\n )\n }, [])\n const toggle = (\n <Pill\n aria-checked={enabled}\n aria-label={`${enabled ? 'Hide' : 'Show'} edit hierarchy handles`}\n className=\"pages-hierarchy-parent-move-toggle\"\n id={`pages-hierarchy-parent-move-toggle-${collectionSlug}`}\n onClick={onToggle}\n pillStyle={enabled ? 'dark' : 'light'}\n size=\"small\"\n >\n Edit Hierarchy\n </Pill>\n )\n\n if (smallBreak) {\n return (\n <>\n <span hidden ref={setMobileMount} />\n {mobileActions ? createPortal(toggle, mobileActions) : null}\n </>\n )\n }\n\n return toggle\n}\n\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[] {\n const {\n badgeConfig,\n columnState,\n docs,\n enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t,\n useAsTitle,\n } = args\n const columnsToUse = columnState.map((column) => {\n if (column.accessor === useAsTitle) {\n return {\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 }\n }\n\n if (column.accessor === '_status') {\n return {\n ...column,\n renderedCells: docs.map((doc, index) =>\n renderStatusBadge({\n badgeConfig,\n doc,\n index,\n t,\n }),\n ),\n }\n }\n\n if (column.accessor === parentFieldSlug) {\n return {\n ...column,\n renderedCells: docs.map((doc, index) =>\n doc.__pageTreeParentID !== null ? (\n (column.renderedCells?.[index] ?? null)\n ) : (\n <span className=\"pages-hierarchy-empty-cell\" key={doc.__pageTreeID ?? index}>\n -\n </span>\n ),\n ),\n }\n }\n\n return column\n })\n\n if (enableRowSelections) {\n columnsToUse.unshift({\n accessor: '_select',\n active: true,\n field: { hidden: true } as Column['field'],\n Heading: <SelectAll />,\n renderedCells: docs.map((doc, index) => (\n <SelectRow key={doc.__pageTreeID ?? index} rowData={getSelectableRowData(doc)} />\n )),\n })\n }\n\n if (orderableFieldName) {\n const orderableColumn = {\n accessor: '_pageTreeOrderSort',\n active: true,\n field: { hidden: true } as Column['field'],\n Heading: <SortHeader />,\n renderedCells: docs.map((doc, index) => (\n <span\n aria-hidden=\"true\"\n className=\"pages-hierarchy-order-sort-spacer\"\n key={doc.__pageTreeID ?? index}\n />\n )),\n } satisfies Column\n const selectColumnIndex = columnsToUse.findIndex((column) => column.accessor === '_select')\n\n columnsToUse.splice(selectColumnIndex >= 0 ? selectColumnIndex + 1 : 0, 0, orderableColumn)\n }\n\n return columnsToUse\n}\n\nfunction HierarchyInsertRow({\n activeColumnsCount,\n activeDragRowID,\n activeDropTargetID,\n dropTarget,\n dropValidation,\n isMovePending,\n}: {\n activeColumnsCount: number\n activeDragRowID: null | string\n activeDropTargetID: null | string\n dropTarget: Extract<PageTreeDropTarget, { dropType: 'insert' }>\n dropValidation?: PageTreeDropValidation\n isMovePending: boolean\n}) {\n const { isOver, setNodeRef } = useDroppable({\n id: dropTarget.dropID,\n data: dropTarget,\n disabled: isMovePending,\n })\n const hasActiveDrag = Boolean(activeDragRowID)\n const showInsertLine = isOver && activeDropTargetID === dropTarget.dropID\n\n return (\n <tr\n className=\"pages-hierarchy-insert-row\"\n data-drag-over={showInsertLine ? 'true' : 'false'}\n data-drop-valid={hasActiveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\n data-page-tree-insert=\"true\"\n >\n {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}\n <td colSpan={activeColumnsCount}>\n <div\n className=\"pages-hierarchy-insert-row__target\"\n data-insert-depth={dropTarget.depth}\n ref={setNodeRef}\n />\n </td>\n </tr>\n )\n}\n\nfunction HierarchyTableRow({\n activeColumns,\n activeDragRowID,\n activeDragType,\n canReorderRows,\n doc,\n dropValidation,\n insertAfterDropID,\n insertBeforeDropID,\n isMovePending,\n rowIndex,\n titleCellAccessor,\n}: {\n activeColumns: Column[]\n activeDragRowID: null | string\n activeDragType: null | PageTreeDragType\n canReorderRows: boolean\n doc: PageTreeDoc\n dropValidation?: PageTreeDropValidation\n insertAfterDropID: null | string\n insertBeforeDropID: null | string\n isMovePending: boolean\n rowIndex: number\n titleCellAccessor: string\n}) {\n const { isOver, setNodeRef } = useDroppable({\n id: getRowDropID(doc.__pageTreeID),\n data: {\n dropType: 'row',\n insertAfterDropID,\n insertBeforeDropID,\n rowID: doc.__pageTreeID,\n } satisfies Extract<PageTreeDropTarget, { dropType: 'row' }>,\n disabled: isMovePending,\n })\n const sortable = useSortable({\n id: getSortableRowID(doc.__pageTreeID),\n data: {\n dragType: 'order',\n parentID: doc.__pageTreeParentID,\n rowID: doc.__pageTreeID,\n } satisfies PageTreeDragData,\n disabled: !canReorderRows || isMovePending || activeDragType === 'move',\n })\n const hasActiveMoveDrag = activeDragType === 'move' && Boolean(activeDragRowID)\n const isActiveDragRow = activeDragRowID === doc.__pageTreeID\n const setRowRef = React.useCallback(\n (element: HTMLTableRowElement | null) => {\n setNodeRef(element)\n sortable.setNodeRef(element)\n },\n [setNodeRef, sortable],\n )\n const rowDndValue = React.useMemo(\n () => ({\n isOrderDragging: sortable.isDragging,\n orderHandleAttributes: sortable.attributes,\n orderHandleListeners: sortable.listeners,\n orderHandleRef: sortable.setActivatorNodeRef,\n }),\n [sortable.attributes, sortable.isDragging, sortable.listeners, sortable.setActivatorNodeRef],\n )\n const sortableStyle = React.useMemo(\n () =>\n ({\n position: sortable.isDragging ? 'relative' : undefined,\n transform: getSortableTransform(sortable.transform),\n transition: activeDragType === 'order' ? sortable.transition : undefined,\n zIndex: sortable.isDragging ? 1 : undefined,\n }) as React.CSSProperties,\n [activeDragType, sortable.isDragging, sortable.transform, sortable.transition],\n )\n\n return (\n <tr\n className={`row-${rowIndex + 1}`}\n data-drag-over={activeDragType === 'move' && isOver ? 'true' : 'false'}\n data-drop-valid={hasActiveMoveDrag ? (dropValidation?.isValid ? 'true' : 'false') : undefined}\n data-id={doc.id}\n data-is-drag-source={activeDragType === 'move' && isActiveDragRow ? 'true' : 'false'}\n data-is-order-drag-source={sortable.isDragging ? 'true' : 'false'}\n data-page-tree-row=\"true\"\n ref={setRowRef}\n style={sortableStyle}\n >\n <PageTreeRowDndProvider value={rowDndValue}>\n {activeColumns.map((column, columnIndex) => {\n const { accessor } = column\n\n return (\n <td\n className={`cell-${accessor.replace(/\\./g, '__')}`}\n data-page-tree-title-cell={accessor === titleCellAccessor ? 'true' : undefined}\n key={columnIndex}\n >\n {column.renderedCells?.[rowIndex] ?? null}\n </td>\n )\n })}\n </PageTreeRowDndProvider>\n </tr>\n )\n}\n\nfunction HierarchyTable({\n activeDragRowID,\n activeDragType,\n activeDropTarget,\n allDocsByID,\n canReorderRows,\n columns,\n data,\n isMovePending,\n titleCellAccessor,\n}: {\n activeDragRowID: null | string\n activeDragType: null | PageTreeDragType\n activeDropTarget: null | PageTreeDropTarget\n allDocsByID: ReadonlyMap<string, PageTreeDoc>\n canReorderRows: boolean\n columns: Column[]\n data: PageTreeDoc[]\n isMovePending: boolean\n titleCellAccessor: string\n}) {\n const activeColumns = React.useMemo(() => columns.filter((column) => column?.active), [columns])\n const sortableItems = React.useMemo(\n () => data.map((doc) => getSortableRowID(doc.__pageTreeID)),\n [data],\n )\n const sortingStrategy = React.useMemo(() => buildPageTreeSortingStrategy(data), [data])\n const insertDropTargets = React.useMemo(() => buildInsertDropTargets(data), [data])\n const insertDropTargetsByReferenceRowID = React.useMemo(\n () => new Map(insertDropTargets.map((dropTarget) => [dropTarget.referenceRowID, dropTarget])),\n [insertDropTargets],\n )\n const activeDropTargetID =\n activeDropTarget?.dropType === 'insert' ? activeDropTarget.dropID : null\n const activeDoc =\n activeDragType === 'move' && activeDragRowID ? (allDocsByID.get(activeDragRowID) ?? null) : null\n const rowDropValidationByID = React.useMemo(() => {\n if (!activeDoc) {\n return new Map<string, PageTreeDropValidation>()\n }\n\n return new Map(\n data.map((doc) => [\n doc.__pageTreeID,\n getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget: {\n dropType: 'row',\n insertAfterDropID: null,\n insertBeforeDropID: null,\n rowID: doc.__pageTreeID,\n },\n }),\n ]),\n )\n }, [activeDoc, allDocsByID, data])\n const insertDropValidationByID = React.useMemo(() => {\n if (!activeDoc) {\n return new Map<string, PageTreeDropValidation>()\n }\n\n return new Map(\n insertDropTargets.map((dropTarget) => [\n dropTarget.dropID,\n getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget,\n }),\n ]),\n )\n }, [activeDoc, allDocsByID, insertDropTargets])\n\n if (activeColumns.length === 0) {\n return <div>No columns selected</div>\n }\n\n return (\n <div\n className={[\n 'table-wrap pages-hierarchy-table',\n activeDoc ? 'pages-hierarchy-table--dragging' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"table table--appearance-default\">\n <table cellPadding=\"0\" cellSpacing=\"0\">\n <thead>\n <tr>\n {activeColumns.map((column, index) => (\n <th\n data-page-tree-title-cell={\n column.accessor === titleCellAccessor ? 'true' : undefined\n }\n id={`heading-${column.accessor.replace(/\\./g, '__')}`}\n key={index}\n >\n {column.Heading}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n <SortableContext items={sortableItems} strategy={sortingStrategy}>\n {data.map((doc, rowIndex) => {\n const rootInsertBeforeDropTarget =\n doc.__pageTreeParentID === null\n ? insertDropTargetsByReferenceRowID.get(doc.__pageTreeID)\n : undefined\n const rootInsertTargetIndex =\n rootInsertBeforeDropTarget !== undefined\n ? insertDropTargets.indexOf(rootInsertBeforeDropTarget)\n : -1\n const rootInsertAfterDropTarget =\n rootInsertTargetIndex >= 0\n ? insertDropTargets[rootInsertTargetIndex + 1]\n : undefined\n const isTrailingRootInsert =\n rootInsertAfterDropTarget === insertDropTargets[insertDropTargets.length - 1]\n const nextVisibleDoc = data[rowIndex + 1]\n const hasVisibleDescendantAfter =\n nextVisibleDoc?.__pageTreeAncestorIDs.includes(doc.__pageTreeID) ?? false\n\n return (\n <React.Fragment key={doc.__pageTreeID}>\n {rootInsertBeforeDropTarget ? (\n <HierarchyInsertRow\n activeColumnsCount={activeColumns.length}\n activeDragRowID={activeDoc ? activeDragRowID : null}\n activeDropTargetID={activeDropTargetID}\n dropTarget={rootInsertBeforeDropTarget}\n dropValidation={insertDropValidationByID.get(\n rootInsertBeforeDropTarget.dropID,\n )}\n isMovePending={isMovePending}\n key={rootInsertBeforeDropTarget.dropID}\n />\n ) : null}\n <HierarchyTableRow\n activeColumns={activeColumns}\n activeDragRowID={activeDragRowID}\n activeDragType={activeDragType}\n canReorderRows={canReorderRows}\n doc={doc}\n dropValidation={rowDropValidationByID.get(doc.__pageTreeID)}\n insertAfterDropID={\n hasVisibleDescendantAfter || isTrailingRootInsert\n ? null\n : (rootInsertAfterDropTarget?.dropID ?? null)\n }\n insertBeforeDropID={rootInsertBeforeDropTarget?.dropID ?? null}\n isMovePending={isMovePending}\n rowIndex={rowIndex}\n titleCellAccessor={titleCellAccessor}\n />\n </React.Fragment>\n )\n })}\n </SortableContext>\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport default function PageTreeListViewClient({\n allDocs,\n badgeConfig,\n canMoveDocs,\n columnState,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n query,\n sourceDocs,\n useAsTitle,\n ...props\n}: PageTreeListViewClientProps) {\n const router = useRouter()\n const searchParams = useSearchParams()\n const { config } = useConfig()\n const locale = useLocale()\n const { i18n } = useTranslation()\n const [activeDragRowID, setActiveDragRowID] = React.useState<null | string>(null)\n const [activeDragType, setActiveDragType] = React.useState<null | PageTreeDragType>(null)\n const [activeDropTarget, setActiveDropTarget] = React.useState<null | PageTreeDropTarget>(null)\n const [collapsedIDs, setCollapsedIDs] = React.useState<Set<string>>(() => new Set())\n const [optimisticOrderRowIDs, setOptimisticOrderRowIDs] = React.useState<null | string[]>(null)\n const [parentMoveEnabled, setParentMoveEnabled] = React.useState(false)\n const [pendingMoveRowID, setPendingMoveRowID] = React.useState<null | string>(null)\n const { getPreference, setPreference } = usePreferences()\n const parentMovePreferenceKey = React.useMemo(\n () => getParentMovePreferenceKey(props.collectionSlug),\n [props.collectionSlug],\n )\n\n const toggleRow = React.useCallback((rowID: string) => {\n setCollapsedIDs((currentState) => {\n const nextState = new Set(currentState)\n\n if (nextState.has(rowID)) {\n nextState.delete(rowID)\n } else {\n nextState.add(rowID)\n }\n\n return nextState\n })\n }, [])\n const handleParentMoveToggle = React.useCallback(() => {\n setParentMoveEnabled((currentValue) => {\n const nextValue = !currentValue\n\n void setPreference(parentMovePreferenceKey, nextValue)\n\n return nextValue\n })\n }, [parentMovePreferenceKey, setPreference])\n const currentSort = React.useMemo(() => {\n const searchParamSort = searchParams.getAll('sort')\n\n if (searchParamSort.length > 0) {\n return normalizeSort(searchParamSort)\n }\n\n return normalizeSort(query.sort as string | string[] | undefined)\n }, [query.sort, searchParams])\n const canReorderRows =\n canMoveDocs && isOrderableSortActive({ orderableFieldName, sort: currentSort })\n const currentLimit = React.useMemo(\n () =>\n normalizePositiveInt(\n searchParams.get('limit'),\n typeof query.limit === 'number' && query.limit > 0 ? query.limit : 10,\n ),\n [query.limit, searchParams],\n )\n const currentRequestedPage = React.useMemo(\n () =>\n normalizePositiveInt(\n searchParams.get('page'),\n typeof query.page === 'number' && query.page > 0 ? query.page : 1,\n ),\n [query.page, searchParams],\n )\n const liveAllDocs = React.useMemo(\n () =>\n buildPageTreeDocs(sourceDocs, {\n parentFieldSlug,\n sort: currentSort,\n }),\n [currentSort, parentFieldSlug, sourceDocs],\n )\n const collapseResetKey = React.useMemo(\n () => JSON.stringify([props.collectionSlug, props.viewType, searchParams.toString()]),\n [props.collectionSlug, props.viewType, searchParams],\n )\n const hierarchyValue = React.useMemo(\n () => ({\n activeDragRowID,\n canMoveDocs,\n collapsedIDs,\n parentMoveEnabled,\n pendingMoveRowID,\n toggleRow,\n }),\n [activeDragRowID, canMoveDocs, collapsedIDs, parentMoveEnabled, pendingMoveRowID, toggleRow],\n )\n\n React.useEffect(() => {\n let isMounted = true\n\n void getPreference<boolean>(parentMovePreferenceKey).then((storedValue) => {\n if (isMounted) {\n setParentMoveEnabled(storedValue === true)\n }\n })\n\n return () => {\n isMounted = false\n }\n }, [getPreference, parentMovePreferenceKey])\n\n React.useEffect(() => {\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n setCollapsedIDs(new Set())\n setOptimisticOrderRowIDs(null)\n }, [collapseResetKey])\n\n const visibleDocs = React.useMemo(\n () => getVisibleTreeDocs(liveAllDocs, collapsedIDs),\n [liveAllDocs, collapsedIDs],\n )\n const paginatedData = React.useMemo(\n () => buildPaginatedData(visibleDocs, currentLimit, currentRequestedPage),\n [currentLimit, currentRequestedPage, visibleDocs],\n )\n const paginatedDocs = paginatedData.docs as PageTreeDoc[]\n const paginatedServerOrderKey = React.useMemo(\n () => paginatedDocs.map((doc) => doc.__pageTreeID).join('\\0'),\n [paginatedDocs],\n )\n const displayedPaginatedDocs = React.useMemo(\n () => orderDocsByRowIDs(paginatedDocs, optimisticOrderRowIDs),\n [optimisticOrderRowIDs, paginatedDocs],\n )\n const displayedPaginatedData = React.useMemo(\n () => ({\n ...paginatedData,\n docs: displayedPaginatedDocs,\n }),\n [displayedPaginatedDocs, paginatedData],\n )\n\n React.useEffect(() => {\n setOptimisticOrderRowIDs(null)\n }, [paginatedServerOrderKey])\n\n const allDocsByID = React.useMemo(\n () => new Map(liveAllDocs.map((doc) => [doc.__pageTreeID, doc])),\n [liveAllDocs],\n )\n const paginatedDocsByID = React.useMemo(\n () => new Map(displayedPaginatedDocs.map((doc) => [doc.__pageTreeID, doc])),\n [displayedPaginatedDocs],\n )\n const renderedCellIndexByDocID = React.useMemo(\n () => new Map(allDocs.map((doc, index) => [doc.__pageTreeID, index])),\n [allDocs],\n )\n const normalizedColumnState = React.useMemo(\n () => ensureUseAsTitleColumn(columnState, useAsTitle),\n [columnState, useAsTitle],\n )\n const paginatedColumnState = React.useMemo(\n () => sliceColumnState(normalizedColumnState, displayedPaginatedDocs, renderedCellIndexByDocID),\n [displayedPaginatedDocs, normalizedColumnState, renderedCellIndexByDocID],\n )\n const tableColumns = React.useMemo(\n () =>\n buildTableColumns({\n badgeConfig,\n columnState: paginatedColumnState,\n docs: displayedPaginatedDocs,\n enableRowSelections: props.enableRowSelections,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n t: i18n.t,\n useAsTitle,\n }),\n [\n paginatedColumnState,\n displayedPaginatedDocs,\n badgeConfig,\n homeIndicatorEnabled,\n orderableFieldName,\n parentFieldSlug,\n props.enableRowSelections,\n i18n.t,\n useAsTitle,\n ],\n )\n const activeDragDoc = activeDragRowID ? (paginatedDocsByID.get(activeDragRowID) ?? null) : null\n const activeDragPreviewPath = React.useMemo(() => {\n if (!activeDragDoc || activeDragType !== 'move') {\n return null\n }\n\n if (!activeDropTarget) {\n return buildDocSlugPath({\n doc: activeDragDoc,\n docsByID: allDocsByID,\n })\n }\n\n const targetDoc = getDropTargetParentDoc({\n docsByID: allDocsByID,\n dropTarget: activeDropTarget,\n })\n const dropValidation = getDropTargetValidation({\n activeDoc: activeDragDoc,\n docsByID: allDocsByID,\n dropTarget: activeDropTarget,\n })\n\n if (!dropValidation.isValid) {\n return buildDocSlugPath({\n doc: activeDragDoc,\n docsByID: allDocsByID,\n })\n }\n\n return buildProspectiveDocSlugPath({\n activeDoc: activeDragDoc,\n docsByID: allDocsByID,\n targetDoc: targetDoc ?? undefined,\n })\n }, [activeDragDoc, activeDragType, activeDropTarget, allDocsByID])\n const isMovePending = pendingMoveRowID !== null\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 2,\n },\n }),\n )\n const handleDragCancel = React.useCallback(() => {\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n }, [])\n const handleDragStart = React.useCallback(\n (event: DragStartEvent) => {\n if (!canMoveDocs || isMovePending) {\n return\n }\n\n const dragData = getPageTreeDragData(event.active.data.current)\n const { dragType, rowID } = dragData\n\n if (\n typeof rowID === 'string' &&\n dragType &&\n paginatedDocsByID.has(rowID) &&\n (dragType !== 'order' || canReorderRows)\n ) {\n setActiveDragRowID(rowID)\n setActiveDragType(dragType)\n setActiveDropTarget(null)\n }\n },\n [canMoveDocs, canReorderRows, isMovePending, paginatedDocsByID],\n )\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const dragData = getPageTreeDragData(event.active.data.current)\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\n\n if (dragData.dragType === 'order') {\n setActiveDropTarget(null)\n return\n }\n\n if (dragData.dragType !== 'move' || !overData) {\n setActiveDropTarget(null)\n return\n }\n\n if (overData.dropType === 'insert') {\n setActiveDropTarget(overData)\n return\n }\n\n if (overData.dropType === 'row') {\n setActiveDropTarget(overData)\n return\n }\n\n setActiveDropTarget(null)\n }, [])\n const handleDragEnd = React.useCallback(\n async (event: DragEndEvent) => {\n const dragData = getPageTreeDragData(event.active.data.current)\n const { dragType, rowID } = dragData\n const activeDoc = typeof rowID === 'string' ? (paginatedDocsByID.get(rowID) ?? null) : null\n const overData = event.over?.data.current as PageTreeDropTarget | undefined\n const overDragData = getPageTreeDragData(event.over?.data.current)\n\n setActiveDragRowID(null)\n setActiveDragType(null)\n setActiveDropTarget(null)\n\n if (dragType === 'order') {\n if (typeof rowID === 'string' && typeof overDragData.rowID === 'string') {\n const nextOrderRowIDs = buildOptimisticOrderRowIDs({\n activeRowID: rowID,\n docs: displayedPaginatedDocs,\n targetRowID: overDragData.rowID,\n })\n const reorderRequestBody = buildReorderRequestBody({\n activeRowID: rowID,\n docs: displayedPaginatedDocs,\n orderableFieldName,\n sort: currentSort,\n targetRowID: overDragData.rowID,\n })\n\n if (!nextOrderRowIDs || !reorderRequestBody) {\n return\n }\n\n const apiRoute = config.routes.api\n const params = new URLSearchParams()\n\n if (locale?.code) {\n params.set('locale', locale.code)\n }\n\n setOptimisticOrderRowIDs(nextOrderRowIDs)\n setPendingMoveRowID(rowID)\n\n try {\n const response = await fetch(\n `${apiRoute}/${props.collectionSlug}/${encodeURIComponent(rowID)}/reorder${\n params.size > 0 ? `?${params.toString()}` : ''\n }`,\n {\n body: JSON.stringify(reorderRequestBody),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n const result = (await response.json().catch(() => null)) as {\n message?: string\n } | null\n\n if (!response.ok) {\n setOptimisticOrderRowIDs(null)\n toast.error(result?.message ?? 'Could not reorder document.')\n return\n }\n\n if (result?.message === 'initial migration') {\n setOptimisticOrderRowIDs(null)\n }\n\n React.startTransition(() => {\n router.refresh()\n })\n } catch (error) {\n const message =\n error instanceof Error && error.message\n ? error.message\n : 'Could not reorder document.'\n\n setOptimisticOrderRowIDs(null)\n toast.error(message)\n } finally {\n setPendingMoveRowID(null)\n }\n }\n\n return\n }\n\n if (dragType !== 'move' || typeof rowID !== 'string' || !activeDoc || !overData) {\n return\n }\n\n const dropValidation = getDropTargetValidation({\n activeDoc,\n docsByID: allDocsByID,\n dropTarget: overData,\n })\n\n if (!dropValidation.isValid) {\n if (!shouldSilenceMoveMessage(dropValidation.message)) {\n toast.error(dropValidation.message ?? 'Could not move document.')\n }\n\n return\n }\n\n if (\n overData.dropType === 'insert' &&\n activeDoc.__pageTreeParentID === dropValidation.parentID\n ) {\n return\n }\n\n const apiRoute = config.routes.api\n const params = new URLSearchParams()\n\n if (locale?.code) {\n params.set('locale', locale.code)\n }\n\n setPendingMoveRowID(rowID)\n\n try {\n const response = await fetch(\n `${apiRoute}/${props.collectionSlug}/${encodeURIComponent(rowID)}/move${\n params.size > 0 ? `?${params.toString()}` : ''\n }`,\n {\n body: JSON.stringify({\n parentID: dropValidation.parentID,\n }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n const result = (await response.json().catch(() => null)) as {\n message?: string\n } | null\n\n if (!response.ok) {\n if (shouldSilenceMoveMessage(result?.message)) {\n return\n }\n\n toast.error(result?.message ?? 'Could not move document.')\n return\n }\n\n toast.success(`Moved \"${getDocDisplayLabel(activeDoc)}\".`)\n React.startTransition(() => {\n router.refresh()\n })\n } catch (error) {\n const message =\n error instanceof Error && error.message ? error.message : 'Could not move document.'\n\n toast.error(message)\n } finally {\n setPendingMoveRowID(null)\n }\n },\n [\n allDocsByID,\n config.routes.api,\n currentSort,\n displayedPaginatedDocs,\n i18n.language,\n locale?.code,\n orderableFieldName,\n paginatedDocsByID,\n props.collectionSlug,\n router,\n ],\n )\n const handleDragEndSync = React.useCallback(\n (event: DragEndEvent) => {\n void handleDragEnd(event)\n },\n [handleDragEnd],\n )\n\n const tableNode = React.useMemo(\n () => (\n <DndContext\n collisionDetection={pageTreeCollisionDetectionStrategy}\n onDragCancel={handleDragCancel}\n onDragEnd={handleDragEndSync}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n sensors={sensors}\n >\n <HierarchyTable\n activeDragRowID={activeDragRowID}\n activeDragType={activeDragType}\n activeDropTarget={activeDropTarget}\n allDocsByID={allDocsByID}\n canReorderRows={canReorderRows}\n columns={tableColumns}\n data={displayedPaginatedDocs}\n isMovePending={isMovePending}\n titleCellAccessor={useAsTitle}\n />\n <DragOverlay dropAnimation={null} style={{ cursor: 'grabbing' }}>\n {activeDragPreviewPath ? (\n <div className=\"pages-hierarchy-drag-overlay\">{activeDragPreviewPath}</div>\n ) : null}\n </DragOverlay>\n </DndContext>\n ),\n [\n activeDragPreviewPath,\n activeDragRowID,\n activeDragType,\n activeDropTarget,\n allDocsByID,\n canReorderRows,\n displayedPaginatedDocs,\n handleDragCancel,\n handleDragEndSync,\n handleDragOver,\n handleDragStart,\n isMovePending,\n sensors,\n tableColumns,\n useAsTitle,\n ],\n )\n const beforeActions = React.useMemo(() => {\n const actions = props.beforeActions ? [...props.beforeActions] : []\n\n if (canMoveDocs) {\n actions.unshift(\n <ParentMoveToggle\n collectionSlug={props.collectionSlug}\n enabled={parentMoveEnabled}\n key=\"parent-move-toggle\"\n onToggle={handleParentMoveToggle}\n />,\n )\n }\n\n return actions.length > 0 ? actions : undefined\n }, [\n canMoveDocs,\n handleParentMoveToggle,\n parentMoveEnabled,\n props.beforeActions,\n props.collectionSlug,\n ])\n\n return (\n <div className={styles.root}>\n <PageTreeProvider value={hierarchyValue}>\n <ListQueryProvider\n collectionSlug={props.collectionSlug}\n data={displayedPaginatedData}\n modifySearchParams\n orderableFieldName={orderableFieldName}\n query={{\n ...query,\n limit: currentLimit,\n page: displayedPaginatedData.page,\n sort: currentSort,\n }}\n >\n <DefaultListView\n {...props}\n beforeActions={beforeActions}\n columnState={paginatedColumnState}\n Table={tableNode}\n />\n </ListQueryProvider>\n </PageTreeProvider>\n </div>\n )\n}\n"],"names":["DndContext","DragOverlay","PointerSensor","useDroppable","useSensor","useSensors","arrayMove","SortableContext","useSortable","DefaultListView","ListQueryProvider","Pill","SelectAll","SelectRow","SortHeader","toast","useConfig","useLocale","usePreferences","useTranslation","useWindowInfo","useRouter","useSearchParams","React","createPortal","buildInsertDropTargets","getDropTargetParentDoc","CANCEL_DRAG_MESSAGE","getDropValidation","buildDocSlugPath","buildPageTreeDocs","buildProspectiveDocSlugPath","getDocDisplayLabel","getVisibleTreeDocs","pageTreeCollisionDetectionStrategy","getPageTreeBadgeColor","getPageTreeBadgeLabel","getPageTreeDisplayStatus","PageTreeProvider","PageTreeRowDndProvider","styles","PageTreeTitleCell","SILENT_MOVE_MESSAGES","Set","ALREADY_ROOT_MESSAGE","getParentMovePreferenceKey","collectionSlug","getRowDropID","rowID","getSortableRowID","getDiagnosticString","value","length","getPageTreeDragData","data","dragType","undefined","parentID","getSortableTransform","transform","scaleX","scaleY","x","y","getVisibleSubtreeIndexRange","docs","rootIndex","rootDoc","end","index","__pageTreeAncestorIDs","includes","__pageTreeID","start","getRangeRect","args","activeNodeRect","activeRange","range","rects","firstRect","lastRect","bottom","top","height","isIndexInRange","buildPageTreeSortingStrategy","activeIndex","overIndex","overRange","activeRect","overRect","buildPaginatedData","limit","requestedPage","totalDocs","totalPages","Math","max","ceil","page","min","startIndex","pageDocs","slice","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage","normalizeSort","Array","isArray","sortValues","filter","entry","join","normalizePositiveInt","fallback","parsedValue","Number","parseInt","isNaN","isOrderableSortActive","orderableFieldName","sort","Boolean","ensureUseAsTitleColumn","columnState","useAsTitle","map","column","accessor","active","sliceColumnState","renderedCellIndexByDocID","renderedCells","doc","renderedCellIndex","get","__pageTreeOrderIndex","getSelectableRowData","record","id","String","_isLocked","_userEditing","shouldSilenceMoveMessage","message","has","getVisibleSubtreeRowIDs","findIndex","rowIDs","push","buildOptimisticOrderRowIDs","activeRowID","targetRowID","activeDoc","find","targetDoc","__pageTreeParentID","activeBlockIDs","targetBlockIDs","currentRowIDs","indexOf","targetIndex","remainingRowIDs","targetAnchorID","targetAnchorIndex","insertIndex","buildReorderRequestBody","siblingDocs","moveFromIndex","moveToIndex","newBeforeRow","newAfterRow","target","getFrontendOrderEntry","orderKey","slug","siblingDocsAfter","movedSiblingDoc","splice","targetKey","newKeyWillBe","docsToMove","frontendOrder","activeSlug","after","before","newAfterRowSlug","newBeforeRowSlug","targetSlug","key","orderDocsByRowIDs","orderRowIDs","docsByID","Map","orderedDocs","flatMap","getDropTargetValidation","dropTarget","dropType","isValid","getStatusClassName","status","renderStatusBadge","badgeConfig","t","customColor","badgeColors","colors","statusClass","style","span","className","data-custom-color","badgeLabels","labels","ParentMoveToggle","enabled","onToggle","breakpoints","s","smallBreak","mobileActions","setMobileActions","useState","setMobileMount","useCallback","node","closest","querySelector","toggle","aria-checked","aria-label","onClick","pillStyle","size","hidden","ref","buildTableColumns","enableRowSelections","homeIndicatorEnabled","parentFieldSlug","columnsToUse","unshift","field","Heading","rowData","orderableColumn","aria-hidden","selectColumnIndex","HierarchyInsertRow","activeColumnsCount","activeDragRowID","activeDropTargetID","dropValidation","isMovePending","isOver","setNodeRef","dropID","disabled","hasActiveDrag","showInsertLine","tr","data-drag-over","data-drop-valid","data-page-tree-insert","td","colSpan","div","data-insert-depth","depth","HierarchyTableRow","activeColumns","activeDragType","canReorderRows","insertAfterDropID","insertBeforeDropID","rowIndex","titleCellAccessor","sortable","hasActiveMoveDrag","isActiveDragRow","setRowRef","element","rowDndValue","useMemo","isOrderDragging","isDragging","orderHandleAttributes","attributes","orderHandleListeners","listeners","orderHandleRef","setActivatorNodeRef","sortableStyle","position","transition","zIndex","data-id","data-is-drag-source","data-is-order-drag-source","data-page-tree-row","columnIndex","replace","data-page-tree-title-cell","HierarchyTable","activeDropTarget","allDocsByID","columns","sortableItems","sortingStrategy","insertDropTargets","insertDropTargetsByReferenceRowID","referenceRowID","rowDropValidationByID","insertDropValidationByID","table","cellPadding","cellSpacing","thead","th","tbody","items","strategy","rootInsertBeforeDropTarget","rootInsertTargetIndex","rootInsertAfterDropTarget","isTrailingRootInsert","nextVisibleDoc","hasVisibleDescendantAfter","Fragment","PageTreeListViewClient","allDocs","canMoveDocs","query","sourceDocs","props","router","searchParams","config","locale","i18n","setActiveDragRowID","setActiveDragType","setActiveDropTarget","collapsedIDs","setCollapsedIDs","optimisticOrderRowIDs","setOptimisticOrderRowIDs","parentMoveEnabled","setParentMoveEnabled","pendingMoveRowID","setPendingMoveRowID","getPreference","setPreference","parentMovePreferenceKey","toggleRow","currentState","nextState","delete","add","handleParentMoveToggle","currentValue","nextValue","currentSort","searchParamSort","getAll","currentLimit","currentRequestedPage","liveAllDocs","collapseResetKey","JSON","stringify","viewType","toString","hierarchyValue","useEffect","isMounted","then","storedValue","visibleDocs","paginatedData","paginatedDocs","paginatedServerOrderKey","displayedPaginatedDocs","displayedPaginatedData","paginatedDocsByID","normalizedColumnState","paginatedColumnState","tableColumns","activeDragDoc","activeDragPreviewPath","sensors","activationConstraint","distance","handleDragCancel","handleDragStart","event","dragData","current","handleDragOver","overData","over","handleDragEnd","overDragData","nextOrderRowIDs","reorderRequestBody","apiRoute","routes","api","params","URLSearchParams","code","set","response","fetch","encodeURIComponent","body","credentials","headers","language","method","result","json","catch","ok","error","startTransition","refresh","Error","success","handleDragEndSync","tableNode","collisionDetection","onDragCancel","onDragEnd","onDragOver","onDragStart","dropAnimation","cursor","beforeActions","actions","root","modifySearchParams","Table"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { createReorderPageEndpoint } from './endpoints/createReorderPageEndpoint
3
3
  import { nestedDocsPageTreePluginCustomKey, pageTreeWriteContextKey } from './types.js';
4
4
  import { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js';
5
5
  import { DIAGNOSTICS_FLOW_CONTEXT_KEY, createFlowID, projectField, resolveDiagnostics } from './utilities/diagnostics.js';
6
+ import { findTopLevelField, mapTopLevelFields } from './utilities/fields.js';
6
7
  const DEFAULT_BREADCRUMBS_FIELD_SLUG = 'breadcrumbs';
7
8
  const DEFAULT_HOME_INDICATOR_COLLECTIONS = [
8
9
  'pages'
@@ -85,9 +86,6 @@ const PAGE_TREE_LIST_VIEW_PATH = 'payload-nested-docs-page-tree/rsc#NestedDocsPa
85
86
  return doc;
86
87
  };
87
88
  }
88
- function getTopLevelField(collection, fieldName) {
89
- return collection.fields.find((field)=>'name' in field && field.name === fieldName);
90
- }
91
89
  function getCollectionEndpoints(collection) {
92
90
  return Array.isArray(collection.endpoints) ? [
93
91
  ...collection.endpoints
@@ -111,13 +109,13 @@ function validateTargetCollection(args) {
111
109
  if (typeof collection.admin?.useAsTitle !== 'string' || collection.admin.useAsTitle.includes('.')) {
112
110
  throw new Error(`payload-nested-docs-page-tree requires "${collection.slug}" to define a top-level admin.useAsTitle field.`);
113
111
  }
114
- if (!getTopLevelField(collection, collection.admin.useAsTitle)) {
115
- throw new Error(`payload-nested-docs-page-tree could not find the useAsTitle field "${collection.admin.useAsTitle}" on "${collection.slug}".`);
112
+ if (!findTopLevelField(collection.fields, collection.admin.useAsTitle)) {
113
+ throw new Error(`payload-nested-docs-page-tree could not find the useAsTitle field "${collection.admin.useAsTitle}" on "${collection.slug}". Fields inside tabs, rows, collapsibles, and unnamed groups are supported; fields inside a named tab or named group are not top-level.`);
116
114
  }
117
- if (!getTopLevelField(collection, parentFieldSlug)) {
115
+ if (!findTopLevelField(collection.fields, parentFieldSlug)) {
118
116
  throw new Error(`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.`);
119
117
  }
120
- if (!getTopLevelField(collection, breadcrumbsFieldSlug)) {
118
+ if (!findTopLevelField(collection.fields, breadcrumbsFieldSlug)) {
121
119
  throw new Error(`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.`);
122
120
  }
123
121
  const existingListView = collection.admin?.components?.views?.list?.Component;
@@ -237,7 +235,7 @@ export const nestedDocsPageTreePlugin = (pluginOptions)=>(config)=>{
237
235
  })
238
236
  ] : []
239
237
  ],
240
- fields: collection.fields.map((field)=>patchBreadcrumbField({
238
+ fields: mapTopLevelFields(collection.fields, (field)=>patchBreadcrumbField({
241
239
  breadcrumbsFieldSlug,
242
240
  field,
243
241
  hideBreadcrumbs
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js'\nimport { createReorderPageEndpoint } from './endpoints/createReorderPageEndpoint.js'\nimport type {\n NestedDocsPageTreePluginCollectionCustom,\n NestedDocsPageTreePluginConfig,\n} from './types.js'\nimport { nestedDocsPageTreePluginCustomKey, pageTreeWriteContextKey } from './types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js'\nimport {\n DIAGNOSTICS_FLOW_CONTEXT_KEY,\n type Diagnostics,\n createFlowID,\n projectField,\n resolveDiagnostics,\n} from './utilities/diagnostics.js'\n\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\n/**\n * When diagnostics are enabled this hook emits a structured event for each\n * page-tree-tagged create/update, including a small before/after diff of the\n * fields most relevant to tree publish/draft regressions.\n */\nfunction createDiagnosticsAfterChangeHook(args: {\n collectionSlug: string\n diagnostics: Diagnostics\n orderableFieldName: null | string\n parentFieldSlug: string\n}): CollectionAfterChangeHook {\n const { collectionSlug, diagnostics, orderableFieldName, parentFieldSlug } = args\n const snapshotFields: string[] = ['_status', parentFieldSlug]\n\n if (orderableFieldName) {\n snapshotFields.push(orderableFieldName)\n }\n\n return async ({ doc, operation, previousDoc, req }) => {\n if (!diagnostics.enabled) {\n return doc\n }\n\n if (operation !== 'update' && operation !== 'create') {\n return doc\n }\n\n // Gated on the write flag, not the deploy opt-out flag: a published move\n // withholds the latter, and that is the case most worth tracing.\n if (!req.context?.[pageTreeWriteContextKey]) {\n return doc\n }\n\n const docID = (doc as Record<string, unknown>)?.id\n\n if (typeof docID !== 'string' && typeof docID !== 'number') {\n return doc\n }\n\n const flow =\n (req.context?.[DIAGNOSTICS_FLOW_CONTEXT_KEY] as string | undefined) ??\n createFlowID('page-tree-change')\n const before: Record<string, unknown> = {}\n const after: Record<string, unknown> = {}\n const changed: string[] = []\n\n for (const field of snapshotFields) {\n const beforeValue = projectField((previousDoc as Record<string, unknown> | undefined)?.[field])\n const afterValue = projectField((doc as Record<string, unknown>)?.[field])\n\n before[field] = beforeValue\n after[field] = afterValue\n\n if (JSON.stringify(beforeValue) !== JSON.stringify(afterValue)) {\n changed.push(field)\n }\n }\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n after,\n before,\n changed,\n docID: String(docID),\n operation,\n },\n flow,\n level: 'info',\n message: `${operation} on ${collectionSlug}#${String(docID)}`,\n source: 'page-tree-change:after',\n })\n\n const beforeStatus = (previousDoc as Record<string, unknown> | undefined)?._status\n const afterStatus = (doc as Record<string, unknown>)?._status\n\n if (beforeStatus === 'published' && afterStatus !== 'published') {\n diagnostics.log({\n collection: collectionSlug,\n data: {\n afterStatus,\n beforeStatus,\n docID: String(docID),\n },\n flow,\n level: 'warn',\n message: `Published doc was demoted to \"${String(afterStatus ?? 'missing')}\" by a page-tree operation. Inspect the move-endpoint:enter/ok snapshots in flow ${flow} to confirm whether the main row was touched.`,\n source: 'page-tree-change:status-flip',\n })\n }\n\n return doc\n }\n}\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 const existingReorderEndpoint = getCollectionEndpoints(collection).find(\n (endpoint) => endpoint.path === '/:id/reorder',\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 if (existingReorderEndpoint) {\n throw new Error(\n `payload-nested-docs-page-tree cannot add the reorder endpoint to \"${collection.slug}\" because the collection already defines POST /:id/reorder.`,\n )\n }\n}\n\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\nexport type {\n NestedDocsPageTreePluginBadgeConfig,\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n NestedDocsPageTreePluginConfig,\n NestedDocsPageTreePluginHomeIndicatorConfig,\n PageTreeMoveContext,\n} from './types.js'\n\nexport { pageTreeMoveContextKey } 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 publishOnMove = pluginOptions.publishOnMove ?? false\n const badges = normalizeNestedDocsPageTreePluginBadgeConfig(pluginOptions.badges)\n const diagnostics = resolveDiagnostics(pluginOptions.diagnostics)\n const homeIndicatorCollectionSlugs = getHomeIndicatorCollectionSlugs(\n pluginOptions.homeIndicator,\n )\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 const orderableFieldName =\n typeof collection.orderable === 'string'\n ? collection.orderable\n : collection.orderable\n ? '_order'\n : null\n const diagnosticsAfterChangeHook = diagnostics.enabled\n ? createDiagnosticsAfterChangeHook({\n collectionSlug: collection.slug,\n diagnostics,\n orderableFieldName,\n parentFieldSlug,\n })\n : null\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 homeIndicator: {\n enabled: homeIndicatorCollectionSlugs.has(collection.slug),\n },\n parentFieldSlug,\n }),\n },\n endpoints: [\n ...getCollectionEndpoints(collection),\n createMovePageEndpoint({\n collectionSlug: collection.slug,\n diagnostics,\n parentFieldSlug,\n publishOnMove,\n }),\n ...(orderableFieldName\n ? [\n createReorderPageEndpoint({\n collectionSlug: collection.slug,\n diagnostics,\n orderableFieldName,\n parentFieldSlug,\n }),\n ]\n : []),\n ],\n fields: collection.fields.map((field) =>\n patchBreadcrumbField({\n breadcrumbsFieldSlug,\n field,\n hideBreadcrumbs,\n }),\n ),\n hooks: {\n ...(collection.hooks ?? {}),\n ...(diagnosticsAfterChangeHook\n ? {\n afterChange: [\n ...(collection.hooks?.afterChange ?? []),\n diagnosticsAfterChangeHook,\n ],\n }\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","createReorderPageEndpoint","nestedDocsPageTreePluginCustomKey","pageTreeWriteContextKey","normalizeNestedDocsPageTreePluginBadgeConfig","DIAGNOSTICS_FLOW_CONTEXT_KEY","createFlowID","projectField","resolveDiagnostics","DEFAULT_BREADCRUMBS_FIELD_SLUG","DEFAULT_HOME_INDICATOR_COLLECTIONS","DEFAULT_LIMIT","DEFAULT_PARENT_FIELD_SLUG","PAGE_TREE_LIST_VIEW_PATH","createDiagnosticsAfterChangeHook","args","collectionSlug","diagnostics","orderableFieldName","parentFieldSlug","snapshotFields","push","doc","operation","previousDoc","req","enabled","context","docID","id","flow","before","after","changed","field","beforeValue","afterValue","JSON","stringify","log","collection","data","String","level","message","source","beforeStatus","_status","afterStatus","getTopLevelField","fieldName","fields","find","name","getCollectionEndpoints","Array","isArray","endpoints","patchBreadcrumbField","breadcrumbsFieldSlug","hideBreadcrumbs","admin","hidden","validateTargetCollection","useAsTitle","includes","Error","slug","existingListView","components","views","list","Component","existingMoveEndpoint","endpoint","path","existingReorderEndpoint","buildCollectionCustom","badges","defaultLimit","homeIndicator","getHomeIndicatorCollectionSlugs","Set","collections","pageTreeMoveContextKey","nestedDocsPageTreePlugin","pluginOptions","config","length","disabled","publishOnMove","homeIndicatorCollectionSlugs","targetedCollectionSlugs","foundCollectionSlugs","nextCollections","map","has","add","orderable","diagnosticsAfterChangeHook","pagination","undefined","custom","hooks","afterChange","missingCollections","filter","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport { createMovePageEndpoint } from './endpoints/createMovePageEndpoint.js'\nimport { createReorderPageEndpoint } from './endpoints/createReorderPageEndpoint.js'\nimport type {\n NestedDocsPageTreePluginCollectionCustom,\n NestedDocsPageTreePluginConfig,\n} from './types.js'\nimport { nestedDocsPageTreePluginCustomKey, pageTreeWriteContextKey } from './types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './utilities/badgeConfig.js'\nimport {\n DIAGNOSTICS_FLOW_CONTEXT_KEY,\n type Diagnostics,\n createFlowID,\n projectField,\n resolveDiagnostics,\n} from './utilities/diagnostics.js'\nimport { findTopLevelField, mapTopLevelFields } from './utilities/fields.js'\n\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\n/**\n * When diagnostics are enabled this hook emits a structured event for each\n * page-tree-tagged create/update, including a small before/after diff of the\n * fields most relevant to tree publish/draft regressions.\n */\nfunction createDiagnosticsAfterChangeHook(args: {\n collectionSlug: string\n diagnostics: Diagnostics\n orderableFieldName: null | string\n parentFieldSlug: string\n}): CollectionAfterChangeHook {\n const { collectionSlug, diagnostics, orderableFieldName, parentFieldSlug } = args\n const snapshotFields: string[] = ['_status', parentFieldSlug]\n\n if (orderableFieldName) {\n snapshotFields.push(orderableFieldName)\n }\n\n return async ({ doc, operation, previousDoc, req }) => {\n if (!diagnostics.enabled) {\n return doc\n }\n\n if (operation !== 'update' && operation !== 'create') {\n return doc\n }\n\n // Gated on the write flag, not the deploy opt-out flag: a published move\n // withholds the latter, and that is the case most worth tracing.\n if (!req.context?.[pageTreeWriteContextKey]) {\n return doc\n }\n\n const docID = (doc as Record<string, unknown>)?.id\n\n if (typeof docID !== 'string' && typeof docID !== 'number') {\n return doc\n }\n\n const flow =\n (req.context?.[DIAGNOSTICS_FLOW_CONTEXT_KEY] as string | undefined) ??\n createFlowID('page-tree-change')\n const before: Record<string, unknown> = {}\n const after: Record<string, unknown> = {}\n const changed: string[] = []\n\n for (const field of snapshotFields) {\n const beforeValue = projectField((previousDoc as Record<string, unknown> | undefined)?.[field])\n const afterValue = projectField((doc as Record<string, unknown>)?.[field])\n\n before[field] = beforeValue\n after[field] = afterValue\n\n if (JSON.stringify(beforeValue) !== JSON.stringify(afterValue)) {\n changed.push(field)\n }\n }\n\n diagnostics.log({\n collection: collectionSlug,\n data: {\n after,\n before,\n changed,\n docID: String(docID),\n operation,\n },\n flow,\n level: 'info',\n message: `${operation} on ${collectionSlug}#${String(docID)}`,\n source: 'page-tree-change:after',\n })\n\n const beforeStatus = (previousDoc as Record<string, unknown> | undefined)?._status\n const afterStatus = (doc as Record<string, unknown>)?._status\n\n if (beforeStatus === 'published' && afterStatus !== 'published') {\n diagnostics.log({\n collection: collectionSlug,\n data: {\n afterStatus,\n beforeStatus,\n docID: String(docID),\n },\n flow,\n level: 'warn',\n message: `Published doc was demoted to \"${String(afterStatus ?? 'missing')}\" by a page-tree operation. Inspect the move-endpoint:enter/ok snapshots in flow ${flow} to confirm whether the main row was touched.`,\n source: 'page-tree-change:status-flip',\n })\n }\n\n return doc\n }\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 (!findTopLevelField(collection.fields, 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}\". Fields inside tabs, rows, collapsibles, and unnamed groups are supported; fields inside a named tab or named group are not top-level.`,\n )\n }\n\n if (!findTopLevelField(collection.fields, 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 (!findTopLevelField(collection.fields, 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 const existingReorderEndpoint = getCollectionEndpoints(collection).find(\n (endpoint) => endpoint.path === '/:id/reorder',\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 if (existingReorderEndpoint) {\n throw new Error(\n `payload-nested-docs-page-tree cannot add the reorder endpoint to \"${collection.slug}\" because the collection already defines POST /:id/reorder.`,\n )\n }\n}\n\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\nexport type {\n NestedDocsPageTreePluginBadgeConfig,\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n NestedDocsPageTreePluginConfig,\n NestedDocsPageTreePluginHomeIndicatorConfig,\n PageTreeMoveContext,\n} from './types.js'\n\nexport { pageTreeMoveContextKey } 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 publishOnMove = pluginOptions.publishOnMove ?? false\n const badges = normalizeNestedDocsPageTreePluginBadgeConfig(pluginOptions.badges)\n const diagnostics = resolveDiagnostics(pluginOptions.diagnostics)\n const homeIndicatorCollectionSlugs = getHomeIndicatorCollectionSlugs(\n pluginOptions.homeIndicator,\n )\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 const orderableFieldName =\n typeof collection.orderable === 'string'\n ? collection.orderable\n : collection.orderable\n ? '_order'\n : null\n const diagnosticsAfterChangeHook = diagnostics.enabled\n ? createDiagnosticsAfterChangeHook({\n collectionSlug: collection.slug,\n diagnostics,\n orderableFieldName,\n parentFieldSlug,\n })\n : null\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 homeIndicator: {\n enabled: homeIndicatorCollectionSlugs.has(collection.slug),\n },\n parentFieldSlug,\n }),\n },\n endpoints: [\n ...getCollectionEndpoints(collection),\n createMovePageEndpoint({\n collectionSlug: collection.slug,\n diagnostics,\n parentFieldSlug,\n publishOnMove,\n }),\n ...(orderableFieldName\n ? [\n createReorderPageEndpoint({\n collectionSlug: collection.slug,\n diagnostics,\n orderableFieldName,\n parentFieldSlug,\n }),\n ]\n : []),\n ],\n fields: mapTopLevelFields(collection.fields, (field) =>\n patchBreadcrumbField({\n breadcrumbsFieldSlug,\n field,\n hideBreadcrumbs,\n }),\n ),\n hooks: {\n ...(collection.hooks ?? {}),\n ...(diagnosticsAfterChangeHook\n ? {\n afterChange: [\n ...(collection.hooks?.afterChange ?? []),\n diagnosticsAfterChangeHook,\n ],\n }\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","createReorderPageEndpoint","nestedDocsPageTreePluginCustomKey","pageTreeWriteContextKey","normalizeNestedDocsPageTreePluginBadgeConfig","DIAGNOSTICS_FLOW_CONTEXT_KEY","createFlowID","projectField","resolveDiagnostics","findTopLevelField","mapTopLevelFields","DEFAULT_BREADCRUMBS_FIELD_SLUG","DEFAULT_HOME_INDICATOR_COLLECTIONS","DEFAULT_LIMIT","DEFAULT_PARENT_FIELD_SLUG","PAGE_TREE_LIST_VIEW_PATH","createDiagnosticsAfterChangeHook","args","collectionSlug","diagnostics","orderableFieldName","parentFieldSlug","snapshotFields","push","doc","operation","previousDoc","req","enabled","context","docID","id","flow","before","after","changed","field","beforeValue","afterValue","JSON","stringify","log","collection","data","String","level","message","source","beforeStatus","_status","afterStatus","getCollectionEndpoints","Array","isArray","endpoints","patchBreadcrumbField","breadcrumbsFieldSlug","hideBreadcrumbs","name","admin","hidden","validateTargetCollection","useAsTitle","includes","Error","slug","fields","existingListView","components","views","list","Component","existingMoveEndpoint","find","endpoint","path","existingReorderEndpoint","buildCollectionCustom","badges","defaultLimit","homeIndicator","getHomeIndicatorCollectionSlugs","Set","collections","pageTreeMoveContextKey","nestedDocsPageTreePlugin","pluginOptions","config","length","disabled","publishOnMove","homeIndicatorCollectionSlugs","targetedCollectionSlugs","foundCollectionSlugs","nextCollections","map","has","add","orderable","diagnosticsAfterChangeHook","pagination","undefined","custom","hooks","afterChange","missingCollections","filter","join"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Field } from 'payload';
2
+ /**
3
+ * Finds the field stored under `fieldName` at the top level of the document,
4
+ * looking through presentational containers such as tabs and rows.
5
+ */
6
+ export declare function findTopLevelField(fields: Field[], fieldName: string): Field | undefined;
7
+ /**
8
+ * Maps `mapField` over every field stored at the top level of the document,
9
+ * rebuilding presentational containers so nested fields are patched in place.
10
+ */
11
+ export declare function mapTopLevelFields(fields: Field[], mapField: (field: Field) => Field): Field[];
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Rows, collapsibles, unnamed groups, and unnamed tabs are presentational
3
+ * only: Payload stores their children directly on the document, so a field
4
+ * nested inside one is still a top-level field as far as the data is
5
+ * concerned. Named groups and named tabs nest their children under their own
6
+ * key, so traversal stops at those.
7
+ */ function getPresentationalChildFields(field) {
8
+ if (field.type === 'row' || field.type === 'collapsible') {
9
+ return field.fields;
10
+ }
11
+ if (field.type === 'group' && !('name' in field)) {
12
+ return field.fields;
13
+ }
14
+ if (field.type === 'tabs') {
15
+ return field.tabs.flatMap((tab)=>'name' in tab ? [] : tab.fields);
16
+ }
17
+ return null;
18
+ }
19
+ /**
20
+ * Finds the field stored under `fieldName` at the top level of the document,
21
+ * looking through presentational containers such as tabs and rows.
22
+ */ export function findTopLevelField(fields, fieldName) {
23
+ for (const field of fields){
24
+ if ('name' in field && field.name === fieldName) {
25
+ return field;
26
+ }
27
+ const childFields = getPresentationalChildFields(field);
28
+ if (childFields) {
29
+ const match = findTopLevelField(childFields, fieldName);
30
+ if (match) {
31
+ return match;
32
+ }
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ /**
38
+ * Maps `mapField` over every field stored at the top level of the document,
39
+ * rebuilding presentational containers so nested fields are patched in place.
40
+ */ export function mapTopLevelFields(fields, mapField) {
41
+ return fields.map((field)=>{
42
+ if (field.type === 'row' || field.type === 'collapsible' || field.type === 'group' && !('name' in field)) {
43
+ return {
44
+ ...field,
45
+ fields: mapTopLevelFields(field.fields, mapField)
46
+ };
47
+ }
48
+ if (field.type === 'tabs') {
49
+ return {
50
+ ...field,
51
+ tabs: field.tabs.map((tab)=>'name' in tab ? tab : {
52
+ ...tab,
53
+ fields: mapTopLevelFields(tab.fields, mapField)
54
+ })
55
+ };
56
+ }
57
+ return mapField(field);
58
+ });
59
+ }
60
+
61
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/fields.ts"],"sourcesContent":["import type { Field } from 'payload'\n\n/**\n * Rows, collapsibles, unnamed groups, and unnamed tabs are presentational\n * only: Payload stores their children directly on the document, so a field\n * nested inside one is still a top-level field as far as the data is\n * concerned. Named groups and named tabs nest their children under their own\n * key, so traversal stops at those.\n */\nfunction getPresentationalChildFields(field: Field): Field[] | null {\n if (field.type === 'row' || field.type === 'collapsible') {\n return field.fields\n }\n\n if (field.type === 'group' && !('name' in field)) {\n return field.fields\n }\n\n if (field.type === 'tabs') {\n return field.tabs.flatMap((tab) => ('name' in tab ? [] : tab.fields))\n }\n\n return null\n}\n\n/**\n * Finds the field stored under `fieldName` at the top level of the document,\n * looking through presentational containers such as tabs and rows.\n */\nexport function findTopLevelField(fields: Field[], fieldName: string): Field | undefined {\n for (const field of fields) {\n if ('name' in field && field.name === fieldName) {\n return field\n }\n\n const childFields = getPresentationalChildFields(field)\n\n if (childFields) {\n const match = findTopLevelField(childFields, fieldName)\n\n if (match) {\n return match\n }\n }\n }\n\n return undefined\n}\n\n/**\n * Maps `mapField` over every field stored at the top level of the document,\n * rebuilding presentational containers so nested fields are patched in place.\n */\nexport function mapTopLevelFields(\n fields: Field[],\n mapField: (field: Field) => Field,\n): Field[] {\n return fields.map((field) => {\n if (\n field.type === 'row' ||\n field.type === 'collapsible' ||\n (field.type === 'group' && !('name' in field))\n ) {\n return {\n ...field,\n fields: mapTopLevelFields(field.fields, mapField),\n } as Field\n }\n\n if (field.type === 'tabs') {\n return {\n ...field,\n tabs: field.tabs.map((tab) =>\n 'name' in tab\n ? tab\n : {\n ...tab,\n fields: mapTopLevelFields(tab.fields, mapField),\n },\n ),\n } as Field\n }\n\n return mapField(field)\n })\n}\n"],"names":["getPresentationalChildFields","field","type","fields","tabs","flatMap","tab","findTopLevelField","fieldName","name","childFields","match","undefined","mapTopLevelFields","mapField","map"],"mappings":"AAEA;;;;;;CAMC,GACD,SAASA,6BAA6BC,KAAY;IAChD,IAAIA,MAAMC,IAAI,KAAK,SAASD,MAAMC,IAAI,KAAK,eAAe;QACxD,OAAOD,MAAME,MAAM;IACrB;IAEA,IAAIF,MAAMC,IAAI,KAAK,WAAW,CAAE,CAAA,UAAUD,KAAI,GAAI;QAChD,OAAOA,MAAME,MAAM;IACrB;IAEA,IAAIF,MAAMC,IAAI,KAAK,QAAQ;QACzB,OAAOD,MAAMG,IAAI,CAACC,OAAO,CAAC,CAACC,MAAS,UAAUA,MAAM,EAAE,GAAGA,IAAIH,MAAM;IACrE;IAEA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASI,kBAAkBJ,MAAe,EAAEK,SAAiB;IAClE,KAAK,MAAMP,SAASE,OAAQ;QAC1B,IAAI,UAAUF,SAASA,MAAMQ,IAAI,KAAKD,WAAW;YAC/C,OAAOP;QACT;QAEA,MAAMS,cAAcV,6BAA6BC;QAEjD,IAAIS,aAAa;YACf,MAAMC,QAAQJ,kBAAkBG,aAAaF;YAE7C,IAAIG,OAAO;gBACT,OAAOA;YACT;QACF;IACF;IAEA,OAAOC;AACT;AAEA;;;CAGC,GACD,OAAO,SAASC,kBACdV,MAAe,EACfW,QAAiC;IAEjC,OAAOX,OAAOY,GAAG,CAAC,CAACd;QACjB,IACEA,MAAMC,IAAI,KAAK,SACfD,MAAMC,IAAI,KAAK,iBACdD,MAAMC,IAAI,KAAK,WAAW,CAAE,CAAA,UAAUD,KAAI,GAC3C;YACA,OAAO;gBACL,GAAGA,KAAK;gBACRE,QAAQU,kBAAkBZ,MAAME,MAAM,EAAEW;YAC1C;QACF;QAEA,IAAIb,MAAMC,IAAI,KAAK,QAAQ;YACzB,OAAO;gBACL,GAAGD,KAAK;gBACRG,MAAMH,MAAMG,IAAI,CAACW,GAAG,CAAC,CAACT,MACpB,UAAUA,MACNA,MACA;wBACE,GAAGA,GAAG;wBACNH,QAAQU,kBAAkBP,IAAIH,MAAM,EAAEW;oBACxC;YAER;QACF;QAEA,OAAOA,SAASb;IAClB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-nested-docs-page-tree",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "Page tree plugin for Payload nested docs collections",
5
5
  "license": "MIT",
6
6
  "author": "WLF Studios",