v26 第 26 批(5 条):财务多选按集合取图 / 首页全天置顶与红线定位 / 任务复选框去提示与看板颜色 / 导航搜索引擎切换与站点复用 / 详情页去复选框

- 财务:勾选多个标签时上面那张「总金额」图按**选中集合**统计(新增
  ledger/total_chart 路由 + 单一容器 data-ck-total-host,按集合现取并缓存;
  Ledger::timeline 第二参数放宽为 string|array)
- 首页日程:全天日程移出滚动容器固定置顶;进场把当前时刻红线居中
  (scrollTop 计算,不用 scrollIntoView),触发条件不绑 $showNow
- 任务:复选框去除 title 提示;看板可设颜色(Task::boardColor/updateBoard),
  首页任务行用该颜色显示所属看板
- 导航:展示页补回 id=engine-tabs(切换搜索引擎无效的根因);补内置引擎;
  新增站点输 URL 可复用他人已加过的站点(sharedByUrl/copyIconFile/adoptSite)
- 任务详情页页头去掉复选框(已有「标记完成」按钮)
This commit is contained in:
2026-10-07 15:31:26 +08:00
parent a5e559b2b3
commit c8839fa728
15 changed files with 964 additions and 93 deletions
+22 -5
View File
@@ -30,14 +30,22 @@ $categories = $categories ?? [];
$colList = [];
foreach ($boards as $b) {
$bid = (int)$b['id'];
$colList[] = ['id' => $bid, 'name' => (string)$b['name'], 'rows' => $cols[$bid] ?? []];
/* 🔴 v24 第 26 批 用户第 3 条:列头带上**看板色**。
用户要的是"一眼看出属于哪个看板" —— 列头本身就是一个看板,
给它一个色点,比只在卡片上标色更直观(卡片散落各处,列头是它们的归属地)。 */
$colList[] = [
'id' => $bid,
'name' => (string)$b['name'],
'color' => \App\Task::boardColor($b['color'] ?? null, (string)$b['name']),
'rows' => $cols[$bid] ?? [],
];
}
if (!empty($cols[0])) {
$colList[] = ['id' => 0, 'name' => '其他', 'rows' => $cols[0]];
$colList[] = ['id' => 0, 'name' => '其他', 'color' => '', 'rows' => $cols[0]];
}
// 一个看板都没有(也不该发生:ensureDefaultBoard 保证至少一个)→ 给一句人话
if (!$colList) {
$colList[] = ['id' => 0, 'name' => '任务', 'rows' => $cols[0] ?? []];
$colList[] = ['id' => 0, 'name' => '任务', 'color' => '', 'rows' => $cols[0] ?? []];
}
$firstColId = (int)($colList[0]['id'] ?? 0);
$lastColIdx = count($colList) - 1;
@@ -208,6 +216,9 @@ $lastColIdx = count($colList) - 1;
<?php foreach ($colList as $ci => $col): $cid = (int)$col['id']; ?>
<section class="kb-col" data-board="<?= $cid ?>">
<header class="kb-head">
<?php if ((string)($col['color'] ?? '') !== ''): ?>
<i class="kb-dot" style="--bc: <?= e((string)$col['color']) ?>;" aria-hidden="true"></i>
<?php endif; ?>
<b><?= e((string)$col['name']) ?></b>
<span class="kb-n"><?= count($col['rows']) ?></span>
</header>
@@ -244,10 +255,16 @@ $lastColIdx = count($colList) - 1;
?>
<div class="kb-meta">
<?php if ($canWrite): ?>
<?php /* ⚠️ v24 第 26 批 用户第 3 条:这里原来有 `title="现在:待办;点一下改成「进行中」"`。
那串提示在卡片里离**完成复选框**很近(kb-top 下一行),鼠标一停就弹出来压住它
—— 用户报的正是「提示把复选框都盖住了」。
去掉 title:状态**已经写在按钮文字上**(待办/进行中),
点一下会变成下一档这件事由按钮的样式(可点)表达,不需要再弹一段长文。
`aria-label` 也一并去掉 —— 它同样会生成浮层;无障碍改用 visually-hidden 文本。 */ ?>
<button class="kb-st is-<?= e($stNow) ?>" type="button"
data-st-id="<?= $tid ?>" data-st="<?= e($stNow) ?>" data-next="<?= e($stNext) ?>"
title="现在:<?= e(\App\Task::statusWord($stNow)) ?>;点一下改成「<?= e(\App\Task::statusWord($stNext)) ?>」">
data-st-id="<?= $tid ?>" data-st="<?= e($stNow) ?>" data-next="<?= e($stNext) ?>">
<?= e(\App\Task::statusWord($stNow)) ?>
<span class="visually-hidden">,点一下改成「<?= e(\App\Task::statusWord($stNext)) ?>」</span>
</button>
<?php else: ?>
<span class="kb-st is-<?= e($stNow) ?> is-static"><?= e(\App\Task::statusWord($stNow)) ?></span>
+13 -1
View File
@@ -32,14 +32,26 @@ $canWrite = \App\Auth::canWrite();
看板是「分开看几摊事」用的(家务 / 装修 / 旅行准备 …)。任务看板顶上可以切换。
删掉一个看板时,里面的任务不会被删,会挪到默认看板。
</p>
<?php /* 🔴 v24 第 26 批 用户第 3 条:「任务在设置看板的时候,可以选择颜色,
这样在首页列表中显示的时候,就可以更加直观的看到他属于哪个看板。」
⇒ 每行给一个**颜色选择器**,与改名在**同一份表单**里一起提交
(用户改色时不该被迫把名字重打一遍)。
⚠️ 用 `<input type="color">` 而不是自绘色块:原生控件在手机上直接唤起系统取色器,
自绘的做不到这一点;代价是桌面端样式朴素 —— 但"能用"优先于"好看"。
⚠️ 旁边那颗小圆点显示**当前最终色**(没选过色时是按名字派生的那个),
不然用户看到取色器里是黑的、而列表里是蓝的,会以为没生效。 */ ?>
<div class="set-list">
<?php foreach ($boards as $b): ?>
<?php $bColor = \App\Task::boardColor($b['color'] ?? null, (string)$b['name']); ?>
<form class="inline-form set-row" method="post" action="<?= e(url('tasks/board_update')) ?>">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= (int)$b['id'] ?>">
<span class="kb-dot" style="background: <?= e($bColor) ?>;" aria-hidden="true"></span>
<input type="color" class="input-color" name="color" value="<?= e($bColor) ?>"
aria-label="看板颜色">
<input class="input" name="name" value="<?= e((string)$b['name']) ?>" required>
<span class="small muted"><?= (int)($b['open_count'] ?? 0) ?> 件未完成</span>
<button class="btn btn-sm" type="submit">改名</button>
<button class="btn btn-sm" type="submit">保存</button>
</form>
<?php if (count($boards) > 1): ?>
<form class="inline-form" method="post" action="<?= e(url('tasks/board_del')) ?>">
+6 -7
View File
@@ -24,13 +24,12 @@ $isChild = !empty($t['parent_id']);
?>
<div class="page-head">
<h1>
<?php /* 用户第 6 条:「所有的任务,前面都带一个复选框,在任何地方,点这个复选框,
这个任务就完成了。」→ 详情页也算"任何地方",标题前也给它一颗。 */ ?>
<?php
$tkId = (int)$t['id']; $tkStatus = (string)$t['status'];
$tkBack = 'show'; $tkStatic = !$canWrite;
require __DIR__ . '/../_task_check.php';
?>
<?php /* 🔴 v24 第 26 批 用户第 5 条:**详情页页头不再放复选框**。
用户原话:「任务详情页面,就不需要复选框了,因为有标记完成这个按钮。」
⇒ 右侧 actions 里那颗「标记完成 / 重新打开」已经把这个动作表达得很清楚,
标题前再挂一颗是重复的(同一页两个入口做同一件事,还容易看不出区别)。
⚠️ **子任务列表里的复选框保留**(见文件下面)—— 那条需求说的是"详情页",
而子任务**没有**自己的「标记完成」按钮,去掉它子任务就没法在列表里勾了。 */ ?>
<?= e((string)$t['title']) ?>
</h1>
<span class="sub"><?= e(\App\Task::statusWord((string)$t['status'])) ?></span>