`。 ⚠️ 抽成闭包是为了**不在下面每处 if/else 手抄两遍结构** —— 抄两遍必然有一天两边不同步(v37 那种"改了 A 忘了 B"的坑)。 ⚠️ 「是否必填」作为**参数**传(不要用 `use` 捕获 —— 闭包定义时那个变量还没赋值, 捕获到的是 null,标记永远不出现)。 🔴🔴 v94(用户 2026-10-25):必填的表示法从「末尾加红色星号」改成 「标签本身红色加粗」,由 CSS 类 `.is-req` 驱动(样式见 `app.css` 末尾 「必填项统一标记」那段)。 ⚠️ 第三个参数 v94 起从 `$star` 更名为 `$req`:它原来叫"画星",现在只表示 "这是必填" —— 名字不改会让后来者以为还在画星号,去 CSS 里找不存在的规则。 */ $evRowOpen = static function (string $full = '', bool $hidden = false) use ($evMv): string { return '
'; }; /* 重复规则**先算好**:下面"结束条件 / 重复次数 / 重复到"三行要不要默认藏起来, 取决于它(见 v44 第 2 条)。原来 `$rp` 是在「重复」那一行才 parse 的, 那三行排在它后面 ⇒ 拿不到。提到最前面,只算一次。 */ $evRp = \App\Repeat::parse((string)($evF['rrule'] ?? '')); $evRepeating = (string)($evRp['freq'] ?? '') !== ''; $evLab = static function (string $text, string $for = '', bool $req = false) use ($evMv): string { $cls = $req ? ' is-req' : ''; if ($evMv) { // 观影式:标签是 ,冒号由 CSS ::after 给 return '' . $text . ''; } return '' . $text . ''; }; ?>
`:后者在手机上要"按住再点", 几乎没法用(任务共享那个 multiple 下拉就是因此被换掉的)。 ⚠️ 字段名必须是 `reminder_minutes[]` —— Calendar::reminderMinutes() 认得数组。 写成 `reminder_minutes`(不带 [])会让 PHP 只留最后一个勾选。 🔴 v43(用户第 5 条):他要求把这一栏底下那句「多选与不提醒」的说明去掉 ⇒ 这里删掉那个 `.tip`(多选语义由复选框本身表达)。 */ $curReminders = \App\Calendar::reminderList($evF['reminder_minutes'] ?? null); ?>
$word): ?>
bx.offsetParent !== null)`)。而这一版**结束那一端默认 带 `hidden`**(要点「+ 添加结束时间」才出现)→ 判断永远不成立 → 范围控件**从来没被挂上去过**(实测 data-semi-range-done 恒为 null)。 更糟的是 CSS 还有 `html.js .dt-range:not(.is-semi-range) > .dt-input { visibility: hidden }` —— 两端于是都是**不可见**的: 屏幕上一片空白、点哪儿都没反应。这就是「无法使用」的全部。 修法:**结束那一端不再默认藏起来**,范围控件一次性就挂上。 起止成对本来就该一起填。想表达"只有一个时刻"的话,范围控件 clear 一下即可。 ⚠️ 顺带删掉「+ 添加结束时间 / 去掉结束时间」那套开关: 它切换显隐会让范围控件反复重挂;范围控件自己就能表达"没有结束"。 🔴🔴 v43(用户 2026-10-11 第 5 条):「开始和结束时间也没有用我们最新的控件, 直接就是四个字"时间范围"。」 —— 两处真缺陷一起修: ① 这个字段块**没传 `$dtPlugin='antd'`** ⇒ 用户看到的还是年/月/日 + 时/分 五个原生下拉,而不是他点名要的 Ant Design 控件; ② 标签写的是「时间范围」四个字,没告诉人"这是开始 / 结束"。 ⇒ `$dtPlugin='antd'`(与观影/行程同一套:面板有可点的时/分列、中文「确定」), 标签改「开始 / 结束」(并去掉那颗必填星号的位置歧义 —— 只标在开始上)。 ⚠️ 契约一字未改:隐藏字段仍是 `*_date/_hour/_minute`;antd 拉不动时 自动退回自建下拉(渐进增强)。 🔴🔴 v44(用户 2026-10-12 第 2 条):「开始/结束,改为:日期范围:。 之前的日期选择控件还有,需要删除。」 —— 用户要三种东西:① 标签「日期范围」;② 标签与**最新控件同行**; ③ 原生那套(年/月/日 + 时/分 五个下拉)**真的消失**。 🔴🔴 **"还在"的真根因(结构性,不是样式没写)**: 观影那对是 `‹div.mv-row.dt-range› ‹div.dt-input›`(**直接子**), 而日程这对是 `‹div.dt-range› ‹div.field.ev-dt› ‹div.dt-input›` —— `.dt-input` 是**孙子**。 于是那条最常见的收起规则 `.dt-range.is-antd > .dt-input`(**直接子**选择器) **在日程上根本不命中** ⇒ antd 挂上了、原生五个下拉照样显示 (用户看到两个控件并排,"之前的日期选择控件还有")。 ⚠️ 与 v43 纪念日那次是**同一个家族**:结构一变,直接子选择器就静默失效。 ⇒ 两手都做:① 把日程的结构改成与观影**一致**(`.dt-input` 直接子); ② CSS 里把 `>` 放宽成后代选择器(0,2,0 → 仍高于基类), 将来结构再变也不会又冒出第二个控件。 ⇒ 形态:由 `_datetime.php` 的 `$dtLabel` 把「日期范围:」 **内联在控件那一行**(不靠宿主的行结构),一个 `.mv-lb` 挂在 `.dt-input` 里 → 三样天然同行,宽度不够时整体换行。 */ ?>
日期范围
` 就直接贴在行的最左边(x=0), 比上面的输入框往左偏了 62px,看着像"错位了"。 ⇒ 补一个**空的** `.mv-lb` 占位(`no-colon` 免得画出「:」)。 不用 `padding-left:62px` 的原因:那条 62px 是 `.mv-row > .mv-lb` 的 `flex:0 0 62px` 算出来的,而 `.mv-lb` 的宽度在窄屏媒体查询里 会变(见 app.css 的 6196 行附近),写死 padding 会跟它脱节。 用空标签则**天然跟随**同一套规则,改一处两边都对。 ⚠️ 仅在观影式排版(`$evMv`)下补:整页表单是 `.form-grid` 两列, 没有 62px 标签列,补了反而会多出缩进。 */ ?>
>
0) ? '' : ' hidden' ?>>
> ` 换成 AntD **纯日期** DatePicker。 ⚠️ 做法与「纪念日 → 日期」完全同一套(v42/v43 已验证): · 外层 `.dt-input` + `data-antd-date="1"` → app.js 的 `mountAntdDate` 接管; · 值载体仍是**同一个** `name="rep_until"` 的 ``, 只是被 `.dt-native` 包起来(否则那条"收起原生框"的 CSS 不命中 ⇒ 会出现"多了一个控件",正是 v43 纪念日踩过的坑); · 服务端契约**一字不改**:`Repeat::build($_POST)` 照旧读 `rep_until`。 ⚠️ 千万别给这个 `.dt-input` 加 `data-dt="…"`:那是"年/月/日+时/分"那套 四字段契约的标记,加上去会被 `upgrade()` 抢走、反而绑错处理器。 */ ?>