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

View file

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

View file

@ -8,6 +8,18 @@ import type { Navigate } from "../routing";
import type { ModerationCaseRow } from "../types";
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 }) {
const { t } = useI18n();
@ -58,11 +70,15 @@ export function ModerationCasesPage({ navigate }: { navigate: Navigate }) {
<form className="toolbar" onSubmit={(event) => { event.preventDefault(); void load(); }}>
<label className="field-inline">
<span>{t("common.status")}</span>
<input
<select
aria-label={t("moderation.statusFilter")}
value={statuses}
onChange={(event) => setStatuses(event.target.value)}
/>
>
{statusFilterOptions.map((option) => (
<option key={option.value} value={option.value}>{t(option.labelKey)}</option>
))}
</select>
</label>
<label className="field-inline">
<span>{t("moderation.assignee")}</span>

View file

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

View file

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