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}
-