0;
/* 分类名:Task::find 不带 join,这里按 id 在清单里找(清单一次查询就够,
比再跑一条 SQL 划算;找不到就当未分类)。 */
$tpCatName = '';
foreach ($tpCats as $tpCat) {
if ((int)$tpCat['id'] === (int)($tpT['category_id'] ?? 0)) {
$tpCatName = (string)$tpCat['name'];
break;
}
}
$tpDue = (string)($tpT['due_at'] ?? '');
$tpDueWord = \App\Task::dueWord($tpDue !== '' ? $tpDue : null);
$tpLate = $tpDue !== '' && $tpStatus !== 'done' && \App\Task::isOverdue($tpDue);
?>
data-tk-url-due="= e(url('tasks/due')) ?>">
状态
$tpSv): ?>
= e($tpSv) ?>
看板
= e((string)$tpB['name']) ?>
截止…
而且**没有截止时间时整行连显示都不显示** —— 用户根本不知道该去哪填。
⇒ 换成与 `_edit_form.php` 同一套的 AntD 单点控件(`dtPlugin=antd-single`),
并且**不管有没有值都画出来**(空着就是"还没设",比"没有这个字段"清楚)。
`$dtValue = $tpDue` ⇒ 已有截止时间会带进控件(用户明确要求)。
⚠️ 控件里改完**立即保存**(`data-tk-act="due"`,见 task_panel.js),
与状态/看板/子任务/评论/附件同一套交互 —— 面板里不该有"保存按钮"。
⚠️ 这个面板是 AJAX 塞进来的,AntD 要靠 `fbBootAntd()` 补挂,
见 task_panel.js 的 paint()。 */ ?>
截止
= e($tpDueWord) ?>
= $tpDue !== '' ? e($tpDue) : '未设' ?>
- 负责人
- = e(person_name(['name' => $tpT['assignee_name'], 'my_nickname' => $tpT['assignee_nick'] ?? ''])) ?>
- 分类
- = e($tpCatName) ?>
- 循环
- = e(\App\Task::repeatWord((string)$tpT['repeat_rule'])) ?>
- 备注
- = nl2br(e((string)$tpT['note'])) ?>
子任务
= (int)$tpKidDone ?>/= count($tpKids) ?>
-
:<状态词>」——
所以这里只给标题,别把"子任务"三个字再拼一遍
(否则读屏会念成「子任务子任务甲:待办」)。 */
$tkLabel = (string)$tpKidRow['title'];
require __DIR__ . '/../_task_check.php';
?>
= e((string)$tpKidRow['title']) ?>
= e(\App\Task::dueWord($tpKidRow['due_at'] ?? null)) ?>
还没有子任务。
附件 = count($tpAtts) ?>
'1'];
require __DIR__ . '/../_attachments.php';
?>
还没有附件。
讨论 = count($tpCmts) ?>
-
= person_chip($tpCmt) ?>
= e((string)$tpCmt['created_at']) ?>
会带上浏览器的灰底与内边距。 */ ?>
= \App\Task::commentHtml((string)$tpCmt['content'], $tpNames) ?>
还没有留言。写 @名字 可以点名。