payload-nested-docs-page-tree 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +148 -11
  2. package/dist/components/PageTreeListView.client.js +9 -4
  3. package/dist/components/PageTreeListView.client.js.map +1 -1
  4. package/dist/components/PageTreeListView.module.css +55 -8
  5. package/dist/components/PageTreeListView.server.js +30 -14
  6. package/dist/components/PageTreeListView.server.js.map +1 -1
  7. package/dist/components/PageTreeLocaleStatusBadges.d.ts +7 -0
  8. package/dist/components/PageTreeLocaleStatusBadges.js +79 -0
  9. package/dist/components/PageTreeLocaleStatusBadges.js.map +1 -0
  10. package/dist/components/PageTreeStatusBadge.d.ts +2 -1
  11. package/dist/components/PageTreeStatusBadge.js +37 -7
  12. package/dist/components/PageTreeStatusBadge.js.map +1 -1
  13. package/dist/components/PageTreeTitleCell.js +12 -10
  14. package/dist/components/PageTreeTitleCell.js.map +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +8 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/types.d.ts +49 -8
  19. package/dist/types.js.map +1 -1
  20. package/dist/utilities/badgeConfig.js +3 -0
  21. package/dist/utilities/badgeConfig.js.map +1 -1
  22. package/dist/utilities/badgeLinks.d.ts +1 -1
  23. package/dist/utilities/badgeLinks.js +13 -3
  24. package/dist/utilities/badgeLinks.js.map +1 -1
  25. package/dist/utilities/localeStatus.d.ts +11 -0
  26. package/dist/utilities/localeStatus.js +83 -0
  27. package/dist/utilities/localeStatus.js.map +1 -0
  28. package/dist/utilities/pageTree.js +1 -1
  29. package/dist/utilities/pageTree.js.map +1 -1
  30. package/dist/utilities/pageTreeConfig.d.ts +1 -1
  31. package/dist/utilities/pageTreeConfig.js +2 -0
  32. package/dist/utilities/pageTreeConfig.js.map +1 -1
  33. package/dist/utilities/status.d.ts +2 -2
  34. package/dist/utilities/status.js.map +1 -1
  35. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/pageTree.ts"],"sourcesContent":["import type { PageTreeSourceDoc } from '../types.js'\nexport type { PageTreeSourceDoc } from '../types.js'\n\nexport type PageTreeMeta = {\n __pageTreeAncestorIDs: string[]\n __pageTreeDepth: number\n __pageTreeHasChildren: boolean\n __pageTreeID: string\n __pageTreeOrderIndex: number\n __pageTreeParentID: null | string\n __pageTreeShadeLevel: number\n}\n\nexport type PageTreeDoc = PageTreeMeta & PageTreeSourceDoc\n\ntype SortToken = {\n descending: boolean\n path: string[]\n}\n\ntype SortValue = null | number | string\n\ntype TreeNode = {\n doc: PageTreeSourceDoc\n id: string\n originalIndex: number\n parentID: null | string\n}\n\nconst dateLikePattern = /^\\d{4}-\\d{2}-\\d{2}(?:[T\\s].*)?$/\n\nexport type BuildPageTreeDocsOptions = {\n parentFieldSlug?: string\n sort?: string\n}\n\nexport function stringifyDocID(id: number | string | undefined): string {\n return String(id ?? '')\n}\n\nexport function getRelationshipID(value: unknown): null | string {\n if (typeof value === 'number' || typeof value === 'string') {\n return stringifyDocID(value)\n }\n\n if (value && typeof value === 'object' && 'id' in value) {\n const relationshipID = (value as { id?: number | string }).id\n\n if (typeof relationshipID === 'number' || typeof relationshipID === 'string') {\n return stringifyDocID(relationshipID)\n }\n }\n\n return null\n}\n\nexport function getDocParentID(\n doc: PageTreeSourceDoc,\n parentFieldSlug = 'parent',\n): null | string {\n return getRelationshipID(doc[parentFieldSlug])\n}\n\nexport function getDocDisplayLabel(doc: PageTreeDoc): string {\n const title = doc.title\n\n if (typeof title === 'string' && title.trim().length > 0) {\n return title\n }\n\n if (typeof doc.slug === 'string' && doc.slug.trim().length > 0) {\n return doc.slug\n }\n\n return doc.__pageTreeID\n}\n\nexport function getDocSlugSegment(doc: PageTreeDoc): string {\n if (typeof doc.slug === 'string' && doc.slug.trim().length > 0) {\n return doc.slug.trim().replace(/^\\/+|\\/+$/g, '')\n }\n\n return doc.__pageTreeID\n}\n\nexport function buildDocSlugPath(args: {\n doc: PageTreeDoc\n docsByID: Map<string, PageTreeDoc>\n}): string {\n const { doc, docsByID } = args\n const segments = doc.__pageTreeAncestorIDs\n .map((ancestorID) => docsByID.get(ancestorID))\n .filter((ancestorDoc): ancestorDoc is PageTreeDoc => Boolean(ancestorDoc))\n .map(getDocSlugSegment)\n\n segments.push(getDocSlugSegment(doc))\n\n return `/${segments.filter(Boolean).join('/')}`\n}\n\nexport function buildProspectiveDocSlugPath(args: {\n activeDoc: PageTreeDoc\n docsByID: Map<string, PageTreeDoc>\n targetDoc?: PageTreeDoc\n}): string {\n const { activeDoc, docsByID, targetDoc } = args\n\n if (!targetDoc) {\n return `/${getDocSlugSegment(activeDoc)}`\n }\n\n const segments = targetDoc.__pageTreeAncestorIDs\n .map((ancestorID) => docsByID.get(ancestorID))\n .filter((ancestorDoc): ancestorDoc is PageTreeDoc => Boolean(ancestorDoc))\n .map(getDocSlugSegment)\n\n segments.push(getDocSlugSegment(targetDoc), getDocSlugSegment(activeDoc))\n\n return `/${segments.filter(Boolean).join('/')}`\n}\n\nexport function buildChildrenByParentID(args: {\n docs: PageTreeSourceDoc[]\n parentFieldSlug?: string\n}): Map<null | string, string[]> {\n const { docs, parentFieldSlug = 'parent' } = args\n const childrenByParentID = new Map<null | string, string[]>()\n\n for (const doc of docs) {\n const docID = stringifyDocID(doc.id)\n const parentID = getDocParentID(doc, parentFieldSlug)\n const existingChildren = childrenByParentID.get(parentID) ?? []\n\n existingChildren.push(docID)\n childrenByParentID.set(parentID, existingChildren)\n }\n\n return childrenByParentID\n}\n\nexport function collectDescendantIDs(\n rootID: string,\n childrenByParentID: Map<null | string, string[]>,\n): string[] {\n const descendantIDs: string[] = []\n const stack = [...(childrenByParentID.get(rootID) ?? [])]\n\n while (stack.length > 0) {\n const currentID = stack.pop()\n\n if (!currentID) {\n continue\n }\n\n descendantIDs.push(currentID)\n stack.push(...(childrenByParentID.get(currentID) ?? []))\n }\n\n return descendantIDs\n}\n\nfunction getCycleNodeIDs(nodes: TreeNode[], nodesByID: Map<string, TreeNode>): Set<string> {\n const cycleNodeIDs = new Set<string>()\n const pathStack: string[] = []\n const visitState = new Map<string, 'done' | 'visiting'>()\n\n const walk = (node: TreeNode) => {\n const currentState = visitState.get(node.id)\n\n if (currentState === 'done') {\n return\n }\n\n if (currentState === 'visiting') {\n const cycleStartIndex = pathStack.lastIndexOf(node.id)\n const cycleIDs = cycleStartIndex >= 0 ? pathStack.slice(cycleStartIndex) : [node.id]\n\n for (const cycleID of cycleIDs) {\n cycleNodeIDs.add(cycleID)\n }\n\n return\n }\n\n visitState.set(node.id, 'visiting')\n pathStack.push(node.id)\n\n if (node.parentID !== null) {\n const parentNode = nodesByID.get(node.parentID)\n\n if (parentNode) {\n walk(parentNode)\n }\n }\n\n pathStack.pop()\n visitState.set(node.id, 'done')\n }\n\n for (const node of nodes) {\n walk(node)\n }\n\n return cycleNodeIDs\n}\n\nfunction parseSortTokens(sort?: string): SortToken[] {\n if (typeof sort !== 'string' || sort.trim().length === 0) {\n return []\n }\n\n return sort\n .split(',')\n .map((token) => token.trim())\n .filter((token) => token.length > 0)\n .map((token) => {\n const descending = token.startsWith('-')\n const normalizedToken = descending ? token.slice(1) : token\n\n return {\n descending,\n path: normalizedToken.split('.').filter(Boolean),\n }\n })\n .filter((token) => token.path.length > 0)\n}\n\nfunction resolveSortValue(source: unknown, path: string[]): SortValue | undefined {\n let currentValue = source\n\n for (const segment of path) {\n if (!currentValue || typeof currentValue !== 'object' || Array.isArray(currentValue)) {\n return undefined\n }\n\n if (!(segment in currentValue)) {\n return undefined\n }\n\n currentValue = (currentValue as Record<string, unknown>)[segment]\n }\n\n if (currentValue === null || currentValue === undefined) {\n return null\n }\n\n if (currentValue instanceof Date) {\n const timestamp = currentValue.getTime()\n\n return Number.isNaN(timestamp) ? undefined : timestamp\n }\n\n if (typeof currentValue === 'boolean') {\n return currentValue ? 1 : 0\n }\n\n if (typeof currentValue === 'number') {\n return Number.isFinite(currentValue) ? currentValue : undefined\n }\n\n if (typeof currentValue !== 'string') {\n return undefined\n }\n\n const normalizedValue = currentValue.trim()\n\n if (dateLikePattern.test(normalizedValue)) {\n const timestamp = Date.parse(normalizedValue)\n\n if (!Number.isNaN(timestamp)) {\n return timestamp\n }\n }\n\n return normalizedValue\n}\n\nfunction compareSortValues(leftValue: SortValue, rightValue: SortValue): number {\n if (leftValue === null && rightValue === null) {\n return 0\n }\n\n if (leftValue === null) {\n return -1\n }\n\n if (rightValue === null) {\n return 1\n }\n\n if (typeof leftValue === 'number' && typeof rightValue === 'number') {\n if (leftValue === rightValue) {\n return 0\n }\n\n return leftValue < rightValue ? -1 : 1\n }\n\n // Payload orderable keys use fractional indexing strings (for example `_order`\n // values like `a5`, `a53`, `a5i`). These must sort by raw lexicographic order\n // to match the database; numeric-aware locale comparison places `a53` after\n // `a5i`, which is wrong for these keys.\n const leftString = String(leftValue)\n const rightString = String(rightValue)\n\n if (leftString === rightString) {\n return 0\n }\n\n return leftString < rightString ? -1 : 1\n}\n\nfunction createTreeNodeComparator(sort?: string) {\n const sortTokens = parseSortTokens(sort)\n\n if (sortTokens.length === 0) {\n return null\n }\n\n return (leftNode: TreeNode, rightNode: TreeNode): number => {\n for (const sortToken of sortTokens) {\n const leftValue = resolveSortValue(leftNode.doc, sortToken.path)\n const rightValue = resolveSortValue(rightNode.doc, sortToken.path)\n\n if (leftValue === undefined || rightValue === undefined) {\n continue\n }\n\n const comparison = compareSortValues(leftValue, rightValue)\n\n if (comparison !== 0) {\n return sortToken.descending ? -comparison : comparison\n }\n }\n\n return leftNode.originalIndex - rightNode.originalIndex\n }\n}\n\nexport function buildPageTreeDocs(\n docs: PageTreeSourceDoc[],\n options: BuildPageTreeDocsOptions = {},\n): PageTreeDoc[] {\n const parentFieldSlug = options.parentFieldSlug ?? 'parent'\n const nodes: TreeNode[] = docs.map((doc, index) => ({\n doc,\n id: stringifyDocID(doc.id),\n originalIndex: index,\n parentID: getDocParentID(doc, parentFieldSlug),\n }))\n const nodesByID = new Map(nodes.map((node) => [node.id, node]))\n const cycleNodeIDs = getCycleNodeIDs(nodes, nodesByID)\n const effectiveParentIDByNodeID = new Map<string, null | string>()\n const childrenByParentID = new Map<null | string, TreeNode[]>()\n const compareTreeNodes = createTreeNodeComparator(options.sort)\n\n for (const node of nodes) {\n const parentExists = node.parentID !== null && nodesByID.has(node.parentID)\n const effectiveParentID =\n parentExists && !cycleNodeIDs.has(node.id) ? node.parentID : null\n\n effectiveParentIDByNodeID.set(node.id, effectiveParentID)\n\n const currentChildren = childrenByParentID.get(effectiveParentID) ?? []\n currentChildren.push(node)\n childrenByParentID.set(effectiveParentID, currentChildren)\n }\n\n if (compareTreeNodes) {\n for (const children of childrenByParentID.values()) {\n children.sort(compareTreeNodes)\n }\n }\n\n const orderedDocs: PageTreeDoc[] = []\n const subtreeDepthByID = new Map<string, number>()\n const visitedNodeIDs = new Set<string>()\n\n const getShadeLevel = (rootMaxDepth: number, depth: number): number => {\n if (rootMaxDepth === 0) {\n return 0\n }\n\n return Math.max(rootMaxDepth - depth + 1, 1)\n }\n\n const getSubtreeDepth = (node: TreeNode): number => {\n const cachedDepth = subtreeDepthByID.get(node.id)\n\n if (typeof cachedDepth === 'number') {\n return cachedDepth\n }\n\n const children = childrenByParentID.get(node.id) ?? []\n\n if (children.length === 0) {\n subtreeDepthByID.set(node.id, 0)\n return 0\n }\n\n const depth = Math.max(...children.map((child) => getSubtreeDepth(child) + 1))\n subtreeDepthByID.set(node.id, depth)\n return depth\n }\n\n const visit = (node: TreeNode, ancestorIDs: string[], rootMaxDepth: number) => {\n if (visitedNodeIDs.has(node.id)) {\n return\n }\n\n visitedNodeIDs.add(node.id)\n\n const children = childrenByParentID.get(node.id) ?? []\n const depth = ancestorIDs.length\n const shadeLevel = getShadeLevel(rootMaxDepth, depth)\n\n orderedDocs.push({\n ...(node.doc as PageTreeSourceDoc),\n __pageTreeAncestorIDs: ancestorIDs,\n __pageTreeDepth: depth,\n __pageTreeHasChildren: children.length > 0,\n __pageTreeID: node.id,\n __pageTreeOrderIndex: orderedDocs.length,\n __pageTreeParentID: effectiveParentIDByNodeID.get(node.id) ?? null,\n __pageTreeShadeLevel: shadeLevel,\n })\n\n for (const child of children) {\n visit(child, [...ancestorIDs, node.id], rootMaxDepth)\n }\n }\n\n const roots = [...(childrenByParentID.get(null) ?? [])]\n\n for (const root of roots) {\n visit(root, [], getSubtreeDepth(root))\n }\n\n const fallbackNodes = compareTreeNodes ? [...nodes].sort(compareTreeNodes) : nodes\n\n for (const node of fallbackNodes) {\n if (!visitedNodeIDs.has(node.id)) {\n visit(node, [], getSubtreeDepth(node))\n }\n }\n\n return orderedDocs\n}\n\nexport function getVisibleTreeDocs(\n docs: PageTreeDoc[],\n collapsedIDs: ReadonlySet<string>,\n): PageTreeDoc[] {\n return docs.filter((doc) =>\n doc.__pageTreeAncestorIDs.every((ancestorID) => !collapsedIDs.has(ancestorID)),\n )\n}\n"],"names":["dateLikePattern","stringifyDocID","id","String","getRelationshipID","value","relationshipID","getDocParentID","doc","parentFieldSlug","getDocDisplayLabel","title","trim","length","slug","__pageTreeID","getDocSlugSegment","replace","buildDocSlugPath","args","docsByID","segments","__pageTreeAncestorIDs","map","ancestorID","get","filter","ancestorDoc","Boolean","push","join","buildProspectiveDocSlugPath","activeDoc","targetDoc","buildChildrenByParentID","docs","childrenByParentID","Map","docID","parentID","existingChildren","set","collectDescendantIDs","rootID","descendantIDs","stack","currentID","pop","getCycleNodeIDs","nodes","nodesByID","cycleNodeIDs","Set","pathStack","visitState","walk","node","currentState","cycleStartIndex","lastIndexOf","cycleIDs","slice","cycleID","add","parentNode","parseSortTokens","sort","split","token","descending","startsWith","normalizedToken","path","resolveSortValue","source","currentValue","segment","Array","isArray","undefined","Date","timestamp","getTime","Number","isNaN","isFinite","normalizedValue","test","parse","compareSortValues","leftValue","rightValue","leftString","rightString","createTreeNodeComparator","sortTokens","leftNode","rightNode","sortToken","comparison","originalIndex","buildPageTreeDocs","options","index","effectiveParentIDByNodeID","compareTreeNodes","parentExists","has","effectiveParentID","currentChildren","children","values","orderedDocs","subtreeDepthByID","visitedNodeIDs","getShadeLevel","rootMaxDepth","depth","Math","max","getSubtreeDepth","cachedDepth","child","visit","ancestorIDs","shadeLevel","__pageTreeDepth","__pageTreeHasChildren","__pageTreeOrderIndex","__pageTreeParentID","__pageTreeShadeLevel","roots","root","fallbackNodes","getVisibleTreeDocs","collapsedIDs","every"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/pageTree.ts"],"sourcesContent":["import type { PageTreeSourceDoc } from '../types.js'\nexport type { PageTreeSourceDoc } from '../types.js'\n\nexport type PageTreeMeta = {\n __pageTreeAncestorIDs: string[]\n __pageTreeDepth: number\n __pageTreeHasChildren: boolean\n __pageTreeID: string\n __pageTreeOrderIndex: number\n __pageTreeParentID: null | string\n __pageTreeShadeLevel: number\n}\n\nexport type PageTreeDoc = PageTreeMeta & PageTreeSourceDoc\n\ntype SortToken = {\n descending: boolean\n path: string[]\n}\n\ntype SortValue = null | number | string\n\ntype TreeNode = {\n doc: PageTreeSourceDoc\n id: string\n originalIndex: number\n parentID: null | string\n}\n\nconst dateLikePattern = /^\\d{4}-\\d{2}-\\d{2}(?:[T\\s].*)?$/\n\nexport type BuildPageTreeDocsOptions = {\n parentFieldSlug?: string\n sort?: string\n}\n\nexport function stringifyDocID(id: number | string | undefined): string {\n return String(id ?? '')\n}\n\nexport function getRelationshipID(value: unknown): null | string {\n if (typeof value === 'number' || typeof value === 'string') {\n return stringifyDocID(value)\n }\n\n if (value && typeof value === 'object' && 'id' in value) {\n const relationshipID = (value as { id?: number | string }).id\n\n if (typeof relationshipID === 'number' || typeof relationshipID === 'string') {\n return stringifyDocID(relationshipID)\n }\n }\n\n return null\n}\n\nexport function getDocParentID(\n doc: PageTreeSourceDoc,\n parentFieldSlug = 'parent',\n): null | string {\n return getRelationshipID(doc[parentFieldSlug])\n}\n\nexport function getDocDisplayLabel(doc: PageTreeDoc): string {\n const title = doc.title\n\n if (typeof title === 'string' && title.trim().length > 0) {\n return title\n }\n\n if (typeof doc.slug === 'string' && doc.slug.trim().length > 0) {\n return doc.slug\n }\n\n return doc.__pageTreeID\n}\n\nexport function getDocSlugSegment(doc: PageTreeDoc): string {\n if (typeof doc.slug === 'string' && doc.slug.trim().length > 0) {\n return doc.slug.trim().replace(/^\\/+|\\/+$/g, '')\n }\n\n return doc.__pageTreeID\n}\n\nexport function buildDocSlugPath(args: {\n doc: PageTreeDoc\n docsByID: Map<string, PageTreeDoc>\n}): string {\n const { doc, docsByID } = args\n const segments = doc.__pageTreeAncestorIDs\n .map((ancestorID) => docsByID.get(ancestorID))\n .filter((ancestorDoc): ancestorDoc is PageTreeDoc => Boolean(ancestorDoc))\n .map(getDocSlugSegment)\n\n segments.push(getDocSlugSegment(doc))\n\n return `/${segments.filter(Boolean).join('/')}`\n}\n\nexport function buildProspectiveDocSlugPath(args: {\n activeDoc: PageTreeDoc\n docsByID: Map<string, PageTreeDoc>\n targetDoc?: PageTreeDoc\n}): string {\n const { activeDoc, docsByID, targetDoc } = args\n\n if (!targetDoc) {\n return `/${getDocSlugSegment(activeDoc)}`\n }\n\n const segments = targetDoc.__pageTreeAncestorIDs\n .map((ancestorID) => docsByID.get(ancestorID))\n .filter((ancestorDoc): ancestorDoc is PageTreeDoc => Boolean(ancestorDoc))\n .map(getDocSlugSegment)\n\n segments.push(getDocSlugSegment(targetDoc), getDocSlugSegment(activeDoc))\n\n return `/${segments.filter(Boolean).join('/')}`\n}\n\nexport function buildChildrenByParentID(args: {\n docs: PageTreeSourceDoc[]\n parentFieldSlug?: string\n}): Map<null | string, string[]> {\n const { docs, parentFieldSlug = 'parent' } = args\n const childrenByParentID = new Map<null | string, string[]>()\n\n for (const doc of docs) {\n const docID = stringifyDocID(doc.id)\n const parentID = getDocParentID(doc, parentFieldSlug)\n const existingChildren = childrenByParentID.get(parentID) ?? []\n\n existingChildren.push(docID)\n childrenByParentID.set(parentID, existingChildren)\n }\n\n return childrenByParentID\n}\n\nexport function collectDescendantIDs(\n rootID: string,\n childrenByParentID: Map<null | string, string[]>,\n): string[] {\n const descendantIDs: string[] = []\n const stack = [...(childrenByParentID.get(rootID) ?? [])]\n\n while (stack.length > 0) {\n const currentID = stack.pop()\n\n if (!currentID) {\n continue\n }\n\n descendantIDs.push(currentID)\n stack.push(...(childrenByParentID.get(currentID) ?? []))\n }\n\n return descendantIDs\n}\n\nfunction getCycleNodeIDs(nodes: TreeNode[], nodesByID: Map<string, TreeNode>): Set<string> {\n const cycleNodeIDs = new Set<string>()\n const pathStack: string[] = []\n const visitState = new Map<string, 'done' | 'visiting'>()\n\n const walk = (node: TreeNode) => {\n const currentState = visitState.get(node.id)\n\n if (currentState === 'done') {\n return\n }\n\n if (currentState === 'visiting') {\n const cycleStartIndex = pathStack.lastIndexOf(node.id)\n const cycleIDs = cycleStartIndex >= 0 ? pathStack.slice(cycleStartIndex) : [node.id]\n\n for (const cycleID of cycleIDs) {\n cycleNodeIDs.add(cycleID)\n }\n\n return\n }\n\n visitState.set(node.id, 'visiting')\n pathStack.push(node.id)\n\n if (node.parentID !== null) {\n const parentNode = nodesByID.get(node.parentID)\n\n if (parentNode) {\n walk(parentNode)\n }\n }\n\n pathStack.pop()\n visitState.set(node.id, 'done')\n }\n\n for (const node of nodes) {\n walk(node)\n }\n\n return cycleNodeIDs\n}\n\nfunction parseSortTokens(sort?: string): SortToken[] {\n if (typeof sort !== 'string' || sort.trim().length === 0) {\n return []\n }\n\n return sort\n .split(',')\n .map((token) => token.trim())\n .filter((token) => token.length > 0)\n .map((token) => {\n const descending = token.startsWith('-')\n const normalizedToken = descending ? token.slice(1) : token\n\n return {\n descending,\n path: normalizedToken.split('.').filter(Boolean),\n }\n })\n .filter((token) => token.path.length > 0)\n}\n\nfunction resolveSortValue(source: unknown, path: string[]): SortValue | undefined {\n let currentValue = source\n\n for (const segment of path) {\n if (!currentValue || typeof currentValue !== 'object' || Array.isArray(currentValue)) {\n return undefined\n }\n\n if (!(segment in currentValue)) {\n return undefined\n }\n\n currentValue = (currentValue as Record<string, unknown>)[segment]\n }\n\n if (currentValue === null || currentValue === undefined) {\n return null\n }\n\n if (currentValue instanceof Date) {\n const timestamp = currentValue.getTime()\n\n return Number.isNaN(timestamp) ? undefined : timestamp\n }\n\n if (typeof currentValue === 'boolean') {\n return currentValue ? 1 : 0\n }\n\n if (typeof currentValue === 'number') {\n return Number.isFinite(currentValue) ? currentValue : undefined\n }\n\n if (typeof currentValue !== 'string') {\n return undefined\n }\n\n const normalizedValue = currentValue.trim()\n\n if (dateLikePattern.test(normalizedValue)) {\n const timestamp = Date.parse(normalizedValue)\n\n if (!Number.isNaN(timestamp)) {\n return timestamp\n }\n }\n\n return normalizedValue\n}\n\nfunction compareSortValues(leftValue: SortValue, rightValue: SortValue): number {\n if (leftValue === null && rightValue === null) {\n return 0\n }\n\n if (leftValue === null) {\n return -1\n }\n\n if (rightValue === null) {\n return 1\n }\n\n if (typeof leftValue === 'number' && typeof rightValue === 'number') {\n if (leftValue === rightValue) {\n return 0\n }\n\n return leftValue < rightValue ? -1 : 1\n }\n\n // Payload orderable keys use fractional indexing strings (for example `_order`\n // values like `a5`, `a53`, `a5i`). These must sort by raw lexicographic order\n // to match the database; numeric-aware locale comparison places `a53` after\n // `a5i`, which is wrong for these keys.\n const leftString = String(leftValue)\n const rightString = String(rightValue)\n\n if (leftString === rightString) {\n return 0\n }\n\n return leftString < rightString ? -1 : 1\n}\n\nfunction createTreeNodeComparator(sort?: string) {\n const sortTokens = parseSortTokens(sort)\n\n if (sortTokens.length === 0) {\n return null\n }\n\n return (leftNode: TreeNode, rightNode: TreeNode): number => {\n for (const sortToken of sortTokens) {\n const leftValue = resolveSortValue(leftNode.doc, sortToken.path)\n const rightValue = resolveSortValue(rightNode.doc, sortToken.path)\n\n if (leftValue === undefined || rightValue === undefined) {\n continue\n }\n\n const comparison = compareSortValues(leftValue, rightValue)\n\n if (comparison !== 0) {\n return sortToken.descending ? -comparison : comparison\n }\n }\n\n return leftNode.originalIndex - rightNode.originalIndex\n }\n}\n\nexport function buildPageTreeDocs(\n docs: PageTreeSourceDoc[],\n options: BuildPageTreeDocsOptions = {},\n): PageTreeDoc[] {\n const parentFieldSlug = options.parentFieldSlug ?? 'parent'\n const nodes: TreeNode[] = docs.map((doc, index) => ({\n id: stringifyDocID(doc.id),\n doc,\n originalIndex: index,\n parentID: getDocParentID(doc, parentFieldSlug),\n }))\n const nodesByID = new Map(nodes.map((node) => [node.id, node]))\n const cycleNodeIDs = getCycleNodeIDs(nodes, nodesByID)\n const effectiveParentIDByNodeID = new Map<string, null | string>()\n const childrenByParentID = new Map<null | string, TreeNode[]>()\n const compareTreeNodes = createTreeNodeComparator(options.sort)\n\n for (const node of nodes) {\n const parentExists = node.parentID !== null && nodesByID.has(node.parentID)\n const effectiveParentID =\n parentExists && !cycleNodeIDs.has(node.id) ? node.parentID : null\n\n effectiveParentIDByNodeID.set(node.id, effectiveParentID)\n\n const currentChildren = childrenByParentID.get(effectiveParentID) ?? []\n currentChildren.push(node)\n childrenByParentID.set(effectiveParentID, currentChildren)\n }\n\n if (compareTreeNodes) {\n for (const children of childrenByParentID.values()) {\n children.sort(compareTreeNodes)\n }\n }\n\n const orderedDocs: PageTreeDoc[] = []\n const subtreeDepthByID = new Map<string, number>()\n const visitedNodeIDs = new Set<string>()\n\n const getShadeLevel = (rootMaxDepth: number, depth: number): number => {\n if (rootMaxDepth === 0) {\n return 0\n }\n\n return Math.max(rootMaxDepth - depth + 1, 1)\n }\n\n const getSubtreeDepth = (node: TreeNode): number => {\n const cachedDepth = subtreeDepthByID.get(node.id)\n\n if (typeof cachedDepth === 'number') {\n return cachedDepth\n }\n\n const children = childrenByParentID.get(node.id) ?? []\n\n if (children.length === 0) {\n subtreeDepthByID.set(node.id, 0)\n return 0\n }\n\n const depth = Math.max(...children.map((child) => getSubtreeDepth(child) + 1))\n subtreeDepthByID.set(node.id, depth)\n return depth\n }\n\n const visit = (node: TreeNode, ancestorIDs: string[], rootMaxDepth: number) => {\n if (visitedNodeIDs.has(node.id)) {\n return\n }\n\n visitedNodeIDs.add(node.id)\n\n const children = childrenByParentID.get(node.id) ?? []\n const depth = ancestorIDs.length\n const shadeLevel = getShadeLevel(rootMaxDepth, depth)\n\n orderedDocs.push({\n ...(node.doc),\n __pageTreeAncestorIDs: ancestorIDs,\n __pageTreeDepth: depth,\n __pageTreeHasChildren: children.length > 0,\n __pageTreeID: node.id,\n __pageTreeOrderIndex: orderedDocs.length,\n __pageTreeParentID: effectiveParentIDByNodeID.get(node.id) ?? null,\n __pageTreeShadeLevel: shadeLevel,\n })\n\n for (const child of children) {\n visit(child, [...ancestorIDs, node.id], rootMaxDepth)\n }\n }\n\n const roots = [...(childrenByParentID.get(null) ?? [])]\n\n for (const root of roots) {\n visit(root, [], getSubtreeDepth(root))\n }\n\n const fallbackNodes = compareTreeNodes ? [...nodes].sort(compareTreeNodes) : nodes\n\n for (const node of fallbackNodes) {\n if (!visitedNodeIDs.has(node.id)) {\n visit(node, [], getSubtreeDepth(node))\n }\n }\n\n return orderedDocs\n}\n\nexport function getVisibleTreeDocs(\n docs: PageTreeDoc[],\n collapsedIDs: ReadonlySet<string>,\n): PageTreeDoc[] {\n return docs.filter((doc) =>\n doc.__pageTreeAncestorIDs.every((ancestorID) => !collapsedIDs.has(ancestorID)),\n )\n}\n"],"names":["dateLikePattern","stringifyDocID","id","String","getRelationshipID","value","relationshipID","getDocParentID","doc","parentFieldSlug","getDocDisplayLabel","title","trim","length","slug","__pageTreeID","getDocSlugSegment","replace","buildDocSlugPath","args","docsByID","segments","__pageTreeAncestorIDs","map","ancestorID","get","filter","ancestorDoc","Boolean","push","join","buildProspectiveDocSlugPath","activeDoc","targetDoc","buildChildrenByParentID","docs","childrenByParentID","Map","docID","parentID","existingChildren","set","collectDescendantIDs","rootID","descendantIDs","stack","currentID","pop","getCycleNodeIDs","nodes","nodesByID","cycleNodeIDs","Set","pathStack","visitState","walk","node","currentState","cycleStartIndex","lastIndexOf","cycleIDs","slice","cycleID","add","parentNode","parseSortTokens","sort","split","token","descending","startsWith","normalizedToken","path","resolveSortValue","source","currentValue","segment","Array","isArray","undefined","Date","timestamp","getTime","Number","isNaN","isFinite","normalizedValue","test","parse","compareSortValues","leftValue","rightValue","leftString","rightString","createTreeNodeComparator","sortTokens","leftNode","rightNode","sortToken","comparison","originalIndex","buildPageTreeDocs","options","index","effectiveParentIDByNodeID","compareTreeNodes","parentExists","has","effectiveParentID","currentChildren","children","values","orderedDocs","subtreeDepthByID","visitedNodeIDs","getShadeLevel","rootMaxDepth","depth","Math","max","getSubtreeDepth","cachedDepth","child","visit","ancestorIDs","shadeLevel","__pageTreeDepth","__pageTreeHasChildren","__pageTreeOrderIndex","__pageTreeParentID","__pageTreeShadeLevel","roots","root","fallbackNodes","getVisibleTreeDocs","collapsedIDs","every"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { CollectionConfig } from 'payload';
2
2
  import type { NestedDocsPageTreePluginCollectionCustom } from '../types.js';
3
- export declare function getCollectionPageTreeConfig(collection: Pick<CollectionConfig, 'custom'>): null | NestedDocsPageTreePluginCollectionCustom;
3
+ export declare function getCollectionPageTreeConfig(collection: Pick<CollectionConfig, 'custom'>): NestedDocsPageTreePluginCollectionCustom | null;
@@ -18,6 +18,8 @@ export function getCollectionPageTreeConfig(collection) {
18
18
  homeIndicator: {
19
19
  enabled: config.homeIndicator.enabled
20
20
  },
21
+ localeBadgeStatus: config.localeBadgeStatus,
22
+ localeBadgeVisibility: config.localeBadgeVisibility,
21
23
  parentFieldSlug: config.parentFieldSlug
22
24
  };
23
25
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/pageTreeConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { NestedDocsPageTreePluginCollectionCustom } from '../types.js'\nimport { nestedDocsPageTreePluginCustomKey } from '../types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './badgeConfig.js'\n\nexport function getCollectionPageTreeConfig(\n collection: Pick<CollectionConfig, 'custom'>,\n): null | NestedDocsPageTreePluginCollectionCustom {\n const value = collection.custom?.[nestedDocsPageTreePluginCustomKey]\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const config = value as Partial<NestedDocsPageTreePluginCollectionCustom>\n\n if (\n typeof config.breadcrumbsFieldSlug !== 'string' ||\n typeof config.defaultLimit !== 'number' ||\n typeof config.hideBreadcrumbs !== 'boolean' ||\n !config.homeIndicator ||\n typeof config.homeIndicator !== 'object' ||\n Array.isArray(config.homeIndicator) ||\n typeof config.homeIndicator.enabled !== 'boolean' ||\n typeof config.parentFieldSlug !== 'string'\n ) {\n return null\n }\n\n return {\n badges: normalizeNestedDocsPageTreePluginBadgeConfig(config.badges),\n badgesLinks: config.badgesLinks,\n breadcrumbsFieldSlug: config.breadcrumbsFieldSlug,\n defaultLimit: config.defaultLimit,\n hideBreadcrumbs: config.hideBreadcrumbs,\n homeIndicator: {\n enabled: config.homeIndicator.enabled,\n },\n parentFieldSlug: config.parentFieldSlug,\n }\n}\n"],"names":["nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","getCollectionPageTreeConfig","collection","value","custom","Array","isArray","config","breadcrumbsFieldSlug","defaultLimit","hideBreadcrumbs","homeIndicator","enabled","parentFieldSlug","badges","badgesLinks"],"mappings":"AAGA,SAASA,iCAAiC,QAAQ,cAAa;AAC/D,SAASC,4CAA4C,QAAQ,mBAAkB;AAE/E,OAAO,SAASC,4BACdC,UAA4C;IAE5C,MAAMC,QAAQD,WAAWE,MAAM,EAAE,CAACL,kCAAkC;IAEpE,IAAI,CAACI,SAAS,OAAOA,UAAU,YAAYE,MAAMC,OAAO,CAACH,QAAQ;QAC/D,OAAO;IACT;IAEA,MAAMI,SAASJ;IAEf,IACE,OAAOI,OAAOC,oBAAoB,KAAK,YACvC,OAAOD,OAAOE,YAAY,KAAK,YAC/B,OAAOF,OAAOG,eAAe,KAAK,aAClC,CAACH,OAAOI,aAAa,IACrB,OAAOJ,OAAOI,aAAa,KAAK,YAChCN,MAAMC,OAAO,CAACC,OAAOI,aAAa,KAClC,OAAOJ,OAAOI,aAAa,CAACC,OAAO,KAAK,aACxC,OAAOL,OAAOM,eAAe,KAAK,UAClC;QACA,OAAO;IACT;IAEA,OAAO;QACLC,QAAQd,6CAA6CO,OAAOO,MAAM;QAClEC,aAAaR,OAAOQ,WAAW;QAC/BP,sBAAsBD,OAAOC,oBAAoB;QACjDC,cAAcF,OAAOE,YAAY;QACjCC,iBAAiBH,OAAOG,eAAe;QACvCC,eAAe;YACbC,SAASL,OAAOI,aAAa,CAACC,OAAO;QACvC;QACAC,iBAAiBN,OAAOM,eAAe;IACzC;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/pageTreeConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { NestedDocsPageTreePluginCollectionCustom } from '../types.js'\n\nimport { nestedDocsPageTreePluginCustomKey } from '../types.js'\nimport { normalizeNestedDocsPageTreePluginBadgeConfig } from './badgeConfig.js'\n\nexport function getCollectionPageTreeConfig(\n collection: Pick<CollectionConfig, 'custom'>,\n): NestedDocsPageTreePluginCollectionCustom | null {\n const value = collection.custom?.[nestedDocsPageTreePluginCustomKey]\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const config = value as Partial<NestedDocsPageTreePluginCollectionCustom>\n\n if (\n typeof config.breadcrumbsFieldSlug !== 'string' ||\n typeof config.defaultLimit !== 'number' ||\n typeof config.hideBreadcrumbs !== 'boolean' ||\n !config.homeIndicator ||\n typeof config.homeIndicator !== 'object' ||\n Array.isArray(config.homeIndicator) ||\n typeof config.homeIndicator.enabled !== 'boolean' ||\n typeof config.parentFieldSlug !== 'string'\n ) {\n return null\n }\n\n return {\n badges: normalizeNestedDocsPageTreePluginBadgeConfig(config.badges),\n badgesLinks: config.badgesLinks,\n breadcrumbsFieldSlug: config.breadcrumbsFieldSlug,\n defaultLimit: config.defaultLimit,\n hideBreadcrumbs: config.hideBreadcrumbs,\n homeIndicator: {\n enabled: config.homeIndicator.enabled,\n },\n localeBadgeStatus: config.localeBadgeStatus,\n localeBadgeVisibility: config.localeBadgeVisibility,\n parentFieldSlug: config.parentFieldSlug,\n }\n}\n"],"names":["nestedDocsPageTreePluginCustomKey","normalizeNestedDocsPageTreePluginBadgeConfig","getCollectionPageTreeConfig","collection","value","custom","Array","isArray","config","breadcrumbsFieldSlug","defaultLimit","hideBreadcrumbs","homeIndicator","enabled","parentFieldSlug","badges","badgesLinks","localeBadgeStatus","localeBadgeVisibility"],"mappings":"AAIA,SAASA,iCAAiC,QAAQ,cAAa;AAC/D,SAASC,4CAA4C,QAAQ,mBAAkB;AAE/E,OAAO,SAASC,4BACdC,UAA4C;IAE5C,MAAMC,QAAQD,WAAWE,MAAM,EAAE,CAACL,kCAAkC;IAEpE,IAAI,CAACI,SAAS,OAAOA,UAAU,YAAYE,MAAMC,OAAO,CAACH,QAAQ;QAC/D,OAAO;IACT;IAEA,MAAMI,SAASJ;IAEf,IACE,OAAOI,OAAOC,oBAAoB,KAAK,YACvC,OAAOD,OAAOE,YAAY,KAAK,YAC/B,OAAOF,OAAOG,eAAe,KAAK,aAClC,CAACH,OAAOI,aAAa,IACrB,OAAOJ,OAAOI,aAAa,KAAK,YAChCN,MAAMC,OAAO,CAACC,OAAOI,aAAa,KAClC,OAAOJ,OAAOI,aAAa,CAACC,OAAO,KAAK,aACxC,OAAOL,OAAOM,eAAe,KAAK,UAClC;QACA,OAAO;IACT;IAEA,OAAO;QACLC,QAAQd,6CAA6CO,OAAOO,MAAM;QAClEC,aAAaR,OAAOQ,WAAW;QAC/BP,sBAAsBD,OAAOC,oBAAoB;QACjDC,cAAcF,OAAOE,YAAY;QACjCC,iBAAiBH,OAAOG,eAAe;QACvCC,eAAe;YACbC,SAASL,OAAOI,aAAa,CAACC,OAAO;QACvC;QACAI,mBAAmBT,OAAOS,iBAAiB;QAC3CC,uBAAuBV,OAAOU,qBAAqB;QACnDJ,iBAAiBN,OAAOM,eAAe;IACzC;AACF"}
@@ -1,7 +1,7 @@
1
- import type { PageTreeSourceDoc, NestedDocsPageTreePluginBadgeMap } from '../types.js';
1
+ import type { NestedDocsPageTreePluginBadgeMap, PageTreeSourceDoc } from '../types.js';
2
2
  export type PageTreeDisplayStatus = 'changed' | 'draft' | 'published' | 'unknown';
3
3
  export declare function getPageTreeDisplayStatus(doc: Pick<PageTreeSourceDoc, '_displayStatus' | '_status'>): PageTreeDisplayStatus;
4
- export declare function getPageTreeDisplayStatusLabelKey(status: PageTreeDisplayStatus): 'version:draft' | 'version:changed' | 'version:published' | 'general:noValue';
4
+ export declare function getPageTreeDisplayStatusLabelKey(status: PageTreeDisplayStatus): 'general:noValue' | 'version:changed' | 'version:draft' | 'version:published';
5
5
  export declare function getPageTreeBadgeColor(args: {
6
6
  badgeColors: NestedDocsPageTreePluginBadgeMap;
7
7
  status: PageTreeDisplayStatus;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/status.ts"],"sourcesContent":["import type {\n PageTreeSourceDoc,\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n} from '../types.js'\n\nexport type PageTreeDisplayStatus = 'changed' | 'draft' | 'published' | 'unknown'\n\nfunction isBadgeStatus(status: PageTreeDisplayStatus): status is NestedDocsPageTreePluginBadgeStatus {\n return status === 'changed' || status === 'draft' || status === 'published'\n}\n\nexport function getPageTreeDisplayStatus(\n doc: Pick<PageTreeSourceDoc, '_displayStatus' | '_status'>,\n): PageTreeDisplayStatus {\n if (doc._displayStatus === 'changed') {\n return 'changed'\n }\n\n if (doc._displayStatus === 'draft') {\n return 'draft'\n }\n\n if (doc._displayStatus === 'published') {\n return 'published'\n }\n\n if (doc._status === 'draft') {\n return 'draft'\n }\n\n if (doc._status === 'published') {\n return 'published'\n }\n\n return 'unknown'\n}\n\nexport function getPageTreeDisplayStatusLabelKey(status: PageTreeDisplayStatus):\n | 'version:draft'\n | 'version:changed'\n | 'version:published'\n | 'general:noValue' {\n if (status === 'changed') {\n return 'version:changed'\n }\n\n if (status === 'draft') {\n return 'version:draft'\n }\n\n if (status === 'published') {\n return 'version:published'\n }\n\n return 'general:noValue'\n}\n\nexport function getPageTreeBadgeColor(args: {\n badgeColors: NestedDocsPageTreePluginBadgeMap\n status: PageTreeDisplayStatus\n}): string | undefined {\n const { badgeColors, status } = args\n\n if (!isBadgeStatus(status)) {\n return undefined\n }\n\n const badgeColor = badgeColors[status]\n\n return typeof badgeColor === 'string' && badgeColor.trim().length > 0\n ? badgeColor.trim()\n : undefined\n}\n\nexport function getPageTreeBadgeLabel(args: {\n badgeLabels: NestedDocsPageTreePluginBadgeMap\n status: PageTreeDisplayStatus\n t: (key: ReturnType<typeof getPageTreeDisplayStatusLabelKey>) => string\n}): string {\n const { badgeLabels, status, t } = args\n\n if (isBadgeStatus(status)) {\n const badgeLabel = badgeLabels[status]\n\n if (typeof badgeLabel === 'string' && badgeLabel.trim().length > 0) {\n return badgeLabel.trim()\n }\n }\n\n return t(getPageTreeDisplayStatusLabelKey(status))\n}\n\nexport function withPageTreeDisplayStatuses(args: {\n currentDocs: Pick<PageTreeSourceDoc, '_status' | 'id'>[]\n draftDocs: PageTreeSourceDoc[]\n}): PageTreeSourceDoc[] {\n const { currentDocs, draftDocs } = args\n const currentStatusByID = new Map(\n currentDocs.map((doc) => [String(doc.id ?? ''), doc._status ?? null]),\n )\n\n return draftDocs.map((doc) => {\n const docID = String(doc.id ?? '')\n const currentStatus = currentStatusByID.get(docID)\n const displayStatus =\n doc._status === 'draft' && currentStatus === 'published'\n ? 'changed'\n : doc._status === 'draft' || doc._status === 'published'\n ? doc._status\n : undefined\n\n if (doc._displayStatus === displayStatus) {\n return doc\n }\n\n return {\n ...doc,\n _displayStatus: displayStatus,\n }\n })\n}\n"],"names":["isBadgeStatus","status","getPageTreeDisplayStatus","doc","_displayStatus","_status","getPageTreeDisplayStatusLabelKey","getPageTreeBadgeColor","args","badgeColors","undefined","badgeColor","trim","length","getPageTreeBadgeLabel","badgeLabels","t","badgeLabel","withPageTreeDisplayStatuses","currentDocs","draftDocs","currentStatusByID","Map","map","String","id","docID","currentStatus","get","displayStatus"],"mappings":"AAQA,SAASA,cAAcC,MAA6B;IAClD,OAAOA,WAAW,aAAaA,WAAW,WAAWA,WAAW;AAClE;AAEA,OAAO,SAASC,yBACdC,GAA0D;IAE1D,IAAIA,IAAIC,cAAc,KAAK,WAAW;QACpC,OAAO;IACT;IAEA,IAAID,IAAIC,cAAc,KAAK,SAAS;QAClC,OAAO;IACT;IAEA,IAAID,IAAIC,cAAc,KAAK,aAAa;QACtC,OAAO;IACT;IAEA,IAAID,IAAIE,OAAO,KAAK,SAAS;QAC3B,OAAO;IACT;IAEA,IAAIF,IAAIE,OAAO,KAAK,aAAa;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,OAAO,SAASC,iCAAiCL,MAA6B;IAK5E,IAAIA,WAAW,WAAW;QACxB,OAAO;IACT;IAEA,IAAIA,WAAW,SAAS;QACtB,OAAO;IACT;IAEA,IAAIA,WAAW,aAAa;QAC1B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,OAAO,SAASM,sBAAsBC,IAGrC;IACC,MAAM,EAAEC,WAAW,EAAER,MAAM,EAAE,GAAGO;IAEhC,IAAI,CAACR,cAAcC,SAAS;QAC1B,OAAOS;IACT;IAEA,MAAMC,aAAaF,WAAW,CAACR,OAAO;IAEtC,OAAO,OAAOU,eAAe,YAAYA,WAAWC,IAAI,GAAGC,MAAM,GAAG,IAChEF,WAAWC,IAAI,KACfF;AACN;AAEA,OAAO,SAASI,sBAAsBN,IAIrC;IACC,MAAM,EAAEO,WAAW,EAAEd,MAAM,EAAEe,CAAC,EAAE,GAAGR;IAEnC,IAAIR,cAAcC,SAAS;QACzB,MAAMgB,aAAaF,WAAW,CAACd,OAAO;QAEtC,IAAI,OAAOgB,eAAe,YAAYA,WAAWL,IAAI,GAAGC,MAAM,GAAG,GAAG;YAClE,OAAOI,WAAWL,IAAI;QACxB;IACF;IAEA,OAAOI,EAAEV,iCAAiCL;AAC5C;AAEA,OAAO,SAASiB,4BAA4BV,IAG3C;IACC,MAAM,EAAEW,WAAW,EAAEC,SAAS,EAAE,GAAGZ;IACnC,MAAMa,oBAAoB,IAAIC,IAC5BH,YAAYI,GAAG,CAAC,CAACpB,MAAQ;YAACqB,OAAOrB,IAAIsB,EAAE,IAAI;YAAKtB,IAAIE,OAAO,IAAI;SAAK;IAGtE,OAAOe,UAAUG,GAAG,CAAC,CAACpB;QACpB,MAAMuB,QAAQF,OAAOrB,IAAIsB,EAAE,IAAI;QAC/B,MAAME,gBAAgBN,kBAAkBO,GAAG,CAACF;QAC5C,MAAMG,gBACJ1B,IAAIE,OAAO,KAAK,WAAWsB,kBAAkB,cACzC,YACAxB,IAAIE,OAAO,KAAK,WAAWF,IAAIE,OAAO,KAAK,cACzCF,IAAIE,OAAO,GACXK;QAER,IAAIP,IAAIC,cAAc,KAAKyB,eAAe;YACxC,OAAO1B;QACT;QAEA,OAAO;YACL,GAAGA,GAAG;YACNC,gBAAgByB;QAClB;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/status.ts"],"sourcesContent":["import type {\n NestedDocsPageTreePluginBadgeMap,\n NestedDocsPageTreePluginBadgeStatus,\n PageTreeSourceDoc,\n} from '../types.js'\n\nexport type PageTreeDisplayStatus = 'changed' | 'draft' | 'published' | 'unknown'\n\nfunction isBadgeStatus(status: PageTreeDisplayStatus): status is NestedDocsPageTreePluginBadgeStatus {\n return status === 'changed' || status === 'draft' || status === 'published'\n}\n\nexport function getPageTreeDisplayStatus(\n doc: Pick<PageTreeSourceDoc, '_displayStatus' | '_status'>,\n): PageTreeDisplayStatus {\n if (doc._displayStatus === 'changed') {\n return 'changed'\n }\n\n if (doc._displayStatus === 'draft') {\n return 'draft'\n }\n\n if (doc._displayStatus === 'published') {\n return 'published'\n }\n\n if (doc._status === 'draft') {\n return 'draft'\n }\n\n if (doc._status === 'published') {\n return 'published'\n }\n\n return 'unknown'\n}\n\nexport function getPageTreeDisplayStatusLabelKey(status: PageTreeDisplayStatus):\n | 'general:noValue'\n | 'version:changed'\n | 'version:draft'\n | 'version:published' {\n if (status === 'changed') {\n return 'version:changed'\n }\n\n if (status === 'draft') {\n return 'version:draft'\n }\n\n if (status === 'published') {\n return 'version:published'\n }\n\n return 'general:noValue'\n}\n\nexport function getPageTreeBadgeColor(args: {\n badgeColors: NestedDocsPageTreePluginBadgeMap\n status: PageTreeDisplayStatus\n}): string | undefined {\n const { badgeColors, status } = args\n\n if (!isBadgeStatus(status)) {\n return undefined\n }\n\n const badgeColor = badgeColors[status]\n\n return typeof badgeColor === 'string' && badgeColor.trim().length > 0\n ? badgeColor.trim()\n : undefined\n}\n\nexport function getPageTreeBadgeLabel(args: {\n badgeLabels: NestedDocsPageTreePluginBadgeMap\n status: PageTreeDisplayStatus\n t: (key: ReturnType<typeof getPageTreeDisplayStatusLabelKey>) => string\n}): string {\n const { badgeLabels, status, t } = args\n\n if (isBadgeStatus(status)) {\n const badgeLabel = badgeLabels[status]\n\n if (typeof badgeLabel === 'string' && badgeLabel.trim().length > 0) {\n return badgeLabel.trim()\n }\n }\n\n return t(getPageTreeDisplayStatusLabelKey(status))\n}\n\nexport function withPageTreeDisplayStatuses(args: {\n currentDocs: Pick<PageTreeSourceDoc, '_status' | 'id'>[]\n draftDocs: PageTreeSourceDoc[]\n}): PageTreeSourceDoc[] {\n const { currentDocs, draftDocs } = args\n const currentStatusByID = new Map(\n currentDocs.map((doc) => [String(doc.id ?? ''), doc._status ?? null]),\n )\n\n return draftDocs.map((doc) => {\n const docID = String(doc.id ?? '')\n const currentStatus = currentStatusByID.get(docID)\n const displayStatus =\n doc._status === 'draft' && currentStatus === 'published'\n ? 'changed'\n : doc._status === 'draft' || doc._status === 'published'\n ? doc._status\n : undefined\n\n if (doc._displayStatus === displayStatus) {\n return doc\n }\n\n return {\n ...doc,\n _displayStatus: displayStatus,\n }\n })\n}\n"],"names":["isBadgeStatus","status","getPageTreeDisplayStatus","doc","_displayStatus","_status","getPageTreeDisplayStatusLabelKey","getPageTreeBadgeColor","args","badgeColors","undefined","badgeColor","trim","length","getPageTreeBadgeLabel","badgeLabels","t","badgeLabel","withPageTreeDisplayStatuses","currentDocs","draftDocs","currentStatusByID","Map","map","String","id","docID","currentStatus","get","displayStatus"],"mappings":"AAQA,SAASA,cAAcC,MAA6B;IAClD,OAAOA,WAAW,aAAaA,WAAW,WAAWA,WAAW;AAClE;AAEA,OAAO,SAASC,yBACdC,GAA0D;IAE1D,IAAIA,IAAIC,cAAc,KAAK,WAAW;QACpC,OAAO;IACT;IAEA,IAAID,IAAIC,cAAc,KAAK,SAAS;QAClC,OAAO;IACT;IAEA,IAAID,IAAIC,cAAc,KAAK,aAAa;QACtC,OAAO;IACT;IAEA,IAAID,IAAIE,OAAO,KAAK,SAAS;QAC3B,OAAO;IACT;IAEA,IAAIF,IAAIE,OAAO,KAAK,aAAa;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,OAAO,SAASC,iCAAiCL,MAA6B;IAK5E,IAAIA,WAAW,WAAW;QACxB,OAAO;IACT;IAEA,IAAIA,WAAW,SAAS;QACtB,OAAO;IACT;IAEA,IAAIA,WAAW,aAAa;QAC1B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,OAAO,SAASM,sBAAsBC,IAGrC;IACC,MAAM,EAAEC,WAAW,EAAER,MAAM,EAAE,GAAGO;IAEhC,IAAI,CAACR,cAAcC,SAAS;QAC1B,OAAOS;IACT;IAEA,MAAMC,aAAaF,WAAW,CAACR,OAAO;IAEtC,OAAO,OAAOU,eAAe,YAAYA,WAAWC,IAAI,GAAGC,MAAM,GAAG,IAChEF,WAAWC,IAAI,KACfF;AACN;AAEA,OAAO,SAASI,sBAAsBN,IAIrC;IACC,MAAM,EAAEO,WAAW,EAAEd,MAAM,EAAEe,CAAC,EAAE,GAAGR;IAEnC,IAAIR,cAAcC,SAAS;QACzB,MAAMgB,aAAaF,WAAW,CAACd,OAAO;QAEtC,IAAI,OAAOgB,eAAe,YAAYA,WAAWL,IAAI,GAAGC,MAAM,GAAG,GAAG;YAClE,OAAOI,WAAWL,IAAI;QACxB;IACF;IAEA,OAAOI,EAAEV,iCAAiCL;AAC5C;AAEA,OAAO,SAASiB,4BAA4BV,IAG3C;IACC,MAAM,EAAEW,WAAW,EAAEC,SAAS,EAAE,GAAGZ;IACnC,MAAMa,oBAAoB,IAAIC,IAC5BH,YAAYI,GAAG,CAAC,CAACpB,MAAQ;YAACqB,OAAOrB,IAAIsB,EAAE,IAAI;YAAKtB,IAAIE,OAAO,IAAI;SAAK;IAGtE,OAAOe,UAAUG,GAAG,CAAC,CAACpB;QACpB,MAAMuB,QAAQF,OAAOrB,IAAIsB,EAAE,IAAI;QAC/B,MAAME,gBAAgBN,kBAAkBO,GAAG,CAACF;QAC5C,MAAMG,gBACJ1B,IAAIE,OAAO,KAAK,WAAWsB,kBAAkB,cACzC,YACAxB,IAAIE,OAAO,KAAK,WAAWF,IAAIE,OAAO,KAAK,cACzCF,IAAIE,OAAO,GACXK;QAER,IAAIP,IAAIC,cAAc,KAAKyB,eAAe;YACxC,OAAO1B;QACT;QAEA,OAAO;YACL,GAAGA,GAAG;YACNC,gBAAgByB;QAClB;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-nested-docs-page-tree",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Page tree plugin for Payload nested docs collections",
5
5
  "license": "MIT",
6
6
  "author": "WLF Studios",