v24 第 12 批:5 条(删除按钮位置/日期控件三修/日历跳转/节气节日/财务图)

用户 2026-10-05 的 5 条。第 11 批交付后用户追问"确定这些需求都做完了?"—— 没有,
这 5 条是进一步要求。实现过程中查出 4 个真 bug。

#1 详情页删除按钮紧贴「开通账号」
   上一版放在页面最下方独立区块(danger-zone),用户要「就放在开通账号按钮下面,
   紧挨着,长度大小和开通账号一样,颜色改成红色」。→ 搬进「登录账号」卡片内
   (.del-inline + 细分隔线 + .btn-block-lg)。
   线上几何实测:同一张卡片、左边缘对齐 255==255、宽度一致 990==990、红色 rgb(192,83,63)。

#2 日期控件三修(两个真 bug + 一次闪烁)
   · 灰底:Semi **外层** .semi-datepicker-input 自带 rgba(46,50,56,.05)、高 32px;
     内层 wrapper 白底 40px → 灰的露在外面。实测「灰底元素」= 1 个 → 修后 0 个。
   · 不垂直居中:外层 32px < 内层 40px,实测 gapTop=1 / **gapBottom=17**(文字贴顶)
     → 修后 gapTop=1 / gapBottom=1。
   · 闪烁:实测首 **200ms** 原生输入框可见(要等 3.4MB React 解析)。
     用 no-js/js 二态:<html class="no-js"> + head 内联脚本立刻换 js +
     CSS `html.js .dt-input:not(.is-semi) .dt-native { visibility:hidden }`
     (配同高骨架 ::after 防布局跳动)。实测「出现过原生可见」= False。

#3 日历跳转保留视图 + 下拉日历
   原来写死 view=day(在月视图点跳转会被踢进日视图)。→ 表单带当前 $view(月还带 ym);
   选择器从"居中弹窗"改成**按钮下方下拉** .cal-jump-drop。
   实测:月视图跳 8/15 仍在月视图且是 8 月;周视图跳 8/15 → 落 8/10 那一周;
   日视图跳 8/15 → 显示 8/15。

#4 传统节日 + 二十四节气两个系统本(Schema v18)
   Holiday::SOLAR_TERMS(24 项 C 常数近似公式 + 例外表)+ traditionalRange
   (农历推导;除夕用"次日是否正月初一"反推,写死腊月廿九会有一半年份错)。
   实测 2026:节气 24 条全对(清明 4/5、冬至 12/22);春节 2/17、除夕 2/16、中秋 9/25。
   ⚠️ ENUM 必须显式 ALTER(对已存在的表不生效)——同一坑第二次踩,VERSION 17→18。

