feat: 统一 Admin 主列表分页 (#64)

This commit is contained in:
chengma
2026-08-09 21:51:20 +08:00
parent 5c9ebd968c
commit 155dd3b4a2
23 changed files with 549 additions and 120 deletions
+9 -1
View File
@@ -10,6 +10,8 @@
{{if .CurrentUser.IsAdmin}}<form class="inline" id="client-delete-form" method="post" action="/clients/delete" data-confirm-delete>
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="name" value="{{.Keyword}}">
<input type="hidden" name="page" value="{{.CurrentPage}}">
<button type="submit" class="danger" data-need-checked>删除</button>
</form>{{end}}
</div>
@@ -55,6 +57,8 @@
data-confirm-submit="确定解绑客户端“{{.Name}}”吗?采购员“{{.AssignedUsername}}”将立即看不到它;归属历史和既有任务会保留。">
<input type="hidden" name="csrf_token" value="{{$.CSRFToken}}">
<input type="hidden" name="client_id" value="{{.ClientID}}">
<input type="hidden" name="name" value="{{$.Keyword}}">
<input type="hidden" name="page" value="{{$.CurrentPage}}">
<button type="submit" class="danger">解绑</button>
</form>{{end}}
</div>
@@ -63,7 +67,9 @@
{{else}}
<tr class="empty">
<td colspan="{{if $.CurrentUser.IsAdmin}}8{{else}}6{{end}}">
{{if $.CurrentUser.IsAdmin}}还没有客户端。<br>
{{if $.IsFiltered}}当前筛选条件下没有客户端。<br>
<small>换个名称或清空搜索词再试。<a href="/clients">查看全部</a></small>
{{else if $.CurrentUser.IsAdmin}}还没有客户端。<br>
<small>客户端第一次调用领取接口时会自动登记到这里,不需要手工添加。</small>
{{else}}当前没有绑定给你的客户端。<br><small>如需使用客户端,请联系管理员绑定。</small>{{end}}
</td>
@@ -99,6 +105,8 @@
<p class="hint" data-assignment-note>绑定只改变负责人和网页可见范围,不影响 Client 接口或既有任务。</p>
<input type="hidden" name="client_id" data-assign-client-id-input>
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="name" value="{{.Keyword}}">
<input type="hidden" name="page" value="{{.CurrentPage}}">
</div>
<div class="modal-foot">
<button type="button" data-modal-close>取消</button>
+1 -1
View File
@@ -1,7 +1,7 @@
{{define "footer"}}
</main>
{{/* 底部状态条:三段式布局的第三段,五个页面都有。
{{/* 底部状态条:三段式布局的第三段,六个主列表都有。
Pagination 是可选的(只有做了分页的页面才传),
没做分页的页面不受影响,见 docs/admin/05-ui-specification.md §3.2。
+6
View File
@@ -16,11 +16,17 @@
<form id="pdd-recollect-form" method="post" action="/pdd/collect" hidden>
<input type="hidden" name="csrf_token" value="{{$.CSRFToken}}">
<input type="hidden" name="ids" value="{{.GoodsID}}">
<input type="hidden" name="status" value="{{$.StatusFilter}}">
<input type="hidden" name="q" value="{{$.Keyword}}">
<input type="hidden" name="page" value="{{$.CurrentPage}}">
</form>
<form method="post" action="/pdd/save">
<input type="hidden" name="csrf_token" value="{{$.CSRFToken}}">
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="status" value="{{$.StatusFilter}}">
<input type="hidden" name="q" value="{{$.Keyword}}">
<input type="hidden" name="page" value="{{$.CurrentPage}}">
<div class="modal-body">
<dl class="detail">
+3 -1
View File
@@ -16,6 +16,7 @@
{{/* 把当前筛选一起带过去,操作完还停在原来的筛选上 */}}
<input type="hidden" name="status" value="{{.StatusFilter}}" form="pdd-form">
<input type="hidden" name="q" value="{{.Keyword}}" form="pdd-form">
<input type="hidden" name="page" value="{{.CurrentPage}}" form="pdd-form">
{{/* 文案是「创建采集任务」不是「采集」:点完只是排了个队,
真正去手机上采要等客户端来领,可能几秒也可能几分钟 */}}
@@ -117,6 +118,7 @@
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="status" value="{{.StatusFilter}}">
<input type="hidden" name="q" value="{{.Keyword}}">
<input type="hidden" name="page" value="{{.CurrentPage}}">
<div class="modal-body">
<div class="field">
<label for="create-url">PDD 链接</label>
@@ -139,7 +141,7 @@
{{/* ── 编辑弹窗的壳子 ───────────────────────────
里面的内容双击行时由 /pdd/detail 返回,前端只负责放进来和显示。 */}}
<div class="modal-backdrop" id="detail-modal" data-detail-url="/pdd/detail" hidden>
<div class="modal-backdrop" id="detail-modal" data-detail-url="{{.DetailURL}}" hidden>
<div class="modal" role="dialog" aria-modal="true" data-detail-slot>
<div class="modal-body">正在加载…</div>
</div>
+1
View File
@@ -37,6 +37,7 @@
<input type="hidden" name="type" value="{{.TypeFilter}}" form="task-form">
<input type="hidden" name="status" value="{{.StatusFilter}}" form="task-form">
<input type="hidden" name="q" value="{{.Keyword}}" form="task-form">
<input type="hidden" name="page" value="{{.CurrentPage}}" form="task-form">
<button type="submit" form="task-form" formaction="/tasks/delete" class="danger"
data-need-checked
+9
View File
@@ -50,6 +50,9 @@
<input type="hidden" name="csrf_token" value="{{$.CSRFToken}}">
<input type="hidden" name="user_id" value="{{.UserID}}">
<input type="hidden" name="status" value="{{if .IsActive}}disabled{{else}}active{{end}}">
<input type="hidden" name="q" value="{{$.Keyword}}">
<input type="hidden" name="list_status" value="{{$.StatusFilter}}">
<input type="hidden" name="page" value="{{$.CurrentPage}}">
<button type="submit" {{if .IsActive}}class="danger"{{end}}>{{if .IsActive}}禁用{{else}}启用{{end}}</button>
</form>
<button type="button" data-modal-open="reset-password-modal"
@@ -96,6 +99,9 @@
minlength="6" maxlength="72" required autocomplete="new-password">
</div>
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="q" value="{{.Keyword}}">
<input type="hidden" name="list_status" value="{{.StatusFilter}}">
<input type="hidden" name="page" value="{{.CurrentPage}}">
</div>
<div class="modal-foot">
<button type="button" data-modal-close>取消</button>
@@ -128,6 +134,9 @@
</div>
<input type="hidden" name="user_id" data-reset-user-id-input>
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="q" value="{{.Keyword}}">
<input type="hidden" name="list_status" value="{{.StatusFilter}}">
<input type="hidden" name="page" value="{{.CurrentPage}}">
</div>
<div class="modal-foot">
<button type="button" data-modal-close>取消</button>