- replace default Convex control-plane wording with Rust SQLite control-plane across architecture, AGENTS, Reasonix, and design docs - retire root Convex functions source and deploy script into recycle while keeping explicit cloud/compat/sync-replica boundaries - add control-plane migration guard/docs and keep CodeGraph refreshed after the SQLite control-plane cutover
95 lines
3.7 KiB
Markdown
95 lines
3.7 KiB
Markdown
# 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`。
|
||
- 使用一次性 SQLite control-plane Auth 用户注册后自动获得的默认 workspace;旧 Convex Auth 只作为历史 compat 对照。
|
||
- 清理仅针对本轮创建对象;如清理失败,只记录对象 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` 失败,验证页面成功进垃圾箱、失败附件仍保留,并出现“部分对象删除失败”摘要。
|