Files
FamilyBook/templates/_entry_popup.php
T
laoyang f1b09a2f41 v93: 首页日历本下拉能拉了 / 日程浮层只留编辑删除 / 重复日程三档 / Markdown 标题四级阶梯补齐
用户两条:
① 「新建日程,日历本是拉不下来的,是空的,好像只有一个"工作"什么的」
② 「点日程后的详情跟原来的弹框几乎一模一样,这个详情就没有意义了」
   ⇒ 只显示「编辑」「删除」;重复日程的删除/编辑要有三档
   (当前 / 从现在到以后 / 全部)

【① 根因】`_add_modal.php` 被日程页与首页共用,HTML 一样,但自绘下拉的整套 JS
只内联在 `templates/calendar/index.php` 底部 ⇒ 首页那份没有交互,点了菜单不展开;
而按钮上是服务端渲染的默认本("工作"),所以看着"只有一个工作"。
修法:抽 `assets/js/cs_picker.js`(全站 defer、按 `[data-cs-picker]` 初始化、
`data-cs-ready` 幂等)。不扫所有 `.cs` —— 观影表单的影院下拉有自己的内联绑定,
两边都绑会"点一次开两次"。

【②】浮层自定义日程不再显示「详情」(派生条目仍只有真链接「详情」);
删除/编辑三档措辞按用户原话;`occ` 为空时只给「删除全部」,绝不让空串触发整条删除。
编辑三档的入口在 `fb_entry_json()` 把 `occ` 拼进 edit 地址(`?d=`)——
不带就只有"修改全部"一档。

【顺带修掉 v85 没做完的一半】全量套件在 v61 A9b 报红,查下去不是本轮改坏的:
CSS 只把 `##`(h4)调到 17px,`###`(h5)留在 15.5px(正文 15px,只差 0.5px)、
`####`(h6)留在 14.5px(比正文还小),而那段注释自己写的就是"三级都要调大"。
阶梯重排 h3/h4/h5/h6 = 22/20/18/17,四级两两不同号。
更值得记的是四条判据全部只盯 h4(v61 A9b、v85 B2/B2b 前身、静态断言、线上 A4),
而 h4 恰好是唯一修好的那一级 ⇒ 各加"每一级/最矮的一级"判据,并用
「只把 h6 打回 14.5px ⇒ A9b 仍绿、只有 A9b2 变红」证明新判据有独立价值。

【工具链】`_b61_falsify.py` 的 main_all 改成每个 case 起独立子进程 ——
原先同一进程连跑 10 遍探针,Playwright 的临时 profile 建/删会在同一轮里累计,
撞沙箱批量删除钩子被 SIGTERM(症状:输出戛然而止、退出码 1、一条 FAIL 都没有)。

验证:v93 正向 28/0 · v93 反向 3 处注入各自被抓 · v61 34/0 · v61 反向 9/9 ·
v85 md_heading 12/0 · v85 静态反向 8/0 · 全量流水线通过并已部署。
2026-10-25 14:52:43 +08:00

