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:
@@ -83,6 +83,14 @@
|
||||
|
||||
function init(root) {
|
||||
var id = root.getAttribute('data-pp') || '';
|
||||
/* 🔴 v43:**幂等闸门**。组件现在可能在"动态插入"之后被重复 init
|
||||
(见文件末尾 `window.fbInitPickers`)。没有这道闸门会挂上第二套监听:
|
||||
· 打开弹框被处理两次、暂存区 chip 加两次;
|
||||
· `change` 里来回切选中态。
|
||||
⚠️ 事件委托本来就是"一次绑定、永久有效",重复调用只需要它**什么也不做**。
|
||||
⚠️ 标记放在**取到必需元素之后**打 —— 否则"结构不全时提前 return"会把
|
||||
这个组件永久标记成"已初始化",之后再补它也没用了。 */
|
||||
if (root.getAttribute('data-pp-init') === '1') { return; }
|
||||
var isMulti = root.getAttribute('data-pp-mode') !== 'single';
|
||||
var modal = root.querySelector('.pp-modal');
|
||||
var openBtn = root.querySelector('.pp-open');
|
||||
@@ -92,6 +100,8 @@
|
||||
var chips = root.querySelector('.pp-chips');
|
||||
var emptyTip = root.querySelector('.pp-empty');
|
||||
if (!modal || !list || !chips) { return; }
|
||||
/* 🔴 v43:必需元素取齐了才打"已初始化"标记(见上面幂等闸门的说明)。 */
|
||||
root.setAttribute('data-pp-init', '1');
|
||||
|
||||
// ---- 第 19 批 用户第 8 条:多选弹框隐藏每行前面的复选框 ----
|
||||
// 用户原话:「弹框选择人员那里,暂存区太小了…前面的复选框就没用了吧,去掉吧。」
|
||||
@@ -715,6 +725,30 @@
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.pp'), init);
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔴🔴 v43(用户 2026-10-11 第 4 条):「在旅程功能里面,编辑一个行程的时候,
|
||||
* 现在"参与的人"添加参与人的那个功能已经不好使了,弹不出选人的框了。」
|
||||
*
|
||||
* 真根因:本组件的绑定只跑一次 —— 脚本加载时 `boot()` 扫描当时的 `.pp`。
|
||||
* 而**详情页的行程弹框**是 AJAX 取片段、`innerHTML` 塞进 DOM 的
|
||||
* ⇒ 那一刻才出现的 `.pp` **从来没被 init 过**
|
||||
* ⇒「+ 添加参与的人」按钮上没有任何 click 监听 ⇒ 点了没反应(弹不出弹框)。
|
||||
* (同一个根因也解释了"暂存区/确定/取消"全都按不动。)
|
||||
*
|
||||
* ⇒ 对外暴露 `window.fbInitPickers(scope)`:任何"动态插入含 `.pp` 的 HTML"之后
|
||||
* 调它一次即可。`init()` 内部有 `data-pp-init` 幂等标记,重复调用安全。
|
||||
*
|
||||
* ⚠️ 本脚本是**按需加载**的(layout.php 里页面上有 `.pp` 才拉),而弹框里的 `.pp`
|
||||
* 是后来才出现的 ⇒ 加载判据可能在脚本拉起时还没看到它。所以宿主调这个钩子时,
|
||||
* 要容忍"函数还不存在"(那时从 `.pp` 到脚本的按需加载链还没走完);
|
||||
* 见 trips/show.php 里那段"等它就绪"的处理。
|
||||
*/
|
||||
window.fbInitPickers = function (scope) {
|
||||
var root = scope || document;
|
||||
Array.prototype.forEach.call(root.querySelectorAll('.pp'), init);
|
||||
return true;
|
||||
};
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', boot);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user