diff --git a/apps/web/app/components/console/account-menu.tsx b/apps/web/app/components/console/account-menu.tsx index 2f5d6471..65d949b4 100644 --- a/apps/web/app/components/console/account-menu.tsx +++ b/apps/web/app/components/console/account-menu.tsx @@ -277,7 +277,7 @@ export function AccountMenu({ session }: { session: SessionInfo }) { {actor?.name ?? "账户"} - +

当前账户

{actor?.name ?? "—"}

diff --git a/apps/web/app/components/console/form-field.tsx b/apps/web/app/components/console/form-field.tsx index 06235624..872f2000 100644 --- a/apps/web/app/components/console/form-field.tsx +++ b/apps/web/app/components/console/form-field.tsx @@ -27,7 +27,8 @@ export function FormField({ className?: string; }) { return ( -
+ // pb-1:说明文字与下一个字段标签至少隔 8px(外层 gap-1 + 这里 4px;QA U5) +
) : null} diff --git a/apps/web/app/routes/console/inbox.tsx b/apps/web/app/routes/console/inbox.tsx index 1028ef59..8f3ebd58 100644 --- a/apps/web/app/routes/console/inbox.tsx +++ b/apps/web/app/routes/console/inbox.tsx @@ -1,13 +1,14 @@ import { useQueryClient } from "@tanstack/react-query"; import type { Decision, DecisionKind, DecisionOption, DecisionStatus } from "@umt/contracts"; import { BellOff, Bot, CheckCheck, ChevronRight, Inbox, Radio, RotateCw } from "lucide-react"; -import { type ReactNode, useMemo, useRef, useState } from "react"; +import { type ReactNode, useId, useMemo, useRef, useState } from "react"; import { Link, useSearchParams } from "react-router"; import { toast } from "sonner"; import { decisionKeys, useDecisionSummary, useDecisions, useResolveDecision } from "~/api/decisions.ts"; import { ConfirmDialog } from "~/components/console/confirm-dialog.tsx"; import { EmptyState, ErrorState, LoadingState } from "~/components/console/empty-state.tsx"; import { FilterBar, FilterSelect } from "~/components/console/filter-bar.tsx"; +import { FormField } from "~/components/console/form-field.tsx"; import { JsonView } from "~/components/console/json-view.tsx"; import { consolePath } from "~/components/console/nav.ts"; import { PageHeader } from "~/components/console/page-header.tsx"; @@ -18,6 +19,7 @@ import { DECISION_KIND, DECISION_STATUS, opts, SEVERITY } from "~/components/lib import { Chip, relTime, Tone } from "~/components/library/parts.tsx"; import { Button } from "~/components/ui/button.tsx"; import { Input } from "~/components/ui/input.tsx"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/components/ui/select.tsx"; import { Textarea } from "~/components/ui/textarea.tsx"; import { errorMessage } from "~/lib/api.ts"; import { actorText } from "~/lib/labels.ts"; @@ -111,6 +113,7 @@ function requiresOf(option: DecisionOption): Requires { function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) { const resolve = useResolveDecision(); + const uid = useId(); const [note, setNote] = useState(""); const requires = requiresOf(option); const [tmdbType, setTmdbType] = useState<"movie" | "tv">("movie"); @@ -161,28 +164,36 @@ function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) { } > {requires === "tmdb" ? ( -
- - setTmdbId(e.target.value)} - placeholder="TMDB ID,如 872585" - /> +
+ + + + + setTmdbId(e.target.value)} + aria-invalid={tmdbId.trim() !== "" && !tmdbOk} + /> +
) : requires === "mediaEntityId" ? ( - + + + ) : null} -