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
+24 -4
View File
@@ -465,20 +465,40 @@ final class Ledger
* 取值规则(每个时点 t):账目在 t 之后才创建 → **不计入**(那时它还不存在);
* 在 t 之前盘点过 → 取最后一次盘点的值;从未盘点过 → 取它现在的值(一直没变过)。
*
* @param string $kind v24 第 23 批 用户第 2 条:**只看某一类别**时传它的 key
* @param string|array $kind v24 第 23 批 用户第 2 条:**只看某一类别**时传它的 key
* ('' = 整本账)。只影响"哪些账目参与累加",口径一字不改 ——
* 所以"存款"那条线与"只记了存款这一笔的账本"完全等价。
* 🔴 v24 第 26 批 用户第 1 条:多选之后传**类别集合**
* (`['deposit','insurance']`)—— 语义同样是"只让这些类别的账目参与累加"。
* ⚠️ 保持接受**字符串**(老调用点:只选了一类时仍然传字符串,见 index.php
* 的 kindLines 预渲染),在下面统一归一成数组 ——
* 两套参数并存是最容易漏改的那种接口。
* @return array<int,array{date:string,net:int,asset:int,debt:int}> 空账本返回 []
*/
public static function timeline(int $ledgerId, string $kind = ''): array
public static function timeline(int $ledgerId, $kind = ''): array
{
// 归一:'' / null → 空数组(= 全部);'deposit' → ['deposit'];数组原样
$kinds = [];
if (is_array($kind)) {
foreach ($kind as $k) {
$k = trim((string)$k);
if ($k !== '') {
$kinds[$k] = true;
}
}
$kinds = array_keys($kinds);
} elseif (is_string($kind) && trim($kind) !== '') {
$kinds = [trim($kind)];
}
$entries = self::entries($ledgerId);
if ($kind !== '') {
if ($kinds) {
// ⚠️ 必须在**取时点之前**过滤(而不是算完再筛):
// 时点集合里有"每条账目的创建日",包含被筛掉那些账目的创建日 →
// 图右端就会凭空多出几个"其实什么都没变"的时点。
// ⚠️ 多选时是**白名单**(在集合里才留);集合为空 = 不过滤 = 整本账。
$entries = array_values(array_filter(
$entries, static fn($e): bool => (string)$e['kind'] === $kind));
$entries, static fn($e): bool => in_array((string)$e['kind'], $kinds, true)));
}
if (!$entries) {
return [];