From b368bce69035d828de7cf760f69c36069fe08793 Mon Sep 17 00:00:00 2001 From: Chaim Date: Mon, 25 May 2026 15:53:01 +0000 Subject: [PATCH] fix: handle invalid date formats gracefully and add missing dialog descriptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Wrap date.fromisoformat() in try/except in case_update tool — prevents unhandled ValueError from surfacing as 500; FastAPI now catches it as 422 - Add DialogDescription (sr-only) to 5 dialogs missing aria-describedby: documents-panel preview + delete, drafts-panel delete + feedback, link-related-dialog Co-Authored-By: Claude Sonnet 4.6 --- mcp-server/src/legal_mcp/tools/cases.py | 10 ++++-- .../src/components/cases/documents-panel.tsx | 3 ++ web-ui/src/components/cases/drafts-panel.tsx | 3 ++ .../precedents/link-related-dialog.tsx | 2 ++ web/app.py | 33 ++++++++++--------- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/mcp-server/src/legal_mcp/tools/cases.py b/mcp-server/src/legal_mcp/tools/cases.py index 0b6fea4..4ad5bf8 100644 --- a/mcp-server/src/legal_mcp/tools/cases.py +++ b/mcp-server/src/legal_mcp/tools/cases.py @@ -326,9 +326,15 @@ async def case_update( if notes: fields["notes"] = notes if hearing_date: - fields["hearing_date"] = date_type.fromisoformat(hearing_date) + try: + fields["hearing_date"] = date_type.fromisoformat(hearing_date) + except ValueError as exc: + raise ValueError(f"Invalid hearing_date format: {hearing_date!r}") from exc if decision_date: - fields["decision_date"] = date_type.fromisoformat(decision_date) + try: + fields["decision_date"] = date_type.fromisoformat(decision_date) + except ValueError as exc: + raise ValueError(f"Invalid decision_date format: {decision_date!r}") from exc if tags is not None: fields["tags"] = tags if expected_outcome: diff --git a/web-ui/src/components/cases/documents-panel.tsx b/web-ui/src/components/cases/documents-panel.tsx index f93e4c4..3c53f57 100644 --- a/web-ui/src/components/cases/documents-panel.tsx +++ b/web-ui/src/components/cases/documents-panel.tsx @@ -6,6 +6,7 @@ import { Progress } from "@/components/ui/progress"; import { Dialog, DialogContent, + DialogDescription, DialogHeader, DialogTitle, DialogFooter, @@ -127,6 +128,7 @@ function DocumentPreviewDialog({ {displayName} + תצוגה מקדימה של תוכן המסמך
{loading && ( @@ -184,6 +186,7 @@ function DeleteConfirmDialog({ מחיקת מסמך + אישור מחיקת המסמך מהתיק

האם למחוק את המסמך “{displayName}”? diff --git a/web-ui/src/components/cases/drafts-panel.tsx b/web-ui/src/components/cases/drafts-panel.tsx index 6712d19..3d36c40 100644 --- a/web-ui/src/components/cases/drafts-panel.tsx +++ b/web-ui/src/components/cases/drafts-panel.tsx @@ -8,6 +8,7 @@ import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, + DialogDescription, DialogHeader, DialogTitle, DialogTrigger, @@ -323,6 +324,7 @@ export function DraftsPanel({ מחיקת טיוטה + אישור מחיקת קובץ הטיוטה

למחוק את הקובץ{" "} @@ -493,6 +495,7 @@ function NewCaseFeedbackDialog({ caseNumber }: { caseNumber: string }) { הערת יו״ר — תיק {caseNumber} + הוספת הערת יו״ר על בלוק בהחלטה

diff --git a/web-ui/src/components/precedents/link-related-dialog.tsx b/web-ui/src/components/precedents/link-related-dialog.tsx index f5d0a00..eb20d07 100644 --- a/web-ui/src/components/precedents/link-related-dialog.tsx +++ b/web-ui/src/components/precedents/link-related-dialog.tsx @@ -6,6 +6,7 @@ import { toast } from "sonner"; import { Dialog, DialogContent, + DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; @@ -68,6 +69,7 @@ function LinkDialog({ caseId, currentRelated, open, onOpenChange }: DialogProps) קשר החלטה קשורה + חיפוש וקישור תקדים או החלטה קשורה לתיק
diff --git a/web/app.py b/web/app.py index 18e97bd..190a6f4 100644 --- a/web/app.py +++ b/web/app.py @@ -1378,21 +1378,24 @@ async def api_case_update(case_number: str, req: CaseUpdateRequest, background_t existing = await db.get_case_by_number(case_number) old_status = (existing or {}).get("status", "") - result = await cases_tools.case_update( - case_number=case_number, - status=req.status, - title=req.title, - subject=req.subject, - notes=req.notes, - hearing_date=req.hearing_date, - decision_date=req.decision_date, - tags=req.tags, - expected_outcome=req.expected_outcome, - appellants=req.appellants, - respondents=req.respondents, - property_address=req.property_address, - permit_number=req.permit_number, - ) + try: + result = await cases_tools.case_update( + case_number=case_number, + status=req.status, + title=req.title, + subject=req.subject, + notes=req.notes, + hearing_date=req.hearing_date, + decision_date=req.decision_date, + tags=req.tags, + expected_outcome=req.expected_outcome, + appellants=req.appellants, + respondents=req.respondents, + property_address=req.property_address, + permit_number=req.permit_number, + ) + except ValueError as exc: + raise HTTPException(422, str(exc)) try: parsed = json.loads(result) except json.JSONDecodeError: