v84: 首页「+ 新建」日程 + 红线去端点 + 新建表单两处可见性修复

用户 2026-10-23 原话:「日程,没有新建日程按钮,名册,也没有新增成员这个按钮。」
「首页上的日程,红色线不对,变短了左侧缺了一块。在日程模块中,那个红线左侧
是不是还有一个红点?如果有,去掉。」

① 首页日程区块加「+ 新建」(FbHomePage / Widgets.FbSectionTitle)
   - FbSectionTitle 扩两个可选参数 addText / onAdd,带默认值 ⇒ 老调用点一行不改
   - 按需懒拉 /calendar/books,缓存进 calBooks,同一会话只拉一次
   - todayIso() 用本地年月日拼,**不用 toISOString**(UTC 会让早 8 点前算成昨天)

② 时间红线两端统一成「一根满宽线、无端点装饰、无行首文字」(FbDayTimeline)
   - 老写法 `Row { Text(时间) width(34); 线; 圆点 }` ⇒ 行首 34vp 把线顶掉一块
     (与网页端 .ag-now「双重缩进」同一类病),行尾 6x6 圆点就是用户问的红点
   - 改成满高 Column + Blank 撑高 + 满宽 2px 线,与卡片端同一写法

③ 🔴 真机实测发现的两处可见性问题(FbEventEditSheet)
   - 「加入哪本日历」原来排在「提醒」之后 ⇒ 表单高于卡片(maxHeight 86%),
     它被推到滚动区下方,首屏只看到被底边切掉半行的标题(实测 bounds 高 7px)。
     它是必选项(没选就「请选一本日历」存不上)⇒ 挪到「全天」之后、日期时间之前。
   - 错误提示原来在滚动区**内部最底部** ⇒ 用户在顶部点「创建」时提示在几百 px
     之下看不见;就算滚到底也被 Scroll 底边切半行。现象是「点了创建什么都没发生」。
     ⇒ 挪到滚动区外面、按钮区上方(实测:Scroll 底 1953,提示 1984~2024,按钮 2074)。

真机验收(设备 5NC0225B27004718,线上 family.yangyq.net):
  - 静态守卫 1112/0;BUILD SUCCESSFUL;install bundle successfully
  - 「+ 新建」bounds [868,931][1018,1045],点击真的弹出「新建日程」
  - 诊断确认 books=15 canWrite=6(数据层完全正常,之前的「选不了日历本」是可见性问题)
  - 日历本挪位后首屏可见:标题高 40px(原 7px),10 本 chip 从 838 排到 1358
  - 错误提示挪位后不滚动即可见:命中「日程得有个标题」
  - **端到端建卡成功**:线上库确认 id=2411 cal=5 20:00~21:00,首页 1 条→2 条;
    测试数据已按 id 精确删除(remaining_test_rows=0),重启后恢复 1 条
This commit is contained in:
2026-10-24 19:14:18 +08:00
parent 0bab0cdcc6
commit cdbf0a9593
4 changed files with 257 additions and 52 deletions
+37 -21
View File
@@ -356,33 +356,49 @@ export struct FbDayTimeline {
.height('100%')
}
/** 第 3 层:当前时间红线(浮在最上层) */
/**
* 第 3 层:当前时间红线(浮在最上层)
*
* 🔴🔴 v84(用户 2026-10-23,同一条消息里两处):首页的这条线「红色线不对,
* 变短了左侧缺了一块」,日程页那条「红线左侧是不是还有一个红点?如果有,去掉。」
*
* 两个抱怨其实是同一段代码的两个缺陷,都在这里:
* ① 老写法是 `Row { Text('07:02') width(34); 线(layoutWeight 1); 圆点(6) }`
* —— **行首的 34vp 时间文字**把线往右顶掉一整块,用户看到的就是
* "左侧缺一块"(与网页端 `.ag-now` 那次「双重缩进」是同一类病:
* 线的左沿被别的东西占了)。
* ② 行尾那个 `6×6 borderRadius(3)` 就是用户问的**红点**。
*
* ⇒ 两端统一成**一根满宽的红线,没有任何端点装饰、没有文字**。
* 这正是用户 v44 定下的口径:「直接把红点去掉就行了,直接一根红线就可以了」,
* 也是网页端 `.ag-now { left: 0; right: 0; border-top: 2px }` 的等价写法。
*
* ⚠️ 别把时间文字"加回来":只要 Row 里有任何子元素,线就一定短一截。
* 想知道现在几点,看左侧刻度列——那里 `isNowHour` 的那个小时文字**已经是红的**
* (见 `hourLabels()` 那段的 `fontColor`),信息并没有丢。
* ⚠️ 别用 `Row { 线(layoutWeight 1) }` 的写法包一层 —— 能跑,但多一层无谓嵌套,
* 且下次有人往这个 Row 里塞东西,缺一块的 bug 就又回来了。
* ⚠️ `hitTestBehavior(HitTestMode.None)` 必须留:装饰层不能挡住点色块。
*/
@Builder
nowLayer() {
if (this.nowVisible()) {
Row() {
// 左侧时间文字(红线那头)
Text(FbTimelineUtil.hhmm(this.nowMin))
.fontSize(9)
.fontColor(FB_NOW_RED)
.fontWeight(FontWeight.Medium)
.textAlign(TextAlign.End)
.width(34)
Row()
.layoutWeight(1)
/* ⚠️ 外层必须是**满高的 Column**:`Stack` 的几个子层是「叠」不是「排」,
直接给线写 `.margin({top})` 在部分版本上会因对齐基准不同而漂移。
用 `Blank` 撑开 = 与卡片端 `FbCard4x4.nowLayer()` **同一个写法**,
两端行为一致,改一处就知道另一处该怎么改。 */
Column() {
if (this.nowVisible()) {
Blank().height(this.nowOffsetVp()).hitTestBehavior(HitTestMode.None)
Column()
.width('100%')
.height(2)
.backgroundColor(FB_NOW_RED)
Row()
.width(6)
.height(6)
.borderRadius(3)
.borderRadius(1)
.backgroundColor(FB_NOW_RED)
}
.width('100%')
.alignItems(VerticalAlign.Center)
.margin({ top: this.nowOffsetVp() })
.hitTestBehavior(HitTestMode.None)
}
.width('100%')
.height('100%')
.hitTestBehavior(HitTestMode.None)
}
build() {