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 فیلترها) */}