v44 第 44 批:界面 5 条 + 移动端 API v1 全量

界面(用户 2026-10-12 第 1~5 条)
1. 新建日程「日历本」并入 .cs 自绘下拉,颜色画进候选项,三字与下拉同行。
2. 新建日程「开始/结束」改「日期范围:」,删旧日期控件;
   重复相关三行仅选重复时出现;删「(含第一次)」与「这段时间算忙碌」。
3. 条目浮层加「地点」、去掉「状态」行;首页红线按分钟定位(原只取整小时);
   去掉左侧红点只留红线。
4. 任务页删掉状态说明提示(STATUS_HINT 三值清空)。
5. 新建任务:标题在前树框在后;截止时间改最新日历控件;负责人默认自己;
   删冗余提示;「上面要做什么」→「任务名称」;清理括号说明。

移动端 API(用户第 6 条:导航模块除外,其余全量)
- 新增 Bearer 令牌鉴权(api_tokens 表,Schema v32),与登录口令 / DAV 口令三套分立。
- Api.php 内核(鉴权/取参/信封/分页/分发 + _method 覆写)+
  ApiHandler.php 17 条资源 + ApiToken.php + api.php 入口。
- 路由:router.php / .htaccess / index.php 三处 /api/ 兜底(部署脚本自动追加线上规则)。
- 个人设置新增「App 接口令牌」卡;docs/API.md 接口文档;
  docs/API-QUESTION-LIST.md 自主决策与待确认缺口清单。

