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:
@@ -2626,13 +2626,24 @@ switch ($r) {
|
||||
flash('err', '找不到这条观影记录。');
|
||||
redirect('movies');
|
||||
}
|
||||
View::render('movies/form', [
|
||||
'title' => '编辑观影记录',
|
||||
/* 🔴 v43(用户 2026-10-11 第 6 条):条目详情浮层里点「编辑」时,
|
||||
要把它**就地**换成这张编辑表单 —— `?embed=1` 只吐弹框那一块
|
||||
(不套 layout),由浮层塞进正文。与 `trips/edit` 同一套约定。
|
||||
⚠️ 详情页那一路(`movies/show` 内嵌 `$mvModalOnly+$mvModalForce`)
|
||||
继续走原样,不受影响。 */
|
||||
$mvArgs = [
|
||||
'm' => $m,
|
||||
'people' => Person::roster($familyId, (int)Auth::personId(), 'member', ''),
|
||||
'cinemas' => Cinema::all($familyId),
|
||||
'errors' => [],
|
||||
], 'movies');
|
||||
];
|
||||
if ((string)($_GET['embed'] ?? '') === '1') {
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo View::renderPartial('movies/form',
|
||||
$mvArgs + ['mvModalOnly' => true, 'mvModalForce' => true, 'mvOpen' => true]);
|
||||
exit;
|
||||
}
|
||||
View::render('movies/form', ['title' => '编辑观影记录'] + $mvArgs, 'movies');
|
||||
break;
|
||||
|
||||
/** 收集表单里和观影有关的字段(create / update 共用一份)。 */
|
||||
@@ -4377,8 +4388,23 @@ $want = array_keys($want);
|
||||
$pids = Anniversary::peopleOf($editing);
|
||||
$editing['person_ids'] = $pids;
|
||||
}
|
||||
View::render('days/form', [
|
||||
'title' => $id > 0 ? '编辑纪念日' : '新建纪念日',
|
||||
/* 🔴🔴 v43(用户 2026-10-11 第 2 条):「新建纪念日的时候,原来的页面还保存着。
|
||||
但是点击"修改纪念日",怎么好像原来的页面全都没了?就是下面那一层页面没了,
|
||||
这好像不太合理吧?」
|
||||
|
||||
真根因:**「修改」是 `<a href="days/edit">` 整页跳转** —— 它套 layout,
|
||||
渲染出的是"一张只有弹框的空白页",列表页被整个换掉
|
||||
(正是用户说的"下面那一层页面没了")。而「新建」走的是列表页内嵌弹框,
|
||||
两条路观感不一致。
|
||||
|
||||
⇒ 修法:`days/edit` 支持 `?embed=1` —— **只吐弹框那一块**(不套 layout),
|
||||
列表页 JS 拿它替换掉当前 `#anNewCard` 并打开。
|
||||
这样"编辑"与"新建"共用**同一个弹框、同一个底层页面**。
|
||||
(与 `trips/edit` 的 `?embed=1` 完全同一套约定。)
|
||||
⚠️ 内嵌形态标 `$anModalOnly = true`:否则模板会给它打上 `data-an-standalone`,
|
||||
关闭时去 `window.location.href` 跳页 —— 那正是要去掉的行为。
|
||||
⚠️ 非 embed 整页路径**保留**(直接访问 URL / 无 JS 兜底)。 */
|
||||
$anArgs = [
|
||||
'editing' => $editing,
|
||||
'kinds' => Anniversary::kinds($familyId),
|
||||
'people' => Person::roster($familyId, $me, 'member', ''),
|
||||
@@ -4387,7 +4413,15 @@ $want = array_keys($want);
|
||||
否则用户看到的是一张空白页(内容全在 hidden 的弹框里)。 */
|
||||
'anModal' => true,
|
||||
'anOpen' => true,
|
||||
], 'days');
|
||||
];
|
||||
if ((string)($_GET['embed'] ?? '') === '1') {
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo View::renderPartial('days/form',
|
||||
$anArgs + ['anModalOnly' => true, 'anShell' => true]);
|
||||
exit;
|
||||
}
|
||||
View::render('days/form',
|
||||
['title' => $id > 0 ? '编辑纪念日' : '新建纪念日'] + $anArgs, 'days');
|
||||
break;
|
||||
|
||||
case 'days/save':
|
||||
@@ -4912,14 +4946,23 @@ $want = array_keys($want);
|
||||
$occ = preg_match('/^\d{4}-\d{2}-\d{2}$/', $occ) ? $occ : '';
|
||||
// 编辑页要回填"哪些天被跳过了"(跳过的那次不再出现在日历里)
|
||||
$ev['skips'] = Calendar::skipsOf((int)$ev['id']);
|
||||
View::render('calendar/event', [
|
||||
/* 🔴 v43(用户 2026-10-11 第 6 条):条目详情浮层里点「编辑」时,
|
||||
`?embed=1` 只吐**编辑表单**(不套 layout、不带页头/删除),
|
||||
由浮层塞进正文。与 days/edit、movies/edit、trips/node_edit 同一套。 */
|
||||
$evArgs = [
|
||||
'title' => (string)$ev['title'],
|
||||
'ev' => $ev,
|
||||
'cal' => $cal,
|
||||
'occ' => $occ,
|
||||
// ⚠️ 不要再传 'ym':模板自己从 $ev['starts_at'] 算(模板里那行更权威,
|
||||
// 传进来反而会在"改过日期后"与模板算出的值不一致)。
|
||||
], 'calendar');
|
||||
];
|
||||
if ((string)($_GET['embed'] ?? '') === '1') {
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo View::renderPartial('calendar/event', $evArgs + ['evEmbed' => true]);
|
||||
exit;
|
||||
}
|
||||
View::render('calendar/event', $evArgs, 'calendar');
|
||||
break;
|
||||
|
||||
case 'calendar/event_update':
|
||||
@@ -5557,6 +5600,35 @@ $want = array_keys($want);
|
||||
], 'tasks');
|
||||
break;
|
||||
|
||||
/* 🔴 v43(用户 2026-10-11 第 6 条):条目详情浮层里点「编辑」→ 取这张表单片段。
|
||||
⚠️ 与 `tasks/show` 共用同一份 `_edit_form.php`(不许各写一张,那必然有一天不同步)。 */
|
||||
case 'tasks/edit':
|
||||
Auth::requireWrite();
|
||||
$familyId = (int)Auth::familyId();
|
||||
$me = (int)Auth::personId();
|
||||
$t = Task::find($familyId, (int)($_GET['id'] ?? 0), $me);
|
||||
if (!$t || !Task::canWrite($t, $me)) {
|
||||
http_response_code(403);
|
||||
echo '这项任务不能改。';
|
||||
exit;
|
||||
}
|
||||
$tkParents = [];
|
||||
foreach (['todo', 'doing', 'done'] as $sk) {
|
||||
foreach (Task::board($familyId, $me)[$sk] as $p) {
|
||||
if ((int)$p['id'] !== (int)$t['id']) { $tkParents[] = $p; }
|
||||
}
|
||||
}
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo View::renderPartial('tasks/_edit_form', [
|
||||
't' => $t,
|
||||
'people' => Person::roster($familyId, $me, 'member', ''),
|
||||
'parents' => $tkParents,
|
||||
'boards' => Task::boards($familyId),
|
||||
'categories' => Task::categories($familyId),
|
||||
'tkEditEmbed' => true, // 浮层形态:保存键由浮层底栏给
|
||||
]);
|
||||
exit;
|
||||
|
||||
case 'tasks/create':
|
||||
case 'tasks/update':
|
||||
$familyId = (int)Auth::familyId();
|
||||
|
||||
Reference in New Issue
Block a user