diff --git a/assets/admin/pages/DoctorDetailPage.tsx b/assets/admin/pages/DoctorDetailPage.tsx index 34b5d913..54206b70 100644 --- a/assets/admin/pages/DoctorDetailPage.tsx +++ b/assets/admin/pages/DoctorDetailPage.tsx @@ -89,7 +89,17 @@ interface SessionConfig { } interface NewDayConfig { sessions: SessionConfig[]; } type NewScheduleMap = Record; -interface WeeklyScheduleData { uuid: string; doctor_uuid: string; schedule: NewScheduleMap; } +interface BookingMeta { + online_booking_enabled: boolean; + booking_window_value: number; + booking_window_unit: 'week' | 'month'; +} +const DEFAULT_BOOKING_META: BookingMeta = { + online_booking_enabled: true, + booking_window_value: 1, + booking_window_unit: 'month', +}; +interface WeeklyScheduleData { uuid: string; doctor_uuid: string; schedule: NewScheduleMap; meta?: BookingMeta; } // ── Constants ────────────────────────────────────────────────────────────── @@ -1191,6 +1201,7 @@ function WeeklyScheduleTab({ doctorUuid, addresses }: { doctorUuid: string; addr const [scheduleMap, setScheduleMap] = useState(EMPTY_NEW_SCHEDULE); const [scheduleUuid, setScheduleUuid] = useState(null); const [expandedDay, setExpandedDay] = useState(null); + const [meta, setMeta] = useState(DEFAULT_BOOKING_META); const scheduleQ = useQuery({ queryKey: ['doctor-schedule', doctorUuid], @@ -1211,6 +1222,7 @@ function WeeklyScheduleTab({ doctorUuid, addresses }: { doctorUuid: string; addr setScheduleMap(merged); setScheduleUuid(d.uuid); } + if (d?.meta) setMeta({ ...DEFAULT_BOOKING_META, ...d.meta }); } else if (scheduleQ.error instanceof ApiError && scheduleQ.error.status === 404) { setScheduleMap(EMPTY_NEW_SCHEDULE); setScheduleUuid(null); } @@ -1237,8 +1249,8 @@ function WeeklyScheduleTab({ doctorUuid, addresses }: { doctorUuid: string; addr if (hasAnyOverlap) throw new Error('تداخل زمانی در برنامه وجود دارد'); if (missingLocation) throw new Error('مکان مطب برای همه بازه‌های فعال الزامی است'); return scheduleUuid - ? api.patch>(`/api/v1/appointment-settings/weekly-schedule/${doctorUuid}`, { schedule: scheduleMap }) - : api.post>('/api/v1/appointment-settings/weekly-schedule', { doctor_uuid: doctorUuid, schedule: scheduleMap }); + ? api.patch>(`/api/v1/appointment-settings/weekly-schedule/${doctorUuid}`, { schedule: scheduleMap, meta }) + : api.post>('/api/v1/appointment-settings/weekly-schedule', { doctor_uuid: doctorUuid, schedule: scheduleMap, meta }); }, onSuccess: (res) => { const d: WeeklyScheduleData = res?.data?.data ?? res?.data; @@ -1298,6 +1310,42 @@ function WeeklyScheduleTab({ doctorUuid, addresses }: { doctorUuid: string; addr )} + {/* ─ نوبت‌دهی آنلاین */} +
+ +
+ رزرو آنلاین تا + setMeta(m => ({ ...m, booking_window_value: Math.max(1, Number(e.target.value) || 1) }))} + className="input w-16 text-center" + /> + + آینده +
+

+ بیمار فقط تا این بازه می‌تواند آنلاین نوبت بگیرد؛ روزهای بعد از آن روی تقویم غیرفعال‌اند. +

+
+ {SCHEDULE_DAYS.map(day => { const sessions = scheduleMap[day.key]?.sessions ?? []; const isOverlap = overlapDays[day.key];