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:
@@ -570,6 +570,34 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
s.parentNode.removeChild(s); // 执行完就摘掉,别留在 DOM 里
|
||||
}
|
||||
|
||||
/* 🔴🔴 v43(用户 2026-10-11 第 4 条):「编辑一个行程的时候,"参与的人"
|
||||
添加参与人的那个功能已经不好使了,弹不出选人的框了。」
|
||||
|
||||
真根因:选人组件(`person_picker.js`)的绑定**只跑一次**(脚本加载时扫一遍 `.pp`)。
|
||||
而这一段表单是 AJAX 取回来、`innerHTML` 塞进 DOM 的 ⇒ 它里面的 `.pp`
|
||||
**从来没被 init 过** ⇒「+ 添加参与的人」按钮上没有任何 click 监听
|
||||
⇒ 点了没反应(弹框弹不出来)。暂存区/确定/取消同理全按不动。
|
||||
|
||||
⇒ 塞完片段后补调 `window.fbInitPickers(scope)`(person_picker.js 暴露,
|
||||
内部幂等)。⚠️ 该脚本是**按需加载**的(layout.php:页面上有 `.pp` 才拉),
|
||||
而弹框里的 `.pp` 是后来才出现的 —— 脚本此刻可能还没加载完。
|
||||
所以做"等它就绪":轮询若干次,出现即调;始终不来也无害(下次打开再试)。
|
||||
⚠️ 只重试有限次(约 3 秒),不做无限轮询。 */
|
||||
function initPickersWhenReady(scope, tries) {
|
||||
tries = (tries === undefined) ? 25 : tries;
|
||||
/* 先确保脚本被拉起(详情页首屏没有 `.pp`,layout 那条"首屏就拉"的判据不会触发它)。
|
||||
`fbLoadPicker` 是幂等的,重复调用只是拿到同一个 Promise。 */
|
||||
if (!window.fbInitPickers && typeof window.fbLoadPicker === 'function') {
|
||||
try { window.fbLoadPicker(); } catch (e) { /* 忽略 */ }
|
||||
}
|
||||
if (typeof window.fbInitPickers === 'function') {
|
||||
try { window.fbInitPickers(scope); } catch (e) { /* 不阻塞表单其它初始化 */ }
|
||||
return;
|
||||
}
|
||||
if (tries <= 0) { return; }
|
||||
setTimeout(function () { initPickersWhenReady(scope, tries - 1); }, 150);
|
||||
}
|
||||
|
||||
function loadInto(url, title) {
|
||||
if (titleEl()) { titleEl().textContent = title || '行程'; }
|
||||
if (body()) { body().innerHTML = '<p class="empty-hint">正在载入…</p>'; }
|
||||
@@ -582,10 +610,21 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
body().innerHTML = html;
|
||||
/* ① 先执行片段自带的内联脚本(它会定义/调用自己的初始化) */
|
||||
runInlineScripts(body(), html);
|
||||
/* ② 再补跑宿主这侧的通用升级(日期/antd/行程表单),按依赖顺序 */
|
||||
/* ② 再补跑宿主这侧的通用升级(日期/antd/行程表单/选人组件),按依赖顺序 */
|
||||
if (window.fbUpgradeRange) { window.fbUpgradeRange(); }
|
||||
if (window.fbBootAntd) { window.fbBootAntd(); }
|
||||
if (window.fbNodeForm) { window.fbNodeForm(body()); }
|
||||
/* 🔴🔴 v43(用户 2026-10-11 第 4 条):「编辑一个行程的时候,"参与的人"
|
||||
添加参与人的那个功能已经不好使了,弹不出选人的框了。」
|
||||
|
||||
真根因:选人组件(`person_picker.js`)的绑定**只跑一次**(脚本加载时扫一遍
|
||||
`.pp`)。而这一段表单是 AJAX 取回来、`innerHTML` 塞进 DOM 的 ⇒
|
||||
它里面的 `.pp` **从来没被 init 过** ⇒「+ 添加参与的人」按钮上没有 click
|
||||
监听 ⇒ 点了没反应。⇒ 这里塞完片段**补调一次**初始化。
|
||||
⚠️ 该脚本是**按需加载**的(layout.php:页面上有 `.pp` 才拉),而弹框里的
|
||||
`.pp` 是后来才出现的 —— 脚本可能还没加载完(或都还没开始加载)。
|
||||
所以这里做"等它就绪":轮询若干次,出现即调;全程没出现也无害。 */
|
||||
initPickersWhenReady(body());
|
||||
var f = document.getElementById('nf-title');
|
||||
if (f) { f.focus(); }
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user