验证:本地 e2e 1510/0、v43 真机 33/0、v43 反向 9/0、
v44 真机 41/0、v44 API 63/0、v44 反向 19/0;全流水线 PUSH_RC=0。
This commit is contained in:
2026-10-12 15:31:03 +08:00
parent 8c651b43eb
commit 075ac6bbeb
21 changed files with 2886 additions and 185 deletions
+90 -7
View File
@@ -616,6 +616,25 @@ textarea.input { min-height: 76px; resize: vertical; }
控件依然完整可用,不是"骨架占位"。
============================================================================ */
.dt-input { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
/* 🔴 v44:内联标签(`_datetime.php` 的 `$dtLabel`)—— 让"日期范围:"与最新控件
**同一行**。宽度与观影式 `.mv-lb`(62px)一致,右对齐、冒号由 `::after` 给,
与「日历本」「标题」那几行的标签左缘对齐。
⚠️ 它是 `.dt-input` 的**兄弟节点**(不是子节点)—— 见 `_datetime.php` 里的说明:
放进去会被"收起原生端点"那条规则一起 clip 掉。选择器用 `+`(紧随其后)。 */
.dt-inline-lab {
flex: 0 0 auto; width: 62px; text-align: right;
font-size: 14px; font-weight: 600; color: var(--ink);
line-height: 1.4; word-break: keep-all;
}
/* ⚠️ 它同时带 `.mv-lb`(在 `.mv-row` 里时由那条规则给固定宽度与冒号);
这里再写一遍是为了**不在 `.mv-row` 里**(编辑整页那种两列排版)也成立。 */
.dt-inline-lab::after { content: ':'; font-weight: 400; color: var(--muted); }
.dt-inline-lab > i { font-style: normal; color: var(--red, #C0392B); margin-left: 1px; }
/* 范围组里带标签时:标签在前、控件在后,横向排(`.dt-range.dt-cols` 已是 flex row) */
.dt-range > .dt-inline-lab { flex: 0 0 62px; }
@media (max-width: 560px) {
.dt-inline-lab { flex: 0 0 52px; width: 52px; font-size: 13px; }
}
.dt-input .dt-native { display: contents; }
.dt-input .dt-semi { display: none; flex: 1 1 220px; min-width: 0; }
@@ -2968,6 +2987,24 @@ body[class] .semi-datepicker-day-inhover { background-color: color-mix(in srgb,
这正是第 11 批"选人过滤一直是坏的"的同一个坑,别再踩第二次。 */
.cs-item[hidden] { display: none; }
.cs-item:hover, .cs-item:focus { background: var(--line-2); outline: none; }
.cs-item.is-disabled { opacity: .5; cursor: not-allowed; }
.cs-item.is-disabled:hover { background: transparent; }
/* ---- 🔴 v44:日程「日历本」下拉 ----
用户 2026-10-12 第 1 条:「把颜色放在下拉框里面,就跟电影的影院选择一样,
让日历本这三个字和下拉框在一条线上。」
⇒ 复用观影那套 `.cs`(按钮 + 色点 + 弹出列表 + 搜索),只补两点:
① 这个下拉在 `.mv-row` 里,宽度由 `> *:not(.mv-lb)` 那条 `flex:1` 接管,够用;
② **无 JS 兜底**:那个原生 `<select id="ce-cal">` 只做视觉收起 ——
用 `position:absolute; width:1px`(**不是 display:none**,保留可聚焦、可提交),
与 `_datetime.php` 的"隐藏 date 当值载体"同一套思路。
⚠️ 断言里按 `#ce-cal` 取 option / 值的写法必须继续成立 —— 它在 DOM 里。 */
.cal-book-cs { width: 100%; }
.cal-book-native {
position: absolute; width: 1px; height: 1px;
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
border: 0; padding: 0; margin: -1px;
}
/* 新建影院:居中弹框(与名册的动作弹框同一形态,只是更宽) */
.cn-modal {
@@ -3858,6 +3895,12 @@ button.btn, a.btn, summary.btn, .seg-btn, .icon-btn, .rv-act-btn, .cs-btn, .bf-b
[data-mode-vehicle][hidden],
[data-mode-ticket][hidden] { display: none !important; }
/* 🔴 v44(用户 2026-10-12 第 2 条):重复那三行(结束条件 / 重复次数 / 重复到)
在观影式排版下是 `.mv-row`(`display:flex`)⇒ 同上面 `.field` 那个坑:
**作者样式优先于 `[hidden]` 的浏览器默认 `display:none`**,`hidden` 形同虚设。
⇒ 一并补上,否则"不重复时它们也显示着"。 */
.mv-row[hidden] { display: none !important; }
/* ============================================================
v24 第 20 批 第 4 条:拖动即时上传的**暂存区** UI
------------------------------------------------------------
@@ -4379,12 +4422,11 @@ button.btn, a.btn, summary.btn, .seg-btn, .icon-btn, .rv-act-btn, .cs-btn, .bf-b
.ag-row { display: flex; align-items: flex-start; gap: 8px; height: 44px; }
.ag-hour { flex: 0 0 42px; font-size: 11.5px; color: var(--faint); font-variant-numeric: tabular-nums; transform: translateY(-6px); }
.ag-line { flex: 1 1 auto; height: 1px; background: var(--line-2); margin-top: 0; }
/* 当前时刻红线(用户原话「需要在当前的时间或者是时刻那里显示一条红线」) */
/* 当前时刻红线(用户原话「需要在当前的时间或者是时刻那里显示一条红线」)
🔴 v44(用户第 3 条):左端那颗小圆点**删掉**了 ——
用户:「这个红点显示也不全,也不太好看。直接把红点去掉就行了,直接一根红线就可以了。」
⇒ 直接一根 2px 红线;`.ag-now-dot` 这条规则随之删除(不再有那个元素)。 */
.ag-now { position: absolute; left: 46px; right: 0; height: 0; border-top: 2px solid var(--red); z-index: 2; }
.ag-now-dot {
position: absolute; left: -4px; top: -5px; width: 8px; height: 8px;
border-radius: 50%; background: var(--red);
}
/* 日程块 */
/* 🔴 v30 第 2 条:「首页上的今天的日程,用色块表示,和日程保持一致。」
⇒ 从原来的"白底卡片 + 左边 3px 色线"改成**与日历页 `.tg-block` 同款的实心色块**:
@@ -5370,12 +5412,53 @@ h5.md-h, h6.md-h { font-size: 14px; }
/* ⚠️ 挂上 antd 之后:**原生那对下拉收起来**(它们仍然在 DOM 里当值载体)。
⚠️ 用 visibility+绝对定位而不是 display:none —— 见 v37 那次的教训:
display:none 的控件在表单校验时不可聚焦;这里虽然已摘掉 required,
但保持"可聚焦"更稳(免得将来再加必填时又踩同一个坑)。 */
.dt-range.is-antd > .dt-input {
但保持"可聚焦"更稳(免得将来再加必填时又踩同一个坑)。
🔴🔴 v44(用户 2026-10-12 第 2 条):「之前的日期选择控件还有,需要删除。」
—— 用户在**日程**上看到 antd 控件与原生五个下拉**并排都在**。真根因是
**结构性**的:日程那对是 `‹div.dt-range› ‹div.field.ev-dt› ‹div.dt-input›`
(`.dt-input` 是**孙子**),而这条规则用的是**直接子**选择器 `> .dt-input`
⇒ **在日程上根本不命中**。
(与 v43 纪念日那次同族:结构一变,直接子选择器静默失效、不报任何错。)
⇒ ① 把 `>` 放宽成**后代**选择器(`_event_fields.php` 那边的结构也已改回
"与观影一致"的直接子,两道保险);
② 用户要的"删除"就做成真删 —— 用 `display:none` 把**原生下拉那一块**
从渲染里去掉。**注意:值载体不受影响** —— 隐藏的 `*_date` / `*_hour`
/ `*_minute` 是 `.dt-input` 的**直接子元素**,**不在 `.dt-native` 里**,
所以删掉原生块**不碰提交契约**。
(v37 那条"display:none 不可聚焦"讲的是**带 required 的可见字段**;
这里被藏的是"已被 antd 取代的旧控件",必填校验早已由
`guardRequired` 的 `data-required` 自查接管 ⇒ 不适用那个顾虑。) */
.dt-range.is-antd .dt-input {
position: absolute; width: 1px; height: 1px;
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
border: 0; padding: 0; margin: -1px;
}
/* antd 真的挂上了 ⇒ 原生那几档下拉**彻底不渲染**(用户要的"删除")。 */
.dt-range.is-antd .dt-input .dt-native { display: none !important; }
/* 🔴🔴 v44:**带内联标签的那个端点不收起**。
根因(真机几何量出来的):内联标签(「日期范围:」)是画在 `.dt-input` **里面**的,
而上面那条收起规则把整个 `.dt-input` 绝对定位 + `clip` 掉了 ⇒
**标签跟着一起被裁没了**,用户只看到一个没有标签的控件
(量出来的证据:标签盒在 x=316/y=313 却被祖先 clip,`elementFromPoint`
命中的是 `.ant-picker-range-separator` ⇒ 标签确实看不见)。
⇒ 两头都不牺牲:`.dt-input` 只藏**它里面的原生块**(上一条已 `display:none`),
自己保持正常布局 ⇒ 它变成 `[标签 62px][最新控件]` 的一个横排。
起止的**第二个**端点没有标签,继续按上一条被收起(它本来就该消失)。 */
.dt-range.is-antd > .dt-input.has-inline-label {
position: static; width: auto; height: auto; overflow: visible;
clip: auto; margin: 0; padding: 0; border: 0;
flex: 1 1 auto; min-width: 0;
display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
}
/* 🔴 v44(用户第 5 条):**单个**带时刻的 antd 控件(任务「截止时间」)。
与上面那对同一条思路 —— 挂上后把原生那几档下拉**真删掉**。
选择器用 `.dt-input.is-antd`(单点,不是范围组)——
`_datetime.php` 里 antd 挂载点仍是 `.dt-input` 自身。 */
.dt-input.is-antd > .dt-native { display: none !important; }
.dt-input.is-antd > .dt-antd { display: block; width: 100%; }
/* 窄屏:标签列收窄,别把输入框挤没了 */
@media (max-width: 560px) {
.mv-row > .mv-lb,