81 lines
5.9 KiB
PHP
Raw 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
/**
* 条目详情浮层 —— **空壳**(全站一份,挂在 layout.php)。
*
* 起源 v43(用户 2026-10-11 第 6 条):「首页上的日程、首页上的近期任务,以及日程里面的
* 日程,点击它们的时候,都会弹出一个框显示更详细的信息。上面有不同的功能按钮…」
*
* 🔴🔴 v49(用户 2026-10-14)——**底栏按「来源」分两种形态**,用户原话:
* 「在首页上点击某一个日程…下面三个按钮,都放在下面的右侧…三个按钮分别是详情、编辑和删除。
* 详细用蓝色,编辑用黄色,删除用红色。
* 当点击详细的时候,**如果这是一个日程**(正常的日程里的事件、不是来自观影/旅程等其他模块)
* → 就**在当前页面让模态框变大**、显示更多信息。
* 当点击编辑的时候,也是**在当前的界面**弹出编辑日程的框,就地编辑;
* 编辑了之后下面有两个按钮:**取消和保存**。
* 当点击删除的时候,就直接把这个日程给删除。
* 如果当前这个日程**来自其他模块**(观影 / 旅程 / 其它)→ 点击详情就**进入那些模块**展示它
* (观影→那一天的观影详情页;旅程→那个行程所在的旅程页)。
* **这种情况下,下面就没有编辑、也没有删除,就只有一个详情。**」
*
* ⇒ 底栏的状态(由 JS 切,见 assets/js/entry_popup.js):
* ① **详情态**(点条目进来):
* · 自定义日程(source='event'):`编辑`(黄) + `删除`(红)
* · 派生条目(观影/旅程/任务/纪念日/农历/节假日):只有 `详情`(蓝) 一颗
* —— 按钮一律**靠右**(用户:"都放在下面的右侧")。
* ② **展开态**(`?embed=detail` 的只读块):v93 起**没有入口**了(函数保留兜底)。
* ③ **编辑态**:正文换成编辑表单;底栏 = `取消` + `保存`。
* 删除范围(重复日程)另有一种临时态,见 JS。
*
* 🔴🔴 v93(用户 2026-10-25)——**用户原话**:
* 「如果点击日程,首页上点击一个日程后会有一个详情。点完之后还是一个弹出框,
* 这个弹出框跟原来的弹出框几乎一模一样。这样的话,这个详情就没有意义了,
* 所以弹出来就只显示两个按钮吧:一个『编辑』,一个『删除』。
* 要注意,删除的时候需要有几个选项:删除当前;删除从现在到以后;删除全部。
* 编辑重复日历时,也会有这三个选项。」
* ⇒ **自定义日程不再有「详情」那颗蓝按钮**:浮层正文本来就是它的全部信息,
* 再点一次只是把同一份信息换个更宽的框再画一遍。
* ⚠️ 派生条目的「详情」**必须保留**(v49 用户明确要求:"就只有一个详情")。
* ⚠️ 那颗按钮的显隐**全由 JS 按来源决定**,服务端只给数据(这里一律 `hidden`,
* 避免"先闪一下三颗、随即收起一颗")。
*
* ⚠️ 空壳放在 **layout.php** 里(全站一份):三处入口在不同页面,
* 放各页面迟早有一个忘了 include —— 那种"某些页面点了没反应"最难查。
* ⚠️ 面板里**不放任何服务端内容**(除了那颗 CSRF):同一页一百条日程也只有一个浮层,开销可忽略。
* ⚠️ 按钮的**显隐全部由 JS 按 `data-fb-entry` 的内容决定**,服务端只给数据:
* 空壳里全部 `hidden`,避免"先闪一下三颗、随即收起一颗"。
*/
?>
<div class="fb-entry-modal" id="fbEntryModal" role="dialog" aria-modal="true"
aria-label="条目详情" hidden>
<?php /* `_csrf` 放在遮罩层里(不放进正文)—— 删除是 AJAX POST,需要它;
而正文会被整块换掉(编辑态 = 服务端表单,里面自带 tokens),
放正文里会在换掉时丢。 */ ?>
<div class="fb-entry-csrf" hidden><?= csrf_field() ?></div>
<div class="cal-modal-panel fb-entry-panel" id="fbEntryPanel">
<div class="cal-modal-head">
<b id="fbEntryTitle">详情</b>
<button type="button" class="cal-modal-x" data-fb-entry-close aria-label="关闭">&#10005;</button>
</div>
<div class="cal-modal-body" id="fbEntryBody"></div>
<div class="cal-modal-foot" id="fbEntryFoot">
<span class="cal-modal-tip" id="fbEntryTip"></span>
<?php /* 右侧按钮组(`margin-left:auto` 把整组推到右边)。
⚠️ 自定义日程只看得到 `编辑` / `删除`;`详情` 那一颗现在**只给派生条目**
(观影/旅程/任务/纪念日…跳去各自模块),v93 用户原话:
"这个详情就没有意义了,所以弹出来就只显示两个按钮吧"。
⚠️ 三颗各自的作用域类(fb-a-detail/edit/del)给颜色,**不动全局 .btn-edit
/ .btn-danger** 的语义(本项目踩过"裸类改色波及别页"的坑,见 app.css)。 */ ?>
<div class="fb-entry-acts" id="fbEntryActs">
<a class="btn btn-sm fb-a-detail" id="fbEntryDetail" href="#" hidden>详情</a>
<button class="btn btn-sm fb-a-edit" type="button" id="fbEntryEdit" hidden>编辑</button>
<button class="btn btn-sm fb-a-del" type="button" id="fbEntryDelete" hidden>删除</button>
<?php /* 编辑态的两颗(默认藏着) */ ?>
<button class="btn btn-ghost btn-sm" type="button" id="fbEntryCancel" hidden>取消</button>
<button class="btn btn-sm" type="button" id="fbEntrySave" hidden>保存</button>
<?php /* 删除范围态(重复日程才有):取消 + 确认删除 */ ?>
<button class="btn btn-ghost btn-sm" type="button" id="fbEntryDelCancel" hidden>取消</button>
<button class="btn btn-sm fb-a-del" type="button" id="fbEntryDelGo" hidden>确认删除</button>
</div>
</div>
</div>
</div>