diff --git a/assets/admin/components/patient/PatientTreatmentTab.tsx b/assets/admin/components/patient/PatientTreatmentTab.tsx index 4778faea..02718819 100644 --- a/assets/admin/components/patient/PatientTreatmentTab.tsx +++ b/assets/admin/components/patient/PatientTreatmentTab.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { - ChevronLeftIcon, ChevronRightIcon, ClipboardDocumentListIcon, + ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ClipboardDocumentListIcon, CpuChipIcon, MagnifyingGlassIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import { api } from '../../lib/api'; @@ -312,6 +312,14 @@ function SessionCard({ session: s, summary, resource, nationalCode }: { nationalCode: string | null; }) { const [booking, setBooking] = useState(false); + /** + * سابقه بسته می‌آید و کارِ پیشِ رو باز. + * + * جلسهٔ انجام‌شده سه ناحیه با خوانده‌هایشان دارد و بازِ پیش‌فرض، فهرست را دفن + * می‌کند؛ ولی جلسه‌ای که باید رزرو شود، دکمه‌اش دلیلِ وجودش است و پشت یک کلیک + * اضافه نباید بماند. + */ + const [open, setOpen] = useState(!SETTLED.includes(s.status)); const qc = useQueryClient(); const clinicUuid = useClinicContext(); @@ -322,26 +330,57 @@ function SessionCard({ session: s, summary, resource, nationalCode }: { const bookable = !SETTLED.includes(s.status) && s.appointment === null && summary.status === 'active'; const areas = s.areas ?? []; + // جلسه‌ای که نه ناحیه‌ای ثبت کرده و نه کاری برای انجام دارد، بدنه‌ای ندارد که باز + // شود؛ کلپسِ خالی فقط یک کلیک بی‌نتیجه است. + const hasBody = areas.length > 0 || bookable; + + const head = ( +
+ + جلسهٔ {formatNumber(s.session_number)} از {formatNumber(s.total_sessions)} + + + + {s.planned_at === null ? '—' : formatDateTime(s.planned_at)} + + {/* تخمین با واقعیت یکی نیست و باید در خودِ کارت معلوم باشد. */} + {s.is_estimate && تخمینی} + {s.performed_by && ( + پرسنل: {s.performed_by.name} + )} + {/* شمارهٔ نواحی در سرِ بسته می‌ماند تا باز کردن، حدس نباشد. */} + {areas.length > 0 && !open && ( + {formatNumber(areas.length)} ناحیه + )} + {hasBody && ( + + )} +
+ ); return (
-
- - جلسهٔ {formatNumber(s.session_number)} از {formatNumber(s.total_sessions)} - - - - {s.planned_at === null ? '—' : formatDateTime(s.planned_at)} - - {/* تخمین با واقعیت یکی نیست و باید در خودِ کارت معلوم باشد. */} - {s.is_estimate && تخمینی} - {s.performed_by && ( - پرسنل: {s.performed_by.name} - )} -
+ {hasBody ? ( + + ) : head} {/* آنچه واقعاً انجام شد: ناحیه، دستگاه و خوانده‌هایش. */} - {areas.length > 0 && ( + {open && areas.length > 0 && (
{areas.map((a) => (
@@ -364,7 +403,7 @@ function SessionCard({ session: s, summary, resource, nationalCode }: {
)} - {bookable && ( + {open && bookable && ( /* بدون دستگاه، فرم سرویسی برای انتخاب ندارد؛ دکمهٔ خاموشِ بی‌توضیح بدتر از نبودنش است، پس دلیلش نوشته می‌شود. */ resource === null ? (