43 lines
2.0 KiB
Markdown
43 lines
2.0 KiB
Markdown
|
|
---
|
||
|
|
name: dyolink-lab-cases
|
||
|
|
description: Lab Cases tab — list, filters, detail panel, assignment, card UX. Use when changing CasesPage, cases API, or case list cards.
|
||
|
|
---
|
||
|
|
|
||
|
|
# Lab Cases tab
|
||
|
|
|
||
|
|
**UI:** [`frontend/src/components/ui/lab/CasesPage.tsx`](frontend/src/components/ui/lab/CasesPage.tsx)
|
||
|
|
**Backend:** [`backend/src/modules/cases/`](backend/src/modules/cases/)
|
||
|
|
**Shared prosthesis rows:** [`LabCaseProsthesisGroupsList.tsx`](frontend/src/components/ui/lab/LabCaseProsthesisGroupsList.tsx) (also used in Treatment lab shipments rail)
|
||
|
|
|
||
|
|
## List behavior
|
||
|
|
|
||
|
|
- **Default sort:** `sentAt` desc (newest first).
|
||
|
|
- **Auto-select:** On tab open / after filter reload, select first list item if none selected; keep selection when still in list; `?caseId=` URL wins.
|
||
|
|
- **Right panel:** Always shows detail for selected case when list non-empty (loading state while fetching).
|
||
|
|
|
||
|
|
## Filters (`GET /cases`)
|
||
|
|
|
||
|
|
| Param | Behavior |
|
||
|
|
|-------|----------|
|
||
|
|
| `prosthesisTypeCode` | Cases with **≥1 task** of that prosthesis type (`tasks.some`) — not treatment-type filter |
|
||
|
|
| `clinicOrganizationId` | From URL (`Today` case partners chart) or dropdown |
|
||
|
|
| `q`, `sentFrom`, `sentTo` | Search + date range |
|
||
|
|
|
||
|
|
Filter options: `GET /cases/filter-options` → `clinics`, `prosthesisTypes` (distinct codes from sent-case tasks, catalog-ordered).
|
||
|
|
|
||
|
|
## List card UI
|
||
|
|
|
||
|
|
Match Treatment shipment cards: patient name, clinic, **colored prosthesis groups + teeth** (`LabCaseProsthesisGroupsList`), sent date, progress bar, due-date badge, unread dot. **No patient mobile** on list cards.
|
||
|
|
|
||
|
|
List item shape: `prosthesisGroups: { prosthesisTypeCode, teeth[] }[]` from task teeth aggregation.
|
||
|
|
|
||
|
|
## Detail panel
|
||
|
|
|
||
|
|
- Task assignment: `PATCH /cases/:caseId/tasks/:taskId/assign` (`TAB_CASES_EDIT`)
|
||
|
|
- Comments: shared `LabCaseCommentsPanel` + `tasksApi` comment routes
|
||
|
|
- Mark read: `POST /notifications/mark-case-read` on select (Cases tab badge)
|
||
|
|
|
||
|
|
## Permissions
|
||
|
|
|
||
|
|
`TAB_CASES_READ` / `TAB_CASES_EDIT`; owner always has Cases access. `LabOrgGuard` on routes.
|