v43 第 43 批:六条反馈(界面 5 + 条目详情浮层)
用户 2026-10-11 反馈六条,逐条定位真根因后修复: ① 纪念日「日期」多出一个控件 —— 只保留最新的那个 两层根因:(a)原生 `input[type=date]` 当初没包在 `.dt-native` 里, v42 那条"AntD 挂上后收起原生框"的选择器根本不命中;(b)更要命的是 `.dt-native` 基类写着 `display: contents` —— 该元素**没有盒子**, 给它 position/width 完全无效 ⇒ 必须把 display 显式改回 block 才收得起来。 ② 编辑纪念日把底层列表页弄没 —— 「修改」原来是整页跳 `days/edit` (套 layout = 一张只有弹框的空白页)。改为 `?embed=1` 只吐弹框那一块, 列表页 JS 取回来替换 `#anNewCard` 并打开 —— 与「新建」同一观感。 内嵌形态标 `$anModalOnly` 以免打 standalone 标记(关闭时不再跳页)。 ③ 拖图裁剪的层被弹框盖住 —— `.crop-overlay` 是 z-index:100 而 `.cal-modal` 是 200 ⇒ 裁剪层被整块盖住。提到 260(与 v41 的 .cn-modal 同一处理)。 ④ 行程弹框里"参与的人"弹不出选人框 —— person_picker.js 只绑定一次, 而弹框表单是 AJAX 片段 ⇒ 里面的 `.pp` 从未被 init。三件事一起: 暴露 `window.fbInitPickers()`(幂等)+ layout 暴露 `window.fbLoadPicker()` (脚本是按需加载的)+ 塞完片段后补调初始化。 ⑤ 日程新建排版/控件/文案 —— 改走观影式 `.mv-grid`(标签对齐 + 冒号); 起止补上 `$dtPlugin='antd'`(试点正式推广到日程);标签「时间范围」→「开始 / 结束」; 删三句提示(结束留空 / 多选提醒 / 全天)。 ⑥ 条目详情浮层(首页日程 / 首页近期任务 / 日程页条目)—— 点条目不再直接跳页,弹浮层显示详情;「详细信息」跳该来源详情页; 「编辑」就地换成该来源的编辑表单(四处 `?embed=1` 片段)。 新增 `templates/_entry_popup.php` + `assets/js/entry_popup.js` + `fb_entry_json()`(三个入口共用一个编码函数)。 验证:php -l 157 文件全过;div 深度 33 组合全配平;片段体检 20 片段无越界; 本地 e2e 1510/0;v43 真机 33/0;v43 反向验证 8/0;v38 36/0;v42 33/0; b31/b32 反向验证 8/0 与 5/0;部署断言本地空跑 RC=0;完整流水线 PUSH_RC=0。
This commit is contained in:
+40
-6
@@ -207,7 +207,19 @@ $isLoggedIn = \App\Auth::check();
|
||||
<button type="button" class="pv-nav pv-next" aria-label="下一张" hidden>›</button>
|
||||
</div>
|
||||
|
||||
<?php /* 🔴 v43(用户 2026-10-11 第 6 条):**条目详情浮层**(全站一份)。
|
||||
首页的日程 / 首页的近期任务 / 日程页的条目 —— 点它们不再直接跳页,
|
||||
而是弹这一个浮层(详情 + 「详细信息」跳转 + 「编辑」就地换编辑表单)。
|
||||
⚠️ 空壳放这里(不放各页面):「三处入口都在不同页面」,
|
||||
放页面里迟早有一个忘了 include —— 那种"某些页面点了没反应"最难查。
|
||||
⚠️ 内容全是 JS 按点击项的 `data-fb-entry` 现填,同一页一百条也只有一个浮层。 */
|
||||
require __DIR__ . '/_entry_popup.php'; ?>
|
||||
|
||||
<script src="<?= e(asset('/assets/js/app.js')) ?>"></script>
|
||||
<?php /* 🔴 v43:条目详情浮层的脚本。**全站加载** ——
|
||||
三处入口分散在首页/日程页,按需加载的判据会在这些页面之间来回漏;
|
||||
它只有几 KB,不值得为省这点流量赌"某个页面漏加载"。 */ ?>
|
||||
<script src="<?= e(asset('/assets/js/entry_popup.js')) ?>" defer></script>
|
||||
<?php /* 🔴 v32 第 3 条:浏览器通知(站内消息 + 日程到期提醒)。
|
||||
⚠️ **只在已登录时加载** —— 登录页轮询会一直 302 去登录页,白跑。
|
||||
同理也不在"免登录的导航展示页"上跑(那页没有会话)。
|
||||
@@ -230,14 +242,36 @@ window.FB_NOTIFY = {
|
||||
**不是**含糊地找 "pp" 这两个字母(页面里 `pp` 太容易撞:分页、其它类名…)。
|
||||
⚠️ DOM 必须已经解析到组件才判断 → 脚本放在 `</body>` 前(本文件本来就是),
|
||||
所以这里能直接查;不需要 DOMContentLoaded 包一层。
|
||||
⚠️ 无 JS 兜底不受影响:组件的 `<noscript>` 块本来就是给"脚本没跑"准备的。 */ ?>
|
||||
⚠️ 无 JS 兜底不受影响:组件的 `<noscript>` 块本来就是给"脚本没跑"准备的。
|
||||
|
||||
🔴🔴 v43(用户 2026-10-11 第 4 条):**上面那条"页面加载时扫一次"的判据不够了**。
|
||||
行程详情页的编辑弹框是 AJAX 取片段、后来才把 `.pp` 塞进 DOM 的 ——
|
||||
脚本那一刻**根本没被加载过**,之后也没人去补 ⇒ 选人按钮永远点不动
|
||||
(「编辑一个行程的时候,参与的人…弹不出选人的框了」)。
|
||||
⇒ 额外暴露一个 `window.fbLoadPicker()`:任何"动态插入含 `.pp` 的 HTML"之后
|
||||
调它一次,脚本会被**按需拉起**(幂等:第二次调用直接返回同一个 Promise)。
|
||||
配套的是 person_picker.js 里的 `window.fbInitPickers(scope)`(真正去绑定)。 */ ?>
|
||||
<script>
|
||||
(function () {
|
||||
if (!document.querySelector('.pp[data-pp]')) { return; }
|
||||
var s = document.createElement('script');
|
||||
s.src = <?= json_encode(asset('/assets/js/person_picker.js')) ?>;
|
||||
s.defer = true;
|
||||
document.head.appendChild(s);
|
||||
var url = <?= json_encode(asset('/assets/js/person_picker.js')) ?>;
|
||||
var loading = null;
|
||||
function load() {
|
||||
if (window.fbInitPickers) { return Promise.resolve(true); }
|
||||
if (loading) { return loading; }
|
||||
loading = new Promise(function (res) {
|
||||
var s = document.createElement('script');
|
||||
s.src = url;
|
||||
s.defer = true;
|
||||
s.onload = function () { res(true); };
|
||||
s.onerror = function () { loading = null; res(false); };
|
||||
document.head.appendChild(s);
|
||||
});
|
||||
return loading;
|
||||
}
|
||||
// 供动态内容(AJAX 片段)按需拉起
|
||||
window.fbLoadPicker = load;
|
||||
// 首屏就有的(绝大多数页面):立刻拉
|
||||
if (document.querySelector('.pp[data-pp]')) { load(); }
|
||||
})();
|
||||
</script>
|
||||
<?php /* v27:笔记的分块编辑器同样**按需加载**(页面上真有 `#noteForm` 才拉)。
|
||||
|
||||
Reference in New Issue
Block a user