#5 财务(一个真 bug + 一个假起点 + 一个真 bug)
   · chart_line 读 `cents` 而 timeline() 返回 `net` → 键名不匹配,**总资产图每点读成 0**
     (正是用户说的"图上是 0")。修:兼容 cents ?? net ?? asset。
     实测 timeline net=800000(8000 元),线上 polyline 有真实起伏。
   · 去掉 timeline 人为插的"前一天=0"假起点(用户:"总资产不应该是 0,
     应该是所有账目创建时的金额的总数")。
   · ppSetSelected 只用 document.querySelector 按名字找,而财务页有**两个** person_id
     组件(「记一笔」+ 修改弹框)→ 永远灌到第一个。加 root 参数、调用方传 panel。

验证:e2e 786/0、交互 92/0、升级 129/0(+3 条 v18 断言)、batch_e 91/0、batch10 46/0、
batch9 38/0、picker_unify 28/0、picker_lazy 11/0、crop 17/0、formbloat 9/0、semi 27/0、
mobile 688/0、drag 5/0、geom 5/5;第 12 批专项:财务 7/0、日历 19/0。
部署静态断言新增 5 组(含反向验证:注入回退 → FAIL=1)。
线上自检 19/19;线上真实账号验收 **30/0**(含真实浏览器几何量删除按钮位置)。
This commit is contained in:
2026-10-04 19:43:00 +08:00
parent 5d80b9480b
commit ecf121772f
12 changed files with 494 additions and 120 deletions
+105 -12
View File
@@ -569,8 +569,29 @@ textarea.input { min-height: 76px; resize: vertical; }
/* v24 第 9 批 #9:Semi DatePicker 升级态 —— .dt-native 是 display:contents(不干扰
flex 布局),升级成功后由 app.js 内联 display:none 藏掉;.dt-semi 顶上同一格。 */
.dt-input .dt-native { display: contents; }
/* ---- v24 第 12 批 #2:消除「先闪原生框、再变 Semi」----
html.js 由 <head> 里的内联脚本立刻加上(见 layout.php 的 no-js/js 二态)。
有 JS 时:原生控件**从一开始就不显示**,等 Semi 就绪(app.js 加 .is-semi)再露出。
没 JS 时(html 仍是 no-js):什么都不藏,原生控件照旧可用 —— 渐进增强的兜底不变。
⚠️ 用 visibility:hidden 而不是 display:none —— 保留元素占位高度,
否则升级完成的那一瞬表单会"跳"一下(高度从 0 变 40px)。 */
html.js .dt-input:not(.is-semi) .dt-native { visibility: hidden; }
html.js .dt-range:not(.is-semi-range) > .dt-input { visibility: hidden; }
/* Semi 未就绪前,先给一个同高的"占位骨架",让表单高度在升级前后保持一致 */
html.js .dt-input:not(.is-semi)::after {
content: ''; display: block; flex: 1 1 150px; height: 40px;
border: 1px solid var(--line); border-radius: var(--radius-s);
background: var(--surface); opacity: .55;
}
html.js .dt-range:not(.is-semi-range)::before {
content: ''; display: block; width: 100%; max-width: 460px; height: 40px;
border: 1px solid var(--line); border-radius: var(--radius-s);
background: var(--surface); opacity: .55;
}
html.js .dt-range.is-semi-range::before { display: none; }
.dt-input .dt-semi { display: none; flex: 1 1 220px; min-width: 0; }
.dt-input.is-semi .dt-semi { display: block; }
.dt-input.is-semi::after { display: none; }
/* 工作经历的月份选择器(type="month" 升级):占满原 .job-cell 格子 */
.dt-semi.dt-semi-month { display: none; }
.dt-semi.dt-semi-month.is-live { display: block; width: 100%; }
@@ -591,6 +612,35 @@ body[class] .dt-semi-range .semi-input-wrapper {
}
body[class] .dt-semi-range .semi-input-wrapper:hover { border-color: var(--brand-2); }
body[class] .dt-semi-range .semi-input { font: inherit; font-size: 13.5px; color: var(--ink); }
/* ---- v24 第 12 批 #2:范围控件的「灰底 + 不垂直居中」(实测定位)----
用真浏览器量出来两个毛病:
① 灰底:Semi 的 **外层** `.semi-datepicker-input` 自带 `rgba(46,50,56,.05)`
灰底、高只有 32px;而内层 `.semi-input-wrapper` 是白底、40px ——
两层套着,灰的那层露在外面(用户看到的"灰色背景色")。
② 不居中:外层 32px < 内层 40px,输入框上下都被挤出去
(实测 gapTop=1 / gapBottom=17 → 文字贴顶)。
修法:把**外层容器**改成透明 + 不限高 + 垂直居中,让内层 40px 的白底框
自己撑起来(与站内 .input 完全一致)。 */
body[class] .dt-semi-range .semi-datepicker-input {
background: transparent !important;
height: auto !important;
min-height: 0 !important;
align-items: center;
padding: 0;
border: 0;
}
body[class] .dt-semi-range .semi-datepicker-range-input-wrapper {
align-items: center;
background: transparent;
}
/* 两端的白底框就是"可见的输入框":撑满高度、文字垂直居中 */
body[class] .dt-semi-range .semi-input-wrapper {
display: flex; align-items: center;
}
body[class] .dt-semi-range .semi-input-wrapper .semi-input {
height: 100%; line-height: 40px; padding: 0 8px;
background: transparent;
}
@media (max-width: 640px) {
.dt-semi-range { max-width: none; }
}
@@ -608,10 +658,24 @@ body[class] .dt-semi .semi-input-wrapper {
width: 100%; height: 40px;
border: 1px solid var(--line); border-radius: var(--radius-s);
background: var(--surface); color: var(--ink);
/* v24 第 12 批 #2:单点控件也做同样处理 —— 外层半透明灰底去掉、文字垂直居中
(用户说"这种情况同样出现在其他的日期选择功能中")。 */
display: flex; align-items: center;
}
body[class] .dt-semi .semi-input-wrapper:hover { border-color: var(--brand-2); background: var(--surface); }
body[class] .dt-semi .semi-input { font: inherit; color: var(--ink); }
body[class] .dt-semi .semi-input::placeholder { color: var(--muted); }
body[class] .dt-semi .semi-datepicker-input,
body[class] .dt-semi .semi-datepicker {
background: transparent !important;
height: auto !important;
min-height: 0 !important;
border: 0;
padding: 0;
}
body[class] .dt-semi .semi-input-wrapper .semi-input {
height: 100%; line-height: 40px; padding: 0 11px; background: transparent;
}
/* 日历面板:白纸底色统一成卡片的纸色,选中/悬停色走上面的 brand 变量 */
body[class] .semi-popover .semi-datepicker { background: var(--surface, #fff); }
body[class] .semi-datepicker-day-selected { background-color: var(--brand, #A84A28); }
@@ -1097,6 +1161,25 @@ body[class] .semi-datepicker-day-inhover { background-color: color-mix(in srgb,
border: 1px solid #F0D6D1; border-radius: 8px; font-size: 13px; color: #7A2A20;
}
.del-big-confirm[hidden] { display: none; }
/* ---- v24 第 12 批 #1:删除按钮紧挨「开通账号」放在同一列 ----
用户原话:「删除按钮,就放在开通账号按钮下面,紧挨着,长度大小,
和开通账号一样,就是颜色改成红色。」
所以这里只做两件事:① 与账号区的按钮**左对齐同宽**(都以账号卡片内容宽为准);
② 上方留一条细分隔线,让人一眼看出"这是同一个区块里的第二件事"。
⚠️ 尺寸一致性靠 .btn-block-lg(100% 宽 + 同 padding),不在这里写死宽度,
否则窄屏下会与「开通账号」对不齐。 */
.del-inline {
margin-top: 14px;
padding-top: 14px;
border-top: 1px dashed var(--line);
}
.del-inline-tip {
margin: 0 0 10px;
font-size: 12.5px;
line-height: 1.7;
color: var(--muted);
}
.person-move { display: flex; gap: 6px; padding: 8px 12px; flex-wrap: wrap; }
.person-move .select { flex: 1 1 auto; min-width: 0; padding: 6px 8px; font-size: 13px; }
.person-move .btn { flex: 0 0 auto; }
@@ -2691,21 +2774,31 @@ body[class] .semi-datepicker-day-inhover { background-color: color-mix(in srgb,
点开弹一个只含 Semi 日期选择器的轻浮层,选中即跳。 */
.cal-jump { display: inline-flex; margin: 0; }
.cal-jump-btn { display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
.cal-jump-host { position: fixed; inset: 0; z-index: 80; display: flex;
align-items: center; justify-content: center; }
.cal-jump-pop {
background: var(--surface); border: 1px solid var(--line);
border-radius: 14px; box-shadow: var(--shadow-l); padding: 10px 12px 12px;
/* ---- v24 第 12 批 #3:跳转日期改成**按钮下方的下拉日历** ----
用户原话:「选择这个日期,不用弹窗,直接把日历选择,弹出在这个按钮下面就可以了。」
所以把原来"全屏遮罩 + 居中弹窗"(.cal-jump-host/.cal-jump-pop)换成
贴着按钮下方展开的下拉面板(.cal-jump-drop)。 */
.cal-jump { position: relative; }
.cal-jump-drop {
position: absolute; z-index: 70;
top: calc(100% + 8px); left: auto; right: 0; /* 贴右:与按钮同一列,不会跑出屏外 */
background: var(--surface);
border: 1px solid var(--line);
border-radius: 12px;
box-shadow: var(--shadow-l);
padding: 8px;
/* 下拉里放的是 Semi 的**内联**日历面板,去掉它自己的浮层阴影/描边避免双层框 */
}
.cal-jump-pop-head {
display: flex; align-items: center; gap: 10px;
font-size: 13.5px; font-weight: 600; margin-bottom: 8px;
.cal-jump-drop[hidden] { display: none; }
.cal-jump-drop .semi-datepicker,
.cal-jump-drop .semi-popover {
box-shadow: none !important;
border: 0 !important;
background: var(--surface) !important;
}
.cal-jump-x {
margin-left: auto; border: 0; background: transparent; cursor: pointer;
font-size: 14px; color: var(--muted); padding: 3px 6px; border-radius: 6px;
.cal-jump-drop .semi-datepicker {
display: block;
}
.cal-jump-x:hover { background: var(--line-2); color: var(--ink); }
/* ==================== 周 / 天:按小时铺的时间网格 ==================== */
/* 结构:左边一条"小时刻度"沟槽(tg-gutter),右边 N 个日期列(tg-col)。