v29 第 29 批(9 条):日程定位/复选框提示/名册错乱三处真因修复 + 读书落盘 + 导航四设置 + 笔记阅读态与共享
前 4 条是"上批改了但用户仍报"的,这次先拿真机证据再动手,三处真因如下:
1. 首页没定位到红线 —— 真根因:定位脚本的 PHP 条件是
`if (!$todayEvents || empty($timed))`,**今天只有全天日程时整段脚本不渲染**
(实测 hasScript=False、scrollTop=0),而 .ag-grid(0–24h) 与红线都在。
有分时段日程时定位其实完全正确(偏差 0px)。已改成 `if (!$todayEvents)`。
2. 任务复选框提示还在 —— 真根因:`_task_check.php` 里那句无障碍文字
`<span class="visually-hidden">` 用的类名**在 app.css 里从来没有定义过**
(项目一直只用 .sr-only)→ 没有规则 = 普通 span = 直接可见。
已把两个类名合并到同一条规则(clip 隐藏,仍可读屏)。
3. 名册完全错乱 —— 真根因:v29 重写平铺列表时**漏了一个 `</div>`**(闭合 .person),
浏览器把下一张卡嵌进上一张里,实测 .person-main 只剩 24~151px(本该 ~800px)。
`php -l` 与全部静态断言都抓不到,只有真机量 DOM 才现形。已补上闭合。
另把 v28 引入的多列 grid 改回单列(它与 content-visibility 冲突)+窄屏动作区折行。
4. 读书慢 —— 按用户给的思路「做一个同步,然后落盘」:
新增 weread_snapshots 表 + App\WeReadCache(按人+数据集存 JSON);
渲染路径改走 notebooksCached()/readStatsCached()(永不联网);
同步从"渲染之前"挪到"**响应之后**"(queueBackgroundSync + fastcgi_finish_request)。
5. 导航设置改成右上角**下拉菜单 + 四视图**(addr/general/board/engine),
表单带 back 域 → 保存后回原来那一项。
🔴 顺带修掉一个真 bug:`if (!$inSettings && $canWrite)` 的 endif 漂到了文件末尾,
把 board/engine 两个视图也包进了"非设置态" → 打开时标题对、**内容是空的**。
6. 笔记列表缩略图:cover → contain + 固定高度(按比例完整显示,不裁切)。
7. 笔记段落编辑器:加 Markdown 工具条 + 斜线命令(行首打 /co → 回车补全代码块),
两者共用同一份命令表。
8. 笔记点进来默认**阅读态**(图文混排、附件在最下方、图片四档宽度、点「编辑」才可改);
清单块并入 Markdown —— 但**历史 list 块转写成 `- 项` 文本,老数据不丢**。
9. 笔记共享改成**逐人 + 权限**(note_shares,与 resource_shares 同构);
可见性收敛成全站唯一的 Note::VIS_COND;迁移用一次性哨兵。
This commit is contained in:
+106
-15
@@ -55,25 +55,89 @@ $sc = static fn($k, $d = '') => (string)($navSet[$k] ?? $d);
|
||||
用参数就能让"保存后回到设置页"(下面的表单里保留了 `set=1` 的隐藏域)。
|
||||
⚠️ 保留 `$editSite` 等编辑态:正在编辑某个站点/板块/引擎时,**强制显示设置视图**,
|
||||
否则用户点"编辑板块"会看到一个没有板块表单的页面(看起来像功能坏了)。 */
|
||||
$inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== null;
|
||||
/* 🔴🔴 v29 用户第 5 条:「导航的设置,做成设置按钮,点击后,拉下来设置选项,
|
||||
分别是地址设置、导航设置、板块设置、搜索引擎设置,把现在的设置页面,拆开,
|
||||
放在不同的设置选项下。」
|
||||
⇒ 从"一个大的设置页"改成**下拉菜单 + 四个独立视图**:
|
||||
· `?set=addr` 地址设置(展示页地址 + 短语)
|
||||
· `?set=general` 导航设置(标题/搜索引擎/布局等,原 SimpleNav 的 settings)
|
||||
· `?set=board` 板块设置
|
||||
· `?set=engine` 搜索引擎设置
|
||||
· 不带 `set` 默认:新增网址 + 网址列表
|
||||
⚠️ 为什么拆开(而不只是把四块堆在一个?"设置页"里):
|
||||
用户点的原话就是"拆开"。而且四块各自是**独立表单**,堆在一页里
|
||||
每次保存后 302 回来都要重新找自己在哪一块。分开之后
|
||||
"你在哪一块"由 URL 决定,保存后回到原地,位置感清楚。
|
||||
⚠️ 用**链接**(服务端渲染)而不是 JS 下拉切换内容:
|
||||
与 v28 的 `?set=1` 同一理由 —— 设置里有表单,保存会 302 回来,
|
||||
纯 JS 的展开状态在刷新后就丢了。`<details>` 只负责"菜单展开"这一个动效,
|
||||
点条目是**真实导航**(URL 变、视图变、刷新/回退都不丢)。
|
||||
⚠️ 编辑态(正在编辑某板块/某引擎)要落到对应的那个视图里,
|
||||
否则用户点"编辑板块"会看到一个没有板块表单的页面(看起来像功能坏了)。 */
|
||||
$setKey = (string)($_GET['set'] ?? '');
|
||||
if ($editGroup !== null) { $setKey = 'board'; }
|
||||
if ($editEngine !== null) { $setKey = 'engine'; }
|
||||
$inSettings = in_array($setKey, ['addr', 'general', 'board', 'engine'], true);
|
||||
|
||||
/* 设置项的登记表(菜单与"当前在哪一项"的标题都读它,只有一份) */
|
||||
$setItems = [
|
||||
'addr' => ['地址设置', 'M2.5 4h11M2.5 8h7M2.5 12h9'],
|
||||
'general' => ['导航设置', 'M8 5.5a2.5 2.5 0 100 5 2.5 2.5 0 000-5z M8 1.5v1.6M8 12.9v1.6M1.5 8h1.6M12.9 8h1.6M3.4 3.4l1.1 1.1M11.5 11.5l1.1 1.1M12.6 3.4l-1.1 1.1M4.5 11.5l-1.1 1.1'],
|
||||
'board' => ['板块设置', 'M2 3.5h4v4H2zM10 3.5h4v4h-4zM2 9.5h4v4H2zM10 9.5h4v4h-4z'],
|
||||
'engine' => ['搜索引擎设置', 'M7 2.5a4.5 4.5 0 100 9 4.5 4.5 0 000-9z M10.4 10.4L14 14'],
|
||||
];
|
||||
?>
|
||||
<div class="page-head">
|
||||
<h1>导航</h1>
|
||||
<span class="sub">你个人用的网址导航 · 每人一份</span>
|
||||
<div class="actions">
|
||||
<?php /* v28 用户第 11 条:右上角「设置」按钮,与其他模块的手指位置一致。
|
||||
⚠️ 它是个**链接**(服务端切换视图),不是 JS 开关 —— 理由见上面的注释。 */ ?>
|
||||
<h1><?= $inSettings ? e($setItems[$setKey][0]) : '导航' ?></h1>
|
||||
<span class="sub">
|
||||
<?php if ($inSettings): ?>
|
||||
<a class="btn btn-sm" href="<?= e(url('nav')) ?>">完成</a>
|
||||
<a href="<?= e(url('nav')) ?>">← 回到网址列表</a>
|
||||
<?php else: ?>
|
||||
<a class="btn btn-ghost btn-sm" href="<?= e(url('nav', ['set' => 1])) ?>">设置</a>
|
||||
你个人用的网址导航 · 每人一份
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
<div class="actions">
|
||||
<?php /* 🔴 v29 用户第 5 条:右上角「设置」点开是**下拉菜单**,四项分设。
|
||||
⚠️ 用项目已有的 `.movie-set.menu`(任务/观影模块同款):
|
||||
外观、点击外部收起、键盘可达全都是现成的,
|
||||
这里再手写一套 `<details>` 样式,迟早跟那边不一致。 */ ?>
|
||||
<details class="movie-set menu">
|
||||
<summary class="btn btn-ghost btn-sm" title="导航设置" aria-label="导航设置">
|
||||
设置
|
||||
<svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true" fill="none"
|
||||
stroke="currentColor" stroke-width="1.8" stroke-linecap="round"
|
||||
stroke-linejoin="round" style="margin-left:2px;vertical-align:-1px">
|
||||
<path d="M4 6.5l4 4 4-4"/>
|
||||
</svg>
|
||||
</summary>
|
||||
<div class="menu-list">
|
||||
<?php foreach ($setItems as $k => $it): ?>
|
||||
<a href="<?= e(url('nav', ['set' => $k])) ?>"<?= $setKey === $k ? ' class="on"' : '' ?>>
|
||||
<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">
|
||||
<path d="<?= e($it[1]) ?>"/>
|
||||
</svg>
|
||||
<span><?= e($it[0]) ?></span>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
<a href="<?= e(url('nav')) ?>">
|
||||
<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">
|
||||
<path d="M3 8l3.5 3.5L13 5"/>
|
||||
</svg>
|
||||
<span>我的网址</span>
|
||||
</a>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php /* 设置视图里的四块(展示地址 / 导航设置 / 板块 / 搜索引擎)。
|
||||
只在设置态渲染 —— 默认进来看到的是"添加网址 + 网址列表"(用户原话)。 */ ?>
|
||||
<?php if ($inSettings): ?><?php /* ==== 设置视图开始 ==== */ ?>
|
||||
<?php /* ==== 地址设置(?set=addr)==== */ ?>
|
||||
<?php if ($setKey === 'addr'): ?>
|
||||
|
||||
<?php /* ==================== ① 展示页地址与短语(用户第 4 条的"特殊地址")====================
|
||||
用户原话:「给他一个非常特殊的地址…地址后面可以跟着用户添加的一个短语,就跟类似
|
||||
@@ -117,17 +181,23 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
<form method="post" action="<?= e(url('nav/save')) ?>" class="inline-form"
|
||||
onsubmit="return confirm('换成一串随机短语?之前的地址会立刻失效。')">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="back" value="addr">
|
||||
<input type="hidden" name="act" value="phrase_random">
|
||||
<button class="btn btn-ghost btn-sm" type="submit">换一串随机的</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php endif; ?><?php /* ==== /地址设置 ==== */ ?>
|
||||
|
||||
<?php /* ==== 导航设置(?set=general)==== */ ?>
|
||||
<?php if ($setKey === 'general'): ?>
|
||||
<?php /* ==================== ② 设置(照搬 SimpleNav 的 settings)==================== */ ?>
|
||||
<div class="card card-pad">
|
||||
<h2 class="cinema-h2">导航设置</h2>
|
||||
<form method="post" action="<?= e(url('nav/save')) ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="back" value="general">
|
||||
<input type="hidden" name="act" value="settings_save">
|
||||
<div class="form-grid">
|
||||
<div class="field">
|
||||
@@ -196,10 +266,15 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php endif; ?><?php /* ==== 设置视图(前半:展示地址 + 导航设置)结束 ==== */ ?>
|
||||
<?php endif; ?><?php /* ==== /导航设置 ==== */ ?>
|
||||
|
||||
<?php /* ==================== ③ 站点:新增/编辑 ==================== */ ?>
|
||||
<?php if ($canWrite): ?>
|
||||
<?php /* ==================== ③ 站点:新增/编辑 ==================== */
|
||||
/* 🔴 v29 用户第 5 条:这两块(新增站点 + 站点列表)是**默认视图**的内容,
|
||||
设置视图(addr/general/board/engine)里不该出现 —— 用户原话是
|
||||
「进来之后,默认就是添加网址,和所有网址的列表」,反过来说
|
||||
进了设置就不该再看到"添加网址"。 */
|
||||
?>
|
||||
<?php if (!$inSettings && $canWrite): ?>
|
||||
<div class="card card-pad">
|
||||
<h2 class="cinema-h2"><?= $editSite ? '编辑站点' : '新增站点' ?></h2>
|
||||
<?php /* 🔴 v24 第 26 批 用户第 4 条:「输入 url 之后,如果其他用户添加了,
|
||||
@@ -276,6 +351,7 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
</div>
|
||||
|
||||
<?php /* ==================== ④ 站点列表(按板块分组,可拖拽排序)==================== */ ?>
|
||||
<?php if (!$inSettings): ?>
|
||||
<div class="card card-pad">
|
||||
<h2 class="cinema-h2">
|
||||
站点列表
|
||||
@@ -327,13 +403,24 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?><?php /* ④ 站点列表(仅默认视图) */ ?>
|
||||
<?php /* ⚠️ 这里必须补上 277 行那个 `if (!$inSettings && $canWrite)` 的收尾 ——
|
||||
它原本一路开到了文件末尾(607 行),把**板块设置 / 搜索引擎设置**两个视图
|
||||
也一起包进了"非设置态"里 → 打开 `?set=board` 时整段被跳过,
|
||||
页面标题显示"板块设置"、内容却是空的(本轮实测抓到的真 bug:
|
||||
`<!--DBG-->` 探针证明执行根本没走到 409 行)。
|
||||
⇒ 「非设置态才显示」只该管**站点编辑 + 站点列表**这两块(见 v29 第 5 条),
|
||||
设置类视图(addr/general/board/engine)各自独立、不受它管。 */ ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($inSettings): ?><?php /* ==== 设置视图(后半:板块 + 搜索引擎)重新开始 ==== */ ?>
|
||||
<?php /* ==== 板块设置(?set=board)==== */ ?>
|
||||
<?php if ($setKey === 'board'): ?>
|
||||
<?php /* ==================== ⑤ 板块 ==================== */ ?>
|
||||
<div class="card card-pad">
|
||||
<h2 class="cinema-h2"><?= $editGroup ? '编辑板块' : '新增板块' ?></h2>
|
||||
<form method="post" action="<?= e(url('nav/save')) ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="back" value="board">
|
||||
<input type="hidden" name="act" value="group_save">
|
||||
<?php if ($editGroup): ?>
|
||||
<input type="hidden" name="id" value="<?= (int)$editGroup['id'] ?>">
|
||||
@@ -390,11 +477,16 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<?php endif; ?><?php /* ==== /板块设置 ==== */ ?>
|
||||
|
||||
<?php /* ==== 搜索引擎设置(?set=engine)==== */ ?>
|
||||
<?php if ($setKey === 'engine'): ?>
|
||||
<?php /* ==================== ⑥ 搜索引擎 ==================== */ ?>
|
||||
<div class="card card-pad">
|
||||
<h2 class="cinema-h2"><?= $editEngine ? '编辑搜索引擎' : '新增搜索引擎' ?></h2>
|
||||
<form method="post" action="<?= e(url('nav/save')) ?>">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="back" value="engine">
|
||||
<input type="hidden" name="act" value="engine_save">
|
||||
<?php if ($editEngine): ?>
|
||||
<input type="hidden" name="id" value="<?= (int)$editEngine['id'] ?>">
|
||||
@@ -519,8 +611,7 @@ $inSettings = !empty($_GET['set']) || $editGroup !== null || $editEngine !== nul
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?><?php /* ==== 设置视图(后半:板块 + 搜索引擎)结束 ==== */ ?>
|
||||
<?php endif; ?><?php /* ==== /搜索引擎设置 ==== */ ?>
|
||||
|
||||
<script>
|
||||
/* 导航管理页的交互(v24 第 24 批)。
|
||||
|
||||
Reference in New Issue
Block a user