日期框补上日历弹层: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
+13 -9
View File
@@ -216,17 +216,21 @@ func TestDateInputsGoThroughAttachAll(t *testing.T) {
t.Fatalf("读取 layout.html 失败: %v", err)
}
lay := string(layout)
// flatpickr 那段是「按需加载」的,datetime-input.js 不能跟着一起被关进去
if i := strings.Index(lay, "{{if .Flatpickr}}"); i >= 0 {
if j := strings.Index(lay[i:], "{{end}}"); j > 0 {
if strings.Contains(lay[i:i+j], "datetime-input.js") {
t.Error("datetime-input.js 被关进 {{if .Flatpickr}} 了 —— 公共页不加载 flatpickr," +
"筛选区的 <input type=date> 就没人改造成文本框,原生那个吞位的老毛病会原样回来")
}
// 日期控件与它的日历弹层必须**无条件**加载:筛选区在公共页上也有日期框,而
// 「按页开开关」这种写法漏过一次(2026-10-09 的日期框 bug 就是只挂了 datetime-local)。
for _, needle := range []string{
"/static/vendor/flatpickr/flatpickr.min.js",
"/static/vendor/flatpickr/flatpickr.min.css",
"/static/js/datetime-input.js",
"rondDatetime.attachAll(",
} {
if !strings.Contains(lay, needle) {
t.Errorf("layout.html 里缺 %s —— 那一页的日期框会退回原生控件(没有日历弹层)", needle)
}
}
if !strings.Contains(lay, "rondDatetime.attachAll(") {
t.Error("layout.html 没有调用 attachAll —— 日期框不会在页面加载时被改造")
if strings.Contains(lay, "{{if .Flatpickr}}") {
t.Error("layout.html 里又出现了 {{if .Flatpickr}} 这种按页开关 —— 日期控件已改成无条件加载," +
"开关一旦漏设,那一页的日期框就没有日历弹层(别再引入会漏的东西)")
}
names, err := fs.Glob(tmplFS, "templates/*.html")