日期框补上日历弹层:flatpickr 改为无条件加载

用户实测:筛选区日期框换成文本框后手机上没了日历弹层、不好操作;多 18KB gzip 可以接受。

- layout.html 里 flatpickr(js + css + l10n)与 datetime-input.js 都改为**无条件加载**,
  不再用 {{if .Flatpickr}} 按页开关 —— 「按页开开关」正是 2026-10-09 日期框 bug 的根源
  (只给 type=datetime-local 挂了控件,后来加的 type=date 没人管)。
- 顺手删掉 `Page.Flatpickr` 字段与三处 `p.Flatpickr = true`(开关没了就不可能再漏设)。
- 守卫 TestDateInputsGoThroughAttachAll 相应改成:钉住「layout 无条件引入 flatpickr +
  datetime-input + attachAll」、并禁止再出现 {{if .Flatpickr}}。

实测(展开筛选面板后):390/320 下 /stats /map /places 的日历都在最上层(z-index 99999)、
完全在视口内、elementFromPoint 命中日历本身;打字 20260606 → 2026-06-06 不变。

回归:./scripts/verify.sh PASS=349 FAIL=0 SKIP=0;JS 单测 45/45;320/390/1440 溢出与改前一致。
This commit is contained in:
tamakyi
2026-10-09 19:09:42 +08:00
parent b69b827d6e
commit b19f27ab69
8 changed files with 43 additions and 27 deletions
+15
View File
@@ -255,3 +255,18 @@ CDP 打字脚本(每字符 keyDown(text) + keyUp)。用它复现:
**回归**:verify.sh 348 例 0 skip、JS 单测 **45/45**(新增 11 条逐键模拟)、移动端 390 / 桌面 1440 审计溢出与改前一致。
⚠️ **纪律(又踩一次)**:验收跑着的时候别并发跑别的(我并发跑了变异测试,verify 当场把注入的旧写法抓成 FAIL ——
守卫是对的,但那轮结果得作废重跑)。这条上次已写进 details 三十二,这次是实锤。
---
## 补:日历弹层也要(用户确认手机上好操作、多 18KB 可以接受)
前面把筛选区的 `type=date` 换成了纯手输文本框、没有日历弹层;用户要日历。最终决定:
**flatpickr 与 datetime-input.js 都改成无条件加载**(js+css+l10n 约 18KB gzip),
`Page.Flatpickr` 字段与三处 `p.Flatpickr = true` 一并删掉 —— 不再用「按页开开关」,
因为那正是这次日期框 bug 的根源(只挂了 datetime-local、type=date 没人管)。
实测(展开筛选面板后):390/320 下 /stats /map /places 的日历都在最上层(z-index 99999)、
完全在视口内、`elementFromPoint` 命中日历本身;打字 20260606 → 2026-06-06 不变。
守卫 `TestDateInputsGoThroughAttachAll` 相应改成钉「无条件加载 + 不许再出现 {{if .Flatpickr}}」。
回归:verify.sh **PASS=349 FAIL=0 SKIP=0**、JS 45/45、320/390/1440 溢出与改前一致。
+6 -4
View File
@@ -1044,11 +1044,13 @@ HTML,一行里必然带 `</script>`,一拒就把正常用法挡死了(我
自动分派只日期(输出 `Y-m-d`)或带时间(输出 `Y-m-dTH:i`)。
⚠️ **不要手写 `querySelector('input[type=...]')`** —— 2026-10-09 的 bug 就是
「只挂了 datetime-local,后来加的 type=date 没人管」。
- `datetime-input.js` **无条件引入**(公共页筛选区也要用;flatpickr 仍按需加载 ——
没有它时只挂输入引导、不给日历)。挂载要在 body 末尾**立刻**跑一次,
别只等 `DOMContentLoaded`,否则用户会先看到一个原生日期框再变文本框。
- flatpickr 与 `datetime-input.js` **都无条件加载**(js+css+l10n 约 18KB gzip):
筛选区在公共页上也有日期框,而且「按页开开关」已经被证明会漏,所以干脆**不设开关**
(`Page.Flatpickr` 字段也删了)。用户明确接受这点资源增量(手机上有日历弹层比省这 18KB 重要)。
挂载要在 body 末尾**立刻**跑一次,别只等 `DOMContentLoaded`,否则先露出原生框再变文本框。
- 门禁 `TestDateInputsGoThroughAttachAll`:模板里出现 `input[type=date]` /
`input[type=datetime-local]` 这种选择器即红,并钉住「layout 无条件引入 + 四个页面都调 attachAll」。
`input[type=datetime-local]` 这种选择器即红;并钉住「layout 无条件引入 flatpickr + datetime-input +
attachAll」、以及「不许再出现 {{if .Flatpickr}} 这种开关」。
- JS 单测:`layoutTo(spec, raw)` 是纯函数,逐键模拟敲 `20260606` 必须得 `2026-06-06`
(`datetime-input.test.js`,node 直跑,45 条)。