v79 端上:任务面板(首页/任务页共用)+ 任务模块功能补齐

用户原话:「鸿蒙端的功能,也需要同样适配,在首页上可以直接修改编辑任务,
另外任务模块的功能需要完善。」

端上原来只有"看列表 / 勾完成 / 新建改标题",网页 v78 那套「就地处理」
(改状态、挪分组、子任务、附件、留言、删除)一件都没有;首页点任务
弹的还是 v73 的只读卡。

一、新增 FbTaskPanel(首页与任务页共用同一组件)
  · 改状态三段(待办/进行中/已完成)+ 标题左侧状态圈
  · 挪看板 chips、勾/加子任务、加图片附件并删、发留言
  · 编辑 → 交给宿主开 FbTaskEditSheet;删除要**点两次**(端上没有 undo)
  · 每个动作成功后再 getTask() 重拉一次:一次动作会牵动子任务计数、
    附件张数、看板色,逐处同步 DOM 必然漏一处

二、退役 FbTaskDetailSheet(v73 只读卡,387 行)
  ⚠️ 它已无人挂载,而守卫还在逐条"通过" —— 等于给死代码盖章。

三、任务模块补齐
  · 卡片点击 → 面板(不再直接进编辑表单:误触一下就开始改标题,
    且子任务/附件/留言没地方放)
  · 「只看已完成」改真打 ?view=done:看板视图服务端就写死
    status <> 'done',在客户端筛永远是空
  · 看板列表改走 ?view=boards:原来从任务反推 ⇒ 空看板永远选不到
  · 编辑表单补分类/循环两排

四、顺带修掉一个自查发现的真 bug
  任务页里 sheetCount 有**两个** @Monitor 都监听 boardSheetOpen、都写同一个值
  ⇒ 关掉设置浮层时谁最后执行不确定,会把还开着的面板"顺便让位结束",
  底部悬浮栏浮上来盖住面板按钮。已并成一个取并集的 monitor。

服务端(另一仓):新增 GET /tasks?view=boards、POST/DELETE /tasks/<id>/attach,
详情补 board_name/board_color_calc,越权删别条任务的附件 → 404。

验证:静态守卫 1055/0(新增 v79 一组,含"全页只许一个 sheetCount 赋值点")、
反向验证 215/0(新增 15 条注入,逐条证明新断言会红)、
服务端 e2e 1558/0、_fb_v79_api.py 26/0、编译通过并已装机。
This commit is contained in:
2026-10-22 16:40:44 +08:00
parent c7bd26dd1b
commit 25a0797a74
8 changed files with 1816 additions and 504 deletions
+72
View File
@@ -702,6 +702,78 @@ export interface FbBoardOpt {
color: string;
}
/** 分类选项(任务的「分类」;`id=0` = 不分类) */
export interface FbCatOpt {
id: number;
name: string;
}
/**
* 任务元数据(v79):**全部**看板 + 全部分类 + 状态/循环词表。
*
* 🔴 为什么单开一个类型、而不是继续从任务列表里反推看板:
* 反推只能看见"**有任务的**看板" ⇒ 刚建好、还没放任务的看板在端上永远选不到
* (用户建了个看板,端上挪不过去 —— 这在 v78 网页版是能做的)。
* 元数据走 `GET /tasks?view=boards`(很轻,不带任务)。
*/
export interface FbTaskMeta {
boards: FbBoardOpt[];
cats: FbCatOpt[];
}
/** 子任务(面板里那几行;只勾状态、不展开二级) */
export interface FbTaskKid {
id: number;
title: string;
status: string;
}
/** 任务下的一条留言 */
export interface FbTaskComment {
id: number;
content: string;
/** 留言人显示名(服务端已按"我怎么称呼他"处理过) */
name: string;
color: string;
createdAt: string;
}
/** 任务下的一个附件 */
export interface FbTaskAttach {
id: number;
name: string;
/** image / pdf / doc / file …(决定画缩略图还是画图标) */
kind: string;
isImage: boolean;
/** 存储键(`photo/xxx.jpg`),画图时交给 fbImageUrl */
key: string;
sizeWord: string;
}
/**
* 任务详情(v79 面板用):列表行 + 只有详情接口才给的那几块。
*
* ⚠️ `base` 复用 `FbTaskItem`:用户点开时先用列表那一份渲染(不空白),
* 详情接口回来再把 `base` 换掉。两处形状一致才不会"点开闪一下再变样"。
*/
export interface FbTaskDetail {
base: FbTaskItem;
/** 负责人 id(编辑时回填;0 = 未指派) */
assigneeId: number;
/** 负责人显示名(`base.assignee` 的同源,详情以这里为准) */
categoryId: number;
category: string;
/** 循环规则(day/week/month/year;空 = 不循环) */
repeat: string;
/** 父任务标题(子任务才有;空 = 本来就是顶层任务) */
parentTitle: string;
/** 建这条的人显示名 */
creator: string;
kids: FbTaskKid[];
comments: FbTaskComment[];
attachs: FbTaskAttach[];
}
// ============================================================
// 纪念日(days)
// ============================================================