Commit Graph
16 Commits
Author SHA1 Message Date
laoyang cbeeb55a82 任务标题改用单行输入框 (#77)
用户 2026-11-05:「现在这个任务标题是好几行的那种输入框,不要用这种输入框,
用一行的输入框就行了。标题没有那么长,现在太高了。」

TextArea(多行,height 84)→ TextInput(单行,height 40)。

① 高度 84 → 40,与「截止」「负责人」那些控件行同高
   标题是一句话,本来不需要多行;84 的高度等于多占两行位置,
   把下面所有内容(状态/看板/截止…)整体往下推。

② 顺带补 onSubmit:单行框里回车是"提交"而不是换行,
   用户打完直接按回车就保存,不用先点别处。
   多行框里回车是换行,所以以前不能加这一条。

⚠️ TextInput 只有一行,高度超了也只是上下留白 ⇒ 直接给 40,
   不是像 TextArea 那样"给多少显示多少"。
⚠️ 单行框超长时不换行、横向滚动 —— 标题本来就没那么长,可接受。

编译通过,已装真机。
2026-11-05 19:52:23 +08:00
laoyang 10cd10e9ff 顶栏去掉重复状态徽标 + 标题输入框与其它统一 (#77)
用户 2026-11-05 两点:
  1.「编辑任务那一行,右上角还有个"进行中",那个也去掉吧,
     因为在状态那里已经看到"进行中"了。」
  2.「台式机采购计划这个任务标题的输入框和其他的都不一样。我感觉没必要,
     字体什么的大小,和下面的备注还有什么的保持一致就行了,没必要特别特殊。」

① 删掉顶栏的状态徽标
   下面「状态」区三个 chip 已经把当前态高亮出来了,顶栏再挂一个只读徽标
   是同一信息画两遍。顶栏现在只剩「编辑任务/属于父任务 + 关闭」。

   ⚠️ `statusWord() / statusTint() / statusWash()` 三个方法**保留** ——
      状态区的 statusChip 还在用。
   ⚠️ 上一版注释写"只留状态徽标 + 关闭",与现实不符了,已同步改掉。

② 标题输入框与备注完全统一
   改前:fontSize(fontTitle=17) + Bold + height(64)
   改后:fontSize(fontSmall=13) + 不加粗 + height(84)
   三项参数与备注(noteDraft 那个 TextArea)**逐项一致**。
   标题的"重要性"由它排在最前 + 标签主题色表达,输入区不必再靠字号放大。

编译通过,已装真机。
2026-11-05 19:50:45 +08:00
laoyang d4b9d08b7e 标题/备注改成常驻输入框 + 内容用墨黑 (#77)
用户 2026-11-05 两点:
  1.「任务标题里面,"台式机采购计划"这样的字样还是改成黑色吧。
     任务标题这四个字用主题色,但是输入框里面的文字用黑色。」
  2.「这个输入框本来就应该是输入框,怎么现在点了一下才变成输入框呢?
     它应该直接就是输入框,只是把文字放到输入框里面就行了。
     这样的话,点一下键盘就弹出来了,包括下面的备注也是一样。」

① 颜色:标签主题色、内容墨黑
   上一版我把 TextArea 的 fontColor 也设成 accent,整段标题变成红的,
   像报错。现在:
     · 「任务标题」四个字 → fieldLb(主题色 + Bold)
     · 框里的文字 → FbColors.ink
   备注同理。

② 常驻输入框(这是关键的结构修正)
   上一版是"只读文字 + 点一下切成 TextArea"的双态(titleEdit / noteEdit),
   所以用户看到的是"点一下才变成输入框"。
   现在**直接就是 TextArea**,值从 titleDraft / noteDraft 来。
   点输入框由系统自己聚焦 + 弹键盘,不需要 requestFocus。

   ⚠️ 必须是**受控**的:`TextArea({ text: this.titleOf() })` 是非受控,
      每次 reload() 重建组件会丢掉用户正在打的字。
   ⚠️ 删掉 titleEdit / noteEdit 两个状态(双态不存在了),
      保存判据改成"值变了没有"。
   ⚠️ 标题**空值回填、不提交**:服务端会把空标题清洗成空串 = 把标题删了。
      用户只是清空重打,不该丢标题。
   ⚠️ 备注**允许清空**:删掉备注是正常操作,所以 note 不像 title 那样回填。

③ 焦点保护(新增 titleFocus / noteFocus)
   `@Monitor(refreshTick)` 会在外部刷新时调 reload(),而 reload 会用
   服务端的值覆盖 titleDraft —— 用户正打字时被覆盖就是"打着打着字没了"。
   ⇒ 有焦点时不覆盖,失焦后再同步(onBlur → save → reload)。

编译通过,已装真机。
2026-11-05 19:48:49 +08:00
laoyang 4cca4c51be 任务面板:左上「编辑任务」+ 点一下即编辑 + 标题最前 + 字号统一 (#77)
用户 2026-11-05 五点:
  「这个框的标题在左上角,是"编辑任务"几个字,颜色用主题颜色。
    你参考一下"编辑行程"的做法。」
  「任务和备注是点进去之后,只要点一下,马上就要变成编辑状态,
    然后弹出输入法,开始输入。不需要点一下之后先变成一个输入框,
    再点一下弹出输入法。直接点进去之后就是输入状态。」
  「任务标题应该放在最前面,放在所有内容之前,也就是状态之前。」
  「状态、分组、看板、任务标题、截止、负责人、备注、协作人、
    子任务、附件、留言这些字的大小要保持统一。」

① 左上角「编辑任务」(主题色)
   与 FbTripNodeSheet 的「编辑行程」完全同一套:
   fontSize(fontBody=15) + Bold + accent。
   只写固定的「编辑任务」,不写任务标题 —— 标题是内容(可改),
   已经下移到 titleRow()。
   「属于「父任务」」跟着放到标题下面第二行(原来是同一行的大字位置)。

② 点一下直接进编辑态并拉起输入法
   原来点一下只是 `xxxEdit = true`,把 TextArea 画出来 ——
   但**画出输入框不会自动获得焦点**,用户还得再点一下才弹输入法,
   正是他说的"变成输入框,再点一下弹出输入法"。
   ⇒ 点击时:
        this.titleEdit = true;
        focusControl.requestFocus(tkpTitleInput);
     并给控件加 `.id(...)` + `.defaultFocus(true)`。
   ⚠️ `focusControl` 是**全局声明的命名空间**(ets/component/common.d.ts),
      **不能 import** —— 写成 `import { focusControl } from @kit.ArkUI`
      会报 "has no exported member"。这个坑踩过一次。
   ⚠️ `defaultFocus(true)` 是兜底:个别机型上 requestFocus 会因
      "节点刚创建"而落空,defaultFocus 能让它自己拿到。
   备注同改(id = tkpNoteInput)。

③ 任务标题提到最前
   build() 的 Scroll 里顺序改为:
      titleRow() → statusSeg() → boardChips() → infoRows() → …
   原来它在 infoRows 内部第一个(等于排在状态/看板之后)。

④ 字号统一
   `fieldLb` 从 fontTiny(11) 改成 **fontSmall(13)**,
   与 `FbSectionTitle` 内部字号完全一致(那个组件是 fontSmall)。
   上一版标签比区块标题小一号,看着不成套。
   现在统计:状态/分组(看板)/协作人/子任务/附件/留言 六个 FbSectionTitle
   全部 fontSmall,任务标题/截止/负责人/备注/分类/循环 六个 fieldLb
   也全部 fontSmall ⇒ 11 处标题字号统一。

编译通过,已装真机。
2026-11-05 19:45:17 +08:00
laoyang 28c6e674ba 任务面板:去掉左上圆圈、标题下移成可编辑的「任务标题」(#77)
用户 2026-11-05:「还是不对,这个弹出框的标题是编辑任务,台式机采购这样的
东西,它是一个标题,也应该可以被修改才对。所以它应该往下放,就是任务标题;
然后台式机采购计划也往下放,也是可以修改的。左上角那个标志,好像一个圆圈
什么的,那个也不要了,去掉。」

① 删掉左上角的 FbCheckCircle("圆圈")
   它是"点一下勾完成"的快捷入口,但下面「状态」区已经有三个明确的 chip,
   入口重复。而且它紧贴标题左侧,视觉上像"标题前面的项目符号",
   反而让人以为标题前面该有个图标。

② 大标题从顶栏下移到「更多信息」区,成为第一项「任务标题」
   原来标题画在 headBar 里,所以它是**只读**的 —— 而标题本来就该能改。
   现在与截止/负责人/备注同形态:标题行 + 控件行,
   点一下变成 TextArea(height 64、字号 fontTitle 17、主题色),
   失焦自动保存(与备注同一套交互,不设保存按钮)。
   ⚠️ 空标题不发请求:服务端会清洗成空串,等于把标题删了。
   ⚠️ `saveField(title, ...)` 走的是既有 PATCH —— 服务端 ApiHandler
      对未提交字段回退原值,所以只传 title 不会把 note/due_at 抹掉。

③ headBar 只剩「状态徽标 + 关闭」,左端放「属于「父任务」」
   父任务那行保留在顶栏不跟着下移:它是上下文不是内容,
   跟标题走反而离"父任务"这个概念更远。
   没有父任务时用 Blank() 占位,保证徽标和关闭仍在右边。

④ 完成态标题仍是 faint + 删除线(不上主题色)
   删除线是"这件事已经过去了"的信号,再上主题色会和待办标题一样抢眼。

编译通过,已装真机。
2026-11-05 19:41:14 +08:00
laoyang 2fefacccd3 任务面板字段改上下两行 + 标题主题色 (#77)
用户 2026-11-05:「还是不对,你还是没有看清楚那个样式的设置:上面的标题和
下面的输入框,其实要分成两行。比如说,"截止"不是直接后面排一个日期,
而是把日期输入框放在"截止"下面;"负责人"也是,"备注"也是,全部都是这样的。
上面"台式机采购计划"这样的标题,应该是主题的颜色。」

前两轮(#77i / #77j)我都在改**颜色和字重**,方向偏了 ——
用户要的是**布局**:标签一行、控件另起一行。

① fieldLb 去掉 width(48)
   上一版把它定成 48vp 固定宽的行内标签,形态是「[截止] 2026-11-07 18:30」,
   与要求的上下两行正好相反。
   现在 width(100%) + textAlign Start,独占一行;
   字号从 fontSmall(13) 降到 fontTiny(11):上下两行之后标签再和控件同号
   会抢视觉重心。

② infoRows 重写为 Column({space:14}),每项 = Column({space:6}){
     标题行 fieldLb(...)
     控件行(height 40 / inputBg / radiusS / 左右 padding 12)
   }
   控件行统一给 height(40):不给的话「设置…」「未指定」这类短文字
   会把框压扁,几行之间的间距就参差不齐。
   负责人那行的头像从 22 调到 24(框内 40 高,22 略嫌小)。
   备注:只读态改 constraintSize({minHeight:40}) + maxLines(3),
   避免长备注把框撑成一大片;编辑态从单行 TextInput 换成
   TextArea(height 76)—— 备注本来就是多行的,单行输入框里
   看不见换行,用户会以为只能写一句。

③ kvRow 同步改成上下两行
   「分类」「循环」若还左右排,夹在截止/负责人/备注中间会显得错位。

④ 面板标题改主题色
   Text(this.titleOf()) 从 FbColors.ink + Medium 改成 this.accent + Bold。
   ⚠️ 完成态仍保留 faint + 删除线:那是"这件事已经过去了"的信号,
      再上主题色会和待办标题一样抢眼,反而分不出轻重。

编译通过,已装真机。
2026-11-05 19:37:08 +08:00
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