首页改任务时看不到「截止时间」(服务端已确认渲染正常,待定位前端) #72

Open
opened 2026-11-05 09:32:43 +00:00 by laoyang · 1 comment
Owner

首页改任务时看不到「截止时间」

用户(2026-11-05)

「网页端,在首页上修改一个日程,没有填写截止日期的地方。」

经确认:用户说的是「任务」,不是「日程」 ——
日程表(calendar_events)本身没有截止日期字段,只有任务表(tasks.due_at)有。

已排除的方向(避免重复劳动)

环节 检查方式 结论
任务表有没有 due_at SHOW COLUMNS ✅ 有,datetime
编辑表单有没有截止时间 读 _edit_form.php ✅ 有,<span class="mv-lb">截止时间</span>
路由是否正确 读 index.php:7056 ✅ tasks/edit → renderPartial('tasks/_edit_form')
服务端渲染结果 实际 renderPartial 后检查字符串 ✅ 18641 字符,含「截止时间」
mountAntdSingleDT 前置元素 检查渲染输出 ✅ dt-native 1 处
bootAntd 查询选择器 检查渲染输出 ✅ data-dt-antd-single 1 处
隐藏字段 检查渲染输出 ✅ due_at_date / due_at_hour 各 1 处
fb-antd meta 读 layout.php:109 ✅ 无条件输出,不依赖页面有没有 antd 控件
antd vendor 文件 ls 服务器 ✅ 5 个文件都在(1.8MB 主包等)
.dt-native 默认显示 读 app.css:865 ✅ display: contents(可见)
只有挂上 antd 才隐藏原生 读 app.css:6192 ✅ .dt-input.is-antd > .dt-native { display:none }
原生下拉样式 读 app.css:870~880 ✅ 年/月/日三个 select 都有完整样式
fbBootAntd 调用 读 entry_popup.js:290 ✅ loadEdit() 里 AJAX 插入后调用

静态路径全部正常。 如果 antd 挂不上,用户应该看到原生年/月/日下拉
(display:contents + 没有 is-antd 类),而不是"什么都没有"。

需要的信息

请提供以下任一,用于定位:

  1. 一张截图(首页点任务 → 浮层 → 编辑,拍「截止时间」那一行附近)
  2. 浏览器 F12 → Console 有没有这两类输出:
    • AntD 日期控件已挂上 N 处
    • antd 单点时间控件挂载失败,留在自建下拉:...
    • AntD DatePicker 未启用:...
  3. F12 → Elements 搜 due_at,看那块的 class 里有没有 is-antd

一个已知的架构隐患(可能是根因)

bootAntd() 开头第 1923 行:

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

首页首屏的任务卡里没有 antd 控件(只有点开浮层后才有)。
页面加载时 singles.length === 0 ⇒ 直接 return ⇒ window.antd 从未被加载。

浮层打开时 entry_popup.js 会调 fbBootAntd(),此时才开始下载 1.8MB 的
antd-with-locales.min.js。这个下载期间:

  • 原生下拉是可见的(正确降级)
  • 但 1.8MB 在慢网/弱机上可能要几秒

如果你是在"刚点开就截图"的时机看,可能只是还没加载完。
但如果是"等很久也看不到",那就不是这个原因。

待确认后再改

不想在没有确认现象的情况下盲改 —— 这条链路已经静态检查了三轮全部正常,
继续猜只会浪费时间。等用户提供截图或 Console 输出。


为什么单独建单

与 #66(日程地点无法修改)不同:那是日程 calendar_events.location;本单是任务 tasks.due_at 在浮层编辑表单里的显示问题,属任务模块。

