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:
+18
-3
@@ -127,9 +127,24 @@ $backUrl = url('days');
|
||||
<div class="mv-row">
|
||||
<span class="mv-lb">日期<i>*</i></span>
|
||||
<div class="dt-input dt-antd-single" data-antd-date="1" id="an-date-wrap">
|
||||
<input type="date" class="dt-date" id="an-date" name="an_date"
|
||||
value="<?= e(sprintf('%04d-%02d-%02d', (int)$v('year', (int)date('Y')), (int)$v('month', 1), (int)$v('day', 1))) ?>"
|
||||
aria-label="日期">
|
||||
<?php /* 🔴🔴 v43(用户 2026-10-11 第 1 条):「日期那里多了一个控件,
|
||||
只保留我们最新的控件就行,之前那种控件删除。」
|
||||
|
||||
真根因:v42 加的那条 CSS 藏原生框的规则写的是
|
||||
`.dt-input.is-antd > .dt-native { …clip… }`
|
||||
—— 它认的是 `.dt-native` 这一层包装。而这里当初**没包这一层**,
|
||||
原生 `<input type="date">` 是 `.dt-input` 的**直接子元素**
|
||||
⇒ 选择器不命中 ⇒ AntD 挂上后,**原生日期框与 AntD 控件并排都在**
|
||||
(用户看到的"多了一个控件")。
|
||||
|
||||
⇒ 修法:补上 `.dt-native` 包装(与 `_datetime.php` 的结构一致),
|
||||
那条 CSS 立刻生效。顺带把原生框**视觉收起**(值载体留着),
|
||||
并在下面补一条**兜底 CSS**(万一哪天结构又变,直接子元素也能收)。 */ ?>
|
||||
<span class="dt-native">
|
||||
<input type="date" class="dt-date" id="an-date" name="an_date"
|
||||
value="<?= e(sprintf('%04d-%02d-%02d', (int)$v('year', (int)date('Y')), (int)$v('month', 1), (int)$v('day', 1))) ?>"
|
||||
aria-label="日期">
|
||||
</span>
|
||||
<input type="hidden" id="an-month" name="month" value="<?= (int)$v('month', 1) ?>">
|
||||
<input type="hidden" id="an-day" name="day" value="<?= (int)$v('day', 1) ?>">
|
||||
</div>
|
||||
|
||||
@@ -98,7 +98,17 @@ $renderTable = function (array $rows, bool $editable) use ($canWrite, $kindBadge
|
||||
→ 改 = `.btn`(主按钮的**蓝**),删 = `.btn-warn`(**黄**实心)。
|
||||
⚠️ 原来用的是 `.link-quiet`(纯文字链接)+ `.btn-ghost`(白底描边),
|
||||
两者都"看不出来是什么动作",与观影/旅程行上那套不一致。 */ ?>
|
||||
<a class="btn btn-sm" href="<?= e(url('days/edit', ['id' => (int)$r['id']])) ?>">修改</a>
|
||||
<?php /* 🔴 v43(用户 2026-10-11 第 2 条):「点击"修改纪念日",
|
||||
怎么好像原来的页面全没了?就是下面那一层页面没了,
|
||||
这好像不太合理吧?」
|
||||
⇒ 「修改」不再整页跳 `days/edit`,改成**在列表页之上开同一个弹框**
|
||||
(与「新建」完全一致的观感)。
|
||||
⚠️ 保留 `data-href` + `href`:JS 没跑时它仍是可直达的链接
|
||||
(无 JS 兜底,行为等同旧版整页编辑)。 */
|
||||
?>
|
||||
<a class="btn btn-sm" data-an-edit
|
||||
data-href="<?= e(url('days/edit', ['id' => (int)$r['id'], 'embed' => 1])) ?>"
|
||||
href="<?= e(url('days/edit', ['id' => (int)$r['id']])) ?>">修改</a>
|
||||
<form method="post" action="<?= e(url('days/destroy')) ?>" class="res-inline">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="id" value="<?= (int)$r['id'] ?>">
|
||||
@@ -169,10 +179,54 @@ $renderTable = function (array $rows, bool $editable) use ($canWrite, $kindBadge
|
||||
if (t) { t.focus(); }
|
||||
}
|
||||
}
|
||||
/* 🔴 v43(用户 2026-10-11 第 2 条):编辑也走这个弹框。
|
||||
把 `?embed=1` 吐回来的那块(**含弹框壳**)替换掉当前 `#anNewCard`,
|
||||
于是"编辑"与"新建"在视觉与交互上是同一个弹框,底层列表页不动。
|
||||
⚠️ 替换后必须**重跑片段自带的内联脚本** —— `innerHTML` 不执行脚本
|
||||
(v42 踩过的坑,`<script>` 既不执行也连标签都不保留)。
|
||||
那两段(关闭自身 / 日期拆分)都要重跑;它们各自有幂等判断,
|
||||
重跑不会重复绑定。 */
|
||||
function runInlineScripts(container, html) {
|
||||
var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gi, m, code = '';
|
||||
while ((m = re.exec(html)) !== null) {
|
||||
if (!/\bsrc\s*=/i.test(m[0].split('>')[0])) { code += m[1] + '\n;\n'; }
|
||||
}
|
||||
if (!code) { return; }
|
||||
var s = document.createElement('script');
|
||||
s.textContent = code;
|
||||
(container || document.body).appendChild(s);
|
||||
s.parentNode.removeChild(s);
|
||||
}
|
||||
function loadEdit(url) {
|
||||
var c = card();
|
||||
if (!c || !window.fetch) { if (url) { window.location.href = url; } return; }
|
||||
c.hidden = false; // 先打开(显示"载入中"占位)
|
||||
var lb = c.querySelector('#anNewCardTitle, .cal-modal-head b');
|
||||
if (lb) { lb.textContent = '编辑纪念日'; }
|
||||
fetch(url, { credentials: 'same-origin',
|
||||
headers: { 'X-Requested-With': 'XMLHttpRequest' } })
|
||||
.then(function (r) { return r.text(); })
|
||||
.then(function (html) {
|
||||
var tmp = document.createElement('div');
|
||||
tmp.innerHTML = html;
|
||||
var fresh = tmp.querySelector('#anNewCard');
|
||||
if (!fresh) { window.location.href = url.replace(/[?&]embed=1/, ''); return; }
|
||||
c.parentNode.replaceChild(fresh, c);
|
||||
runInlineScripts(fresh, html);
|
||||
setOpen(true);
|
||||
})
|
||||
.catch(function () { window.location.href = url.replace(/[?&]embed=1/, ''); });
|
||||
}
|
||||
document.addEventListener('click', function (e) {
|
||||
var t = e.target;
|
||||
if (!t || !t.closest) { return; }
|
||||
if (t.closest('#anNewBtn')) { e.preventDefault(); setOpen(true); return; }
|
||||
var ed = t.closest('[data-an-edit]');
|
||||
if (ed) {
|
||||
e.preventDefault();
|
||||
loadEdit(ed.getAttribute('data-href') || '');
|
||||
return;
|
||||
}
|
||||
if (t.closest('#anNewX') || t.closest('#anNewCancel')) { setOpen(false); return; }
|
||||
var c = card();
|
||||
if (c && t === c) { setOpen(false); }
|
||||
|
||||
Reference in New Issue
Block a user