From b7682a2d1c4d7893b222b7042a8a35c40371de2c Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 14 Jul 2026 15:09:10 +0330 Subject: [PATCH] fix(treatment): show only past plans in history rail and refresh after lab send. Co-authored-by: Cursor --- .cursor/skills/treatment-workspace/SKILL.md | 3 +- .../treatment/treatmentHistoryFilters.ts | 12 ++---- .../ui/treatment/PastTreatmentsPanel.tsx | 20 ++-------- .../ui/treatment/TreatmentWorkspace.tsx | 40 ++++++++++++++----- 4 files changed, 38 insertions(+), 37 deletions(-) diff --git a/.cursor/skills/treatment-workspace/SKILL.md b/.cursor/skills/treatment-workspace/SKILL.md index 2e07de0..ddcf835 100644 --- a/.cursor/skills/treatment-workspace/SKILL.md +++ b/.cursor/skills/treatment-workspace/SKILL.md @@ -70,7 +70,8 @@ Thin route: `app/[locale]/(dashboard)/treatment/page.tsx` (supports `?appointmen - **Not shipped to lab** — show treatments that have at least one lab-dependent detail (prosthesis via `labDependentCodes`) with `!sentAt`. - **Date** — filter on `treatmentAt` matching that local calendar day. -- When **not shipped** is on and workspace is live (not browsing), prepend a synthetic **current draft** row (`id: 'current-draft'`) if it has pending lab-dependent details. +- When **not shipped** is on, filters **already-fetched** history only (excludes the active appointment row). +- **Previous treatments rail** excludes the active appointment; live draft stays in **Current draft** preview only. Refresh history after lab send. Helpers: `frontend/src/components/treatment/treatmentHistoryFilters.ts`. diff --git a/frontend/src/components/treatment/treatmentHistoryFilters.ts b/frontend/src/components/treatment/treatmentHistoryFilters.ts index d4871dc..b32c208 100644 --- a/frontend/src/components/treatment/treatmentHistoryFilters.ts +++ b/frontend/src/components/treatment/treatmentHistoryFilters.ts @@ -25,17 +25,13 @@ export function treatmentMatchesHistoryDate(treatmentAt: string, date: string): export function filterTreatmentHistoryItems( history: PastTreatment[], - currentDraft: PastTreatment | null, labDependentCodes: Set, filters: TreatmentHistoryFilters, + excludeAppointmentId?: string | null, ): PastTreatment[] { - const source = (() => { - if (!currentDraft) return history; - const withoutCurrentAppointment = currentDraft.appointmentId - ? history.filter((item) => item.appointmentId !== currentDraft.appointmentId) - : history; - return [currentDraft, ...withoutCurrentAppointment]; - })(); + const source = excludeAppointmentId + ? history.filter((item) => item.appointmentId !== excludeAppointmentId) + : history; return source.filter((treatment) => { if (!treatmentMatchesHistoryDate(treatment.treatmentAt, filters.date)) { diff --git a/frontend/src/components/ui/treatment/PastTreatmentsPanel.tsx b/frontend/src/components/ui/treatment/PastTreatmentsPanel.tsx index 5916b3e..f37ec4e 100644 --- a/frontend/src/components/ui/treatment/PastTreatmentsPanel.tsx +++ b/frontend/src/components/ui/treatment/PastTreatmentsPanel.tsx @@ -15,7 +15,6 @@ import type { TreatmentCatalogEntry } from '@/types/treatment-catalog'; interface PastTreatmentsPanelProps { items: PastTreatment[]; - currentDraft?: PastTreatment | null; patientName?: string; currentAppointmentId?: string | null; treatmentCatalog: TreatmentCatalogEntry[]; @@ -33,7 +32,6 @@ function formatHistoryTimestamp(iso: string, locale: string): string { export function PastTreatmentsPanel({ items, - currentDraft = null, patientName, currentAppointmentId, treatmentCatalog, @@ -54,11 +52,11 @@ export function PastTreatmentsPanel({ const displayedItems = useMemo( () => - filterTreatmentHistoryItems(items, currentDraft, labDependentCodes, { + filterTreatmentHistoryItems(items, labDependentCodes, { notShippedOnly, date: filterDate, - }), - [items, currentDraft, labDependentCodes, notShippedOnly, filterDate], + }, currentAppointmentId), + [items, currentAppointmentId, labDependentCodes, notShippedOnly, filterDate], ); function clearFilters() { @@ -119,9 +117,6 @@ export function PastTreatmentsPanel({ > {displayedItems.map((treatment) => { const isSelected = selectedPreviewId === treatment.id; - const isCurrentAppointment = - Boolean(currentAppointmentId) && treatment.appointmentId === currentAppointmentId; - const isLiveDraft = treatment.id === 'current-draft'; return (
{formatHistoryTimestamp(treatment.treatmentAt, locale)} - {isLiveDraft ? ( - - {t('labAttentionCurrentDraft')} - - ) : isCurrentAppointment ? ( - - {t('historyCurrentAppointment')} - - ) : null} {treatment.details.length === 0 ? ( diff --git a/frontend/src/components/ui/treatment/TreatmentWorkspace.tsx b/frontend/src/components/ui/treatment/TreatmentWorkspace.tsx index 284e86d..310252e 100644 --- a/frontend/src/components/ui/treatment/TreatmentWorkspace.tsx +++ b/frontend/src/components/ui/treatment/TreatmentWorkspace.tsx @@ -501,12 +501,19 @@ export function TreatmentWorkspace({ const previewTreatment = useMemo(() => { if (!selectedPreviewId) return currentDraftPreview; - return ( + const fromHistory = history.find((item) => item.id === selectedPreviewId) ?? - historyPanelItems.find((item) => item.id === selectedPreviewId) ?? - currentDraftPreview - ); - }, [selectedPreviewId, history, historyPanelItems, currentDraftPreview]); + historyPanelItems.find((item) => item.id === selectedPreviewId); + if ( + workspaceMode === 'live' && + currentDraftPreview?.appointmentId && + (selectedPreviewId === currentDraftPreview.id || + fromHistory?.appointmentId === currentDraftPreview.appointmentId) + ) { + return currentDraftPreview; + } + return fromHistory ?? currentDraftPreview; + }, [selectedPreviewId, history, historyPanelItems, currentDraftPreview, workspaceMode]); const isBrowsing = selectedPreviewId !== null; @@ -1039,23 +1046,33 @@ export function TreatmentWorkspace({ const ok = workspaceModeRef.current === 'live' ? await flushDraftSave() : true; if (!ok) return false; - const isHistorical = isTreatmentDayHistorical(treatment.treatmentAt, todayStart); + let treatmentToLoad = treatment; + try { + const draftResponse = await treatmentsApi.getDraft(treatment.appointmentId); + if (draftResponse.data) { + treatmentToLoad = draftResponse.data; + } + } catch { + // Fall back to the history snapshot when draft cannot be loaded. + } + + const isHistorical = isTreatmentDayHistorical(treatmentToLoad.treatmentAt, todayStart); setWorkspaceMode(isHistorical ? 'historical' : 'live'); setSelectedPreviewId(null); - const nextDay = startOfLocalDay(new Date(treatment.treatmentAt)); + const nextDay = startOfLocalDay(new Date(treatmentToLoad.treatmentAt)); setSelectedDay((prev) => (compareLocalDayStart(prev, nextDay) === 0 ? prev : nextDay)); setSelectionLocked(true); - setSelectedAppointmentId(treatment.appointmentId); + setSelectedAppointmentId(treatmentToLoad.appointmentId ?? treatment.appointmentId); skipNextGetDraftRef.current = true; draftHydratingRef.current = true; - hydrateFromTreatment(treatment); + hydrateFromTreatment(treatmentToLoad); draftHydratingRef.current = false; if (focusDetailClientId) { setActiveDetailId(focusDetailClientId); const mappedLabCases = withoutEmptyLabCaseDrafts( - (treatment.labCases ?? []).map(mapLabCaseDraftFromApi), + (treatmentToLoad.labCases ?? []).map(mapLabCaseDraftFromApi), ); const linked = mappedLabCases.find( (lc) => !lc.sentAt && lc.detailClientId === focusDetailClientId, @@ -1510,6 +1527,7 @@ export function TreatmentWorkspace({ notifyTabBadgesChanged(); if (selectedAppointment.patientId) { void refreshPatientLabCases(selectedAppointment.patientId); + void refreshHistory(selectedAppointment.patientId); } } catch (error: unknown) { showError(getUserFacingError(error, tErrors, t('errorSendCase'))); @@ -1523,6 +1541,7 @@ export function TreatmentWorkspace({ persistDraft, persistLabCases, refreshPatientLabCases, + refreshHistory, showSuccess, showError, t, @@ -1675,7 +1694,6 @@ export function TreatmentWorkspace({ >