From 5c09fe8ac3816a53ff094247b78c015abe07150e Mon Sep 17 00:00:00 2001
From: hamed <15238-genius.ha@users.noreply.drupalcode.org>
Date: Mon, 13 Jul 2026 09:57:28 +0330
Subject: [PATCH] feat(admin): implement ServiceVisitCard component for
improved session display
---
assets/admin/pages/MyPatientsPage.tsx | 181 +++++++++++++++++++-------
1 file changed, 136 insertions(+), 45 deletions(-)
diff --git a/assets/admin/pages/MyPatientsPage.tsx b/assets/admin/pages/MyPatientsPage.tsx
index cf837274..77a39caa 100644
--- a/assets/admin/pages/MyPatientsPage.tsx
+++ b/assets/admin/pages/MyPatientsPage.tsx
@@ -2,7 +2,9 @@ import {
Bars3Icon,
CheckCircleIcon,
ChevronRightIcon,
+ ClockIcon,
FolderOpenIcon,
+ FunnelIcon,
MagnifyingGlassIcon,
PencilIcon,
PhoneIcon,
@@ -1126,52 +1128,37 @@ function MyPatientsPageInner() {
{detailTab === "services" && (
sessionsLoading ? (
در حال بارگذاری…
- ) : sessions.length === 0 ? (
-
- هنوز سرویسی برای این بیمار ثبت نشده است.
-
) : (
-
- {sessions.map((s) => {
- const svcNames = (s.services ?? []).map((x) => x.service_name).join("، ") || "ویزیت";
- const debt = s.patient_debt_rials ?? 0;
- return (
-
-
-
{svcNames}
- {s.is_paid
- ?
تسویه شده
- :
تسویه نشده}
-
-
انجامدهنده{s.doctor_name || "—"}
-
تاریخ{formatDate(s.created_at)}
-
هزینه{formatRial(s.final_price_rials)}
-
- مانده بدهی
- 0 ? "var(--danger)" : "var(--success)" }}>
- {debt > 0 ? formatRial(debt) : "ندارد"}
-
-
- {s.is_paid ? (
- s.invoice_uuid ? (
-
- ) : (
-
- )
- ) : (
-
- )}
-
- );
- })}
-
+ <>
+
+
+
+
+ {sessions.length === 0 ? (
+
+ هنوز سرویسی برای این بیمار ثبت نشده است.
+
+ ) : (
+
+ {sessions.map((s) => (
+ settleSessionMut.mutate(uuid)}
+ onViewInvoice={(uuid) => setInvoiceUuid(uuid)}
+ />
+ ))}
+
+ )}
+ >
)
)}
@@ -1719,6 +1706,110 @@ function PatientRow({
);
}
+// کارت هر مراجعه در تب «سرویسها»: اول مراجعه (سرویسها در سرِ کارت)، سپس جزئیات و پرداخت.
+function ServiceVisitCard({
+ session,
+ settling,
+ onSettle,
+ onViewInvoice,
+}: {
+ session: PatientSession;
+ settling: boolean;
+ onSettle: (uuid: string) => void;
+ onViewInvoice: (uuid: string) => void;
+}) {
+ const services = session.services ?? [];
+ const title = services[0]?.service_name || "ویزیت";
+ const subtitle = services.length
+ ? services.map((s) => s.service_name).join(" - ")
+ : "ویزیت";
+ const assistant = services.find((s) => s.staff_name)?.staff_name || null;
+ const debt = session.patient_debt_rials ?? 0;
+ const paid = !!session.is_paid;
+
+ const row = (
+ label: string,
+ value: React.ReactNode,
+ danger = false,
+ ) => (
+
+ {label}
+ {value}
+
+ );
+
+ const divider = ;
+
+ return (
+
+ {/* سرِ کارت: سرویسها + وضعیت + منو */}
+
+
+
+ {title}
+ {subtitle}
+
+
+ {paid
+ ?
+ : }
+
+
+
+
+
+ {divider}
+
+
+ {row("انجام دهنده:", session.doctor_name || "—")}
+ {row("دستیار:", assistant || "—")}
+ {row("تاریخ:", formatDate(session.created_at))}
+ {session.notes && (
+
+ توضیحات:{" "}
+ {session.notes}
+
+ )}
+
+
+ {divider}
+
+
+ {row("هزینه:", formatRial(session.final_price_rials))}
+ {row("مانده بدهی:", debt > 0 ? formatRial(debt) : "ندارد", debt > 0)}
+
+
+
+ {paid ? (
+ session.invoice_uuid ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ );
+}
+
function SessionRow({
session,
onEdit,