laoyang
|
d9ca9dbe31
|
下拉框与网页端对齐(照 FeedLite 那套观感)(#86)
用户 2026-11-05:「好了,鸿蒙端也用类似的方式调,效果让它保持一致。」
端上**不需要像网页那样手写浮层** —— 网页端必须自绘是因为
「原生 select 的展开列表由浏览器绘制,CSS 改不动」;
ArkUI 的 Select 本身就是自绘的、选项列表也归框架管。
⇒ 把对应属性都设上就等价了:
网页端 ArkUI Select
──────────────────────────────────────────────────────
按钮 40 高 / 圆角 / 细边框 height(40) + borderRadius + border
箭头打开转 180° 框架内置(自带动画)
悬停 tint-1 不支持(触屏没有 hover)→ 用打开态代替
选中项底 tint-2 selectedOptionBgColor(fbMixWhite(accent,0.80))
选中项文字 主题色 selectedOptionFontColor(accent)
选中项右侧对勾 showDefaultSelectedIcon(true)
浮层白底 + 细边框 menuBackgroundColor(White) + border
浮层与按钮同宽 optionWidth(OptionWidthMode.FIT_TRIGGER)
未选值次要色 fontColor(有值 ? accent : Faint)
① Theme 新增 fbMixWhite(hex, ratio)
与网页端 fb_color_tint() **同算法同比例**(混 91/80/72% 白)。
⚠️ 为什么不用现成的 fbAlpha():那是「原色 + 透明度」,
会透出父容器底色 —— 下拉浮层背景不确定,那样会时深时浅;
这里是实色混合,颜色确定。
⚠️ 实测 16 组(4 个主题色 × 4 档比例)与 PHP 输出逐个比对,全部一致。
② 边框单独用一档
按钮边框 fbMixWhite(accent, 0.62) —— 比 tint-3 再深一点,
否则在 tint-1 的浅底上几乎看不见边界。
③ 修一个类型坑
本来写了个 pickFontColor(): string 返回 accent / FbColors.muted,
但 FbColors.muted 是 Resource($r(...)),返回 string | Resource
会让 fontColor() 报「Type 'string | Resource' is not assignable to 'string'」。
⇒ 改成内联三元,且未选用 FbColors.faint(那个是 string 常量)。
编译通过,已装真机。
|
2026-11-05 20:25:59 +08:00 |
|
laoyang
|
389cb31df4
|
分类下拉:修「永远未分类」+ 菜单同宽 + 主题色 (#84)
用户 2026-11-05 三点:
1.「分类那个地方没带进来。明明是有分类的,但是它却显示的是未分类。」
2.「分类弹出来的框太窄了,应该和输入框一样宽。」
3.「颜色也不对…文字颜色是主题色,背景色是比主题色浅一点的那个主题色。」
① tskCats 永远是空数组
`FbHomePage.loadTaskMeta()` 开头:
if (this.tskBoards.length > 0) { return; }
**只看看板有没有值**。这个方法跑过一次、看板填上之后,
以后再进来直接返回 ⇒ `tskCats` 永远停在上一次的赋值上;
如果第一次调用时 cats 恰好是空(或 #83 之前的版本压根没赋过),
就再也补不上 ⇒ 下拉里只有「未分类」。
⇒ 改成 `if (boards.length > 0 && cats.length > 0) return;`
"两样都有值才跳过"。
⚠️ 不能只判 cats:新家庭可能真的一条分类都没建,那样每次都重拉。
⚠️ 任务页的 `loadMeta()` 没有这个提前返回,不用改。
② 下拉菜单太窄
`width(100%)` 管的是**控件本身**;弹出的选项菜单有独立宽度
(`optionWidth`),不给就按选项文字撑开 ⇒ 很窄。
⇒ `.optionWidth(OptionWidthMode.FIT_TRIGGER)` 让它跟触发器同宽。
⚠️ 顺手试过 `.optionHeight(auto)` —— SDK 里 `optionHeight` 只收
`Dimension`,传 auto 直接编译报 "No overload matches this call"。
③ 颜色改主题色
文字 `this.accent` + `weight: Medium`;
底色 `fbAlpha(this.accent, 0.10)`(浅一档的主题色)。
与面板里「+ 添加附件」那颗胶囊同一套 —— 整面板"可操作控件"观感一致。
选项列表里:选中项用主题色、其余用墨色(全主题色会失去对比)。
编译通过,已装真机。
|
2026-11-05 20:19:43 +08:00 |
|
laoyang
|
79bc593d43
|
鸿蒙端:分类、循环改成可编辑 (#83)
用户 2026-11-05:「分类和重复,也就是循环,都需要加上,鸿蒙端也得加上。」
原来这两个只在**有值**时才画一行只读文字
(`if (this.categoryOf() !== )` / `if (this.repeatOf() !== )`)——
用户不仅改不了,连"这里本来有这一项"都看不出来。
(这与 #76 里网页端"负责人为空就整行消失"是同一个毛病。)
改法:与截止/负责人同形态(标签一行 + 控件一行),**始终显示**。
① FbTaskPanel 新增 `@Param cats: FbCatOpt[]`
⚠️ 与 boards 同一理由:**不能从任务里反推** ——
反推只能看见"已经被用过的"分类,新建的分类在端上永远选不到。
② 下拉用 ArkUI 原生 `Select`,第 0 项固定「未分类」/「不循环」
- 分类:index 0 → category_id = 0;index N → cats[N-1].id
- 循环:index 0 → (不循环);index N → REPEAT_KEYS[N-1]
⚠️ REPEAT_KEYS 与 REPEAT_WORDS **必须严格对齐**,
错一位就是"选每天存成每周"这种静默错数据。
③ `inlineBusy` 时退回只读文字:请求在飞的时候不给选,
否则用户连点两下会发两次相反的值。
④ 首页 / 任务页两处宿主传 `cats`(tskCats / metaCats)。
⑤ 服务端 API 早就支持这两个字段(`Api::str(repeat_rule, ...)`),
本轮只补了 `Task::setAttrs` 的 repeat_rule 分支(见服务端那次提交)。
编译通过,已装真机。
|
2026-11-05 20:15:25 +08:00 |
|
laoyang
|
8fe1131334
|
去掉截止、负责人右侧的小铅笔图标 (#77)
用户 2026-11-05:「截止日期和负责人右侧都有一个编辑用的、像小铅笔似的图标。
我感觉这个东西不需要了。如果要加的话,全部都得加上,台式机采购计划、测试
之类的都要加上。但现在我觉得不加也可以,就把所有小图标全部去掉,
也就是右侧那个小铅笔图标全去掉。」
删掉两处 `✎`:
· 截止那行(rows: 到期时间 + 已逾期徽标 + ✎)
· 负责人那行(头像 + 名字 + ✎)
上一版加它是想提示"这里能点"(本项目踩过"纯文字看着不可点"的坑),
但代价是:
① **只有这两行有、别的行没有** ⇒ 视觉上不齐,看着像漏做;
② 输入框本身(浅底圆角 40 高)已经足够表达"这是个可操作的控件",
铅笔是重复提示。
⚠️ 全项目扫过:`✎` 只在 FbTaskPanel 这两处,已全部清零。
⚠️ 注释里记下取舍:以后若要恢复"可点"提示,必须**所有行一起加**
(任务标题/截止/负责人/分类/循环/备注),不能只给其中两行 ——
那才是用户不接受的地方,不是"有提示"本身。
编译通过,已装真机。
|
2026-11-05 20:04:59 +08:00 |
|
laoyang
|
619f800ae7
|
删除按钮从底栏移到内容最底部(危险操作区)(#77)
用户 2026-11-05:「删除按钮不能出现在那里,因为这样太容易误触了。
删除按钮应该放在哪里?你考虑考虑。」
放在**滚动内容的最末尾**。
为什么不在底栏(原来和「保存」并排):
① **误触**:底栏是"保存"这种高频操作的位置,手一滑就点到删除,
而删除**不可恢复**,一次误触 = 数据没了。
② **语义错位**:底栏是"我改完了、要留下这个结果"的确认区,
不该混进"我要毁掉它"。
为什么不放顶栏:顶栏是"知道我在哪 / 怎么退出"的位置,
在那里放删除,误触代价同样不可恢复(还紧挨着关闭按钮)。
放最底部的好处:
· 用户得主动滚到最底才看得见 —— 低频操作不必首屏可见;
· 纯文字(fontTiny)、无填充底色,**不像按钮**,不招手指;
· 与正文隔一条分割线,视觉上属于"其它",不属于"操作";
· 这是通行做法(Notion / 备忘录 / 各类设置页的删除都在最底部)。
二次确认也重做了:
第一下「删除这个任务」→
变成「删了就找不回来了,确定吗?」+ [确定删掉] [取消]
原来只有"再点一次"、没有取消出口,误点后只能点别处退出
(不明显)。现在有明确的「取消」可退。
底栏现在只剩**全宽的「保存」**,视觉上更明确:这一条就是"确认改动"。
编译通过,已装真机。
|
2026-11-05 20:03:05 +08:00 |
|
laoyang
|
ad63b4c89d
|
修:面板底部「保存/删除」按钮被裁掉看不见 (#77)
用户 2026-11-05:「你改的是什么?是鸿蒙版吗?怎么没有看到任何按钮啊?」
代码确实在(我解包 sy-77.hap 在 modules.abc 里搜到了"保存中"字符串),
是**布局把它裁掉了**。
真根因:中间那个 Scroll 用的是 `flexShrink(1)` ——
`flexShrink` 只表示"空间不够时允许收缩",但 Scroll 的**内容高度**
仍会把自身撑开(ArkUI 竖向 Scroll 默认按内容高参与布局)。于是:
头部 + Scroll(按内容撑满) 吃光 `maxHeight: 86%`
→ 下面的 footBar 被推到 86% 之外
→ `FbSheetRing.clip(true)` 把它整条裁掉
⇒ 一颗按钮都看不见(而且连痕迹都没有,看起来就像"没做")。
改法:
① Scroll → `layoutWeight(1)`
"占据剩余空间"而不是"按内容撑开"。高度被限定成
"86% − 头部 − 分割线 − footBar",footBar 因此必然留在可视区内,
内容再长也只在自己内部滚动。
② footBar 补 `flexShrink(0)`
显式禁止压缩,防止某些机型把 42 高的按钮压扁。
⚠️ 旧注释(v60b)说 `layoutWeight(1)` 会让"短内容也把卡片顶满、底下留一片空白"。
那个副作用是真的,但属于观感问题;按钮看不见是功能问题。
两害相权先保证按钮可用。要消空白的话正确做法是外层配 minHeight:0,
而不是回到 flexShrink(那条路会让底栏被挤出去)。
编译通过,已装真机。
|
2026-11-05 19:58:53 +08:00 |
|
laoyang
|
980630644b
|
底部「编辑」换成「保存」(#77)
用户 2026-11-05:「和网页版一样,没有保存按钮啊,这应该怎么保存呢?
在哪个地方点保存呢?」
之前是"失焦自动保存"——逻辑上能存,但**用户看不见这件事**,
没有按钮就没底,不知道到底存没存。补一颗显式按钮。
① footBar 的「编辑」→「保存」
原来那颗「编辑」本身就是矛盾的:面板已经能改所有字段
(标题/备注/截止/负责人/分类/协作人/子任务/附件/留言),
再给一颗"编辑"反而跳到另一张表单。
⇒ 换成「保存」,保存后关窗(与网页端保存后关浮层一致)。
② saveAll():串行存标题 + 备注,然后 onChanged() + onClose()
⚠️ 必须**串行**不能并发:`saveField()` 内部会 `reload()`,
两次并发会让后一次的 reload 覆盖前一次的结果,
表现为"改完标题,备注却回到旧值"。
⚠️ 有 `saving` 忙碌态:避免连点两次发四组请求。
③ 其余字段保持"点了就生效",不按保存
状态/看板/截止/负责人/分类/协作人/子任务/附件/留言 都是**动作**
(选中即生效),多一步确认反而烦;只有"打字"类(标题、备注)
才需要一次确认 —— 这也是网页端的口径。
编译通过,已装真机。
|
2026-11-05 19:54:30 +08:00 |
|
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 |
|