feat(files): 文件管理四项——侧栏拖拽移动、草稿跨窗口认领、未命名默认存根目录、打开所在位置(docs/25)

This commit is contained in:
Muse
2026-11-14 16:36:36 +08:00
parent 71825201a2
commit c2f69f9303
12 changed files with 513 additions and 19 deletions

View File

@@ -0,0 +1,58 @@
# docs/25 文件管理四项:拖拽移动 / 草稿跨窗口 / 未命名默认保存 / 重命名与定位
## 1. 左侧栏拖拽移动
- 文件、文件夹均可拖到任意文件夹上松手完成移动(底层走 rename_path);
拖到顶部根目录标题行 = 移回工作区根目录。
- 投放合法性在拖拽悬停时就判定,不合法的目标不亮、不接受投放:
- **拖回原文件夹**(原位置)→ 不接受(无操作,避免无意义的报错与刷新);
- 拖到自己身上 → 不接受;
- 文件夹拖进自己或自己的子文件夹 → 不接受(App 侧执行时再校验一遍,
并拦截目标已有同名的情况,报错不覆盖)。
- 投放目标高亮(accent 描边+弱底色),被拖条目半透明。
- 移动后已打开的标签路径跟随(含文件夹内的子文档)、最近列表与恢复
记录键统一换位(remapAfterRelocate,改名共用同一套)。
## 2. 新窗口不再重复弹「未保存草稿」
根因:恢复记录在全应用共享的 SQLite 里,每个窗口启动都全量扫描并
按 planRecovery 提示;文档还开在另一个窗口里编辑时,它的自动保存
记录也被当成了崩溃草稿。
修复(services/windowClaims.ts):跨窗口认领注册表(localStorage,
多窗口同源共享)——每个窗口把「打开中的文档键 + 正在提示的草稿键」
登记并 10 秒心跳保鲜、关闭时注销;启动扫描滤掉被其他存活窗口认领
的记录。窗口崩溃残留的认领 45 秒后过期,真正的崩溃草稿不会被吞。
## 3. 未命名文档保存默认落工作区根目录
- 普通保存(Ctrl+S):有工作区时直接写到根目录的「未命名.md」,
同名自动避让为「未命名 1.md / 2.md…」(上限 100,仍撞名退回弹框);
没有工作区才弹保存框(与原来一致)。
- 另存为仍弹框,但默认位置预填到工作区根目录。
## 4. 重命名与打开所在位置
- 重命名本来就有(文件/文件夹右键均有),这次补齐短板:改文件夹名时,
其内已打开的子文档标签、最近列表、恢复记录一并换位(此前只跟随
恰好同路径的单个文件标签,文件夹内的标签会指向失效路径)。
- 右键新增「打开所在位置」:新增 Rust 命令 reveal_in_explorer,
用 explorer /select 打开父目录并选中该文件/文件夹(文件、文件夹
均有此项)。
## 验证
- vitest 106+2(新增:window-claims 3 例、路径助手 2 例、文件树拖放
与定位菜单 5 例);tsc 0 错误;构建通过。
- 无头浏览器实测:应用启动后认领注册表落盘、打开文档的键即时登记,
无页面错误。
- Rust 命令沙箱无工具链未编译(按 commands.rs 既有风格编写),
待 Windows 构建验证。
## 待真机复验
- 拖拽手感(WebView2 下 HTML5 拖放)与各拦截提示;
- 双窗口:窗口 A 编辑未保存 → 开新窗口不再弹草稿;A 崩溃/强杀后
新窗口仍能收到草稿提示;
- 未命名保存直接落根目录、避让命名;
- 「打开所在位置」资源管理器定位效果。