garsoncron/payload-plugin-content-tree

GitHub: garsoncron/payload-plugin-content-tree

为 Payload CMS 提供类 Sitecore 风格的层级内容树管理视图,支持拖拽重构与右键菜单,解决深层级复杂内容的管理与迁移痛点。

Stars: 0 | Forks: 0

# @garsoncron/payload-plugin-content-tree [![npm version](https://img.shields.io/npm/v/@garsoncron/payload-plugin-content-tree.svg)](https://www.npmjs.com/package/@garsoncron/payload-plugin-content-tree) [![npm downloads](https://img.shields.io/npm/dm/@garsoncron/payload-plugin-content-tree.svg)](https://www.npmjs.com/package/@garsoncron/payload-plugin-content-tree) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/67e6acbe8a014955.svg)](https://github.com/garsoncron/payload-plugin-content-tree/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![bundle size](https://img.shields.io/bundlephobia/minzip/@garsoncron/payload-plugin-content-tree)](https://bundlephobia.com/package/@garsoncron/payload-plugin-content-tree) ![展示展开、拖放重新排序和右键上下文菜单的内容树](https://raw.githubusercontent.com/garsoncron/payload-plugin-content-tree/main/.github/assets/hero.gif) ## 为什么会有这个插件 Payload CMS 3.x 将每个集合作为扁平列表进行浏览。这对于文章和产品来说运作良好。但是当你拥有一个页面树——嵌套三到四层的文件夹层次结构、编辑人员需要一眼看出的父子关系,以及决定何种内容类型可以存在于何种父级之下的插入选项时,这种模式就会失效。 从 Sitecore 迁移过来的团队会立刻感受到这一点。Sitecore 内容编辑器将树作为主要的导航界面。编辑人员通过扫描它来定位,通过右键单击来插入,并通过拖动来重构——所有这些都不需要离开树形视图。Payload 开箱即用时并不提供这些功能。 本插件添加了一个即插即用的 `/admin/tree` 视图,该视图基于 [react-arborist](https://github.com/brimdata/react-arborist) 构建,提供了你的编辑人员已经熟悉的 Sitecore 风格用户体验:插入选项、工作流侧边栏、锁定指示器,以及用于在不丢失树上下文的情况下进行编辑的 iframe 侧边轨道。它在今天就能正常运行,同时 Payload 官方的 Tree View RFC (#13982) 仍在开发中,并且它有针对性地解决了即使 Payload 原生树视图发布后也不太可能涵盖的 Sitecore 迁移用例。完整的 v1.0 范围请参见 [`PRD.md §5`](./PRD.md)。 ## 安装 ``` pnpm add @garsoncron/payload-plugin-content-tree ``` 然后在你的 Payload admin 布局中导入一次样式表(通常是 `app/(payload)/layout.tsx`): ``` import '@garsoncron/payload-plugin-content-tree/styles.css' ``` ## 用法 在 `payload.config.ts` 中注册插件,并将其指向定义了所需字段的集合: ``` // payload.config.ts import { buildConfig } from 'payload' import { contentTreePlugin } from '@garsoncron/payload-plugin-content-tree' export default buildConfig({ collections: [Pages], plugins: [ contentTreePlugin({ collectionSlug: 'pages', insertOptions: { root: ['page', 'folder'], folder: ['page', 'folder'], page: ['page'], }, contentTypeLabels: { page: 'Page', folder: 'Folder' }, }), ], }) ``` 然后访问 `/admin/tree`。 该插件会在 `buildConfig` 阶段验证你的集合,如果缺少任何必需的字段,将抛出可复制的错误信息。有关包含所有配置选项(`editUrlBuilder`、`canPerformAction`、`features`、`maxDepth` 等)的完整 API 契约,请参见 [`PRD.md §6`](./PRD.md)。 ### 必需的集合结构 该插件不会注入字段——你的集合必须定义它们: | 字段 | 类型 | 必需 | | --------------- | ----------------------- | -------- | | `parent` | `relationship` (self) | 是 | | `sortOrder` | `number` | 是 | | `contentType` | `select` | 是 | | `title` | `text` (any text-ish) | 是 | | `slug` | `text` | 否 | | `workflowState` | `select` | 否 | | `lockedBy` | `relationship` to users | 否 | 可以通过 `fields: { parent: 'parentPage', sortOrder: 'order', ... }` 覆盖任何字段名称。 ## 功能 - react-arborist 树视图——虚拟化、延迟加载展开状态、每个集合在 localStorage 中持久化 - 带有配置驱动的插入选项的右键上下文菜单(与 Sitecore 插入选项对等) - 拖放重新排序和重新设置父级,并带有原子性的 parent + sortOrder 写入 - 深度搜索并自动展开至祖先节点 - 侧边栏中可选的 workflow + 锁定指示器(通过 `fields.workflowState` 和 `fields.lockedBy` 选择启用) - 用于右侧 iframe 目标的 `editUrlBuilder` —— 已准备好集成 Puck - `canPerformAction` 回调,用于基于角色的操作门控 - 错误时的 Toast 通知 ## 示例 - [`./examples/basic`](./examples/basic) —— 可运行的沙盒:Next 15 + SQLite,零额外依赖 - [`./examples/with-puck`](./examples/with-puck) —— 通过 `editUrlBuilder` 集成 Puck 页面构建器 - [`./examples/sitecore-migration`](./examples/sitecore-migration) —— 从 Sitecore XM 迁移至 Payload 的叙述 分步迁移指南另请参见 [`MIGRATING.md`](./MIGRATING.md)。 ## 主题 所有可供使用者覆盖的值均作为 `--ct-*` CSS 自定义属性暴露。可以在你自己的 admin CSS 中覆盖它们: ``` :root { --ct-row-bg-selected: #c7f0d4; --ct-row-height: 32px; } ``` 或者将覆盖范围限定到自定义的 admin 包装器类: ``` .my-app-admin { --ct-text: #111827; --ct-border: #d1d5db; } ``` 回退到 Payload `--theme-elevation-*` 色阶的变量会自动识别你的 Payload 主题——对于 dark-mode(暗黑模式)支持,无需进行额外配置。 **变量分组**(事实来源:`packages/plugin/src/client/styles.css` `:root` 块): - **布局** — `--ct-row-height`、`--ct-indent-step` - **颜色 — 文本** — `--ct-text`、`--ct-text-muted` - **颜色 — 表面** — `--ct-surface` - **颜色 — 错误** — `--ct-error` - **颜色 — 交互状态** — `--ct-bg-hover`、`--ct-bg-selected`、`--ct-row-bg-selected`、`--ct-row-bg-hover`、`--ct-row-bg-highlighted` - **边框和阴影** — `--ct-border`、`--ct-shadow-card` - **Z-index 堆叠** — `--ct-z-context-menu`、`--ct-z-modal`、`--ct-z-modal-backdrop`、`--ct-z-toast` - **动画** — `--ct-anim-fast`、`--ct-anim-base` - **工具栏** — `--ct-toolbar-height`、`--ct-toolbar-border`、`--ct-search-input-width` - **DnD** — `--ct-drop-indicator` ## 质量 - 默认渲染时 0 个 axe-core 违规 - 覆盖率门控:服务端辅助函数 ≥80%,客户端 ≥60% - 打包体积:admin chunk ≤ 80 KB gzip(超出此阈值将在 CI 中直接失败) - CI 矩阵:Node 20 + 22 × SQLite(包含 Postgres + React 18 / Payload 3.0 组合) - 严格的 TypeScript,带有 `noUncheckedIndexedAccess`,除了带有记录原因的 disable-islands 之外不使用 `any` ## 状态 ## 路线图 v1.0 在 [PRD §5](./PRD.md) 中交付了锁定的范围。可以通过 [GitHub issues](https://github.com/garsoncron/payload-plugin-content-tree/issues) 和 [milestones](https://github.com/garsoncron/payload-plugin-content-tree/milestones) 跟踪正在进行的工作。 ## 贡献 开发循环、代码风格和发布流程请参见 [`CONTRIBUTING.md`](./CONTRIBUTING.md)。在提交 issue 或 PR 之前,请阅读 [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md)。安全漏洞请参见 [`SECURITY.md`](./SECURITY.md) —— 请勿为它们提交公开的 issue。 ## 许可证 MIT —— 详见 [`LICENSE`](./LICENSE)。
标签:CMS插件, CMS迁移, MIT许可, NPM包, OSV-Scalibr, Payload CMS, React, react-arborist, Sitecore, Syscalls, TypeScript, UX优化, 内容树, 内容管理, 内容编辑器, 右键菜单, 安全插件, 层级结构, 拖拽排序, 无头CMS, 管理后台, 管理界面, 自动化攻击, 节点层级, 页面树