Files
mnote/design/04-tree-domain/done/4-26-filetree-bulk-delete-selection-smoke-v1.md
T
lix-2026 384da4e44c feat(tree): checkpoint resource lifecycle work
提交当前顶层 mnote Git 工作区,范围集中在 04-tree-domain 的 resource/trash/filetree 生命周期、mnote-web resource_trash 路由、Convex/Next 兼容接口、sidebar/file-tree 客户端适配、smoke 脚本与对应设计/bug 记录。

不包含被 ignore 的 design/05-editor-mainline/reference-code/leptos-tiptap 嵌套仓库改动。新增 smoke 的测试密码改为运行时读取 MNOTE_E2E_PASSWORD,避免提交明文 credential assignment。
2026-05-16 07:38:45 +08:00

95 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 4-26 FileTree 批量删除与选择矩阵 Smoke
> 状态:done
> 创建时间:2026-05-15
> 所属主线:04-tree-domain / VSCode Explorer 文件树与垃圾箱闭环
> 来源:`design/10-review/07-vscode-explorer-filetree-trash-gap-review.md` 阶段 4
## 1. 目标
补齐 Convex filetree 下的真实浏览器验收,避免只用 reducer、local-folder smoke 或 API seed 证明“文件树多选删除已完成”。
本设计只覆盖阶段 4 的最小闭环:
- 隔离用户 / 隔离 workspace seed 3 个页面、2 个普通附件、1 个 mindmap、1 个 table。
- 在 3000 主入口打开 filetree UI。
- 验证 Ctrl/Cmd 多选、Shift 范围、右键已选项保持 selection、右键未选项切换 action target。
- 验证 Delete / Backspace 触发混合 doc + asset 批量删除。
- 验证确认文案按页面、附件、mindmap、table 计数。
- 验证删除后无需浏览器刷新,filetree 中目标行立即消失,并能在 trash dataset 或 `/trash` 中看到。
## 2. 安全边界
- 不在默认测试账号既有 workspace 上执行批量删除。
- 不对默认 workspace 执行 `emptyTrashByWorkspace`
- 使用一次性 Convex Auth 用户注册后自动获得的默认 workspace。
- 清理仅针对本轮创建对象;如清理失败,只记录对象 ID,不扩大删除范围。
## 3. 建议脚本
新增:
- `scripts/task428-filetree-bulk-delete-selection-smoke.js`
脚本输入:
- `MNOTE_UI_BASE_URL`:默认 `http://127.0.0.1:3001`,便于复用 `FRONTEND_PORT=3001 npm run desktop:hot`
- `NEXT_PUBLIC_CONVEX_URL` / `CONVEX_SELF_HOSTED_URL`:默认 `http://127.0.0.1:3210`
脚本输出:
- `tmp/task428-filetree-bulk-delete-selection-smoke/result.json`
- 包含本轮 email、workspaceId、docIds、assetIds、captured confirm 文案、tree command / resource request 摘要、trash 验证结果。
## 4. 验收矩阵
### 4.1 Seed
- 创建父页面 `root`
- 创建子页面 `child`
- 创建兄弟页面 `sibling`
- 创建资源页面 `resources`,用于挂载:
- 普通附件 2 个。
- mindmap 1 个。
- table 1 个。
### 4.2 Selection
- Ctrl/Cmd 点击:选中 `root` 与一个外部普通附件。
- Shift 点击:在可见行上形成范围选区,至少包含 2 行。
- 右键已选项:selection 数量保持不变。
- 右键未选项:selection 切换为该项。
### 4.3 Delete / Backspace
第一轮 Delete
- 选择 `root``child`、外部普通附件、mindmap、table。
- 预期 preflight plan 去重:`root` 保留,`child` 被父页面覆盖,外部资源保留。
- 确认文案应包含:
- `1 个页面`
- `1 个附件`
- `1 个思维导图`
- `1 个在线表格`
- 确认后:
- `root``child`、外部普通附件、mindmap、table 对应行无需刷新消失。
- Convex trash / sidebar dataset 可查询到对应 deleted / archived 状态。
第二轮 Backspace
- 选择 `sibling` 与第二个普通附件。
- 触发 Backspace,确认后无需刷新消失。
- 作为 Delete 入口的键盘等价验证。
## 5. 执行结果
`scripts/task428-filetree-bulk-delete-selection-smoke.js` 已落地并通过真实浏览器验证:
- 创建一次性用户和隔离 workspace。
- seed 页面、附件、mindmap、table。
- 验证 Ctrl/Cmd 多选、Shift 范围、右键已选保持、右键未选切换。
- 验证 Delete 混合删除页面 + 附件 + mindmap + table。
- 验证 Backspace 混合删除页面 + 附件。
- 验证确认文案计数、filetree 行无需刷新消失、Convex 垃圾箱状态。
- 通过 route interception 强制 `/api/media/batch` 失败,验证页面成功进垃圾箱、失败附件仍保留,并出现“部分对象删除失败”摘要。