# 首页改任务时看不到「截止时间」 ## 用户(2026-11-05) > 「网页端,在首页上修改一个日程,没有填写截止日期的地方。」 **经确认:用户说的是「任务」,不是「日程」** —— 日程表(`calendar_events`)本身没有截止日期字段,只有任务表(`tasks.due_at`)有。 ## 已排除的方向(避免重复劳动) | 环节 | 检查方式 | 结论 | |---|---|---| | 任务表有没有 `due_at` | `SHOW COLUMNS` | ✅ 有,`datetime` | | 编辑表单有没有截止时间 | 读 `_edit_form.php` | ✅ 有,`<span class="mv-lb">截止时间</span>` | | 路由是否正确 | 读 `index.php:7056` | ✅ `tasks/edit` → `renderPartial('tasks/_edit_form')` | | **服务端渲染结果** | **实际 renderPartial 后检查字符串** | ✅ 18641 字符,含「截止时间」 | | `mountAntdSingleDT` 前置元素 | 检查渲染输出 | ✅ `dt-native` 1 处 | | `bootAntd` 查询选择器 | 检查渲染输出 | ✅ `data-dt-antd-single` 1 处 | | 隐藏字段 | 检查渲染输出 | ✅ `due_at_date` / `due_at_hour` 各 1 处 | | `fb-antd` meta | 读 `layout.php:109` | ✅ **无条件输出**,不依赖页面有没有 antd 控件 | | antd vendor 文件 | `ls` 服务器 | ✅ 5 个文件都在(1.8MB 主包等) | | `.dt-native` 默认显示 | 读 `app.css:865` | ✅ `display: contents`(**可见**) | | 只有挂上 antd 才隐藏原生 | 读 `app.css:6192` | ✅ `.dt-input.is-antd > .dt-native { display:none }` | | 原生下拉样式 | 读 `app.css:870~880` | ✅ 年/月/日三个 select 都有完整样式 | | `fbBootAntd` 调用 | 读 `entry_popup.js:290` | ✅ `loadEdit()` 里 AJAX 插入后调用 | **静态路径全部正常。** 如果 antd 挂不上,用户应该看到**原生年/月/日下拉** (`display:contents` + 没有 `is-antd` 类),而不是"什么都没有"。 ## 需要的信息 请提供以下任一,用于定位: 1. **一张截图**(首页点任务 → 浮层 → 编辑,拍「截止时间」那一行附近) 2. **浏览器 F12 → Console** 有没有这两类输出: - `AntD 日期控件已挂上 N 处` - `antd 单点时间控件挂载失败,留在自建下拉:...` - `AntD DatePicker 未启用:...` 3. **F12 → Elements** 搜 `due_at`,看那块的 `class` 里有没有 `is-antd` ## 一个已知的架构隐患(可能是根因) `bootAntd()` 开头第 1923 行: ```javascript if (!hosts.length && !dateRanges.length && !dates.length && !singles.length) { return; } ``` **首页首屏的任务卡里没有 antd 控件**(只有点开浮层后才有)。 页面加载时 `singles.length === 0` ⇒ 直接 return ⇒ `window.antd` 从未被加载。 浮层打开时 `entry_popup.js` 会调 `fbBootAntd()`,此时才开始下载 **1.8MB** 的 `antd-with-locales.min.js`。这个下载期间: - 原生下拉是可见的(正确降级) - 但 1.8MB 在慢网/弱机上可能要几秒 **如果你是在"刚点开就截图"的时机看,可能只是还没加载完。** 但如果是"等很久也看不到",那就不是这个原因。 ## 待确认后再改 不想在没有确认现象的情况下盲改 —— 这条链路已经静态检查了三轮全部正常, 继续猜只会浪费时间。等用户提供截图或 Console 输出。 --- ### 为什么单独建单 与 #66(日程地点无法修改)不同:那是日程 calendar_events.location;本单是任务 tasks.due_at 在浮层编辑表单里的显示问题,属任务模块。
Author
Owner

首页改任务时看不到「截止时间」

用户(2026-11-05)

「网页端,在首页上修改一个日程,没有填写截止日期的地方。」

经确认:用户说的是任务(日程表没截止日期字段)。

用户提供的 Console 输出(决定性线索)

app.js?v=2890f9e5:1971 AntD 日期控件已挂上 5 处

AntD 控件已经挂上了 5 处 ⇒ 资源加载、挂载逻辑全部正常。问题不在前端控件。

真正的根因:底栏根本没有「编辑」按钮

