v44 第 44 批:界面 5 条 + 移动端 API v1 全量
界面(用户 2026-10-12 第 1~5 条) 1. 新建日程「日历本」并入 .cs 自绘下拉,颜色画进候选项,三字与下拉同行。 2. 新建日程「开始/结束」改「日期范围:」,删旧日期控件; 重复相关三行仅选重复时出现;删「(含第一次)」与「这段时间算忙碌」。 3. 条目浮层加「地点」、去掉「状态」行;首页红线按分钟定位(原只取整小时); 去掉左侧红点只留红线。 4. 任务页删掉状态说明提示(STATUS_HINT 三值清空)。 5. 新建任务:标题在前树框在后;截止时间改最新日历控件;负责人默认自己; 删冗余提示;「上面要做什么」→「任务名称」;清理括号说明。 移动端 API(用户第 6 条:导航模块除外,其余全量) - 新增 Bearer 令牌鉴权(api_tokens 表,Schema v32),与登录口令 / DAV 口令三套分立。 - Api.php 内核(鉴权/取参/信封/分页/分发 + _method 覆写)+ ApiHandler.php 17 条资源 + ApiToken.php + api.php 入口。 - 路由:router.php / .htaccess / index.php 三处 /api/ 兜底(部署脚本自动追加线上规则)。 - 个人设置新增「App 接口令牌」卡;docs/API.md 接口文档; docs/API-QUESTION-LIST.md 自主决策与待确认缺口清单。 验证:本地 e2e 1510/0、v43 真机 33/0、v43 反向 9/0、 v44 真机 41/0、v44 API 63/0、v44 反向 19/0;全流水线 PUSH_RC=0。
This commit is contained in:
@@ -36,19 +36,23 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
<form method="post" action="<?= e(url('tasks/update')) ?>" class="node-form" id="tkEditForm">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="<?= (int)($tkT['id'] ?? 0) ?>">
|
||||
<div class="nf-grid">
|
||||
<div class="field full">
|
||||
<label for="tk-title">标题</label>
|
||||
<?php /* 🔴 v44(用户 2026-10-12 第 5 条):编辑表单也统一成观影式排版 +
|
||||
最新时间控件 + 文案精简(与「新建任务」弹框一致)——
|
||||
同一件事在两个入口长得不一样,用户会以为"进了别的页面"。 */ ?>
|
||||
<div class="mv-grid">
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">任务名称<i>*</i></span>
|
||||
<input class="input" id="tk-title" name="title" required value="<?= e((string)($tkT['title'] ?? '')) ?>">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>截止时间(留空=不上日历)</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">截止时间</span>
|
||||
<?php /* 🔴 v44:截止时间用 AntD 单点控件(与新建同一套);括号去掉。 */ ?>
|
||||
<?php $dtName = 'due_at'; $dtValue = $tkT['due_at'] ?? null;
|
||||
$dtRequired = false;
|
||||
$dtRequired = false; $dtPlugin = 'antd-single';
|
||||
require __DIR__ . '/../_datetime.php'; ?>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>负责人</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">负责人</span>
|
||||
<?php /* 第 8 条同一诉求:负责人也是「选人」,人多时用弹窗 + 首字母更快。
|
||||
保留原下拉的「不指定」(pp-item-none + value=0)。 */ ?>
|
||||
<?php
|
||||
@@ -63,8 +67,8 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
require __DIR__ . '/../_person_picker.php';
|
||||
?>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>循环</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">循环</span>
|
||||
<select class="select" name="repeat_rule">
|
||||
<?php foreach (\App\Task::REPEAT as $rk => $rv): ?>
|
||||
<option value="<?= e($rk) ?>"<?= (string)($tkT['repeat_rule'] ?? '') === (string)$rk ? ' selected' : '' ?>>
|
||||
@@ -73,8 +77,8 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>挂到哪个父任务下</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">父任务</span>
|
||||
<select class="select" name="parent_id">
|
||||
<option value="0">(这是一项独立的任务)</option>
|
||||
<?php foreach ($tkParents as $p): ?>
|
||||
@@ -85,8 +89,8 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
</select>
|
||||
</div>
|
||||
<?php /* v24 第 9、10 条:分类与看板(看板把任务放到哪一块,分类是标签) */ ?>
|
||||
<div class="field">
|
||||
<label>分类</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">分类</span>
|
||||
<select class="select" name="category_id">
|
||||
<option value="0">未分类</option>
|
||||
<?php foreach ($tkCats as $c): ?>
|
||||
@@ -96,8 +100,8 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>看板</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">看板</span>
|
||||
<select class="select" name="board_id">
|
||||
<?php foreach ($tkBoards as $b): ?>
|
||||
<option value="<?= (int)$b['id'] ?>"<?= (int)($tkT['board_id'] ?? 0) === (int)$b['id'] ? ' selected' : '' ?>>
|
||||
@@ -106,8 +110,8 @@ $tkEmbed = !empty($tkEditEmbed);
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field full">
|
||||
<label for="tk-note">备注</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">备注</span>
|
||||
<textarea class="input" id="tk-note" name="note" rows="3"><?= e((string)($tkT['note'] ?? '')) ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+60
-46
@@ -89,57 +89,72 @@ $lastColIdx = count($colList) - 1;
|
||||
`back=tasks` 走白名单。 */ ?>
|
||||
<input type="hidden" name="back" value="tasks">
|
||||
<div class="cal-modal-body">
|
||||
<div class="form-grid">
|
||||
<div class="field full">
|
||||
<label for="tk-title">要做什么 *</label>
|
||||
<input class="input" id="tk-title" name="title" required placeholder="如:周末大扫除">
|
||||
<?php /* 🔴 v44(用户 2026-10-12 第 5 条):「新建任务页面的排版还没有统一,
|
||||
应该把标题放在前面,树框放在后面。」
|
||||
⇒ 用观影/行程/日程那套 **`.mv-grid`**(标签 62px 右对齐 + CSS `::after` 冒号 +
|
||||
控件占满剩余宽度),标题那一行在最前、其余字段依次跟上 ——
|
||||
"标题在前、后面的框跟上"就是这套排版的自然顺序。 */ ?>
|
||||
<div class="mv-grid">
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">任务名称<i>*</i></span>
|
||||
<input class="input" id="tk-title" name="title" required
|
||||
placeholder="如:周末大扫除">
|
||||
</div>
|
||||
<?php /* v24 第 5 条:截止时刻也走全局统一的「日期 + 时分秒」控件。
|
||||
秒这一档保留(与其它模块同一口径),默认 23:59:59 —— "这天之前做完"
|
||||
比"这天 00:00 之前"更符合直觉。 */ ?>
|
||||
<div class="field">
|
||||
<label for="tk-due">截止时间(有才会出现在日历里)</label>
|
||||
比"这天 00:00 之前"更符合直觉。
|
||||
🔴 v44(用户第 5 条):「截止时间也用我们最新的日历控件,
|
||||
记得把现在这个控件删掉。」
|
||||
⇒ 换成 AntD 的**单点** DatePicker(带时刻):
|
||||
`$dtPlugin='antd-single'`(见 app.js 的 mountAntdSingleDT)。
|
||||
原生那几档下拉由 CSS **真删掉**(不是 clip 藏起来)。
|
||||
标签去掉那个括号(见下一条)。 */ ?>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">截止时间</span>
|
||||
<?php $dtName = 'due_at'; $dtId = 'tk-due'; $dtValue = null;
|
||||
$dtRequired = false;
|
||||
$dtRequired = false; $dtPlugin = 'antd-single';
|
||||
require __DIR__ . '/../_datetime.php'; ?>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="tk-assign">负责人</label>
|
||||
<?php /* 🔴 v44(用户第 5 条):「负责人默认是自己。」
|
||||
⇒ 默认选中当前登录的人(原来 `$ppSelected = []`,空着)。
|
||||
⚠️ 用 `Auth::personId()` 取"我",与后端"负责人为空"的兜底一致。 */ ?>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">负责人</span>
|
||||
<?php
|
||||
$ppName = 'assignee_id';
|
||||
$ppPeople = $people;
|
||||
$ppSelected = [];
|
||||
$ppSelected = [(int)\App\Auth::personId()];
|
||||
$ppMode = 'single';
|
||||
$ppOpenBtn = '选择负责人';
|
||||
$ppOpenBtn = '更换负责人';
|
||||
$ppTitle = '谁负责这件事';
|
||||
$ppEmptyText = '不指定';
|
||||
$ppAllowEmpty = true;
|
||||
require __DIR__ . '/../_person_picker.php';
|
||||
?>
|
||||
</div>
|
||||
<?php /* v24 第 14 批 用户第 2 条:新建时就能定状态(默认「待办」)。
|
||||
⚠️ 选「已完成»的话它不会出现在看板上(已完成已从看板撤走),
|
||||
只在「任务设置 → 已完成」里能翻到 —— 这句提示必须写上,
|
||||
否则用户会以为"刚建的任务丢了"。 */ ?>
|
||||
<div class="field">
|
||||
<label for="tk-status">状态</label>
|
||||
<?php /* 🔴 v44(用户第 5 条):「状态下面选"已完成"的话,它只在"已完成"里出现,
|
||||
看板上不再显示,这句话也去掉。」
|
||||
⇒ 删掉那句 `.tip`(状态语义由状态徽标本身表达)。
|
||||
⚠️ 用户同条要求「任务页面,任务下面有一行字…这个提示不要了」——
|
||||
那是**看板顶部**那块「状态说明」(见上方 legend 那段)。 */ ?>
|
||||
<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>
|
||||
<span class="tip">选「已完成」的话,它只在「已完成」里出现,看板上不再显示。</span>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="tk-repeat">循环</label>
|
||||
<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="field">
|
||||
<label for="tk-cat">分类</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">分类</span>
|
||||
<select class="select" id="tk-cat" name="category_id">
|
||||
<option value="0">未分类</option>
|
||||
<?php foreach ($categories as $c): ?>
|
||||
@@ -148,19 +163,21 @@ $lastColIdx = count($colList) - 1;
|
||||
</select>
|
||||
</div>
|
||||
<?php /* 用户第 7 条:看板 = 任务"归属哪摊事",新建时直接选(不再是顶上的切换条) */ ?>
|
||||
<div class="field">
|
||||
<label for="tk-board">看板</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">看板</span>
|
||||
<select class="select" id="tk-board" name="board_id">
|
||||
<?php foreach ($boards as $b): ?>
|
||||
<option value="<?= (int)$b['id'] ?>"><?= e((string)$b['name']) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="tk-share">共享给(可多选,任何人完成都算完成)</label>
|
||||
<?php /* 第 8 条的同一诉求:人多时不要下拉里瞪眼找。换成弹窗 + 首字母联想。
|
||||
⚠️ 候选里去掉**自己**——「共享给自己」是空操作;组件没有"排除项",
|
||||
所以在传进去之前先过滤掉。 */ ?>
|
||||
<?php /* 🔴 v44(用户第 5 条):「"共享给"后面有个括号,可多选,任何人完成都算完成,
|
||||
这个括号里面的内容也去掉。」⇒ 标签只留「共享给」。
|
||||
第 8 条的同一诉求:人多时不要下拉里瞪眼找。换成弹窗 + 首字母联想。
|
||||
⚠️ 候选里去掉**自己**——「共享给自己」是空操作;组件没有"排除项",
|
||||
所以在传进去之前先过滤掉。 */ ?>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">共享给</span>
|
||||
<?php
|
||||
$ppName = 'shares[]';
|
||||
$ppPeople = array_values(array_filter($people,
|
||||
@@ -172,8 +189,8 @@ $lastColIdx = count($colList) - 1;
|
||||
require __DIR__ . '/../_person_picker.php';
|
||||
?>
|
||||
</div>
|
||||
<div class="field full">
|
||||
<label for="tk-note">备注</label>
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">备注</span>
|
||||
<textarea class="input" id="tk-note" name="note" rows="2"></textarea>
|
||||
</div>
|
||||
|
||||
@@ -184,12 +201,12 @@ $lastColIdx = count($colList) - 1;
|
||||
服务端 attach_save_files(..., 'attach', ...) 零改动就能收。
|
||||
⚠️ 拖进来的走暂存(stage_token[]),随表单一起认领;
|
||||
直接点选走 $_FILES 路径。两条路服务端都接(见 attach_save_files)。 */ ?>
|
||||
<div class="field full">
|
||||
<label for="sd-tk-attach">附件(可多选)</label>
|
||||
<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 /* /.form-grid */ ?>
|
||||
</div><?php /* /.mv-grid */ ?>
|
||||
</div><?php /* /.cal-modal-body */ ?>
|
||||
<div class="cal-modal-foot">
|
||||
<span class="cal-modal-tip" id="taskAddTip"></span>
|
||||
@@ -225,17 +242,14 @@ $lastColIdx = count($colList) - 1;
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php /* 状态到底是什么(用户第 6 条:「待办和进行中,有什么区别?」)——
|
||||
把三个状态的一句话解释直接摆在看板上方,而不是藏在 title 里。
|
||||
他问出这句话,就说明界面上没有一处讲清楚过。 */ ?>
|
||||
<div class="tk-legend">
|
||||
<?php foreach (\App\Task::STATUS as $sk => $sv): ?>
|
||||
<span class="tk-lg-item">
|
||||
<span class="kb-st is-<?= e($sk) ?> is-static"><?= e($sv) ?></span>
|
||||
<span class="tk-lg-hint"><?= e(\App\Task::statusHint($sk)) ?></span>
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php /* 🔴 v44(用户 2026-10-12 第 4 条):「任务页面,任务下面有一行字:
|
||||
"待办记下来了,还没动手,排队等着进行"之类的。这个提示不要了,去掉。」
|
||||
⇒ 整块「状态说明」legend **删掉**(连那三个状态徽标也一起去掉)——
|
||||
用户要的是"任务下面不要再挂一行字",留着徽标仍然是一行字。
|
||||
⚠️ `Task::STATUS_HINT` / `statusHint()` **保留在类里**(它是这三个状态语义的
|
||||
唯一书面定义,后端/文案用得上),只是**界面不再渲染**。
|
||||
⚠️ `.tk-legend` 那条 CSS 留着不动:删 CSS 会牵连缩进,而它只是空规则,
|
||||
真正的约束是"模板里不再输出 TK-LEGEND 这一块"。 */ ?>
|
||||
|
||||
<?php /* v24 第 14 批 用户第 2 条:**每张卡上都能看到并改状态**。
|
||||
⚠️ 与上面搬卡那份同理:表单全页只有一份,卡片上只放 `data-st-*`,
|
||||
|
||||
Reference in New Issue
Block a user