From 6fba565fcb39c0482e0793fe0d0a778294f60a03 Mon Sep 17 00:00:00 2001 From: Chaim Date: Fri, 12 Jun 2026 06:57:18 +0000 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D7=AA=D7=A8=D7=92=D7=95=D7=9D=20?= =?UTF-8?q?=D7=A2=D7=91=D7=A8=D7=99=D7=AA=20=D7=9C=D7=A1=D7=98=D7=98=D7=95?= =?UTF-8?q?=D7=A1=D7=99-=D7=AA=D7=99=D7=A7=20in=5Fprogress=20+=20qa=5Ffail?= =?UTF-8?q?ed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit הבאג: ה-StatusBadge מציג מחרוזת גולמית באנגלית ("in_progress") כשהשרת פולט סטטוס שאינו במפת-התוויות. CaseStatus ב-web-ui החסיר שני סטטוסים שהשרת אכן פולט — in_progress (workflow.set_outcome) ו-qa_failed (app.py human-gate) — ולכן נפלו ל-fallback `?? status` (אנגלית גולמית). התיקון (יישור frontend↔backend SoT, X6 UI-API contract): - CaseStatus type: הוספת "in_progress" + "qa_failed". - status-badge.tsx: 4 מפות Record — LABELS (בעבודה / בדיקת איכות נכשלה), ICONS (Hammer / AlertTriangle), DESCRIPTIONS, TONE (warn / danger). - status-donut.tsx: GROUP_OF — in_progress→intake, qa_failed→writing. ללא שינוי-עיצוב ויזואלי (תיקון-תוכן/i18n של רכיב קיים) → חוסה תחת החריג המפורש בשער-העיצוב ב-web-ui/AGENTS.md. invariants: מקיים X6 (UI↔API contract — הטיפוס תואם לסטטוסי-השרת); לא G2 (אין מסלול מקביל), לא G1-symptom (מתקן את מקור-הדריפט בטיפוס). tsc --noEmit עובר נקי. Co-Authored-By: Claude Opus 4.8 (1M context) --- web-ui/src/components/cases/status-badge.tsx | 10 +++++++++- web-ui/src/components/cases/status-donut.tsx | 4 ++-- web-ui/src/lib/api/cases.ts | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/web-ui/src/components/cases/status-badge.tsx b/web-ui/src/components/cases/status-badge.tsx index 8c34c01..4a0e8c1 100644 --- a/web-ui/src/components/cases/status-badge.tsx +++ b/web-ui/src/components/cases/status-badge.tsx @@ -3,13 +3,14 @@ import { FilePlus2, Upload, Loader2, FileCheck, Target, Lightbulb, Compass, PenLine, SearchCheck, FileText, FileOutput, CheckCircle2, Award, ShieldCheck, BookOpen, - Microscope, PlayCircle, + Microscope, PlayCircle, Hammer, AlertTriangle, } from "lucide-react"; import type { CaseStatus } from "@/lib/api/cases"; import type { LucideIcon } from "lucide-react"; const STATUS_LABELS: Record = { new: "חדש", + in_progress: "בעבודה", uploading: "מעלה", processing: "בעיבוד", documents_ready: "מסמכים מוכנים", @@ -22,6 +23,7 @@ const STATUS_LABELS: Record = { ready_for_writing: "מוכן לכתיבה", drafting: "בכתיבה", qa_review: "בדיקת איכות", + qa_failed: "בדיקת איכות נכשלה", drafted: "טיוטה", exported: "יוצא", reviewed: "נבדק", @@ -30,6 +32,7 @@ const STATUS_LABELS: Record = { const STATUS_ICONS: Record = { new: FilePlus2, + in_progress: Hammer, uploading: Upload, processing: Loader2, documents_ready: FileCheck, @@ -42,6 +45,7 @@ const STATUS_ICONS: Record = { ready_for_writing: PlayCircle, drafting: PenLine, qa_review: SearchCheck, + qa_failed: AlertTriangle, drafted: FileText, exported: FileOutput, reviewed: CheckCircle2, @@ -50,6 +54,7 @@ const STATUS_ICONS: Record = { const STATUS_DESCRIPTIONS: Record = { new: "התיק נוצר וממתין להעלאת מסמכים", + in_progress: "התיק בעבודה", uploading: "מסמכים בתהליך העלאה לשרת", processing: "המערכת מעבדת ומנתחת את המסמכים", documents_ready: "כל המסמכים עובדו ומוכנים לעבודה", @@ -62,6 +67,7 @@ const STATUS_DESCRIPTIONS: Record = { ready_for_writing: "הכל מוכן — ממתין לכותב ההחלטה", drafting: "טיוטת ההחלטה בתהליך כתיבה", qa_review: "הטיוטה בבדיקת איכות אוטומטית", + qa_failed: "בדיקת האיכות נכשלה — נדרש תיקון", drafted: "טיוטה מוכנה לעיון", exported: "ההחלטה יוצאה לקובץ DOCX", reviewed: "ההחלטה נבדקה ע\"י היו\"ר", @@ -76,6 +82,7 @@ const STATUS_DESCRIPTIONS: Record = { * done → exported, reviewed, final (success green) */ const STATUS_TONE: Record = { new: "bg-rule-soft text-ink-muted border-rule", + in_progress: "bg-warn-bg text-warn border-warn/40", uploading: "bg-rule-soft text-ink-muted border-rule", processing: "bg-info-bg text-info border-info/30", documents_ready: "bg-info-bg text-info border-info/40", @@ -88,6 +95,7 @@ const STATUS_TONE: Record = { ready_for_writing:"bg-gold-wash text-gold-deep border-gold/50", drafting: "bg-warn-bg text-warn border-warn/40", qa_review: "bg-warn-bg text-warn border-warn/40", + qa_failed: "bg-danger-bg text-danger border-danger/40", drafted: "bg-warn-bg text-warn border-warn/50", exported: "bg-success-bg text-success border-success/40", reviewed: "bg-success-bg text-success border-success/50", diff --git a/web-ui/src/components/cases/status-donut.tsx b/web-ui/src/components/cases/status-donut.tsx index 0077f5e..0ef4823 100644 --- a/web-ui/src/components/cases/status-donut.tsx +++ b/web-ui/src/components/cases/status-donut.tsx @@ -12,10 +12,10 @@ import { STATUS_LABELS } from "@/components/cases/status-badge"; type GroupKey = "intake" | "prep" | "thinking" | "writing" | "done"; const GROUP_OF: Record = { - new: "intake", uploading: "intake", processing: "intake", + new: "intake", in_progress: "intake", uploading: "intake", processing: "intake", documents_ready: "prep", analyst_verified: "prep", research_complete: "prep", outcome_set: "prep", brainstorming: "thinking", direction_approved: "thinking", analysis_enriched: "thinking", ready_for_writing: "thinking", - drafting: "writing", qa_review: "writing", drafted: "writing", + drafting: "writing", qa_review: "writing", qa_failed: "writing", drafted: "writing", exported: "done", reviewed: "done", final: "done", }; diff --git a/web-ui/src/lib/api/cases.ts b/web-ui/src/lib/api/cases.ts index 44cfa2a..132d9bb 100644 --- a/web-ui/src/lib/api/cases.ts +++ b/web-ui/src/lib/api/cases.ts @@ -15,6 +15,7 @@ import type { PracticeArea, AppealSubtype } from "@/lib/practice-area"; export type CaseStatus = | "new" + | "in_progress" | "uploading" | "processing" | "documents_ready" @@ -27,6 +28,7 @@ export type CaseStatus = | "ready_for_writing" | "drafting" | "qa_review" + | "qa_failed" | "drafted" | "exported" | "reviewed" -- 2.49.1