任务面板的截止时间显示成五个原生下拉,不是 AntD 弹层日历 #75

Open
opened 2026-11-05 09:59:12 +00:00 by laoyang · 0 comments
Owner

任务面板的截止时间显示成五个原生下拉,不是 AntD 弹层日历

用户(2026-11-05)

「空间有了,但是不是我想要的空间,这个空间需要换。」

「空间」= 「控件」(口误)。经确认:

「现在显示的是五个下拉框,不对」

现象

点开首页任务 → 面板里「截止」那一行是:

年 ▾  月 ▾  日 ▾  时 ▾  分 ▾

五个原生 <select>。期望是 AntD 的弹层日历(点一下弹面板选日期时间)。

根因:首次打开面板的那条路没挂 AntD

entry_popup.js 的 loadPanel():

.then(function (html) {
  bodyEl().innerHTML = html;
  runInlineScripts(bodyEl(), html);
  // ← 这里没有 fbBootAntd()
})

首次打开面板走的就是这条路。

我在 task_panel.js 的 paint() 里加过 fbBootAntd()(上一条提交 #74),
但 paint() 只在面板里做了动作之后重画时被调用:

  • 点状态 / 挪看板 / 加子任务 / 发评论 / 传附件 → 走 act() → 回来后 paint()
  • 首次打开不经过 paint()

⇒ 用户第一眼看到的是从未被升级过的原生下拉。
(如果先点一下「已完成」再点回来,就会看到 AntD 挂上了 —— 这种"时好时坏"最迷惑。)

为什么 bootAntd() 首屏扫不到

function bootAntd(hosts, dateRanges, dates, singles) {
  if (!hosts.length && !dateRanges.length && !dates.length && !singles.length) { return; }

首页首屏的任务卡里没有 [data-dt-antd-single](那控件只有打开面板后才存在)
⇒ 首屏调用时 singles.length === 0 ⇒ 直接 return ⇒ 什么都没挂。

修法

loadPanel() 在插入 HTML 后补两件事:

if (typeof window.fbBootAntd === 'function') {
  try { window.fbBootAntd(); } catch (e) {}
}
window.fbTaskPanelBindDue();   // 首次打开也要绑 change 监听,否则选完不保存

同时把 bindDue() 从 task_panel.js 内部暴露成 window.fbTaskPanelBindDue ——
否则 entry_popup.js 调不到(它在另一个 IIFE 里)。

顺带修掉的第二个 bug

bindDue() 原来只在 paint() 里调。首次打开时不绑定
⇒ 用户选完截止时间,change 事件没人听,不会保存。
只有"先做一次别的动作触发重画"之后才生效 —— 又是一个"时好时坏"。

加载顺序确认

layout.php:253  entry_popup.js  (defer)
layout.php:268  task_panel.js   (defer)

两者都是 defer,按文档顺序执行 ⇒ task_panel.js 先跑完、注册好
window.fbTaskPanelBindDue,之后 loadPanel() 才在用户点击时被调用。
不存在"调的时候还没定义"的时序问题。

验收

  • 点开任务 → 「截止」是一个可点的输入框,点一下弹出日历面板
  • 不是五个下拉框
  • 已有截止时间会带进控件
  • 选完时间立即保存(不刷新页面)
  • 重复点开/切换任务都保持 AntD 形态(不会退回下拉)

为什么单独建单

#74 是把只读的截止行改成可编辑控件;本单是那个控件首次打开时没被升级成 AntD(首次走 entry_popup.loadPanel,不经过 task_panel.paint)。同一个功能的下一层缺陷。

# 任务面板的截止时间显示成五个原生下拉,不是 AntD 弹层日历 ## 用户(2026-11-05) > 「空间有了,但是不是我想要的空间,这个空间需要换。」 **「空间」= 「控件」**(口误)。经确认: > 「现在显示的是五个下拉框,不对」 ## 现象 点开首页任务 → 面板里「截止」那一行是: ``` 年 ▾ 月 ▾ 日 ▾ 时 ▾ 分 ▾ ``` 五个原生 `<select>`。期望是 AntD 的**弹层日历**(点一下弹面板选日期时间)。 ## 根因:首次打开面板的那条路没挂 AntD `entry_popup.js` 的 `loadPanel()`: ```javascript .then(function (html) { bodyEl().innerHTML = html; runInlineScripts(bodyEl(), html); // ← 这里没有 fbBootAntd() }) ``` **首次打开面板走的就是这条路。** 我在 `task_panel.js` 的 `paint()` 里加过 `fbBootAntd()`(上一条提交 #74), 但 `paint()` 只在**面板里做了动作之后重画**时被调用: - 点状态 / 挪看板 / 加子任务 / 发评论 / 传附件 → 走 `act()` → 回来后 `paint()` - **首次打开不经过 `paint()`** ⇒ 用户第一眼看到的是从未被升级过的原生下拉。 (如果先点一下「已完成」再点回来,就会看到 AntD 挂上了 —— 这种"时好时坏"最迷惑。) ### 为什么 `bootAntd()` 首屏扫不到 ```javascript function bootAntd(hosts, dateRanges, dates, singles) { if (!hosts.length && !dateRanges.length && !dates.length && !singles.length) { return; } ``` 首页首屏的任务卡里**没有** `[data-dt-antd-single]`(那控件只有打开面板后才存在) ⇒ 首屏调用时 `singles.length === 0` ⇒ 直接 return ⇒ 什么都没挂。 ## 修法 `loadPanel()` 在插入 HTML 后补两件事: ```javascript if (typeof window.fbBootAntd === 'function') { try { window.fbBootAntd(); } catch (e) {} } window.fbTaskPanelBindDue(); // 首次打开也要绑 change 监听,否则选完不保存 ``` 同时把 `bindDue()` 从 `task_panel.js` 内部暴露成 `window.fbTaskPanelBindDue` —— 否则 `entry_popup.js` 调不到(它在另一个 IIFE 里)。 ### 顺带修掉的第二个 bug `bindDue()` 原来只在 `paint()` 里调。**首次打开时不绑定** ⇒ 用户选完截止时间,`change` 事件没人听,**不会保存**。 只有"先做一次别的动作触发重画"之后才生效 —— 又是一个"时好时坏"。 ## 加载顺序确认 ``` layout.php:253 entry_popup.js (defer) layout.php:268 task_panel.js (defer) ``` 两者都是 `defer`,按文档顺序执行 ⇒ `task_panel.js` 先跑完、注册好 `window.fbTaskPanelBindDue`,之后 `loadPanel()` 才在用户点击时被调用。 不存在"调的时候还没定义"的时序问题。 ## 验收 - [ ] 点开任务 → 「截止」是**一个可点的输入框**,点一下弹出**日历面板** - [ ] 不是五个下拉框 - [ ] 已有截止时间会带进控件 - [ ] 选完时间立即保存(不刷新页面) - [ ] 重复点开/切换任务都保持 AntD 形态(不会退回下拉) --- ### 为什么单独建单 #74 是把只读的截止行改成可编辑控件;本单是那个控件**首次打开时没被升级成 AntD**(首次走 entry_popup.loadPanel,不经过 task_panel.paint)。同一个功能的下一层缺陷。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook#75