From bc4030251d4b9141c88e3a002146943fcde6070b Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Thu, 16 Jul 2026 09:39:33 +0330 Subject: [PATCH] fix: allow submit when picking an existing patient Backend requires a valid national code for every appointment, but a picked patient record may have none stored. Show a selected-patient card with an editable national-code field (prefilled from the record) so submit can enable. Add happy-path and boundary tests for the picked-patient flow. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../pages/AppointmentCreatePage.test.tsx | 41 +++++++++++++++++++ assets/admin/pages/AppointmentCreatePage.tsx | 28 +++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/assets/admin/pages/AppointmentCreatePage.test.tsx b/assets/admin/pages/AppointmentCreatePage.test.tsx index 06ded61a..54a4d306 100644 --- a/assets/admin/pages/AppointmentCreatePage.test.tsx +++ b/assets/admin/pages/AppointmentCreatePage.test.tsx @@ -86,4 +86,45 @@ describe('AppointmentCreatePage — افزودن نوبت', () => { fireEvent.change(screen.getByPlaceholderText('شماره تماس مراجعه کننده'), { target: { value: '09121234567' } }); expect(btn).toBeDisabled(); }); + + it('picking an existing patient WITH a national code enables submit and posts it (happy path)', async () => { + get.mockImplementation((url: string) => { + if (url.startsWith('/api/v1/patients?')) + return Promise.resolve({ success: true, data: [{ uuid: 'rec1', user_name: 'حامد حسینی', user_mobile: '09210671745', user_national_code: '0012345675' }] }); + return Promise.resolve({ success: true, data: [] }); + }); + + renderWithProviders(, { route: '/admin/appointments/new' }); + + fireEvent.change(screen.getByPlaceholderText('جستجوی نام، شماره تماس، شماره پرونده...'), { target: { value: 'حامد' } }); + fireEvent.click(await screen.findByText(/حامد حسینی/)); + + const btn = screen.getByText('ثبت اطلاعات') as HTMLButtonElement; + await waitFor(() => expect(btn).not.toBeDisabled()); + + fireEvent.click(btn); + await waitFor(() => expect(post).toHaveBeenCalled()); + const [, body] = post.mock.calls[0]; + expect(body).toMatchObject({ patient_name: 'حامد حسینی', patient_mobile: '09210671745', patient_national_code: '0012345675' }); + }); + + it('picking an existing patient WITHOUT a national code keeps submit disabled until one is entered (boundary)', async () => { + get.mockImplementation((url: string) => { + if (url.startsWith('/api/v1/patients?')) + return Promise.resolve({ success: true, data: [{ uuid: 'rec2', user_name: 'حامد حسینی', user_mobile: '09210671745', user_national_code: null }] }); + return Promise.resolve({ success: true, data: [] }); + }); + + renderWithProviders(, { route: '/admin/appointments/new' }); + + fireEvent.change(screen.getByPlaceholderText('جستجوی نام، شماره تماس، شماره پرونده...'), { target: { value: 'حامد' } }); + fireEvent.click(await screen.findByText(/حامد حسینی/)); + + const btn = screen.getByText('ثبت اطلاعات') as HTMLButtonElement; + expect(btn).toBeDisabled(); + + // کد ملیِ خالیِ رکورد را دستی وارد کن → فعال می‌شود + fireEvent.change(screen.getByPlaceholderText('کد ملی مراجعه کننده'), { target: { value: '0012345675' } }); + await waitFor(() => expect(btn).not.toBeDisabled()); + }); }); diff --git a/assets/admin/pages/AppointmentCreatePage.tsx b/assets/admin/pages/AppointmentCreatePage.tsx index fd84cb45..91008fc5 100644 --- a/assets/admin/pages/AppointmentCreatePage.tsx +++ b/assets/admin/pages/AppointmentCreatePage.tsx @@ -194,15 +194,35 @@ export default function AppointmentCreatePage() { {!picked && patients.length > 0 && (
{patients.map(p => ( - ))}
)} + + {/* کارت بیمارِ انتخاب‌شده + کد ملی (برای ثبت نوبت الزامی است) */} + {picked && ( +
+
+ + {picked.user_name} {picked.user_mobile} + + +
+ +
+ setNationalCode(e.target.value.replace(/\D/g, '').slice(0, 10))} + placeholder="کد ملی مراجعه کننده" dir="ltr" inputMode="numeric" maxLength={10} /> +
+
+ )} )}