fix(admin): sync moderation status dropdown

This commit is contained in:
iamxvbaba 2026-07-26 22:44:01 +08:00
parent 8b866b2bb2
commit b742450938
8 changed files with 41 additions and 11 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -21,8 +21,8 @@
} }
})(); })();
</script> </script>
<script type="module" crossorigin src="/assets/index-DRjvnVte.js"></script> <script type="module" crossorigin src="/assets/index-DJw3UpEg.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BwxAoLbQ.css"> <link rel="stylesheet" crossorigin href="/assets/index-D5Lc7N2D.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View file

@ -459,7 +459,9 @@ const translations: Record<Language, Record<string, string>> = {
"moderation.currentQueue": "Current queue", "moderation.currentQueue": "Current queue",
"moderation.criticalCases": "Critical cases", "moderation.criticalCases": "Critical cases",
"moderation.pendingOrFailed": "Pending / failed actions", "moderation.pendingOrFailed": "Pending / failed actions",
"moderation.statusFilter": "Case status filter (comma-separated identifiers)", "moderation.statusFilter": "Case status filter",
"moderation.statusFilter.active": "Active queue",
"moderation.statusFilter.all": "All statuses",
"moderation.assignee": "Reviewer", "moderation.assignee": "Reviewer",
"moderation.allAssignees": "Leave blank for all", "moderation.allAssignees": "Leave blank for all",
"moderation.case": "Case", "moderation.case": "Case",
@ -1043,7 +1045,9 @@ const translations: Record<Language, Record<string, string>> = {
"moderation.currentQueue": "当前队列", "moderation.currentQueue": "当前队列",
"moderation.criticalCases": "关键案件", "moderation.criticalCases": "关键案件",
"moderation.pendingOrFailed": "处置待完成 / 失败", "moderation.pendingOrFailed": "处置待完成 / 失败",
"moderation.statusFilter": "案件状态筛选(英文标识以逗号分隔)", "moderation.statusFilter": "案件状态筛选",
"moderation.statusFilter.active": "活跃队列",
"moderation.statusFilter.all": "全部状态",
"moderation.assignee": "审核人", "moderation.assignee": "审核人",
"moderation.allAssignees": "留空为全部", "moderation.allAssignees": "留空为全部",
"moderation.case": "案件", "moderation.case": "案件",
@ -1627,7 +1631,9 @@ const translations: Record<Language, Record<string, string>> = {
"moderation.currentQueue": "Текущая очередь", "moderation.currentQueue": "Текущая очередь",
"moderation.criticalCases": "Критические обращения", "moderation.criticalCases": "Критические обращения",
"moderation.pendingOrFailed": "Ожидающие / неудачные действия", "moderation.pendingOrFailed": "Ожидающие / неудачные действия",
"moderation.statusFilter": "Фильтр по статусу (идентификаторы через запятую)", "moderation.statusFilter": "Фильтр по статусу обращения",
"moderation.statusFilter.active": "Активная очередь",
"moderation.statusFilter.all": "Все статусы",
"moderation.assignee": "Модератор", "moderation.assignee": "Модератор",
"moderation.allAssignees": "Оставьте пустым для всех", "moderation.allAssignees": "Оставьте пустым для всех",
"moderation.case": "Обращение", "moderation.case": "Обращение",

View file

@ -8,6 +8,18 @@ import type { Navigate } from "../routing";
import type { ModerationCaseRow } from "../types"; import type { ModerationCaseRow } from "../types";
const defaultStatuses = "open,in_review,action_pending,action_failed,appeal_review"; const defaultStatuses = "open,in_review,action_pending,action_failed,appeal_review";
const allStatuses = "open,in_review,action_pending,action_failed,resolved,dismissed,appeal_review";
const statusFilterOptions = [
{ value: defaultStatuses, labelKey: "moderation.statusFilter.active" },
{ value: allStatuses, labelKey: "moderation.statusFilter.all" },
{ value: "open", labelKey: "moderation.status.open" },
{ value: "in_review", labelKey: "moderation.status.in_review" },
{ value: "action_pending", labelKey: "moderation.status.action_pending" },
{ value: "action_failed", labelKey: "moderation.status.action_failed" },
{ value: "appeal_review", labelKey: "moderation.status.appeal_review" },
{ value: "resolved", labelKey: "moderation.status.resolved" },
{ value: "dismissed", labelKey: "moderation.status.dismissed" }
];
export function ModerationCasesPage({ navigate }: { navigate: Navigate }) { export function ModerationCasesPage({ navigate }: { navigate: Navigate }) {
const { t } = useI18n(); const { t } = useI18n();
@ -58,11 +70,15 @@ export function ModerationCasesPage({ navigate }: { navigate: Navigate }) {
<form className="toolbar" onSubmit={(event) => { event.preventDefault(); void load(); }}> <form className="toolbar" onSubmit={(event) => { event.preventDefault(); void load(); }}>
<label className="field-inline"> <label className="field-inline">
<span>{t("common.status")}</span> <span>{t("common.status")}</span>
<input <select
aria-label={t("moderation.statusFilter")} aria-label={t("moderation.statusFilter")}
value={statuses} value={statuses}
onChange={(event) => setStatuses(event.target.value)} onChange={(event) => setStatuses(event.target.value)}
/> >
{statusFilterOptions.map((option) => (
<option key={option.value} value={option.value}>{t(option.labelKey)}</option>
))}
</select>
</label> </label>
<label className="field-inline"> <label className="field-inline">
<span>{t("moderation.assignee")}</span> <span>{t("moderation.assignee")}</span>

View file

@ -174,6 +174,7 @@ body {
button, button,
input, input,
select,
textarea { textarea {
font: inherit; font: inherit;
} }

View file

@ -325,6 +325,7 @@
} }
input, input,
select,
textarea { textarea {
color: var(--text); color: var(--text);
background: var(--input-bg); background: var(--input-bg);
@ -339,12 +340,17 @@ textarea::placeholder {
color: var(--muted-2); color: var(--muted-2);
} }
input { input,
select {
width: 190px; width: 190px;
height: 34px; height: 34px;
padding: 0 10px; padding: 0 10px;
} }
select {
min-width: 220px;
}
textarea { textarea {
width: 100%; width: 100%;
padding: 9px 10px; padding: 9px 10px;
@ -352,6 +358,7 @@ textarea {
} }
input:focus, input:focus,
select:focus,
textarea:focus { textarea:focus {
border-color: var(--brand); border-color: var(--brand);
box-shadow: 0 0 0 3px var(--focus); box-shadow: 0 0 0 3px var(--focus);