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) {