Commit Graph
10 Commits
Author SHA1 Message Date
laoyang b42e657bb2 标题颜色/看板/截止/负责人/备注/协作人/留言头像 全部修正 (#77)
用户 2026-11-05:「还是不对,标题的颜色不对。分组看板那个地方没改,截止没改,
负责人没改,备注没改,协作人没改。评论那个地方的头像怎么又没了?」

逐条查下来,四个真问题:

① 上一轮只改了 3 个标题,漏了一大片
   只换了「子任务/附件/留言」,而 **看板、状态、协作人**、
   以及「更多信息」里的**字段标签**全是手写的 fontTiny + faint。
   ⇒ 看板/状态/协作人 补 FbSectionTitle(Bold + accent + 字距 0.6)。
   ⇒ 截止/负责人/备注/分类/循环 这些**行内字段标签**新增 fieldLb() Builder:
     同样取主题色 + Bold + letterSpacing,但宽度 48、无内边距
     (不能直接用 FbSectionTitle:它 width 100% + padding,会把右侧控件顶下去)。
   ⚠️ 这与「编辑表单」的口径不同:那边 `期限` 仍是浅灰小字。
      用户明确要求这个面板里字段标签也用主题色粗体 —— 按用户要求走,
      已在 fieldLb 的注释里写明这个差异,避免以后有人"统一"回去。

② 留言头像丢失的真因
   不是数据问题,是 `FbPersonChip` **不透传 imageUrl**。
   它内部的 `FbAvatar({ name, color, dia, fontSizeVp })` 漏了这个参数,
   而 `FbAvatar` 自己是支持的(注释里还写着"800 人里只有 19 人有头像,
   有图显示图、没图回落色块字")。
   ⇒ 上一轮我换成 FbPersonChip 后,原来手写 FbAvatar 时**能显示的头像反而没了**。
      给 FbPersonChip 补 `@Param imageUrl` 并传给内部 FbAvatar,
      调用点把 `fbImageSrc(c.avatar, token)` 传进去。

③ 状态区原来没有标题
   三个 chip 直接飘在那(上下每个区段都有标题)。补 FbSectionTitle(状态)。

④ 协作人标题改组件
   顺手把「+ 共享」按钮挪到标题下面单独一行(FbSectionTitle 是 100% 宽,
   放同一个 Row 里会把它压成 0 宽)。

编译通过,已装真机。
2026-11-05 19:34:12 +08:00
laoyang 09f7878994 样式改为走规范组件 FbSectionTitle / FbPersonChip (#77)
用户 2026-11-05:「样式还没变,还记得咱们之前规定的样式是怎么做的吗?」

找到了。规定就在 entry/src/main/ets/components/Widgets.ets,
而且 FbSectionTitle 的注释里**留着用户原话**:

  「"今天的日程",既然是日程,标题颜色就应该用日程的主题色。
    …下面的"近期任务"改法跟上面一样,还有"最近纪念日"也不说了,全都是一样的。」

上一轮我做错的地方:**手写 Text 改 fontColor**,没走组件。
而 FbSectionTitle 给的是三样东西:
  · fontWeight: accent 存在时 Bold(不是 Medium)
  · fontColor: accent
  · letterSpacing: 0.6
我只改了颜色 ⇒ 字重和字距还是老样子 ⇒ 用户看着"样式没变"。

改动:
① 子任务 / 附件 / 留言 三个区块标题 → 全部换成 FbSectionTitle
   传 accent: this.accent(模块主题色)+ extra(数量/进度)
② 留言人 → 换成 FbPersonChip
   网页端留言人用的就是 person_chip()(头像 + 名字的胶囊),
   鸿蒙端对应 FbPersonChip。上一轮我手写的"头像 + 纯文字名字"只是长得像,
   不是同一套。换掉后同时删掉外置的那个 FbAvatar(组件内置了,会画两遍)。

🔴 踩到一个组件约束:FbSectionTitle 是 `width(100%)` 的独立组件,
   塞进 `Row` 里会和后面的计数/按钮抢宽度,被压成 0 宽。
   ⇒ 三处都改成**独占一行**;「已完成 2/5」这类附加信息走它自带的 extra;
      按钮(+ 添加附件)另起一行右对齐。

编译通过,已装真机。
2026-11-05 19:29:39 +08:00
laoyang 32a35ca222 留言底部被裁 + 留言支持附件 (#77)
用户 2026-11-05:
  「留言输入框下面还有东西,现在被挡住了,根本看不见,也滚不动了。
   但下面应该还有字什么的,看看是什么。」
  「留言是可以需要添加附件的。」

① 被挡住的是什么
   是 #77 刚加的「回车发送」那行小字。

   根因:`commentSection()` 是 `Scroll` 里**最后一个**子元素,
   而 Scroll 内容末尾只留了 `height(6)`。
   Scroll 本身是 `flexShrink(1)`(内容不够高时按内容收缩),
   最后一行下边距一旦小于"卡片 padding + footBar 高度",
   就会被判定为"已到底" —— 滚不过去、也看不见。
   ⇒ 底部留白从 6 改成 28。

② 留言带附件
   服务端网页端早就有(tasks/comment_add 里的 attach_save_files),
   但 **API 的 comments 端点只收 content**,且空文字直接 422
   ⇒ 端上根本没有传附件的入口。三处一起改:

   · app/ApiHandler.php:comments POST 支持 multipart
       - 有 file 就走附件流程:先 addComment 拿 cid,再 Attachment::save
         (顺序不能反:save 要 owner_id,cid 是插入后才有的)
       - kind 用 task_comment,与网页端 attach_save_files 同一归属类型
         (不同的话同一条留言的附件在两端互相看不见)
       - **允许只发附件不写字**:自动补占位文案「(附件)」,与网页端同口径
   · FbTaskRepo.addTaskCommentWithFile():手拼 multipart
       - 不能复用 fbUploadOne(那个是"一个文件 + 一个字段",
         评论要同时传 content + file)
       - 文件段必须带 Content-Type:服务端按它判"是不是图片"
       - boundary 之间用 \r\n(用 \n 有些解析器会把整段当一个字段,
         表现为"文字上去了、附件不见了")
   · FbTaskPanel:
       - 「+ 添加附件」按钮(DocumentViewPicker,任意文件)
       - 选中的文件名显示成 chip,可点 ✕ 去掉
       - 附件**不立刻上传**,随留言一起发(与「任务附件」那块语义不同:
         那个传完就生效)
       - 发成功后清空待发附件,否则下一条会重复带上

   实测(模拟上传链路):
     只有文字          => cid=18 ✅
     文字 + 附件        => cid=19,附件数 1 ✅(key=files/6b4e...txt)
     只发附件(占位)   => cid=20 ✅
   测试数据已清理。
2026-11-05 19:25:32 +08:00
laoyang ad25792732 选人改「只留搜索框」+ 附件用系统打开 + 留言头像与主题色 (#77)
用户 2026-11-05 五项。

① 选人慢 → 未输入关键词时不渲染任何人
   用户:「实在不行,我们就不把人列出来了,只留搜索框…输入拼音首字母就可以找到这个人」

   慢的根因(不只是节点多):
     · 名册 **800 人**(不是 8 个);
     · 每人一个 FbAvatar,而它内部调 fbImageSrc(avatar, token) ——
       那是**同步**查本地缓存 + 拼 URL,800 次全在打开弹窗那一帧跑完;
     · 再加 800 个 Column/Text 节点参与布局。
   ⇒ 未输入时一个候选都不渲染,只显示"输入名字或拼音首字母找人"。
     只有真打了字才过滤、才渲染(结果通常 1~20 个,瞬间出来)。

   ⚠️ 没改成"只显示前 N 个":800 人里翻前 20 个没用,用户还是得搜。
   ⚠️ 暂存区(已选那几个)不受影响:数量极少且必须一直可见
      (否则用户忘记选了谁)。多选 + 多次搜索的流程因此保持完整:
      搜一个 → 点选进暂存 → 改关键词再搜 → 再点选 → 确定。

② 附件:Word 等非图片文件交给系统应用打开
   用户:「应该打开本机上默认能够打开这个文件的应用,让它把文件打开才对。」

   项目里**已经有** common/FbAttachOpen.ets(下载明文到 cacheDir +
   隐式 Want + action.viewData 交给系统「打开方式」),只是任务面板没调用。
   ⇒ 附件缩略图挂上 onClick:
       · 图片 → 就地全屏预览(新加浮层,ImageFit.Contain 看全图不裁边)
       · 其它 → fbAttachOpen(),系统自己找能打开 .docx 的应用
   ⚠️ 不能用「显式 Want + 包名」:不知道用户装的是 WPS 还是 Office。
   ⚠️ 预览用 Contain 而非 Cover —— 缩略图用 Cover 对,预览裁边就错了。

③ 留言人头像
   服务端 Task::comments() 的 SQL 里**一直有** `p.avatar`,
   端上 parseTaskComment 只取了 name/color ⇒ 头像从没显示过。
   补 RawTaskComment.avatar + FbTaskComment.avatar + 解析,
   UI 换成公共 FbAvatar(有图用图、没图退回首字色块)。

④ 留言标题/发言人用模块主题色加粗
   原来发言人是 muted 灰、常规字重 —— 漏了全站「以模块色标识」的规矩
   (观影紫 / 旅程绿 / 任务赭红)。改成 this.accent + FontWeight.Medium。
   同时把「附件」「留言」「子任务」三个小节标题也从 ink 改成主题色。

   ⚠️ 正文**没有**跟着改主题色:整段上色会掉可读性(色彩需要留白)。
      如果用户要求正文也变色,改一行即可(已在代码注释里标了位置)。

⑤ 编译通过,已装真机。
2026-11-05 19:19:57 +08:00
laoyang 4e2fbb04b7 鸿蒙任务面板:看板平铺、截止负责人备注可改、文案与图标 (#77)
用户 2026-11-05 对鸿蒙端首页任务弹窗提了 12 项,本批完成 9 项
(附件预览/下载单独做)。

① 看板平铺,不再左右滑
   参考 FbTripNodeSheet 的做法:≤6 项 Flex(wrap) 换行平铺,>6 项才横滑。
   当前家庭 4 个看板(默认 + 正在进列/等待反馈/等待结果)⇒ 走平铺。
   ⚠️ 平铺必须用 Flex(wrap),ArkUI 的 Row 不换行,塞不下会横向溢出
      父容器(v76 真机踩过:最后一个 chip 被裁掉且点不到)。
   ⚠️ Row 的 space 在 Flex 里不生效 ⇒ chip 补了 margin 做间距。

② 删掉截止下面重复的「看板」行
   上面 boardChips() 已经把当前看板高亮出来了,再列一行纯属重复,
   而且两处都要同步才不出错。

③ 截止日期可改
   点整行 → FbDateTimePicker(与编辑表单同一个组件,交互一致)。
   改完立刻保存,不设保存按钮 —— 与状态/看板/子任务同一套交互。

④ 负责人可改 + 头像
   点头像/名字 → FbPersonPickSheet 单选。
   头像来源:服务端 Task::find 的 SQL 里**一直有** a.avatar AS assignee_avatar
   (实测 #49 返回 avatars/2026xxx.jpg),只是端上 parseTaskItem 从没解析
   ⇒ 补 RawTask 字段 + FbTaskItem.assigneeAvatar/assigneeColor + 解析。
   没头像时用首字色块兜底(与留言区同一手法)。

⑤ 备注可改
   点一下变输入框,回车或失焦自动保存(等用户去找"保存"按钮
   就会以为没存上)。

⑥ 「共享给谁」→「协作人」(标题与弹层标题都改)

⑦ 「+ 加图片」→「+ 添加附件」,**行为也跟着改**:
   原来 pickAttach 用 PhotoViewPicker + IMAGE_TYPE 只能选相册图片,
   改叫"添加附件"却选不了 PDF/Word,用户会以为功能坏了
   ⇒ 换成 DocumentViewPicker(系统文件选择器),能选任意文件。

⑧ 留言区标题加 💬 图标

⑨ 「回车发送」从 placeholder 挪到下方独立小字
   (塞 placeholder 里一打字就看不见,而且 placeholder 该放"填什么"不是"怎么操作")

⑩ 发送按钮显示不全
   根因:写死 width(56) + textAlign(Center),Text 默认内边距吃掉两侧空间,
   56 减去内边距 + 两个汉字正好压线,字体缩放或不同机型就截掉半个字。
   ⇒ 改 constraintSize({minWidth:60}) + 水平 padding,按文字实际宽度自适应。

⚠️ 另一个必须同步的地方:FbTasksPage 里改状态时会**整条替换** FbTaskItem,
   新加的两个字段漏了就会被抹掉(改一次状态头像就没了)——已补。

编译通过。
2026-11-05 19:12:24 +08:00
laoyang 86de59616c 端上:#47~#55 打包 —— 行程双轨、动态类型、表单全局规范 (#53)
#48 计划/实际双轨:nodeAction(start/done/cancel),完成即转实际行程,
    实际行程不再显示状态;新增 actualStartedAt/actualEndedAt
#49 类型/出行方式/车辆 chip 改内部读状态(@Builder 值传参不刷新)
#50 类型点击立即变色、出行方式平铺、参与人显示已选头像
#51 节点类型动态加载(原硬编码5种)、地址 onPick 拿详细地址与坐标
#52 标签改主题色 Bold、必填红无星号、编辑行程标题同步
#53 表单两排版式(标签独占一行解决左右对不齐);电影弹层 layoutWeight 修滚动
#54 地址联想框加时间窗抑制(600ms 内不搜)、候选限高 180

含附件回填诊断日志(DIAG-ATTACH/FILL),待真机确认后移除
2026-11-05 12:41:04 +08:00
laoyang 59a9d3df39 任务共享:面板补「共享给谁」区块 laoyang/FamilyBook#26
用户原话(2026-10-28):「鸿蒙端对齐网页端」。任务面板原来没有共享入口,现在:

1) FbTaskShare 类型 + parseTaskDetail 解析 Task::find 已带的 shares
2) FbTaskRepo 补 fetchTaskShares/shareTask/unshareTask(删除走 query)
3) FbTaskPanel 加「共享给谁」区块:列表(可改/只看)+ 逐条取消 +
   「+ 共享」复用选人组件(与资源/财务共享同一套)

编译 BUILD SUCCESSFUL;服务端冒烟 _i26_task_share_api.py 13/0 + 反证命中。
2026-10-28 22:10:15 +08:00
laoyang 1c6af8ac56 v79b 任务面板:补「看板」一行 + boardOf 反查兜底
真机验收时发现 boardOf() 定义了却从没被渲染,面板上看不出这条任务
属于哪个看板 —— 而「挪看板」正是 v79 新做的动作,做完看不见结果等于没做。

- infoRows() 增加 kvRow('看板', boardOf())
- boardOf() 在 base.board 为空时按 boardId 反查 boards,最后回落到「默认看板」

验证:静态守卫 1068/0(新增 ⑰ 三条)· 反向验证 222/0(新增 2 条注入)
     真机探针 _fb_v79_verify.py 57/0
2026-10-22 18:46:04 +08:00
laoyang 559d79b2e2 v79b 端上:修 ForEach 键——改完状态卡片还显示旧状态
自查发现的隐患,**编译通过、静态断言全绿、节点也都在**,只是内容陈旧:

任务行是 `@Builder taskRow(t: FbTaskItem, …)` / `taskCard(t)` —— 入参按值传递、
不参与状态观察(本仓库文件头第 A 条反模式)。而 `ForEach` 的生成键只有
`'htk_' + t.id` ⇒ 改了状态 → 重拉列表 → `this.tasks` 换成新对象,但**键没变**
⇒ ArkUI 按 key 复用旧节点、不重跑生成器 ⇒ 卡片仍显示旧状态。

用户会看到:「面板里改成已完成了,关掉面板那张卡还是待办。」

修法:新增 `model/Types.taskKey(t)`,键里带**所有会被画到行上的字段**
(status / boardId / dueAt / overdue / childDone+childTotal / title),
首页与任务页两处 ForEach 都改用它;面板里子任务行的键也补上 `k.status`。

⚠️ 代价是状态一变这一行会重建(丢的是这一行的局部动画,不是滚动位置)。
   这是刻意的取舍:**宁可重画,也不要不刷新**。

新增守卫 ⑯ 组 10 条(计数/关系型:
「键生成器必须调 taskKey」「taskKey 必须含这 6 个字段」「子任务键要带 status」),
并补 5 条反向验证注入(退回只拼 id / 漏 status / 漏 boardId / 子任务键缺 status)。

守卫 1064/0 · 反向 220/0 · 编译 BUILD SUCCESSFUL。
2026-10-22 17:33:32 +08:00
laoyang 25a0797a74 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、编译通过并已装机。
2026-10-22 16:40:44 +08:00