编辑器存量 rubric 徽标/题型切换清理/分值输入修复(最终复核 R1-R3)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-08-20 14:57:40 +08:00
co-authored by Claude Haiku 4.5
parent 5e4904742a
commit 5ce33f3edf
2 changed files with 17 additions and 4 deletions
@@ -61,6 +61,18 @@ describe("QuestionList 结构化编辑", () => {
expect(screen.getByText("AI 逐评分点判分(存量题,保留原评分点)")).toBeInTheDocument();
});
it("编辑存量无 judgeMode 字段的题显示 AI 判分徽标与必填参考解答语义", () => {
render(
<QuestionList
value={[{ type: "solve", stem: "解方程", points: 10, reference: "x=2", rubric: [{ point: "过程", score: 6 }], explain: "e" }]}
onChange={() => {}}
/>,
);
fireEvent.click(screen.getByLabelText("编辑第 1 题"));
expect(screen.getByText("AI 逐评分点判分(存量题,保留原评分点)")).toBeInTheDocument();
expect(screen.getByText("参考解答(完整解题过程,展示给孩子)")).toBeInTheDocument();
});
it("题干为空保存时报错,不写入列表", async () => {
const user = userEvent.setup();
let saved: QuizQ[] = [];
+5 -4
View File
@@ -110,7 +110,7 @@ export function QuestionList({
aria-label="题型"
onChange={(e) => {
const t = e.target.value as QuizQ["type"];
update({ type: t, options: undefined, answers: undefined, reference: undefined, judgeMode: undefined, points: undefined, ...(t === "solve" ? { judgeMode: "answer", points: 10 } : {}) });
update({ type: t, options: undefined, answers: undefined, reference: undefined, rubric: undefined, judgeMode: undefined, points: undefined, ...(t === "solve" ? { judgeMode: "answer", points: 10 } : {}) });
}}
className="ml-2 h-8 rounded-lg border border-slate-200 bg-white px-2 text-sm"
>
@@ -205,15 +205,16 @@ export function QuestionList({
aria-label="分值"
type="number"
min={1}
value={draft.points ?? 10}
placeholder="10"
value={draft.points ?? ""}
onChange={(e) => update({ points: Number(e.target.value) || undefined })}
/>
</div>
<div className="rounded-md bg-slate-50 px-3 py-2 text-xs text-slate-600">
{draft.judgeMode === "rubric" ? "AI 逐评分点判分(存量题,保留原评分点)" : "仅最终答案(秒判)"}
{draft.judgeMode === "answer" ? "仅最终答案(秒判)" : "AI 逐评分点判分(存量题,保留原评分点)"}
</div>
<div className="space-y-1">
<Label>参考解答(可选,给孩子看)</Label>
<Label>{draft.judgeMode === "answer" ? "参考解答(可选,给孩子看)" : "参考解答(完整解题过程,展示给孩子)"}</Label>
<Input aria-label="参考解答" value={draft.reference ?? ""} onChange={(e) => update({ reference: e.target.value })} />
</div>
</div>