From 3036c0bf45dbd509a2e4cd21e7474f3253ddfeee Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Mon, 13 Jul 2026 15:40:52 +0330 Subject: [PATCH] =?UTF-8?q?feat(patients):=20phase=20B5=20=E2=80=94=20wire?= =?UTF-8?q?=20service=20creation=20into=20the=20detail=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reuse the existing NewSessionPage (service section/item + insurance coverage + payment flow → POST /patient/{recordUuid}/session) from the new patient detail: add a patients-scoped route /admin/patients/:recordUuid/session/new and a "سرویس جدید" action on the services tab. The multi-step visual restyle and the standalone invoice-issuance screen remain a follow-up (the underlying session/billing endpoints already exist). Co-Authored-By: Claude Opus 4.8 (1M context) --- assets/admin/App.tsx | 1 + assets/admin/pages/PatientDetailPage.test.tsx | 7 +++++++ assets/admin/pages/PatientDetailPage.tsx | 9 +++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/assets/admin/App.tsx b/assets/admin/App.tsx index aa4e7cb3..ee56e539 100644 --- a/assets/admin/App.tsx +++ b/assets/admin/App.tsx @@ -197,6 +197,7 @@ export default function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/assets/admin/pages/PatientDetailPage.test.tsx b/assets/admin/pages/PatientDetailPage.test.tsx index 978bd91b..51f833c1 100644 --- a/assets/admin/pages/PatientDetailPage.test.tsx +++ b/assets/admin/pages/PatientDetailPage.test.tsx @@ -76,6 +76,13 @@ describe('PatientDetailPage (پرونده تب‌دار)', () => { expect(await screen.findByPlaceholderText('مثلاً: معاینه اولیه')).toBeInTheDocument(); }); + it('links "سرویس جدید" on the services tab to the new-session route', async () => { + renderDetail(); + await screen.findByText('ساغر صابری'); // services is the default tab + const link = await screen.findByRole('link', { name: /سرویس جدید/ }); + expect(link).toHaveAttribute('href', '/admin/patients/r1/session/new'); + }); + it('renders the messages tab with a send box', async () => { renderDetail(); await screen.findByText('ساغر صابری'); diff --git a/assets/admin/pages/PatientDetailPage.tsx b/assets/admin/pages/PatientDetailPage.tsx index 46bb3e85..a50ffe25 100644 --- a/assets/admin/pages/PatientDetailPage.tsx +++ b/assets/admin/pages/PatientDetailPage.tsx @@ -122,8 +122,13 @@ export default function PatientDetailPage() { ) : tab === 'services' ? ( - ({ title: s.section_name || s.name || 'سرویس', meta: s.created_at ? formatDate(s.created_at) : '', badge: s.status })} /> +
+
+ سرویس جدید +
+ ({ title: s.section_name || s.name || 'سرویس', meta: s.created_at ? formatDate(s.created_at) : '', badge: s.status })} /> +
) : tab === 'appointments' ? ( ({ title: a.service_name || a.doctor_name || 'نوبت', meta: a.date ? formatDate(a.date) : (a.starts_at ? formatDate(a.starts_at) : ''), badge: a.status_label || a.status })} />