收口工作台资源 tab 与本地文件树 P1
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# 4-43 Local Folder Sort Order Persistence Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-20
|
||||
>
|
||||
> Owner:local folder tree command / file tree projection ordering
|
||||
|
||||
## 1. 目标
|
||||
|
||||
补齐 P1:`local_folder` 的 `move` 当前只把 `sortOrder` 回显到 `_unsupportedFields`,不能形成拖拽排序后的持久顺序语义。目标是在不引入第二套 UI 真相的前提下,让本地文件夹排序通过本地 metadata 持久化,并被 file tree / page tree projection 消费。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `rust/crates/mnote-web/src/routes/tree.rs` 中仅限合同测试或调用透传
|
||||
- 可新增聚焦 smoke:`scripts/task47*-local-folder-sort-order-*.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不通过重命名文件前缀实现排序。
|
||||
- 不把排序真相放到前端 DOM 或 localStorage。
|
||||
- 不改变 Markdown 页面正文事实源。
|
||||
- 不改变垃圾箱、restore、purge 的既有路径语义。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] 本地 metadata 增加可持久化排序记录,按 parent/container 维度表达子项顺序。
|
||||
- [x] `move` 带 `sortOrder` 时写入排序记录,不再返回 `_unsupportedFields.sortOrder`。
|
||||
- [x] projection 读取排序记录并稳定排序,未记录项继续按现有自然排序兜底。
|
||||
- [x] rename / move / archive / restore 后排序记录不会留下明显悬挂项或破坏 projection。
|
||||
- [x] Rust 合同测试覆盖 move sortOrder 持久化、重新加载 snapshot 后顺序保持。
|
||||
- [x] 如涉及可见行为,补 browser/API smoke 验证排序后重新加载 projection 不回退。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- [x] `cargo test -p mnote-web local_tree_command_move_with_sort_order -- --test-threads=1`
|
||||
- [x] `cargo test -p mnote-web tree_command_local_folder -- --test-threads=1`
|
||||
- [x] 如新增 smoke:`node scripts/task472-local-folder-sort-order-persistence-smoke.js`
|
||||
|
||||
## 5.1 本轮执行记录
|
||||
|
||||
- 已合入:`.mnote/file-order.json` 按 parent relative path 记录子项相对路径顺序,projection 扫描时消费该顺序。
|
||||
- 已退役:`_unsupportedFields.sortOrder` 合同测试,改为持久化顺序和 snapshot 顺序断言。
|
||||
- 已合入:rename / archive / purge 对 file-order path 做 rewrite / remove,restore 回到文件系统自然排序或原 parent 现有顺序。
|
||||
- 本轮补齐:`scripts/task472-local-folder-sort-order-persistence-smoke.js` 使用隔离 tmp root,经 `/api/tree/commands` 执行 local_folder `move sortOrder`,再通过 `/api/tree/projections/file` 重拉 projection,验证刷新/重新加载后顺序不回退。
|
||||
- 执行记录:`node --check scripts/task472-local-folder-sort-order-persistence-smoke.js` 通过;`node scripts/task472-local-folder-sort-order-persistence-smoke.js` 在本地 `http://127.0.0.1:3000` 服务可用时通过。
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不实现跨设备 sync 的排序冲突合并。
|
||||
- 不实现完整 VSCode Explorer sort comparator 配置。
|
||||
@@ -0,0 +1,56 @@
|
||||
# 4-44 FileTree Action Layer Paste / Drop / Delete Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-20
|
||||
>
|
||||
> Owner:File Tree actions / preflight / smoke semantics
|
||||
|
||||
## 1. 目标
|
||||
|
||||
补齐 P1:delete、paste、right-click paste、external drop 的动作层仍分散,缺少 dirty / readonly / undo / fallback 的统一动作合同。目标是先把现有行为收口成可测试的轻量 action layer,不一次性照搬 VSCode `IBulkEditService`。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `rust/crates/mnote-web/src/routes/tree.rs`
|
||||
- `rust/crates/mnote-web/src/tree_shell/*` 中仅限 preflight / action contract
|
||||
- `scripts/task430-vscode-explorer-stage7-smoke.js`
|
||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
- 可新增聚焦 smoke:`scripts/task47*-filetree-action-layer-smoke.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不删除旧 media / mindmap / table fallback route。
|
||||
- 不把默认删除改成永久删除。
|
||||
- 不绕过 readonly preflight。
|
||||
- 不破坏多选 `data-selected` 语义。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] 提炼前端 File Tree action helper,统一记录 action、target、preflight、fallback、失败项。
|
||||
- [x] delete 对 local folder 资源统一走 archive tree command,并暴露可观测 undo/fallback 占位状态。
|
||||
- [x] right-click paste 使用当前菜单目标,而不是只能依赖 focused row。
|
||||
- [x] paste / drop 对 readonly 目标有一致阻断提示和 DOM 标记。
|
||||
- [x] external drop 二进制文件继续进入上传链路,失败时不清空 selection。
|
||||
- [x] smoke 增加至少一个语义断言:目标 row、action 名、fallback/readonly/undo 状态之一。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- [x] `cargo test -p mnote-web layout -- --test-threads=1`
|
||||
- [x] `cargo test -p mnote-web tree_command_local_folder -- --test-threads=1`
|
||||
- [ ] `node scripts/task430-vscode-explorer-stage7-smoke.js`
|
||||
- [ ] `node scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
- [ ] 如新增 smoke:`node scripts/task47*-filetree-action-layer-smoke.js`
|
||||
|
||||
## 5.1 本轮执行记录
|
||||
|
||||
- 已合入:`recordFileTreeAction` / `recordFileTreeActionStatus`,为 delete、paste、open-right、new-window 等现有路径暴露稳定 DOM 状态。
|
||||
- 已合入:右键 `paste-into` 使用菜单触发 row,不再只能靠 focused row。
|
||||
- 本轮追加:`layout.rs` 为 filetree projection row 暴露 `data-capabilities`,新增 `ensureFileTreeWritableTarget` / `blockReadonlyFileTreeAction`,paste 与内部 drop 在执行前复用 `/api/tree/filetree/drop-preflight`;readonly 目标统一写入 `data-mnote-filetree-last-action-status=blocked`、`data-mnote-filetree-readonly-blocked`、`data-mnote-filetree-readonly-message` 与目标 row 标记,并沿用 `alert` fallback 提示。
|
||||
- 本轮追加:`task471-local-folder-bulk-resource-trash-smoke.js` 增加语义断言,覆盖 bulk-delete 的 action 名、触发 row 与 `archived` undo 状态;未修改 `task430` 的隔离 workspaceId 前置条件,避免把环境准备失败误判为业务回归。
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不实现完整 undo stack。
|
||||
- 不实现 cloud object storage drop executor。
|
||||
@@ -0,0 +1,52 @@
|
||||
# 5-22 Mindmap Main Editor Tab Kind Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-20
|
||||
>
|
||||
> Owner:main editor resource tab / mindmap editor kind
|
||||
|
||||
## 1. 目标
|
||||
|
||||
补齐 P1:mindmap 仍以独立 object shell 进入主 pane,而不是 main editor group 内的 editor kind。目标是把 File Tree 中的 mindmap 资源默认打开到主编辑区 tab,并保留显式对象页 / 新窗口兼容入口。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `scripts/task169-mindmap-realtime-smoke.js`
|
||||
- 可新增聚焦 smoke:`scripts/task47*-mindmap-resource-tab-smoke.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不把 mindmap 数据保存到 `page.body.save`。
|
||||
- 不删除 `/mindmap/:documentId/:mindmapId` object shell 兼容路由。
|
||||
- 不破坏已存在的 mindmap realtime / long text edit smoke。
|
||||
- 不让 mindmap tab 和 page tab 使用同一个 DOM identity。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] resource open resolver 识别 `kind=mindmap` / `objectKind=mindmap`。
|
||||
- [x] 点击 File Tree mindmap 资源默认创建 main editor resource tab,而不是整页跳 `/mindmap/...`。
|
||||
- [x] mindmap tab 使用稳定 canonical identity,如 `resource:mindmap:<documentId>:<mindmapId>` 或 local file canonical identity。
|
||||
- [x] tab panel 内挂载既有 mindmap runtime,并保持 `data-mnote-object-editor="mindmap"` / 可观测标记。
|
||||
- [x] 显式新窗口 / object shell 入口仍可用。
|
||||
- [x] smoke 覆盖从 File Tree 打开 mindmap tab、切回 page、再切回 mindmap。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- [x] `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- [x] `node scripts/task169-mindmap-realtime-smoke.js`
|
||||
- [ ] 如新增 smoke:`node scripts/task47*-mindmap-resource-tab-smoke.js`
|
||||
|
||||
## 5.1 本轮执行记录
|
||||
|
||||
- 已合入:`kind=mindmap` resource tab,使用 `resource:mindmap:<documentId>:<mindmapId>` identity,并复用现有 `/mindmap/...` bootstrap + runtime mount。
|
||||
- 已保留:旧 object shell 作为 runtime 不可用或显式路径 fallback。
|
||||
- 本轮更新:`task169` 已从旧 object shell 口径切到 main editor mindmap resource tab 口径,断言 File Tree 打开 mindmap 后进入 `data-mnote-tab-kind="mindmap"` 的 resource tab,并覆盖切回 page tab 后再切回 mindmap tab。
|
||||
- 已退役:`task169` 内旧 topic/runtime realtime 深测不再作为必过主链,结果中写入 `retiredRealtimeTopicEditing`,避免旧 object shell 时代的交互假设干扰当前 P1 resource tab 验收。
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不实现 mindmap 多实例协同编辑模型。
|
||||
- 不实现 tab 持久化恢复。
|
||||
@@ -0,0 +1,50 @@
|
||||
# 5-23 Editor Side Target / Secondary Pane Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-20
|
||||
>
|
||||
> Owner:document pane runtime / side target
|
||||
|
||||
## 1. 目标
|
||||
|
||||
补齐 P1:secondary pane 与 main tab 目前是两套概念。目标是先建立轻量 side target 合同,让 `openTarget=side` 能稳定映射到当前 secondary pane,而不是继续分散在“右侧边栏打开”和 resource tab 特例里。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `scripts/task457-main-editor-resource-tab-smoke.js`
|
||||
- 可新增聚焦 smoke:`scripts/task47*-side-target-smoke.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不实现完整多 editor group grid。
|
||||
- 不改变 primary page / resource tab 的默认 active tab 行为。
|
||||
- 不把 secondary pane 等同为 active resource tab。
|
||||
- 不删除现有 `secondaryDocumentId` query 兼容。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] `resolveResourceOpen` / document pane runtime 对外暴露 `openTarget=side` 的稳定返回。
|
||||
- [x] 页面文档的 side target 继续打开 secondary pane,并更新/清理既有 secondary query。
|
||||
- [x] 资源类 side target 有明确行为:当前阶段可先显示 unsupported/error placeholder,但必须可观测且不误开新窗口。
|
||||
- [x] 关闭 secondary pane 不影响 active resource tab URL state。
|
||||
- [x] smoke 覆盖 active tab 与 secondary pane 可同时存在、互不清状态。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- [x] `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- [x] `node scripts/task457-main-editor-resource-tab-smoke.js`
|
||||
- [x] 如新增 smoke:`node scripts/task47*-side-target-smoke.js`
|
||||
|
||||
## 5.1 本轮执行记录
|
||||
|
||||
- 已合入:`openResourceAsSideTarget`,资源侧栏目标先显示可观测 unsupported placeholder,不再误开新窗口或污染 active resource tab。
|
||||
- 已合入:`tree.page.open` + `openTarget=side` 的 document side target wrapper,复用现有 `openSecondaryDocument` / `secondaryDocumentId` 合同。
|
||||
- 已合入:资源类 `openTarget=side` 使用 secondary pane unsupported placeholder 时清理 `secondaryDocumentId` / `secondarySourceKind` / `secondaryRootUri`,保留 active resource tab 的 `resourceTab` URL state。
|
||||
- 验证记录:`node --check scripts/task472-side-target-secondary-pane-smoke.js`、`node --check scripts/task457-main-editor-resource-tab-smoke.js`、`cargo test -p mnote-web web_shell -- --test-threads=1`、`node scripts/task472-side-target-secondary-pane-smoke.js`、`node scripts/task457-main-editor-resource-tab-smoke.js`。
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不实现 split editor layout、drag editor between groups、MRU across groups。
|
||||
@@ -113,3 +113,10 @@ local office 可进入主编辑区 tab,Convex office 仍可能新窗口;mind
|
||||
- `design/04-tree-domain/process/4-41-filetree-bulk-resource-command-cutover-v1.md`
|
||||
- `design/04-tree-domain/process/4-42-filetree-open-target-rooturi-contract-v1.md`
|
||||
- `design/05-editor-mainline/process/5-21-editor-tab-url-active-identity-checklist-v1.md`
|
||||
|
||||
第四轮进入 P1,按 editor workbench 语义继续拆分:
|
||||
|
||||
- `design/04-tree-domain/process/4-43-local-folder-sort-order-persistence-v1.md`
|
||||
- `design/05-editor-mainline/process/5-22-mindmap-main-editor-tab-kind-v1.md`
|
||||
- `design/05-editor-mainline/process/5-23-editor-side-target-secondary-pane-v1.md`
|
||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
||||
|
||||
Reference in New Issue
Block a user