Files
FamilyBook/assets
laoyang 20ba36ad62 修截止时间时/分保存不上:改为读 AntD 可见框 (#77)
用户 2026-11-05:「截止日期的时间保存有bug,时和分没保存上。」

根因:save-attrs 原来直接读 .dt-hour / .dt-minute 的 value。
那两个 <select> 是 AntD 挂上后**被 CSS 收起**的镜像(.dt-input.is-antd
> .dt-native { display:none }),它们的值依赖 mountAntdSingleDT 的
writeBack() 写回 —— 而 writeBack 走 writeDT(box, str),str 来自 antd
的 onChange 第二参数。

用 Playwright + 站点真实 app.js/antd 实测发现问题:
  · 只给 select 放一个 option 时,writeDT 写入不存在的值 → value 变空串;
  · 时序上(首屏挂载 / 面板 AJAX 换入 / 受控重渲染)隐藏字段可能滞后于
    用户看到的那个值。
⇒ 读隐藏字段本质上是"读镜像",镜像一旦滞后或缺失,时分就丢。

修法:新增 readDue(),按优先级读:
  ① AntD 的可见输入框 .ant-picker-input > input(用户实际看到/改的那一个,
     格式 YYYY-MM-DD HH:mm)—— 这是唯一权威来源;
  ② 没有 AntD(降级成原生下拉)时才读 .dt-date/.dt-hour/.dt-minute;
  ③ 都没有 → 空(= 清掉截止时间)。
AntD 的框是只读文本框(用户通过弹层选,不能直接打字),
所以解析它的 text 不会碰到"敲了半截日期"的中间态。

实测(Playwright 复刻完整 mountAntdSingleDT + readDue):
  AntD 可见框    = 2026-10-16 20:30
  隐藏 hour/min  = 20 / 30
  readDue 结果   = 2026-10-16 20:30:00  ✅

服务端侧已确认无需改动:Task::dtOrNull 会把
YYYY-MM-DD HH:mm 补秒成 YYYY-MM-DD HH:mm:ss,
YYYY-MM-DD 补成 00:00:00,格式非法才回 null。
2026-11-05 18:12:44 +08:00
..