From 4dd2f9280ff6c903b95cc2624ee4e71fc8afec05 Mon Sep 17 00:00:00 2001 From: JetSprow Date: Fri, 1 May 2026 00:58:46 +1000 Subject: [PATCH] polish: refine admin ui controls --- .../admin/announcements/announcement-form.tsx | 242 +++++++++++------- .../_components/discount-type-select.tsx | 45 ++++ src/app/(admin)/admin/commerce/page.tsx | 16 +- src/app/(admin)/admin/nodes/node-actions.tsx | 4 +- src/app/(admin)/admin/nodes/node-form.tsx | 27 +- .../(admin)/admin/payments/config-form.tsx | 29 ++- .../admin/plans/plan-basics-section.tsx | 24 +- src/app/(admin)/admin/plans/plan-form.tsx | 22 +- .../admin/plans/plan-policy-section.tsx | 34 +-- .../admin/plans/proxy-config-section.tsx | 30 +-- .../admin/plans/streaming-config-section.tsx | 4 +- .../(admin)/admin/services/service-form.tsx | 29 ++- .../(admin)/admin/settings/settings-form.tsx | 55 ++-- .../_components/support-ticket-meta-form.tsx | 35 +-- .../support-ticket-meta-selects.tsx | 77 ++++++ src/app/(admin)/admin/users/user-form.tsx | 31 ++- .../(user)/store/latency-detail-dialog.tsx | 2 +- src/app/(user)/store/proxy-detail-dialog.tsx | 16 +- .../store/proxy-trace-detail-dialog.tsx | 2 +- .../(user)/store/streaming-detail-dialog.tsx | 11 +- .../_components/renewal-button.tsx | 2 +- .../_components/traffic-topup-dialog.tsx | 2 +- .../create-support-ticket-form.tsx | 41 ++- src/components/admin/filter-bar.tsx | 76 ++++-- .../shared/confirm-action-button.tsx | 2 +- .../subscription-risk-review-actions.tsx | 2 +- src/components/ui/boolean-toggle.tsx | 14 +- src/components/ui/dialog.tsx | 66 ++++- src/components/ui/input.tsx | 2 +- src/components/ui/select.tsx | 16 +- 30 files changed, 651 insertions(+), 307 deletions(-) create mode 100644 src/app/(admin)/admin/commerce/_components/discount-type-select.tsx create mode 100644 src/app/(admin)/admin/support/_components/support-ticket-meta-selects.tsx diff --git a/src/app/(admin)/admin/announcements/announcement-form.tsx b/src/app/(admin)/admin/announcements/announcement-form.tsx index 016ce3a..5de5acb 100644 --- a/src/app/(admin)/admin/announcements/announcement-form.tsx +++ b/src/app/(admin)/admin/announcements/announcement-form.tsx @@ -15,6 +15,7 @@ import { BooleanToggle } from "@/components/ui/boolean-toggle"; import { Button } from "@/components/ui/button"; import { Dialog, + DialogBody, DialogContent, DialogHeader, DialogTitle, @@ -22,6 +23,13 @@ import { } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { getErrorMessage } from "@/lib/errors"; @@ -43,6 +51,32 @@ interface AnnouncementFormData { endAt: Date | string | null; } +const audienceLabels: Record = { + PUBLIC: "公开", + USERS: "全部用户", + ADMINS: "全部管理员", + SPECIFIC_USER: "指定用户", +}; + +const displayTypeLabels: Record = { + INLINE: "普通公告", + BIG: "大公告", + POPUP: "弹窗公告", +}; + +function getAudienceLabel(value: unknown) { + return audienceLabels[value as AnnouncementAudience] ?? "选择范围"; +} + +function getDisplayTypeLabel(value: unknown) { + return displayTypeLabels[value as AnnouncementDisplayType] ?? "选择展示方式"; +} + +function getTargetUserLabel(users: AnnouncementOptionUser[], value: unknown) { + if (!value) return "不指定"; + return users.find((user) => user.id === value)?.email ?? "选择用户"; +} + function toDateTimeLocalValue(value: Date | string | null) { if (!value) { return ""; @@ -94,48 +128,55 @@ export function AnnouncementForm({ }> {triggerLabel ?? "编辑"} - - + + 编辑公告 -
-
-
+ + +
+
-
+
- + + {(value) => getAudienceLabel(value)} + + + 公开(登录/注册页可见) + 全部用户 + 全部管理员 + 指定用户 + +
-
-
+
+
- + + {(value) => getDisplayTypeLabel(value)} + + + 普通公告 + 大公告 + 弹窗公告 + +
-
+
-
+
- + + {(value) => getTargetUserLabel(users, value)} + + + 不指定 + {users.map((user) => ( + + {user.email} + + ))} + +
-
+