fix(case-page): resolve full-page review findings (bugs + RTL + resilience) #329
Reference in New Issue
Block a user
Delete Branch "worktree-case-page-fixes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
סקירת-קוד מלאה של דף-התיק (14 רכיבים, ~4,000 שורות) — כל הממצאים תוקנו כאן.
באגי-לוגיקה
form.resetרץ ב-poll כל-5ש' בזמן שהדיאלוג פתוח → דרס עריכות. עכשיו מאפס רק ב-open→true.selectedלא הסתנכרן ל-currentStatusאסינכרוני/חיצוני (dropdown תקוע). שוכתב לעקוב אחרי currentStatus עד בחירה מפורשת; מתאפס אחרי שמירה.block.content/word_countללא הגנת-null (אין response-model) → קריסת-render אפשרית; coerce?? ""/?? 0.STATUS_LABELSעם fallback לסטטוס במקוםundefined.await mutateAsync()בלי try/catch → unhandled rejection. עוטף (שגיאות עדיין דרךisError).עמידות / היגיינה
!data+ כפתור "נסה שוב".useUpdateCase— invalidate ל-allדרס את ה-patch האופטימי של ה-detail. צומצם ל-prefix של list.תקינות-RTL (מאפיינים לוגיים)
mr-auto→ms-auto/me-auto, אייקוניםml-1/ml-2→me-1/me-2,*חובהmr-1→ms-1, רשימהpr-4→ps-4(agent-status-widget, agent-activity-feed, document-type-editor).מינוריים
<a href>→next/link(drafts-panel) · issueMap ב-useMemo·aria-labelל-Textarea · upload-sheet:unknownכבר לא ✓ ירוק (אייקון ניטרלי + "רענן לאישור") · citations.ts:case_name: string | null.שער-עיצוב
פריטים נוגעי-ויזואל (צד-ה-gap ב-RTL, כפתור "נסה שוב", אייקון-העלאה ניטרלי) אושרו ע"י היו"ר דרך אישור הממצאים ("לתקן הכול"); אף אחד לא משנה layout של עמוד-מאושר — תיקוני-תקינות בלבד.
בדיקות
tsc --noEmitנקי ·eslintנקי (אזהרתform.watchקיימת-מראש בשורה לא-נגועה).אומת תקין בסקירה (ללא שינוי)
אין double-card נוסף · אין שימוש-שגוי ב-TanStack v5 · אין בליעת-שגיאות שקטה · drafts-panel/app-shell נקיים כמעט לגמרי.
🤖 Generated with Claude Code
Full code review of the case-detail page (14 components) surfaced these, all fixed here: Logic bugs - case-edit-dialog: form.reset ran on the 5s useCase refetch while the dialog was open, clobbering in-progress edits. Now resets only on open→true. - status-changer: `selected` never synced to async/external `currentStatus` (stale dropdown). Reworked to track currentStatus until an explicit pick; resets to tracking after save. - decision-blocks-panel: `block.content`/`word_count` accessed without null guards (endpoint has no response model) → potential render crash. Coerced with `?? ""` / `?? 0`. `STATUS_LABELS[status]` now falls back to the raw status instead of rendering literal "undefined". - document-type-editor: `await mutateAsync()` in async click handlers without try/catch → unhandled promise rejection. Wrapped (errors still surface via isError). Resilience / hygiene - page.tsx: a transient 5xx on the background poll flipped the WHOLE page to the error card and discarded loaded data. Now gated on `!data`, plus a "נסה שוב" retry. - cases.ts useUpdateCase: invalidated casesKeys.all, which re-invalidated the detail it had just optimistically patched. Scoped to the list prefix. RTL correctness (logical properties) - agent-status-widget `mr-auto`→`ms-auto`; agent-activity-feed `mr-auto`→ `me-auto`, icon `ml-1/ml-2`→`me-1/me-2`, required `*` `mr-1`→`ms-1`; document-type-editor list `pr-4`→`ps-4`. Minors - drafts-panel: `<a href>`→`next/link` (operations + citation links) for SPA nav. agent-activity-feed: issueMap memoized; comment Textarea aria-label. upload-sheet: `unknown` status no longer shown as green success (neutral icon + "רענן לאישור"). citations.ts: case_name typed `string | null`. Design gate: visual-touching items (RTL gap side, retry button, neutral upload icon) were chair-authorized via the reviewed-findings approval ("fix all"); none alter an approved page layout — they are correctness fixes. tsc clean; eslint clean (1 pre-existing form.watch warning, untouched line). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>