链路

  1. 首页任务卡点开 → 浮层显示的是 tasks/panel(_panel.php,可操作面板)
  2. 面板里的「截止」是只读的一行:
    <?php if ($tpDue !== ''): ?>
      <div class="kv-row"><dt>截止</dt><dd>…</dd></div>
    <?php endif; ?>
    
    没有截止时间的任务,这一行连显示都不显示。
  3. 要改截止时间必须点底栏「编辑」→ 进 _edit_form.php(那里才有 AntD 控件)
  4. 但底栏的「编辑」按钮压根没显示 —— 见下

为什么编辑按钮不显示

entry_popup.js 的 paintDetail():

var isEvent = (data.source === 'event');
// 「编辑」「删除」只有 source === 'event' 才点亮

而 source 由 fb_entry_json() 算:

$evKind = (string)($ev['kind'] ?? 'custom');   // 任务卡没传 kind ⇒ 默认 'custom'
$evRef  = (int)($ev['ref_id'] ?? 0);           // 任务卡没传 ref_id ⇒ 0
$evOwn  = ($evKind === 'custom' && $evRef > 0);  // ⇒ false
'source' => $evOwn ? 'event' : 'derived',        // ⇒ 'derived'

$evRef = 0 ⇒ $evOwn = false ⇒ source = 'derived' ⇒ 编辑/删除都不显示。

任务卡漏传了什么

templates/home/_card_tasks.php:55:

data-fb-entry='<?= fb_entry_json([
     'title'       => ...,
     'status_word' => ...,
     'note'        => ...,
     'panel'       => url('tasks/panel', ['id' => ...]),
], url('tasks/show', [...]),
   \App\Auth::canWrite() ? url('tasks/edit', [...]) : '',   // ← edit 传了
   [...]) ?>'

edit 地址传了,但 $ev['ref_id'] 没传 ⇒ $evOwn 判 false ⇒ 那颗按钮永远不显。

irony:_card_tasks.php 是唯一给 panel 的卡片(注释里还写着"只有任务会给这个字段"),
但它同时是唯一没给 ref_id 的调用方。

修法

在任务卡的 fb_entry_json 第一个参数里补 ref_id:

'ref_id' => (int)$t['id'],

这样 $evOwn 为 true ⇒ source='event' ⇒ 编辑/删除按钮显示 ⇒
点「编辑」进 _edit_form.php ⇒ 看到 AntD 的「截止时间」。

⚠️ 不能给 kind:任务的 kind 传什么值?fb_entry_json 的判据是
kind === 'custom',任务不是 custom 也不是 movie/trip 那种派生本。
最干净的做法是只补 ref_id,让 kind 走默认的 'custom' ——
对 fb_entry_json 来说它只关心"这条能不能在这里改",任务确实能改(有 tasks/edit)。

⚠️ del 也会跟着变成非空(tasks 的删除地址)—— 这是正确的,
任务本来就能删,只是之前因为同一个 bug 也一并没显。

验收

  • 首页「近期任务」点开 → 底栏有「编辑」「删除」
  • 点「编辑」→ 表单里有「截止时间」,是 AntD 日期选择器
  • 改完能保存
  • 有截止时间的任务,面板里那行只读「截止」仍正常显示

已排除(避免重复劳动)

