feat(v1.9.0): Bootstrap 5 迁移第 3/4、4/4 轮(抽屉、表单、大屏内部)

版本号保持 1.9.0,仍为纯前端改动:
- 日历抽屉:快速输入改 form-control,任务/到期列表改 Bootstrap list-group,加急标签改 badge
- 客户详情:套餐下拉、开始日、天数/次数、终止日统一 form-select / form-control
- 大屏内部:KPI 改 card,TOP 榜与今日列表改 list-group,加急改 badge;热力网格保留自绘
- app.css 增加 Bootstrap 收敛规则(list-group 透明背景、任务分隔线)

验证:无头 Chrome 实拍日历、客户详情、大屏三页(shots/bs3-*.png),页面正常渲染
数据库与业务逻辑零改动
This commit is contained in:
subtrack
2026-10-19 22:17:01 +08:00
parent a83bfbb2b3
commit 621adfa4a8
4 changed files with 25 additions and 18 deletions
+7
View File
@@ -1119,3 +1119,10 @@ fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
background: var(--surface-2);
}
.subcard.is-closed:hover { opacity: 0.8; }
/* ---------- v1.9 bootstrap 收敛 ---------- */
.list-group-item { background: transparent; }
.task.list-group-item { border-bottom: 1px dashed var(--line-2); }
.task.list-group-item:last-child { border-bottom: 0; }
.quick-form .form-control { max-width: 220px; }
+7 -7
View File
@@ -83,7 +83,7 @@
<input type="hidden" name="pkg" value="{{.D.PkgID}}">
<input type="hidden" name="tag" value="{{.D.Tag}}">
<input type="hidden" name="back" value="{{.D.Back}}">
<input type="text" name="tail" placeholder="输入手机尾号,回车即可完成" maxlength="8" autocomplete="off" inputmode="numeric" aria-label="手机尾号快速完成">
<input class="form-control form-control-sm" type="text" name="tail" placeholder="输入手机尾号,回车即可完成" maxlength="8" autocomplete="off" inputmode="numeric" aria-label="手机尾号快速完成">
<button class="btn btn-sm btn-primary" type="submit">完成</button>
<button type="button" class="btn btn-sm btn-ghost keypad-toggle" data-keypad-toggle title="切换触控/PC 模式" aria-label="切换触控/PC 模式">⌨</button>
</form>
@@ -115,7 +115,7 @@
<input type="hidden" name="back" value="{{.D.Back}}">
<ul class="pick-list">
{{range .D.PickRows}}
<li>
<li class="list-group-item px-0">
<label>
<input type="checkbox" name="sub_ids" value="{{.ID}}"{{if not .Done}}{{if not .Skipped}} checked{{end}}{{end}}>
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
@@ -139,16 +139,16 @@
{{end}}
{{if .D.Tasks}}
<ul class="task-list">
<ul class="list-group list-group-flush task-list">
{{range .D.Tasks}}
{{if or .Done .Skipped}}
<li class="task task-done" style="--asg:{{.AssigneeHex}}">
<li class="list-group-item task task-done px-0" style="--asg:{{.AssigneeHex}}">
<details class="done-fold">
<summary>
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
<span class="pkg">{{.PackageName}}</span>
<span class="chip {{if .Done}}chip-active{{else}}chip-paused{{end}}">{{if .Done}}已完成{{else}}已跳过{{end}}</span>
{{if .Urgent}}<span class="tag-urgent">加急</span>{{end}}
{{if .Urgent}}<span class="badge text-bg-danger tag-urgent">加急</span>{{end}}
<span class="fold-caret" aria-hidden="true"></span>
</summary>
<div class="done-detail">
@@ -181,7 +181,7 @@
</details>
</li>
{{else}}
<li class="task{{if .Urgent}} urgent{{end}}" style="--asg:{{.AssigneeHex}}">
<li class="list-group-item task{{if .Urgent}} urgent{{end}} px-0" style="--asg:{{.AssigneeHex}}">
<div class="task-main">
<a class="task-title" href="/customers/{{.CustomerID}}">
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
@@ -234,7 +234,7 @@
<section class="drawer-block">
<h3>这天到期 <em>{{len .D.Due}}</em></h3>
{{if .D.Due}}
<ul class="due-list">
<ul class="list-group list-group-flush due-list">
{{range .D.Due}}
<li>
<a class="due-main" href="/customers/{{.CustomerID}}">
@@ -86,7 +86,7 @@
{{if .D.Packages}}
<form method="post" action="/customers/{{.D.Customer.ID}}/subscriptions" class="inline-form" data-sub-form>
<select name="package_id" required data-pkg-select>
<select class="form-select form-select-sm" name="package_id" required data-pkg-select>
<option value="">选择套餐…</option>
{{range .D.Packages}}
<option value="{{.ID}}" data-unit="{{if .Season}}season{{else}}{{.Unit}}{{end}}" data-amount="{{.DefaultAmount}}" data-validity="{{.DefaultValidityDays}}"{{if .Archived}} disabled{{end}}{{if .SeasonExpired $.TodayStr}} disabled{{end}}>
@@ -95,16 +95,16 @@
{{end}}
</select>
<label class="inline-field" data-start-wrap>开始日
<input type="date" name="start_date" value="{{.TodayStr}}" required>
<input class="form-control form-control-sm" type="date" name="start_date" value="{{.TodayStr}}" required>
</label>
<label class="inline-field" data-days-wrap>{{/* 默认显示 */}}
天数 <input type="number" name="days" min="1" max="3650" value="30">
天数 <input class="form-control form-control-sm" type="number" name="days" min="1" max="3650" value="30">
</label>
<label class="inline-field" data-count-wrap hidden>
次数 <input type="number" name="total_count" min="1" max="10000" value="10">
次数 <input class="form-control form-control-sm" type="number" name="total_count" min="1" max="10000" value="10">
</label>
<label class="inline-field" data-end-wrap>
终止日(可留空)<input type="date" name="end_date">
终止日(可留空)<input class="form-control form-control-sm" type="date" name="end_date">
</label>
<button class="btn btn-primary" type="submit">开通订阅</button>
</form>
+6 -6
View File
@@ -26,16 +26,16 @@
</header>
<section class="scr-kpis">
<div class="kpi">
<div class="kpi card bg-body-tertiary border-secondary-subtle">
<span>客户</span><b>{{.D.Stats.Customers}}</b><i>位</i>
</div>
<div class="kpi">
<span>活跃订阅</span><b>{{.D.Stats.ActiveSubs}}</b><i>条</i>
</div>
<div class="kpi kpi-hot">
<div class="kpi kpi-hot card bg-body-tertiary border-secondary-subtle">
<span>今日到期</span><b>{{.D.Stats.DueToday}}</b><i>条</i>
</div>
<div class="kpi kpi-warm">
<div class="kpi kpi-warm card bg-body-tertiary border-secondary-subtle">
<span>7 天内到期</span><b>{{.D.Stats.Due7}}</b><i>条</i>
</div>
</section>
@@ -72,7 +72,7 @@
<div class="panel panel-top card bg-body-tertiary border-secondary-subtle">
<div class="panel-head"><h2>即将到期 TOP 10</h2><span>按剩余量排序</span></div>
{{if .D.Top}}
<ol class="top-list">
<ol class="top-list list-group list-group-flush">
{{range $i, $s := .D.Top}}
<li class="top-item lv-{{$s.Eval.Level}}">
<span class="rank">{{add $i 1}}</span>
@@ -97,7 +97,7 @@
<span>{{len .D.DueToday}} 条</span>
</div>
{{if .D.DueToday}}
<ul class="today-list">
<ul class="today-list list-group list-group-flush">
{{range .D.DueToday}}
<li class="lv-{{.Eval.Level}}">
<span class="tchip" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
@@ -123,7 +123,7 @@
<span class="tchip" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
<span class="pkg">{{.PackageName}}</span>
<span class="asg{{if .AssigneeNone}} none{{end}}"><i style="background:{{.AssigneeHex}}"></i>{{.AssigneeLabel}}</span>
{{if .Urgent}}<span class="tag-urgent">加急</span>{{end}}
{{if .Urgent}}<span class="badge text-bg-danger tag-urgent">加急</span>{{end}}
<span class="rem">{{.RemainShort}}</span>
</li>
{{end}}