v24 第 10 批:名册真性能(根因是每卡内联表单)等九条
- #6 名册线上真实数据(1184 人)卡顿:根因是**每张卡片内联一整份分组弹层**—— 全页 2369 个 form / 27234 个 input / 22496 个 radio / 98100 DOM 节点, 密码管理器(Bitwarden 等)逐个扫描 form 把主线程占死(用户报的就是这个冲突)。 改为卡片只带 data 属性 + 全页**唯一一份**共享浮层 #rosterMenus。 实测:form 2369→3、input 27234→25、DOM 98100→17659、解压 7694→2306 KB、 长任务 1/52ms → 0。新增哨兵 _fb_formbloat_check.py(含反向验证)。 - #5 日视图翻页失效:day_columns() 无条件吸到周一,天视图只有 1 列 → 永远显示那周周一。 改为仅 span>1 时吸附(周视图行为不变)。 - #2 财务「欠款」类别(负债);并修一个真 bug:负债填负数会让净资产**反向变大**。 写入口 normalizeAmount 归一化 + summary/timeline 侧 abs 防御 + Schema v17 纠正老数据。 - #3 账目行「盘点」「修改」两个并列按钮(各自就地弹面板);图移到账目上方, 总金额图跨整行 + 每个账目一条线 + 类别筛选条;charts() 改为覆盖全部账目。 - #4 日程新增「农历」「节假日」两本不可删除只读日历(app/Holiday.php): 两级自动更新 —— 内置规则(公历固定 + 清明节气 + 农历节日)保证断网也有; 官方 JSON 镜像自动抓取补齐调休。抓取**不在渲染路径联网**(响应后 fastcgi_finish_request + 频率闸门),缓存落 storage/cache。仅派生本不可写日程。 - #6 日程页设置按钮前加「跳到某一天」(选中即跳)。 - #7 起止范围改用一个 Semi dateTimeRange 控件(观影/旅程/节点/日程共 4 处); 新增 window.fbSetDT / fbUpgradeRange;修范围重挂(React 非受控组件须 unmount 再 createRoot) 与范围里 required 未摘除导致表单无法提交两个真实问题。 验证:e2e 786/0、batch10 44/0、batch9 38/0、batch_e 91/0、upgrade 126/0、picker 28/0、 semi_integrate 27/0、formbloat 5/0(+反向 3 红)、mobile 688/0、interact 97/0、drag 5/0、geom 5/5; 线上自检 19/19 + 线上真实账号巡检 28/0(含 Firefox 实测)。
This commit is contained in:
@@ -371,11 +371,20 @@ function day_columns(string $anchor, int $span): array
|
||||
if ($ts === false) {
|
||||
$ts = time();
|
||||
}
|
||||
$w = (int)date('w', $ts); // 0=周日 … 6=周六
|
||||
$mon = strtotime('-' . (($w + 6) % 7) . ' days', $ts); // 周一开头
|
||||
// ⚠️ v24 第 10 批 #5(用户报「日视图点后一天/前一天没反应」):
|
||||
// 这里原来**无条件**把日期吸到"这一周的周一"—— 周视图要这样(7 列从周一排),
|
||||
// 但天视图只有 1 列,吸过去就等于**永远显示那一周的周一**:
|
||||
// d=2026-10-04(周日)→ 列 09-28;d=2026-09-30(周三)→ 列 09-28;
|
||||
// 只有 d 本来就是周一时才"看着正常"。而页头标题用的是 $anchor(正确),
|
||||
// 于是症状正是"标题变了、日程区域纹丝不动"。
|
||||
$start = $ts;
|
||||
if ($span > 1) {
|
||||
$w = (int)date('w', $ts); // 0=周日 … 6=周六
|
||||
$start = strtotime('-' . (($w + 6) % 7) . ' days', $ts); // 周一开头(仅周视图)
|
||||
}
|
||||
$out = [];
|
||||
for ($i = 0; $i < max(1, $span); $i++) {
|
||||
$d = date('Y-m-d', strtotime('+' . $i . ' days', $mon));
|
||||
$d = date('Y-m-d', strtotime('+' . $i . ' days', $start));
|
||||
$out[] = [
|
||||
'date' => $d,
|
||||
'w' => (int)date('w', strtotime($d)),
|
||||
@@ -3390,6 +3399,14 @@ switch ($r) {
|
||||
$calId = (int)($_POST['calendar_id'] ?? 0);
|
||||
// ⚠️ 走 mineOne 而不是 Calendar::find():要带 perm,共享本的可读写才判得对
|
||||
$cal = Calendar::mineOne($familyId, $me, $calId);
|
||||
// v24 第 10 批 #4:农历 / 节假日(还有观影 / 旅行)是**派生只读本**,
|
||||
// 内容由别处算出来,不能往里写日程 —— 写了也不会显示(Calendar::month 只从
|
||||
// kind='custom' 取 calendar_events),却会在库里留下一堆"看不见的日程"。
|
||||
// 用户的要求是"不可删除",这里顺带把"不可写入"也钉死。
|
||||
if ($cal && Calendar::isReadonlyKind((string)$cal['kind'])) {
|
||||
flash('err', '「' . $cal['name'] . '」是系统日历,内容自动生成,不能往里加日程。');
|
||||
redirect('calendar', ['view' => 'month', 'ym' => $ym]);
|
||||
}
|
||||
if (!$cal || !Calendar::canWrite($cal, $me)) {
|
||||
flash('err', '这本日历你没有写权限。');
|
||||
redirect('calendar', ['ym' => $ym]);
|
||||
|
||||
Reference in New Issue
Block a user