环节 结论
tasks.due_at 字段 ✅ 存在
_edit_form.php 有截止时间 ✅ 有
tasks/edit 路由 ✅ 正确
服务端渲染输出(18641 字符) ✅ dt-native/data-dt-antd-single/隐藏字段全在
antd vendor 文件 ✅ 5 个都在
.dt-native 默认可见 ✅ display:contents
AntD 是否挂上 ✅ 用户 Console 确认「已挂上 5 处」
# 首页改任务时看不到「截止时间」 ## 用户(2026-11-05) > 「网页端,在首页上修改一个日程,没有填写截止日期的地方。」 经确认:用户说的是**任务**(日程表没截止日期字段)。 ## 用户提供的 Console 输出(决定性线索) ``` app.js?v=2890f9e5:1971 AntD 日期控件已挂上 5 处 ``` **AntD 控件已经挂上了 5 处** ⇒ 资源加载、挂载逻辑全部正常。问题不在前端控件。 ## 真正的根因:底栏根本没有「编辑」按钮 ### 链路 1. 首页任务卡点开 → 浮层显示的是 **`tasks/panel`**(`_panel.php`,可操作面板) 2. 面板里的「截止」是**只读的一行**: ```php <?php if ($tpDue !== ''): ?> <div class="kv-row"><dt>截止</dt><dd>…</dd></div> <?php endif; ?> ``` 没有截止时间的任务,**这一行连显示都不显示**。 3. 要改截止时间必须点底栏「编辑」→ 进 `_edit_form.php`(那里才有 AntD 控件) 4. **但底栏的「编辑」按钮压根没显示** —— 见下 ### 为什么编辑按钮不显示 `entry_popup.js` 的 `paintDetail()`: ```javascript var isEvent = (data.source === 'event'); // 「编辑」「删除」只有 source === 'event' 才点亮 ``` 而 `source` 由 `fb_entry_json()` 算: ```php $evKind = (string)($ev['kind'] ?? 'custom'); // 任务卡没传 kind ⇒ 默认 'custom' $evRef = (int)($ev['ref_id'] ?? 0); // 任务卡没传 ref_id ⇒ 0 $evOwn = ($evKind === 'custom' && $evRef > 0); // ⇒ false 'source' => $evOwn ? 'event' : 'derived', // ⇒ 'derived' ``` `$evRef = 0` ⇒ `$evOwn = false` ⇒ `source = 'derived'` ⇒ **编辑/删除都不显示**。 ### 任务卡漏传了什么 `templates/home/_card_tasks.php:55`: ```php data-fb-entry='<?= fb_entry_json([ 'title' => ..., 'status_word' => ..., 'note' => ..., 'panel' => url('tasks/panel', ['id' => ...]), ], url('tasks/show', [...]), \App\Auth::canWrite() ? url('tasks/edit', [...]) : '', // ← edit 传了 [...]) ?>' ``` **`edit` 地址传了,但 `$ev['ref_id']` 没传** ⇒ `$evOwn` 判 false ⇒ 那颗按钮永远不显。 irony:`_card_tasks.php` 是唯一给 `panel` 的卡片(注释里还写着"只有任务会给这个字段"), 但它同时是唯一**没给 ref_id** 的调用方。 ## 修法 在任务卡的 `fb_entry_json` 第一个参数里补 `ref_id`: ```php 'ref_id' => (int)$t['id'], ``` 这样 `$evOwn` 为 true ⇒ `source='event'` ⇒ 编辑/删除按钮显示 ⇒ 点「编辑」进 `_edit_form.php` ⇒ 看到 AntD 的「截止时间」。 ⚠️ **不能给 `kind`**:任务的 kind 传什么值?`fb_entry_json` 的判据是 `kind === 'custom'`,任务不是 custom 也不是 movie/trip 那种派生本。 最干净的做法是**只补 `ref_id`**,让 `kind` 走默认的 `'custom'` —— 对 `fb_entry_json` 来说它只关心"这条能不能在这里改",任务**确实能改**(有 `tasks/edit`)。 ⚠️ `del` 也会跟着变成非空(`tasks` 的删除地址)—— 这是**正确的**, 任务本来就能删,只是之前因为同一个 bug 也一并没显。 ## 验收 - [ ] 首页「近期任务」点开 → 底栏有「编辑」「删除」 - [ ] 点「编辑」→ 表单里有「截止时间」,是 AntD 日期选择器 - [ ] 改完能保存 - [ ] 有截止时间的任务,面板里那行只读「截止」仍正常显示 ## 已排除(避免重复劳动) | 环节 | 结论 | |---|---| | `tasks.due_at` 字段 | ✅ 存在 | | `_edit_form.php` 有截止时间 | ✅ 有 | | `tasks/edit` 路由 | ✅ 正确 | | 服务端渲染输出(18641 字符) | ✅ `dt-native`/`data-dt-antd-single`/隐藏字段全在 | | antd vendor 文件 | ✅ 5 个都在 | | `.dt-native` 默认可见 | ✅ `display:contents` | | **AntD 是否挂上** | ✅ **用户 Console 确认「已挂上 5 处」** |
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook#72