From 376e610260a5c9f50777d2a5b0939489ad83930f Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Tue, 14 Jul 2026 00:09:08 +0330 Subject: [PATCH] =?UTF-8?q?feat(appointments):=20toolbar=20personnel=20fil?= =?UTF-8?q?ter=20(=D9=BE=D8=B1=D8=B3=D9=86=D9=84=20=D8=B1=D8=A7=20=D8=A7?= =?UTF-8?q?=D9=86=D8=AA=D8=AE=D8=A7=D8=A8=20=DA=A9=D9=86=DB=8C=D8=AF...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds staffUuid to AppointmentFilters and a toolbar staff select that filters the loaded day's rows client-side, matching appointments-table.pdf. Co-Authored-By: Claude Fable 5 --- .../components/AppointmentFiltersModal.test.tsx | 4 ++++ .../components/AppointmentFiltersModal.tsx | 5 ++++- assets/admin/pages/AppointmentsPage.tsx | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/assets/admin/components/AppointmentFiltersModal.test.tsx b/assets/admin/components/AppointmentFiltersModal.test.tsx index 26db02f7..ef36ddb0 100644 --- a/assets/admin/components/AppointmentFiltersModal.test.tsx +++ b/assets/admin/components/AppointmentFiltersModal.test.tsx @@ -40,6 +40,10 @@ describe('applyAppointmentFilters', () => { expect(applyAppointmentFilters(items, { ...EMPTY_FILTERS, statuses: ['cancelled'] })).toHaveLength(1); expect(applyAppointmentFilters(items, { ...EMPTY_FILTERS, statuses: ['salon', 'completed'] })).toHaveLength(2); expect(applyAppointmentFilters(items, { ...EMPTY_FILTERS, gender: 'female' })).toHaveLength(2); + expect(applyAppointmentFilters( + items.map((a, i) => ({ ...a, staff: i === 0 ? { uuid: 'st1', full_name: 'x' } : null })), + { ...EMPTY_FILTERS, staffUuid: 'st1' }, + )).toHaveLength(1); expect(applyAppointmentFilters(items, EMPTY_FILTERS)).toHaveLength(3); }); }); diff --git a/assets/admin/components/AppointmentFiltersModal.tsx b/assets/admin/components/AppointmentFiltersModal.tsx index d3973240..1ab3e40d 100644 --- a/assets/admin/components/AppointmentFiltersModal.tsx +++ b/assets/admin/components/AppointmentFiltersModal.tsx @@ -13,12 +13,14 @@ export interface AppointmentFilters { nationalCode: string; sectionUuid: string; itemUuid: string; + /** toolbar «پرسنل را انتخاب کنید...» select — not part of the modal */ + staffUuid: string; statuses: string[]; gender: 'female' | 'male' | 'both'; } export const EMPTY_FILTERS: AppointmentFilters = { - name: '', nationalCode: '', sectionUuid: '', itemUuid: '', statuses: [], gender: 'both', + name: '', nationalCode: '', sectionUuid: '', itemUuid: '', staffUuid: '', statuses: [], gender: 'both', }; // design's 6 checkboxes; لغو شده covers both cancel reasons @@ -38,6 +40,7 @@ export function applyAppointmentFilters(items: Appointment[], f: AppointmentFilt if (f.nationalCode && !(a.patient_national_code ?? '').includes(f.nationalCode)) return false; if (f.sectionUuid && a.service_section?.uuid !== f.sectionUuid) return false; if (f.itemUuid && a.service_item?.uuid !== f.itemUuid) return false; + if (f.staffUuid && a.staff?.uuid !== f.staffUuid) return false; if (f.statuses.length) { const matches = f.statuses.some(s => s === 'cancelled' ? a.status.startsWith('cancelled') : a.status === s); diff --git a/assets/admin/pages/AppointmentsPage.tsx b/assets/admin/pages/AppointmentsPage.tsx index e582d3fb..475729ea 100644 --- a/assets/admin/pages/AppointmentsPage.tsx +++ b/assets/admin/pages/AppointmentsPage.tsx @@ -712,6 +712,9 @@ export default function AppointmentsPage() { )} + {/* Personnel filter (Figma «پرسنل را انتخاب کنید...») */} + setFilters(f => ({ ...f, staffUuid: v }))} /> + {/* Filters (Figma فیلترها) */}