From 54ab9f825b918396330dbee263cf7394767cf292 Mon Sep 17 00:00:00 2001 From: laoyang Date: Sun, 18 Oct 2026 09:52:23 +0800 Subject: [PATCH] =?UTF-8?q?v60=EF=BC=9A=E8=8C=83=E5=9B=B4=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=8E=A7=E4=BB=B6=E5=8F=AA=E6=94=B9=E4=B8=80=E7=AB=AF?= =?UTF-8?q?=EF=BC=88=E7=82=B9=E3=80=8C=E7=A1=AE=E5=AE=9A=E3=80=8D=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E8=B7=B3=E5=9B=9E=E5=BC=80=E5=A7=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户反馈:范围控件里前面的时间不用改,直接点后面的结束时间,选完之后它还是 跳回开始时间、要重新选开始 —— 没必要。 真根因(不是接线错,一个回调都不挂的裸 RangePicker 也一样): ① rc-picker 点「确定」会把活动端复位到「开始」(那是为下一次选择准备的, 正常情况面板同时也该关掉,用户看不见); ② 这个版本关完面板又把焦点送回开始输入框,而 Trigger 「聚焦即展开」, 于是面板又开了、还停在「开始」端。 修法:接管 open —— 点「确定」就关(onOk),开合由 onOpenChange 同步。 只给成对的范围控件(观影/日程/行程的起止)加;单点控件(任务截止时间) 不动 —— 它点确定本来就能正常关闭。 编号说明:v56/v57/v58/v59 已被「设备会话 / 增量同步」那批用掉,本批顺延 v60。 验证: - _fb_v60_ui.py 真机 28 条(只改结束日期/时刻不动开始、确定后关闭、 关掉后能重开、点面板外能关、日历点格子带入时间仍同步、单点控件不受影响) - _b60_falsify.py 3 处注入全部变红(不接管 open / 确定不关 / 连张开都吞掉) - 回归:v55 套件 30/30、v45 重复到 10/10 仍全绿 --- assets/js/app.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/assets/js/app.js b/assets/js/app.js index a519392..c540145 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -2017,6 +2017,20 @@ ⚠️ 状态用 `v0/v1` 两个字符串('YYYY-MM-DD HH:mm'):与 writeBack 的入参同一 口径(antd 的 `strs` 就是这个格式),不用在两条路之间换算。 */ var st0 = v0, st1 = v1; + /* 🔴🔴 v60(用户 2026-10-18):**范围控件只改一端,选完不该被赶回起点**。 + 现象:「前面的时间不用改,我直接点后面的结束时间;选完之后它还是跳回到 + 开始时间、让我重新选开始 —— 没必要。」 + 链路(**不是我们接线接错了** —— 一个回调都不挂的裸 RangePicker 也一样): + ① 点「确定」→ rc-picker 把**活动端复位到「开始」**(那是为"下一次选择" + 准备的,正常情况下面板同时也该关掉,用户看不见); + ② 但这个版本关完面板又把焦点**送回开始输入框**,Trigger 是"聚焦即展开" + ⇒ 面板又开了、还停在「开始」端 ⇒ 用户看到的就是"让我重选开始"。 + ⇒ 这里**接管 open**:面板开合由我们说了算,点「确定」就关(`onOk`)。 + ⚠️ 别把 `open` 的接管抄到 `mountAntdSingleDT`:单点控件(任务截止时间) + 实测点确定能正常关闭 —— 没有"复位活动端"这回事,多接管一层反而挡开合。 + ⚠️ 反向验证(_b60_falsify 三处注入)证明:去掉 `open` 接管 / 去掉 + `onOk` 里的关闭 / 让 `onOpenChange` 连张开都吞掉 —— 对应断言都会变红。 */ + var openState = false; var root = null; function renderPicker() { @@ -2027,6 +2041,16 @@ placeholder: ['开始时间', '结束时间'], // ⚠️ 受控:空串要给 null,否则 dayjs('') 会变成 Invalid Date → 控件显示 NaN value: [st0 ? toDayjs(st0) : null, st1 ? toDayjs(st1) : null], + // 🔴 v60:面板开合由我们说了算(见上面那段)。 + open: openState, + onOpenChange: function (o) { + openState = !!o; + renderPicker(); + }, + onOk: function () { + openState = false; + renderPicker(); + }, // ⚠️ onCalendarChange 是**单端也算**的那个(实测:只点开始它就响); // onChange 只在两端齐了才响。两个都挂才不会丢值。 onCalendarChange: function (vals, strs) {