分类下拉:修「永远未分类」+ 菜单同宽 + 主题色 (#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)`(浅一档的主题色)。
   与面板里「+ 添加附件」那颗胶囊同一套 —— 整面板"可操作控件"观感一致。
   选项列表里:选中项用主题色、其余用墨色(全主题色会失去对比)。

编译通过,已装真机。
This commit is contained in:
2026-11-05 20:19:43 +08:00
parent 79bc593d43
commit 389cb31df4
2 changed files with 41 additions and 9 deletions
+28 -8
View File
@@ -1472,16 +1472,31 @@ export struct FbTaskPanel {
.backgroundColor(FbColors.inputBg)
.borderRadius(FbMetric.radiusS)
} else {
/* 🔴 #84(用户 2026-11-05):
「分类弹出来的框太窄了,应该和输入框一样宽。」
「颜色也不对。它的颜色应该是主题色:里面的文字颜色是主题色,
背景色是比主题色浅一点的那个主题色。」
· `width('100%')` 管的是**控件本身**;弹出来的下拉菜单
还有自己的宽度(`optionWidth`),不给就按内容撑 ⇒ 很窄。
用 `optionWidth(OptionWidthMode.FIT_TRIGGER)` 让它跟触发器同宽。
· 文字 `this.accent`、底色 `fbAlpha(this.accent, 0.10)`
—— 与面板里「+ 添加附件」那颗胶囊同一套(主题色 + 淡底),
这样"可操作"的控件在全面板观感一致。 */
Select(this.catOptions())
.selected(this.catIndex())
.value(this.categoryOf() !== '' ? this.categoryOf() : '未分类')
.font({ size: FbMetric.fontSmall })
.fontColor(FbColors.ink)
.selectedOptionFont({ size: FbMetric.fontSmall })
.font({ size: FbMetric.fontSmall, weight: FontWeight.Medium })
.fontColor(this.accent)
.selectedOptionFont({ size: FbMetric.fontSmall, weight: FontWeight.Medium })
.selectedOptionFontColor(this.accent)
.optionFont({ size: FbMetric.fontSmall })
.optionFontColor(FbColors.ink)
.optionWidth(OptionWidthMode.FIT_TRIGGER)
.width('100%')
.height(40)
.backgroundColor(FbColors.inputBg)
.padding({ left: 4, right: 4 })
.backgroundColor(fbAlpha(this.accent, 0.10))
.borderRadius(FbMetric.radiusS)
.onSelect((idx: number): void => {
/* index 0 = 「未分类」→ category_id 传 0 */
@@ -1507,16 +1522,21 @@ export struct FbTaskPanel {
.backgroundColor(FbColors.inputBg)
.borderRadius(FbMetric.radiusS)
} else {
/* #84:与分类同一套(主题色文字 + 淡主题底色 + 菜单同宽) */
Select(this.repeatOptions())
.selected(this.repeatIndex())
.value(this.repeatOf() !== '' ? this.repeatWordOf(this.repeatOf()) : '不循环')
.font({ size: FbMetric.fontSmall })
.fontColor(FbColors.ink)
.selectedOptionFont({ size: FbMetric.fontSmall })
.font({ size: FbMetric.fontSmall, weight: FontWeight.Medium })
.fontColor(this.accent)
.selectedOptionFont({ size: FbMetric.fontSmall, weight: FontWeight.Medium })
.selectedOptionFontColor(this.accent)
.optionFont({ size: FbMetric.fontSmall })
.optionFontColor(FbColors.ink)
.optionWidth(OptionWidthMode.FIT_TRIGGER)
.width('100%')
.height(40)
.backgroundColor(FbColors.inputBg)
.padding({ left: 4, right: 4 })
.backgroundColor(fbAlpha(this.accent, 0.10))
.borderRadius(FbMetric.radiusS)
.onSelect((idx: number): void => {
const rk: string = idx === 0 ? '' : FbTaskPanel.REPEAT_KEYS[idx - 1];
+13 -1
View File
@@ -835,7 +835,19 @@ export struct FbHomePage {
/** 拉全部看板 + 分类(面板的"挪分组"、表单的"分类"都要用) */
private async loadTaskMeta(): Promise<void> {
if (this.tskBoards.length > 0) {
/* 🔴 #84(用户 2026-11-05):「鸿蒙端的分类那个地方没带进来。
明明是有分类的,但是它却显示的是未分类。」
**就是这个提前返回**:只看 `tskBoards` 有没有值。
而这个方法一旦先跑过一次、看板填上了,以后再进来就直接返回 ——
`tskCats`(分类)**永远停在上一次的赋值上**;如果第一次调用时
`m.cats` 恰好是空(或被 #83 之前的版本错过了),就永远补不上。
⇒ 改成"两样都有值才跳过"。任何一个为空就再拉一次
(接口很轻:`?view=boards` 不带任务列表)。
⚠️ 不能只判 `tskCats.length`:新家庭可能真的一条分类都没建,
那样每次都重拉。两条一起判才是"数据齐了"。 */
if (this.tskBoards.length > 0 && this.tskCats.length > 0) {
return;
}
await loadPath<FbTaskMeta>('tasks_meta', '/api/v1/tasks?view=boards', parseTaskMeta,