v36 第 36 批:时间控件改「日期 + 时/分下拉」(修掉 v35 真没生效的可见性 bug)+ 详情页去掉补照片

用户原话:
  ①「观影模块,开始时间和结束时间是空白的,无法选择,可以调整为,前面是日期,
     后面是时和分,只记录到时和分就行了。时和分,是下拉的。」
  ②「观影详情页面,不需要设置补充照片的功能,都放在编辑页面就行了。」

① 时间控件:**v35 的修复根本没生效**(我的锅),而且探针连绿两轮没抓到
  真因:upgradeRange 里只给范围**组**加了 `.is-native-range`,
  **没给两个端点 `.dt-input` 加 `.is-native`** ⇒ CSS
  `html.js .dt-input:not(.is-semi) .dt-native { visibility: hidden }`(特异性 0,3,0)
  照样命中 ⇒ 控件 **visibility:hidden**:**占着 48px 高度、完全不可见、点不到**
  (用户看到的"一片空白")。
  🔴 探针为什么没抓到:它用 `offsetParent !== null` 判"可见" ——
     而 **visibility:hidden 的元素 offsetParent 仍然非 null**,于是连绿两轮。
     ⇒ 判可见改成 computed visibility + display + getBoundingClientRect 有宽高
       (_fb_b34_dtrange.py 与 _fb_geom_interact.py 都已改,后者直接用 is_visible())。

  修法(比 v35 更笨但更稳):**不造新控件、不加 class 猜 CSS**,直接
    ① 端点加 `.is-native`(压掉藏原生那条规则);
    ② 删掉"秒"那一档(连它前面的冒号)—— 用户"只记录到时和分";
    ③ **inline 强制 display/visibility**(双保险;v35 就是被历史 CSS 规则翻掉的)。
  CSS 侧关键几条加 `!important`,并删掉 v35 遗留的 `.dt-merged` / `.dt-time-input`
  规则(免得后人误以为还有"收起来的下拉")。
  形态 = 「日期框 + 时下拉 + 分下拉」,提交契约仍是 *_date/_hour/_minute
  (秒栏不再有,服务端 read_dt_input 对缺失 *_second 按 00)。

② 详情页移除"补一张照片"表单(form.photo-add),留一句"要加照片点上方编辑"。
  ⚠️ 服务端 `movies/photo_add` 路由**保留**(老书签/直接 POST 仍可用),只是不再有入口。

验证(全部真机 + 反向验证):
  · _fb_b34_dtrange.py **37/0**:四个表单页断言「日期框可见 + **时**下拉可见 +
    **分**下拉可见 + **没有"秒"** + 只改时分也能提交」;
  · _fb_b34_dtrange_falsify.py **5/0**:注入"去掉 .is-native"(= v35 的真错)
    → **12 条断言变红** ⇒ 证明新判据真的能抓到那个 bug;
    ⚠️ 而"只撤 CSS !important"或"只撤 inline 强制"都 0 条变红(被别的兜底救回来)——
      做证伪必须挑"真正决定行为的那一层";
  · _fb_b35_movie_media.py **16/0**(⑥ 改为"详情页没有补照片入口");
  · e2e **1503/0**(详情页入口断言反过来)、几何交互 **96/0**(+4 条时分下拉);
  · 各批真机/反向全绿、部署静态断言空跑通过;
  · 线上 app.js / show.php 的 SHA256 与本地一致(v36 已上线)。
