\App\Calendar::canWrite($c, (int)\App\Auth::personId()))); $visCals = array_map('intval', (array)($visCals ?? [])); $hiddenCals = array_map('intval', (array)($hiddenCals ?? [])); $newAt = (string)($newAt ?? ''); // 能不能"点一下建日程":只读账号点了没反应,所以连 rt-writable 标记都不给。 // 🔴 v48(用户 2026-10-14 第 3 条):**十字光标已去掉**(CSS 里不再有 cursor:crosshair), // 但 `rt-writable` 这个**类名保留** —— 它是"这个人能不能写"在 DOM 上的标记位, // 点击建日程的判断逻辑与此无关(见底部 JS 的 $canWrite && $writable)。 $canNew = $canWrite && (bool)$writable; // 三种看法各自的「上一段 / 下一段」:月按整月走,周按 7 天走,天按 1 天走 $step = $view === 'week' ? 7 : ($view === 'day' ? 1 : 0); $prevD = date('Y-m-d', strtotime('-' . $step . ' days', strtotime($anchor))); $nextD = date('Y-m-d', strtotime('+' . $step . ' days', strtotime($anchor))); $todayD = date('Y-m-d'); $headText = $view === 'month' ? date('Y 年 n 月', $ts) : ($view === 'week' ? date('Y 年 n 月 j 日', strtotime($anchor)) . ' 起这一周' : date('Y 年 n 月 j 日', strtotime($anchor))); ?>

日程

月 周 天 上一月 今天 下一月 今天 而不是再引一个弹层:它的原生日历足够用, 而且**选中就有值**(change 事件)→ 直接跳转,不用再点一次"确定"。 桌面/手机/无 JS 三种情况下的行为都是可预期的。 */ ?>
` 在部分旧 WebView 上行为不一致, 而且我们已有的浮层已经解决了"点遮罩关、Esc 关、滚动锁"这几件事。 ⚠️ 表单本身**一个字没动**(字段名/服务端契约/CSRF 全照旧), 只把它的容器从"页面上的一格"换成"浮层里的一块"。 `calendar_id` 那个 select 也保留(第 7 条要求"选择日历本,带上颜色", 见下面给每个 option 加的色块)。 */ ?>
`** —— `.cal-modal-panel` 被提前闭合、 跟着又被多关一层,于是 `
` 跑到了 **面板外面**(DOM 上它是 `.cal-modal` 的直接子元素)。 面板 `max-height` 一卡,底栏就被挤到面板下方 → 用户看不到。 另有 CSS 一层:`.cal-modal-panel > form` 原先不是 flex 列, `.cal-modal-body{flex:1 1 auto}` 因此不起作用(两处都已修)。 ⚠️ 提交键用 `form="calAddForm"` **显式关联**:多一层/少一层 DOM 的 意外都不会再让它失效(它本来就在 form 内部,但显式写更稳)。 */ ?>
全天
$c): ?>
0) { $evEdit = url('calendar/event', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'movie' && $evRef > 0) { $evEdit = url('movies/edit', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'task' && $evRef > 0) { $evEdit = url('tasks/edit', ['id' => $evRef]); } elseif ($evKind === 'anniv' && $evRef > 0) { $evEdit = url('days/edit', ['id' => $evRef, 'embed' => 1]); } ?> ' style="background: ;" href="" title="">
$c): ?>
0) { $evEdit = url('calendar/event', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'movie' && $evRef > 0) { $evEdit = url('movies/edit', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'task' && $evRef > 0) { $evEdit = url('tasks/edit', ['id' => $evRef]); } // trip 的条目指向"某个旅程里的某段行程",编辑器在旅程详情页里 —— 这里不给「编辑」 elseif ($evKind === 'anniv' && $evRef > 0) { $evEdit = url('days/edit', ['id' => $evRef, 'embed' => 1]); } ?> data-fb-entry='' style="background: ; top: %; height: %; left: calc(2px + %); width: calc(% - 4px);" href="" title="">
自己处理,JS 会排除掉)。 */ ?>
0) { $evEdit = url('calendar/event', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'movie' && $evRef > 0) { $evEdit = url('movies/edit', ['id' => $evRef, 'embed' => 1]); } elseif ($evKind === 'task' && $evRef > 0) { $evEdit = url('tasks/edit', ['id' => $evRef]); } elseif ($evKind === 'anniv' && $evRef > 0) { $evEdit = url('days/edit', ['id' => $evRef, 'embed' => 1]); } ?> ' style="background: ;" href="" title=""> 3): ?> + 条