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:
@@ -1119,3 +1119,10 @@ fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
|
|||||||
background: var(--surface-2);
|
background: var(--surface-2);
|
||||||
}
|
}
|
||||||
.subcard.is-closed:hover { opacity: 0.8; }
|
.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; }
|
||||||
|
|||||||
@@ -83,7 +83,7 @@
|
|||||||
<input type="hidden" name="pkg" value="{{.D.PkgID}}">
|
<input type="hidden" name="pkg" value="{{.D.PkgID}}">
|
||||||
<input type="hidden" name="tag" value="{{.D.Tag}}">
|
<input type="hidden" name="tag" value="{{.D.Tag}}">
|
||||||
<input type="hidden" name="back" value="{{.D.Back}}">
|
<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 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>
|
<button type="button" class="btn btn-sm btn-ghost keypad-toggle" data-keypad-toggle title="切换触控/PC 模式" aria-label="切换触控/PC 模式">⌨</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
<input type="hidden" name="back" value="{{.D.Back}}">
|
<input type="hidden" name="back" value="{{.D.Back}}">
|
||||||
<ul class="pick-list">
|
<ul class="pick-list">
|
||||||
{{range .D.PickRows}}
|
{{range .D.PickRows}}
|
||||||
<li>
|
<li class="list-group-item px-0">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" name="sub_ids" value="{{.ID}}"{{if not .Done}}{{if not .Skipped}} checked{{end}}{{end}}>
|
<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>
|
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
||||||
@@ -139,16 +139,16 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{if .D.Tasks}}
|
{{if .D.Tasks}}
|
||||||
<ul class="task-list">
|
<ul class="list-group list-group-flush task-list">
|
||||||
{{range .D.Tasks}}
|
{{range .D.Tasks}}
|
||||||
{{if or .Done .Skipped}}
|
{{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">
|
<details class="done-fold">
|
||||||
<summary>
|
<summary>
|
||||||
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
||||||
<span class="pkg">{{.PackageName}}</span>
|
<span class="pkg">{{.PackageName}}</span>
|
||||||
<span class="chip {{if .Done}}chip-active{{else}}chip-paused{{end}}">{{if .Done}}已完成{{else}}已跳过{{end}}</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>
|
<span class="fold-caret" aria-hidden="true"></span>
|
||||||
</summary>
|
</summary>
|
||||||
<div class="done-detail">
|
<div class="done-detail">
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
</details>
|
</details>
|
||||||
</li>
|
</li>
|
||||||
{{else}}
|
{{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">
|
<div class="task-main">
|
||||||
<a class="task-title" href="/customers/{{.CustomerID}}">
|
<a class="task-title" href="/customers/{{.CustomerID}}">
|
||||||
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
<span class="ticket" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
<section class="drawer-block">
|
<section class="drawer-block">
|
||||||
<h3>这天到期 <em>{{len .D.Due}}</em></h3>
|
<h3>这天到期 <em>{{len .D.Due}}</em></h3>
|
||||||
{{if .D.Due}}
|
{{if .D.Due}}
|
||||||
<ul class="due-list">
|
<ul class="list-group list-group-flush due-list">
|
||||||
{{range .D.Due}}
|
{{range .D.Due}}
|
||||||
<li>
|
<li>
|
||||||
<a class="due-main" href="/customers/{{.CustomerID}}">
|
<a class="due-main" href="/customers/{{.CustomerID}}">
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
|
|
||||||
{{if .D.Packages}}
|
{{if .D.Packages}}
|
||||||
<form method="post" action="/customers/{{.D.Customer.ID}}/subscriptions" class="inline-form" data-sub-form>
|
<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>
|
<option value="">选择套餐…</option>
|
||||||
{{range .D.Packages}}
|
{{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}}>
|
<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}}
|
{{end}}
|
||||||
</select>
|
</select>
|
||||||
<label class="inline-field" data-start-wrap>开始日
|
<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>
|
||||||
<label class="inline-field" data-days-wrap>{{/* 默认显示 */}}
|
<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>
|
||||||
<label class="inline-field" data-count-wrap hidden>
|
<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>
|
||||||
<label class="inline-field" data-end-wrap>
|
<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>
|
</label>
|
||||||
<button class="btn btn-primary" type="submit">开通订阅</button>
|
<button class="btn btn-primary" type="submit">开通订阅</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -26,16 +26,16 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<section class="scr-kpis">
|
<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>
|
<span>客户</span><b>{{.D.Stats.Customers}}</b><i>位</i>
|
||||||
</div>
|
</div>
|
||||||
<div class="kpi">
|
<div class="kpi">
|
||||||
<span>活跃订阅</span><b>{{.D.Stats.ActiveSubs}}</b><i>条</i>
|
<span>活跃订阅</span><b>{{.D.Stats.ActiveSubs}}</b><i>条</i>
|
||||||
</div>
|
</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>
|
<span>今日到期</span><b>{{.D.Stats.DueToday}}</b><i>条</i>
|
||||||
</div>
|
</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>
|
<span>7 天内到期</span><b>{{.D.Stats.Due7}}</b><i>条</i>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
<div class="panel panel-top card bg-body-tertiary border-secondary-subtle">
|
<div class="panel panel-top card bg-body-tertiary border-secondary-subtle">
|
||||||
<div class="panel-head"><h2>即将到期 TOP 10</h2><span>按剩余量排序</span></div>
|
<div class="panel-head"><h2>即将到期 TOP 10</h2><span>按剩余量排序</span></div>
|
||||||
{{if .D.Top}}
|
{{if .D.Top}}
|
||||||
<ol class="top-list">
|
<ol class="top-list list-group list-group-flush">
|
||||||
{{range $i, $s := .D.Top}}
|
{{range $i, $s := .D.Top}}
|
||||||
<li class="top-item lv-{{$s.Eval.Level}}">
|
<li class="top-item lv-{{$s.Eval.Level}}">
|
||||||
<span class="rank">{{add $i 1}}</span>
|
<span class="rank">{{add $i 1}}</span>
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
<span>{{len .D.DueToday}} 条</span>
|
<span>{{len .D.DueToday}} 条</span>
|
||||||
</div>
|
</div>
|
||||||
{{if .D.DueToday}}
|
{{if .D.DueToday}}
|
||||||
<ul class="today-list">
|
<ul class="today-list list-group list-group-flush">
|
||||||
{{range .D.DueToday}}
|
{{range .D.DueToday}}
|
||||||
<li class="lv-{{.Eval.Level}}">
|
<li class="lv-{{.Eval.Level}}">
|
||||||
<span class="tchip" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
<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="tchip" style="--tag:{{.PackageColor}}"><b>{{.CustomerTail}}</b>{{.CustomerName}}</span>
|
||||||
<span class="pkg">{{.PackageName}}</span>
|
<span class="pkg">{{.PackageName}}</span>
|
||||||
<span class="asg{{if .AssigneeNone}} none{{end}}"><i style="background:{{.AssigneeHex}}"></i>{{.AssigneeLabel}}</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>
|
<span class="rem">{{.RemainShort}}</span>
|
||||||
</li>
|
</li>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
Reference in New Issue
Block a user