Files
laoyang 8a9629650a v72:日历本显示与管理合并成一张清单,颜色改用内置调色模态框
用户 2026-10-21 两条:
  「日历设置里面日历本显示和日历管理可以放在一起」
  「预制的颜色点了之后没反应……选颜色那个地方点了之后是弹出 Windows 的
    一个颜色选择框,这个不好,我们把它改成内置的」

改动:
· calendar/display 整页删除,并入 calendar/calendars(保留 302 老地址)
· 新增 templates/_color_picker.php(按钮 + 值载体,表单/独立双模式)
· 新增 templates/_color_picker_modal.php(全页唯一模态框,预置色 + hex 手输)
· 共享本提到同一清单,标注归属与权限;owner 校验服务端做
· 清掉 display.php 时代遗留的死 CSS(.cal-set-page / .cal-set-book* 等)

部署中抓出并修掉两处真问题:
· 部署脚本「清掉被取代文件」清单漏了 display.php —— tar 只新增/覆盖,
  git rm 掉的文件在线上永远留着,被第 7 段断言拦下(断言是对的,缺的是删除步骤)
· _color_picker.php 里残留 <input type="color" class="cp-trigger">:
  原生取色控件既不能有子元素、也没有 data-cp-open ⇒
  按钮回显失效(找不到 .cp-trigger-dot/hex)+ 模态框永远打不开,
  用户点到的还是 Windows 取色框。改成 <button type="button"> + 色点 + hex
  (v72 探针在修复前实测 2 条红,修复后 50/0)
2026-10-21 20:01:23 +08:00

79 lines
5.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 日程模块的「设置」下拉(v24 用户 2026-10-03 第 4、5 条;🔴 v51 重构)。
*
* 起源用户原话:「日程模块,左侧的日历本显示与否,去掉,让日历充满整个宽度。
* 在右侧,也加一个设置按钮,设置中,可以设置哪些日历本显示,
* 调整日历的颜色,导入日历等功能,都放在这个设置下。」
* 「在日程的设置中,可以设置默认显示的视图模式,月视图还是周视图还是日视图。」
*
* 🔴🔴 v51(用户 2026-10-15 第 6 条)——**下拉从"长表单"改成"纯列表"**:
* 用户原话:「日程的设置,拉下来之后,先是默认打开时的视图,然后还有显示哪些日历本,
* 下面是那个设置。应该把这些设置都**放在另外一个页面**里面。因为如果日历本
* 特别多的时候,它拉下来会非常长,下面的设置就看不到了,要拉下来才能看到。
* 所以点开这个设置之后啊,仍然和其他的设置页面一样,是几个,是一个列表。
* 第一个就是**显示设置**……然后紧接着就是**日历本管理**,再下面是**订阅管理**,
* 再下面是 **Dev(DAV)口令**。」
*
* 为什么必须这么改(用户给的理由,别丢):日历本可能有几十本,
* 原来把「默认视图 + 每一本一个勾选框」**铺在下拉里** ⇒ 下拉被撑得极长,
* 排在后面的「日历本管理 / 订阅 / 口令」被挤到屏幕外面。
* ⇒ 下拉只留**四行固定高度的条目**,点进各自的页面再看长内容。
* 这也让日程与本项目其它模块(观影/旅程/任务)的设置**手感一致**:
* 三处都是"☰ → 一串列表"。
*
* 四行(顺序是用户点名的):
* ① 显示设置 → **v72 起与「日历本管理」合并**:两行都落到 `calendar/calendars`
* (用 `#cal-books` 锚点区分落点,见下)
* ② 日历本管理 → `calendar/calendars`(显隐 + 改名/换色/共享/导入,全在一页)
* ③ 订阅管理 → `calendar/calendars#caldav`(只读订阅进来的外部日历)
* ④ DAV 口令 → `settings/me#dav`(日历 + 通讯录共用那一把)
*
* 🔴 v72(用户 2026-10-21):「日历设置里面日历本显示和日历管理可以放在一起啊。
* 就是把日历本全都列出来,然后显示不显示,加个复选框就行了。」
* ⇒ ① 与 ② **现在是同一页**。但**四行都留着**,原因:
* · 用户 2026-10-15 第 6 条明确点名"下拉就是这四行",少一行他会以为功能没了;
* · 两行落到同一页、用锚点定位到各自那一段 —— 点"显示设置"落在清单、
* 点"日历本管理"也落在清单,但**用户想找的东西就在那儿**,不用再跳。
* ⚠️ 千万别因为"合并了"就把菜单砍成三行:那是**把用户的入口拿走**,
* 而他这次要的是"放一起",不是"少一个入口"。
*
* 用法(require 前 set 好):
* $setCurrent 当前页 key('view'|'books'|'dav')用来高亮;
* '' 也行(比如从旅程/观影页挂过来时没有当前项)
*/
$setCurrent = (string)($setCurrent ?? '');
$setOn = static function (string $key) use ($setCurrent): string {
return $setCurrent === $key ? ' class="on"' : '';
};
$setIcon = static function (string $name): string {
$paths = [
'view' => '<rect x="2" y="3.2" width="12" height="10.4" rx="1.6"/><path d="M2 6.4h12M5.4 1.6v3.2M10.6 1.6v3.2"/>',
'books' => '<path d="M2.6 3.2h4v9.6h-4zM9.4 3.2h4v9.6h-4z"/>',
'sub' => '<path d="M8 2.4v11.2M2.4 8h11.2" />',
'dav' => '<circle cx="8" cy="8" r="5.6"/><path d="M2.4 8h11.2M8 2.4c1.8 2 2.6 3.7 2.6 5.6S9.8 12 8 13.6C6.2 11.6 5.4 9.9 5.4 8S6.2 4.4 8 2.4z"/>',
];
$d = $paths[$name] ?? '';
if ($d === '') {
return '';
}
return '<svg class="mi" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"'
. ' fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"'
. ' stroke-linejoin="round">' . $d . '</svg>';
};
?>
<details class="movie-set menu cal-set">
<summary class="btn btn-icon" title="日程设置" aria-label="日程设置"><svg viewBox="0 0 16 16" width="18" height="18" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M2.5 4.5h11M2.5 8h11M2.5 11.5h11"/></svg></summary>
<div class="menu-list cal-set-list">
<?php /* ⚠️ 这里**只放列表**(不做任何表单)—— 见文件头那段「为什么必须这么改」。
表单全在各自的目标页上;下拉绝不随"日历本数量"变长。 */ ?>
<a href="<?= e(url('calendar/calendars')) ?>#cal-books"<?= $setOn('view') ?>><?= $setIcon('view') ?><span>显示设置</span></a>
<a href="<?= e(url('calendar/calendars')) ?>"<?= $setOn('books') ?>><?= $setIcon('books') ?><span>日历本管理</span></a>
<a href="<?= e(url('calendar/calendars')) ?>#caldav"<?= $setOn('sub') ?>><?= $setIcon('sub') ?><span>订阅管理</span></a>
<?php /* v24 第 22 批:口令改成通用 DAV 口令(日历 + 通讯录共用)。落到能**生成口令**的
那一页(个人设置 → DAV 同步),而不是只显示地址的日历本页。 */ ?>
<a href="<?= e(url('settings/me', [], 'dav')) ?>"<?= $setOn('dav') ?>><?= $setIcon('dav') ?><span>DAV 口令</span></a>
</div>
</details>
<?php
unset($setCurrent, $setOn, $setIcon);