2026-10-22 12:40:14 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 「新建任务」弹框(v78 从 `tasks/index.php` 里抽出来的)。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 为什么抽出来:用户 2026-10-22 说「在全部任务旁边,放一个新建任务的功能,
|
|
|
|
|
|
* 其实就是把任务中的新建和编辑功能,搬过来,用弹出框来处理。」
|
|
|
|
|
|
* ⇒ 首页也要有这张弹框。**绝不能各写一张**:
|
|
|
|
|
|
* 两张表单的字段迟早不同步(本项目在 `_edit_form.php` 上已经栽过一次,
|
|
|
|
|
|
* 见那份文件头部"为什么独立出来"的说明)。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 用法(require 之前设好这几个变量):
|
|
|
|
|
|
* $tkAddBack 新建完回哪儿:'tasks'(看板,默认)/ 'home'(首页)
|
|
|
|
|
|
* $tkAddBoards 看板清单(Task::boards 的结果)
|
|
|
|
|
|
* $tkAddCats 分类清单(Task::categories 的结果)
|
|
|
|
|
|
* $tkAddPeople 名册(Person::roster 的结果)
|
|
|
|
|
|
*
|
|
|
|
|
|
* ⚠️ 表单字段名 / action / 契约与原来**一字未改**(服务端 `tasks/create` 收的就是这些)。
|
|
|
|
|
|
* ⚠️ 打开/关闭由 `assets/js/task_add.js` 管(全站加载,页面里没有这张弹框就什么都不做)——
|
|
|
|
|
|
* 两页共用一份脚本,不在这里写内联 script(内联脚本在 AJAX 换正文时不会被重跑,
|
|
|
|
|
|
* 这个坑 v42/v47 连着踩过两次)。
|
|
|
|
|
|
*/
|
|
|
|
|
|
$tkAddBack = (string)($tkAddBack ?? 'tasks');
|
|
|
|
|
|
$tkAddBoards = (array)($tkAddBoards ?? []);
|
|
|
|
|
|
$tkAddCats = (array)($tkAddCats ?? []);
|
|
|
|
|
|
$tkAddPeople = (array)($tkAddPeople ?? []);
|
|
|
|
|
|
?>
|
|
|
|
|
|
<?php if (\App\Auth::canWrite()): ?>
|
|
|
|
|
|
<div class="cal-modal" id="taskAddCard" role="dialog" aria-modal="true"
|
|
|
|
|
|
aria-label="新建任务" hidden>
|
|
|
|
|
|
<div class="cal-modal-panel">
|
|
|
|
|
|
<div class="cal-modal-head">
|
|
|
|
|
|
<b>新建任务</b>
|
|
|
|
|
|
<button type="button" class="cal-modal-x" data-tk-add-close aria-label="关闭">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* ⚠️ enctype 必须有:本批新增了**附件**上传(用户第 6 条第 2 点
|
|
|
|
|
|
「新建任务时,竟然没有添加附件,这个应该加上」)。
|
|
|
|
|
|
没有它的话文件根本不会随表单发出去,而且 $_FILES 是空的。 */ ?>
|
|
|
|
|
|
<form method="post" action="<?= e(url('tasks/create')) ?>"
|
|
|
|
|
|
enctype="multipart/form-data" id="taskAddForm">
|
|
|
|
|
|
<?= csrf_field() ?>
|
|
|
|
|
|
<?php /* ⚠️ 新建后回**看板**(用户:「新建完之后刷新…看板页面」)。
|
|
|
|
|
|
`back=tasks` / `back=home` 走服务端白名单,见 index.php 的 tasks/create。 */ ?>
|
|
|
|
|
|
<input type="hidden" name="back" value="<?= e($tkAddBack) ?>">
|
|
|
|
|
|
<div class="cal-modal-body">
|
|
|
|
|
|
<?php /* 🔴 v44(用户 2026-10-12 第 5 条):「新建任务页面的排版还没有统一,
|
|
|
|
|
|
应该把标题放在前面,树框放在后面。」
|
|
|
|
|
|
⇒ 用观影/行程/日程那套 **`.mv-grid`**(标签 62px 右对齐 + CSS `::after` 冒号 +
|
|
|
|
|
|
控件占满剩余宽度),标题那一行在最前、其余字段依次跟上。 */ ?>
|
|
|
|
|
|
<div class="mv-grid">
|
|
|
|
|
|
<div class="mv-row">
|
2026-10-26 06:45:38 +08:00
|
|
|
|
<span class="mv-lb is-req">任务名称</span>
|
2026-10-22 12:40:14 +08:00
|
|
|
|
<input class="input" id="tk-title" name="title" required
|
|
|
|
|
|
placeholder="如:周末大扫除">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* v24 第 5 条:截止时刻也走全局统一的「日期 + 时分秒」控件。
|
|
|
|
|
|
秒这一档保留(与其它模块同一口径),默认 23:59:59 —— "这天之前做完"
|
|
|
|
|
|
比"这天 00:00 之前"更符合直觉。
|
|
|
|
|
|
🔴 v44(用户第 5 条):「截止时间也用我们最新的日历控件,
|
|
|
|
|
|
记得把现在这个控件删掉。」
|
|
|
|
|
|
⇒ 换成 AntD 的**单点** DatePicker(带时刻):
|
|
|
|
|
|
`$dtPlugin='antd-single'`(见 app.js 的 mountAntdSingleDT)。 */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">截止时间</span>
|
|
|
|
|
|
<?php $dtName = 'due_at'; $dtId = 'tk-due'; $dtValue = null;
|
|
|
|
|
|
$dtRequired = false; $dtPlugin = 'antd-single';
|
|
|
|
|
|
require __DIR__ . '/../_datetime.php'; ?>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* 🔴 v44(用户第 5 条):「负责人默认是自己。」
|
|
|
|
|
|
⇒ 默认选中当前登录的人(原来 `$ppSelected = []`,空着)。 */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">负责人</span>
|
|
|
|
|
|
<?php
|
|
|
|
|
|
$ppName = 'assignee_id';
|
|
|
|
|
|
$ppPeople = $tkAddPeople;
|
|
|
|
|
|
$ppSelected = [(int)\App\Auth::personId()];
|
|
|
|
|
|
$ppMode = 'single';
|
|
|
|
|
|
$ppOpenBtn = '更换负责人';
|
|
|
|
|
|
$ppTitle = '谁负责这件事';
|
|
|
|
|
|
$ppEmptyText = '不指定';
|
|
|
|
|
|
$ppAllowEmpty = true;
|
|
|
|
|
|
require __DIR__ . '/../_person_picker.php';
|
|
|
|
|
|
?>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* 🔴 v44(用户第 5 条):「状态下面选"已完成"的话,它只在"已完成"里出现,
|
|
|
|
|
|
看板上不再显示,这句话也去掉。」⇒ 删掉那句 `.tip`(状态语义由徽标本身表达)。 */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">状态</span>
|
|
|
|
|
|
<select class="select" id="tk-status" name="status">
|
|
|
|
|
|
<?php foreach (\App\Task::STATUS as $sk => $sv): ?>
|
|
|
|
|
|
<option value="<?= e($sk) ?>" <?= $sk === 'todo' ? 'selected' : '' ?>><?= e($sv) ?></option>
|
|
|
|
|
|
<?php endforeach; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">循环</span>
|
|
|
|
|
|
<select class="select" id="tk-repeat" name="repeat_rule">
|
|
|
|
|
|
<?php foreach (\App\Task::REPEAT as $rk => $rv): ?>
|
|
|
|
|
|
<option value="<?= e($rk) ?>"><?= e($rv) ?></option>
|
|
|
|
|
|
<?php endforeach; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">分类</span>
|
|
|
|
|
|
<select class="select" id="tk-cat" name="category_id">
|
|
|
|
|
|
<option value="0">未分类</option>
|
|
|
|
|
|
<?php foreach ($tkAddCats as $c): ?>
|
|
|
|
|
|
<option value="<?= (int)$c['id'] ?>"><?= e((string)$c['name']) ?></option>
|
|
|
|
|
|
<?php endforeach; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* 用户第 7 条:看板 = 任务"归属哪摊事",新建时直接选(不是顶上的切换条) */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">看板</span>
|
|
|
|
|
|
<select class="select" id="tk-board" name="board_id">
|
|
|
|
|
|
<?php foreach ($tkAddBoards as $b): ?>
|
|
|
|
|
|
<option value="<?= (int)$b['id'] ?>"><?= e((string)$b['name']) ?></option>
|
|
|
|
|
|
<?php endforeach; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* 🔴 v44(用户第 5 条):「"共享给"后面有个括号,可多选,任何人完成都算完成,
|
|
|
|
|
|
这个括号里面的内容也去掉。」⇒ 标签只留「共享给」。
|
|
|
|
|
|
第 8 条的同一诉求:人多时不要下拉里瞪眼找。换成弹窗 + 首字母联想。
|
|
|
|
|
|
⚠️ 候选里去掉**自己**——「共享给自己」是空操作。 */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">共享给</span>
|
|
|
|
|
|
<?php
|
|
|
|
|
|
$ppName = 'shares[]';
|
|
|
|
|
|
$ppPeople = array_values(array_filter($tkAddPeople,
|
|
|
|
|
|
fn($p) => (int)$p['id'] !== (int)\App\Auth::personId()));
|
|
|
|
|
|
$ppSelected = [];
|
|
|
|
|
|
$ppMode = 'multi';
|
|
|
|
|
|
$ppOpenBtn = '+ 添加人';
|
|
|
|
|
|
$ppTitle = '共享给谁';
|
|
|
|
|
|
require __DIR__ . '/../_person_picker.php';
|
|
|
|
|
|
?>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">备注</span>
|
|
|
|
|
|
<textarea class="input" id="tk-note" name="note" rows="2"></textarea>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<?php /* 🔴 v37 用户第 6 条第 2 点:「新建任务时,竟然没有添加附件,这个应该加上。」
|
|
|
|
|
|
走全站统一的「点击或拖动进行上传」框(templates/_stage_drop.php);
|
|
|
|
|
|
字段名 `attach[]` 与详情页的附件上传**一致**。 */ ?>
|
|
|
|
|
|
<div class="mv-row">
|
|
|
|
|
|
<span class="mv-lb">附件</span>
|
|
|
|
|
|
<?php $sdName = 'attach[]'; $sdId = 'sd-tk-attach'; $sdSlot = 'photo';
|
|
|
|
|
|
require __DIR__ . '/../_stage_drop.php'; ?>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div><?php /* /.mv-grid */ ?>
|
|
|
|
|
|
</div><?php /* /.cal-modal-body */ ?>
|
|
|
|
|
|
<div class="cal-modal-foot">
|
|
|
|
|
|
<span class="cal-modal-tip" id="taskAddTip"></span>
|
|
|
|
|
|
<button class="btn btn-sm" type="submit" form="taskAddForm" id="taskAddSubmit">新建</button>
|
|
|
|
|
|
<button class="btn btn-ghost btn-sm" type="button" data-tk-add-close>取消</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</form>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
<?php
|
|
|
|
|
|
/* ⚠️ 只清本片段自己的变量:宿主页面后面还要用 $boards / $people 这些。
|
|
|
|
|
|
(`_edit_form.php` 头部记着"把宿主变量 unset 掉 → 子任务与评论区静默消失"那次事故。) */
|
|
|
|
|
|
unset($tkAddBack, $tkAddBoards, $tkAddCats, $tkAddPeople,
|
|
|
|
|
|
$dtName, $dtId, $dtValue, $dtRequired, $dtPlugin,
|
|
|
|
|
|
$ppName, $ppPeople, $ppSelected, $ppMode, $ppOpenBtn, $ppTitle,
|
|
|
|
|
|
$ppEmptyText, $ppAllowEmpty,
|
|
|
|
|
|
$sdName, $sdId, $sdSlot);
|
|
|
|
|
|
?>
|