feat(board): 已完成列按完成时间倒序排列
- 已完成列的展示顺序改由 completedAt 倒序决定(新增 sortCompletedDesc 纯函数), 最近完成的永远在最上面;缺 completedAt 的旧数据排在有完成时间的任务之后, 彼此退回 sortOrder 倒序 - 该列停用列内排序:拖拽与 ↑↓ 只能跨列,列头标注「按完成时间倒序」说明口径 - 数据层不动:不迁移 sortOrder,导入导出、快照结构与 schemaVersion 均不变, 倒序只在 BoardView.visibleColumns 单点发生 - 新增 ADR-009,并在 ADR-008 的否决项里标注被部分推翻 - 单测 705 → 738(sortOrder +5、BoardView +5、BoardColumn +1),README 同步
This commit is contained in:
+40
@@ -232,6 +232,7 @@ MVP 有「启动快照 + 手动导出」两道保护,但两个整份覆盖的
|
||||
创建时间对「先做哪件」几乎没有影响,放进 `title` 与详情抽屉足够。
|
||||
- _增加「按创建 / 完成时间排序」开关_:完成列的顺序由手动 `sortOrder` 表达,再引入第二种排序会让
|
||||
「看到的顺序」与「拖拽写回的顺序」产生两个真相;当前也没有对应使用场景。
|
||||
(其中「完成列按完成时间排序」后来被 [ADR-009](#adr-009--已完成列改按完成时间倒序展示) 部分推翻。)
|
||||
- _用相对时间(「3 天前」)_:文案依赖渲染时刻,页面开一整天就会和实际完成日对不上;
|
||||
复盘场景下具体日期更有用。
|
||||
- _提升 `schemaVersion` 做迁移_:字段早已存在,且 `coerceTask` 已把它们收敛为字符串或 `null`,无需迁移。
|
||||
@@ -242,3 +243,42 @@ MVP 有「启动快照 + 手动导出」两道保护,但两个整份覆盖的
|
||||
拖拽换列走 `moveTask`,两者规则一致(进入「已完成」写时间、离开即清空),展示值与状态不会互相矛盾。
|
||||
- 新增两个纯函数与对应单测;`TrashPanel` 少了一个私有格式化函数。
|
||||
- 卡片 `title` 是纯提示信息,不参与可访问性命名(`aria-label` 仅在多选态给出),读屏语义不变。
|
||||
|
||||
---
|
||||
|
||||
## ADR-009 · 已完成列改按完成时间倒序展示
|
||||
|
||||
**背景**
|
||||
|
||||
ADR-008 否掉了「完成列按时间排序」,理由是维持单一顺序来源。但实际使用中这个取舍站不住:
|
||||
完成任务时 `sortOrder` 是「追加到列尾」,于是**刚勾完的任务沉到列表最底下** ——
|
||||
打开看板想问「我刚才做完什么」,得滚到列底;做完几十条之后,已完成列变成一条只有
|
||||
「按完成先后升序」的考古记录。对已完成的任务来说,用户唯一关心的顺序就是完成时间。
|
||||
|
||||
**结论**
|
||||
|
||||
1. 已完成列的展示顺序由 `completedAt` 倒序决定,不再消费 `sortOrder`。
|
||||
排序键收敛为一个纯函数 `sortCompletedDesc`(`src/utils/sortOrder.ts`),
|
||||
转换只在 `BoardView` 的 `visibleColumns` 单点发生,store 与数据层语义不变。
|
||||
2. 该列停用列内排序:拖拽与 `↑` `↓` 只允许跨列(`sortDisabled` 对 `done` 恒为 true),
|
||||
避免写出「永远看不见结果」的 `sortOrder`。
|
||||
3. 列头标注「按完成时间倒序」,把口径写在界面上,用户不会误以为拖不动是故障。
|
||||
4. 不做数据迁移:`sortOrder`、导入导出、快照结构与 `schemaVersion` 全都不动。
|
||||
`completedAt` 缺失的旧数据(手工导入、更早的备份)排在有完成时间的任务之后,
|
||||
彼此之间退回 `sortOrder` 倒序,至少保持「新完成的在上面」。
|
||||
|
||||
**被否决的方案**
|
||||
|
||||
- _一次性按完成时间重排 `sortOrder`,新完成插列首_:需要迁移存量数据,且用户只要拖过一次,
|
||||
顺序就再次和时间脱钩 —— 等于保留两个真相,还多了写操作。
|
||||
- _只改插入位置(新完成插列首)_:改动最小,但存量列表仍是旧的升序,首屏出现
|
||||
「新任务在顶、旧任务按升序续在后面」的断裂顺序。
|
||||
- _加排序开关_:一个开关多一份状态、多一组需要测试的组合,而「已完成」只有一种合理顺序。
|
||||
|
||||
**影响**
|
||||
|
||||
- 落入已完成列的落点不再由拖拽位置决定(`completedAt` 刚写入即最新),这是预期行为。
|
||||
- `store.byColumn.done` 仍是 `sortOrder` 语义,只有视图层按时间倒序;两者差异集中在
|
||||
`BoardView.visibleColumns`,测试覆盖了「顺序与 `sortOrder` 无关」这一条。
|
||||
- 已完成列成为只读顺序:拖拽、`↑` `↓`、批量移动(只能移出该列)都不会改变其内部顺序。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user