提交当前顶层 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。
4.6 KiB
4.6 KiB
4-37 [done] 垃圾箱改为居中弹窗工作台 v1
更新时间:2026-05-15
背景:
- 用户建议:垃圾箱应做成弹窗,而不是单一页面。
- 当前
/trash是完整页面入口;在本地文件夹 / 云空间切换异常时,用户会通过垃圾箱“找回”原空间页面,这进一步暴露垃圾箱作为导航页面会改变当前工作区上下文。
1. 设计目标
把垃圾箱从“离开当前工作区的独立页面”逐步改为“当前工作区内的居中弹窗工作台”。
弹窗形态以 Wolai 居中对话框为准:遮罩覆盖页面,工作台面板在视口中心显示,左右和上下都保留留白;不要做成靠右侧贴边的 drawer / 抽屉。
目标体验:
- 用户点击左下角“垃圾箱”时,不离开当前页面和当前文件树上下文。
- 垃圾箱以居中 modal 打开,不贴右侧边缘,不改变当前 URL。
- 弹窗内展示页面垃圾箱与资源垃圾箱。
- 恢复、彻底删除、清空操作完成后,当前 Sidebar / File Tree / Page Tree 实时同步。
- 关闭弹窗后,用户回到原页面、原选中 row、原滚动位置。
2. 非目标
- 本稿不改变删除、恢复、彻底删除的底层命令语义。
- 本稿不一次性废弃
/trash;/trash可作为兼容、直接链接和测试入口保留。 - 本稿不扩大到全局搜索、模板中心等其它 footer 入口。
3. 最小实现切片
P0:入口形态
- 左下角“垃圾箱”从普通导航改为打开弹窗。
- 弹窗复用现有
mnote-trash-workbenchDOM 与 API。 - 打开弹窗不改变当前 URL;如需要可用
?trash=1或 history state,但默认不跳整页。
P1:上下文保持
- 弹窗打开前记录当前
sourceKind、workspaceId、rootUri、active row、scrollTop。 - 关闭弹窗后恢复原 File Tree / Page Tree 视图状态。
- 本地文件夹场景下,垃圾箱只展示本地
.mnote/trash能力;Convex 云空间展示 Convex trash。
P2:实时同步
- 页面 restore / purge / empty 后,当前 Sidebar 通过 tree event 或本地 apply 更新。
- 资源 restore / purge / empty 后,File Tree 对应资源 row 同步恢复或消失。
4. 验收标准
- 点击“垃圾箱”不会离开当前文档 URL。
- 垃圾箱面板在视口中心显示,左右居中偏差不超过 8px,并保留可见的上下留白。
- 弹窗内能恢复页面、彻底删除页面、清空页面垃圾箱。
- 弹窗内能恢复/彻底删除/清空附件、mindmap、table 等资源。
- 关闭弹窗后,原页面仍打开,File Tree 滚动位置和选中 row 不被无关重置。
/trash兼容入口仍可访问并通过现有 smoke。
5. 当前状态
当前状态:done
2026-05-15 已完成最小可用实现:
- 左下角“垃圾箱”入口保留
href="/trash"作为兼容 fallback,但主壳点击会拦截为data-mnote-action="open-trash-modal"。 PageLayout新增垃圾箱 modal:打开后 fetch/trash?workspaceId=...,解析并挂载现有mnote-trash-workbench,不改变当前 URL。- modal 关闭时会关闭 workbench EventSource,并恢复 File Tree
scrollTop;不改变原页面、active row 或当前文档 URL。 /trash独立页面继续保留,作为直接链接、兼容入口和现有 smoke 的验证对象。- 本地文件夹上下文下,modal 保持在本地 source,不跳回 Convex;当前先展示
.mnote/trash/trash-index.json的本地垃圾箱说明,后续如需完整 local trash list 可继续扩展。 - 2026-05-15 根据用户参考图修正 modal 形态:从右侧 drawer 改为居中对话框,并在 smoke 中增加居中与上下留白断言,避免后续重复退回侧栏抽屉形态。
代码落点:
rust/crates/mnote-web/src/workspace_shell.rsrust/crates/mnote-web/src/ssr/pages/layout.rsrust/crates/mnote-web/src/ssr/styles.rsrust/crates/mnote-web/src/routes/gateway.rsscripts/task442-trash-modal-workbench-smoke.js
已通过验证:
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_tree_runtime -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web workspace_shell -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web trash_entry -- --nocapture
MNOTE_UI_BASE_URL=http://127.0.0.1:3428 node scripts/task442-trash-modal-workbench-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3428 node scripts/task432-filetree-trash-page-dual-browser-no-refresh-smoke.js
结果文件:
tmp/task442-trash-modal-workbench-smoke/result.jsontmp/task432-filetree-trash-page-dual-browser-no-refresh-smoke/result.json