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')) ?>"
data-tk-url-save="= e(url('tasks/panel_save')) ?>">
状态
$tpSv): ?>
= e($tpSv) ?>
看板
= e((string)$tpB['name']) ?>
` 而不是 `_person_picker.php` 的弹窗选人:
面板本身已在浮层里,再弹一层模态 = 两层遮罩,手机上很容易点错;
而且 picker 需要 `fbInitPickers()` 初始化,`loadPanel()` 目前没调它。
家庭成员通常 3~10 人,select 够用。**人多了再换弹窗**,那时记得
把 `fbInitPickers` 也补进 `loadPanel()`。 */ ?>
更多信息
截止
= e($tpDueWord) ?>
= $tpDue !== '' ? e($tpDue) : '未设' ?>
负责人
= !empty($tpT['assignee_name'])
? e(person_name(['name' => $tpT['assignee_name'],
'my_nickname' => $tpT['assignee_nick'] ?? '']))
: '不指定' ?>
分类
= $tpCatName !== '' ? 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) ?>
还没有留言。写 @名字 可以点名。