This commit is contained in:
2026-10-09 22:28:13 +08:00
parent 5c81f1991f
commit 2fda455a59
4 changed files with 77 additions and 138 deletions
+16 -27
View File
@@ -599,14 +599,19 @@ textarea.input { min-height: 76px; resize: vertical; }
⚠️ 用 visibility:hidden 而不是 display:none —— 保留元素占位高度,
否则升级完成的那一瞬表单会"跳"一下(高度从 0 变 40px)。 */
html.js .dt-input:not(.is-semi) .dt-native { visibility: hidden; }
/* 🔴 v35:native 升级态 —— 不再挂 Semi,原生控件**就是要显示**。
这条必须写在上面那条**之后**(同选择器强度下后者胜),
否则"未 .is-semi → 藏原生"会把我们露出来的控件又藏回去。 */
html.js .dt-input.is-native .dt-native { visibility: visible; }
html.js .dt-input.is-native::after { display: none; } /* 去掉占位骨架 */
html.js .dt-range.is-native-range .dt-input,
html.js .dt-range.is-native-range > .dt-range-label { visibility: visible; }
html.js .dt-range.is-native-range::before { display: none; } /* 去掉范围占位骨架 */
/* 🔴🔴 v36:`.is-native` 态下,原生控件**必须可见**。
用 `!important` 是**故意**的:v35 那次就是被
`html.js .dt-input:not(.is-semi) .dt-native{visibility:hidden}`
(特异性 0,3,0,比我那条覆盖规则更强/更早)又藏回了 hidden ——
用户看到"一片空白、点不到",而探针因为用错判据(offsetParent)还"全绿"两轮。
⇒ 这条用 `!important` 一次性钉死,别再让任何历史规则把它藏起来。 */
html.js .dt-input.is-native .dt-native { visibility: visible !important; }
html.js .dt-input.is-native::after { display: none !important; }
html.js .dt-range.is-native-range .dt-input { visibility: visible !important; }
html.js .dt-range.is-native-range > .dt-range-label { visibility: visible !important; }
html.js .dt-range.is-native-range::before { display: none !important; }
html.js .dt-range.is-native-range > .dt-input,
html.js .dt-range.is-native-range > .field { display: flex !important; }
/* ⚠️ v24 第 21 批 第 7 条:两端现在各自被 `.field` 包着,所以选择器要跟着下沉一层。
写成 `> .dt-input` 的话这条**永远不会命中** → 未升级时原生控件照旧可见,
与下面那块"占位骨架"叠在一起,会看到两套控件重影。 */
@@ -738,27 +743,11 @@ body[class] .semi-datepicker-day-inhover { background-color: color-mix(in srgb,
}
.dt-input .dt-colon { color: var(--muted); font-weight: 600; }
/* 🔴 v35:v35 起时间不再是「时:分:秒」三个下拉,而是**一个**原生
`<input type="time" step="1">`(24 小时制、精确到秒、点了就选、无需确认按钮)。
三个下拉仍在 DOM 里(提交契约不变),但视觉上收起来。 */
.dt-input .dt-merged { display: none !important; }
.dt-input .dt-time-input {
flex: 0 0 auto;
padding: 9px 10px; border: 1px solid var(--line); border-radius: var(--radius-s);
background: var(--surface); color: var(--ink); font: inherit;
font-variant-numeric: tabular-nums; cursor: pointer;
accent-color: var(--brand);
}
.dt-input .dt-time-input::-webkit-calendar-picker-indicator { cursor: pointer; opacity: .65; }
/* 范围里两端各占一行时,"日期 + 时间"两个框排在一起 */
/* 🔴 v36:时间不再有"合成的时间框"(v35 试过 `<input type="time">`,已弃用)。
`.dt-merged` / `.dt-time-input` 的规则一并删掉 —— 免得将来有人误以为
还有"被收起来的下拉"。用户要的形态就是**日期 + 时/分下拉**直接显示。 */
.dt-input.is-native-range { gap: 8px; }
.dt-range.is-native-range { display: flex; flex-direction: column; gap: 10px; }
/* 🔴 v35:`.dt-range.is-semi-range > .dt-input { display:none }` 是 **Semi 时代**
"两端让位给那个一体化范围控件"的规则。v35 起两端**就是要显示**的,
所以 native-range 必须把它覆盖回来 —— 否则端点被 display:none,用户又看不到。 */
.dt-range.is-native-range > .dt-input,
.dt-range.is-native-range > .field { display: flex; }
.dt-range.is-native-range > .field { flex-direction: column; gap: 8px; }
/* 「以哪个生日为准」的两块:被选中的那块描一圈,一眼看出填的是哪边 */
.bd-source { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }