|
1 | 1 | # v0.12.2:笔记页信息架构重构——三栏布局 + 收件箱动线 + 路由信息收敛 |
2 | 2 |
|
3 | | -> 状态:**规划定稿(2026-08-23,设计完成待实施)** |
| 3 | +> 状态:**代码已交付(2026-08-23)** |
4 | 4 | > 依据:用户对话 2026-08-23(笔记页截图 4 点抱怨:碎片捕获无头绪 · 分组混乱交互不明 · 路由理由放置存疑 · 需要自主新建笔记)+ 市场调研(捕获收件箱模式 / Gmail 分类透明性 / 自动组织先例)+ 三项用户裁决(方案 A 三栏 · 二元论碎片 · 升笔记轻确认) |
5 | 5 | > 前置:v0.12.1(OCR 引擎回归修复)交付后开工 |
| 6 | +> 实施裁决(2026-08-23 用户最终确认):feedCapture 开关**默认开启**(快速记录收件箱转正,不再是预览);Phase 1 + Phase 2 全量实施 |
6 | 7 |
|
7 | 8 | ## 一句话 |
8 | 9 |
|
|
116 | 117 | ## 落地顺序 |
117 | 118 |
|
118 | 119 | - **Phase 1(纯前端,零后端改动)**:三栏拆分 + 组行交互修正 + ⓘ 弹层(迁入路由理由/改判/组管理/周契约)+ 新建去 prompt + 收件箱视图常驻(碎片列表迁移)。 |
119 | | -- **Phase 2(后端 + 开关)**:`promote_fragment_to_note` + 碎片卡升笔记/升卡接线 + feedCapture 开关语义调整(默认值待决)。 |
| 120 | +- **Phase 2(后端 + 开关)**:`promote_fragment_to_note` + 碎片卡升笔记/升卡接线 + feedCapture 开关语义调整(默认值已裁决:**改开**)。 |
120 | 121 | - **验收走查**:种子数据过 捕获→升级→编辑→归组→闪卡 全链。 |
121 | 122 |
|
| 123 | +## 交付记录(2026-08-23) |
| 124 | + |
| 125 | +### M1 · 三栏布局重构(Phase 1) |
| 126 | + |
| 127 | +- `NoteGroupPanel.tsx`(545 行,三合一)按职责拆分并删除: |
| 128 | + - `GroupSidebar.tsx`(240px 组筛选侧栏)——行单击=**仅过滤**(删除"单击=过滤+展开"双动作);行小字=人话归因一行 + ⓘ;⚡ 快速记录、📥 收件箱(恒常首项+计数)、📁 全部笔记、🎴 复习徽标。 |
| 129 | + - `RouteInfoPopover.tsx`(ⓘ 弹层,≤300 行)——四区:人话归因 + 信号明细**默认折叠**("查看明细"展开)/ 改判(修改即记忆)/ 组管理(生成闪卡·结算含计划·复习本组·移入移出选中笔记)/ 周契约卡(`WeekContractCard` 独立组件由弹层引用);fixed 锚定组行下方 + 透明背板/ESC 关闭。 |
| 130 | +- `NotesPage.tsx` 三栏编排:`view: notes | inbox` 中部原位切换;`groupFilter` 只做过滤;搜索/标签过滤激活时 NoteListView 原位显示结果(不再 flatMode 换布局);focusNoteId 跨页直达简化为滚动定位(无展开依赖);`noteTree.ts` 树形合并纯函数与单测下线(v0.11.5 树模式被三栏取代)。 |
| 131 | +- 行数豁免登记同步(`docs/standards/line-limit-exemptions.md`):NoteGroupPanel(545)与 NoteEditView(登记值过期,实测 ≤300)登记移除;NotesPage.tsx(328 行)正式登记(编排层内聚,拆分计划:快捷键/收件箱动线回调拆 hooks)。 |
| 132 | +- 新建笔记:`handleCreate` 去 `window.prompt` —— `create_note(未命名笔记,"")` → 立即编辑态聚焦首行(NoteEditView autoFocus),落未归组(全部笔记可见),并自动切回笔记视图+全部过滤(新建即见闭环)。 |
| 133 | + |
| 134 | +### M2 · 收件箱动线(Phase 2) |
| 135 | + |
| 136 | +- `promote_fragment_to_note(fragment_id, title, group_id?)` 新命令:单事务(读碎片→建 notes(source=manual, 正文=碎片文本)→图片搬运 `fragments/`→`notes-images/{nid}/` 并写入 markdown 引用→删碎片);图片搬运失败**降级纯文本笔记**(碎片文本不丢);标题后端必填校验;`require_feed_enabled` 对称准入。 |
| 137 | +- `promote_fragment_to_card(fragment_id)` 新命令:复用 `card_from_fragment` 多句卡规则;幂等(`card_by_fragment` 查重——已升级返回 0 不报错,可重复触发);未归组碎片明确报错引导先归组/升笔记(flashcards.group_id NOT NULL 契约);记 `fragment_upgraded` 指标(与组生成同口径)。 |
| 138 | +- `FeedFragmentList.tsx` 改造为**收件箱碎片卡**(全量 active 碎片,不再依赖 feed 组展开):✍ 升为笔记(内联轻确认表单:标题预填首句可改 + 归组下拉默认未归组→确认后右侧自动打开新笔记)/ ⚙ 升为闪卡 / 🗑 删除(二次确认);空态引导"一句灵感,三种归宿"。 |
| 139 | +- feedCapture 开关:默认值改开(`feature_flags` Default + 测试同步);语义改为「快速记录入口」(设置页文案更新);后端命令准入保留(减面不减安全)。 |
| 140 | + |
| 141 | +### M3 · 验证 |
| 142 | + |
| 143 | +- Rust:cargo test 新增 5 测(碎片升笔记 文本/图片搬运/图片缺失降级/碎片不存在 + flashcard 幂等判据)全绿;cargo clippy 零新增警告;cargo check 通过。 |
| 144 | +- 前端:`tsc --noEmit` 零错误;vitest **67 通过**(新增 10 测:routeReason 人话归因 5 + inbox 预填/预览 5 + jsdom 组件测试 收件箱状态机 4(捕获→升笔记→移除/升卡幂等/删除二次确认/空态)+ ⓘ 弹层 4(四区齐全/改判契约/生成闪卡/ESC);测试基建:`jsdom` + `@testing-library/react` + vitest include 扩展 `.tsx`,组件测试按文件 `@vitest-environment jsdom` 切换环境);`npm run build` 通过。 |
| 145 | +- 待真机验收:种子数据过 捕获→升级→编辑→归组→闪卡 全链(验收标准 1-4 走查)。 |
| 146 | + |
| 147 | +### 与规划的主要差异(诚实记录) |
| 148 | + |
| 149 | +- ⓘ 弹层定位用視口 fixed 锚定(最初设计为侧栏内 absolute;fixed 简化背板关闭逻辑,视觉等价)。 |
| 150 | +- `noteTree.ts` 被三栏取代后删除(含单测)——v0.11.5 树形合并是"展开组必看笔记"的过渡形态,三栏下组行只过滤、列表常驻,树无消费方(YAGNI);如后续需要"组内速览"再以独立视图恢复。 |
| 151 | +- 收件箱碎片卡未逐个显示所属组名(Fragment 契约不含 name;补计需要额外 join——YAGNI,升笔记/升卡时组选择已可见)。 |
| 152 | + |
122 | 153 | ## 验收标准 |
123 | 154 |
|
124 | 155 | 1. 侧栏组行单击=仅过滤(中部列表切换,无展开动作);⚠ 待确认组淡橙描边小字显示;ⓘ 弹层四区齐全,明细默认折叠。 |
|
0 commit comments