From 526048fd563264ea43499925d9b9bf664940fbab Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Wed, 15 Jul 2026 16:13:32 +0330 Subject: [PATCH] fix(appointments): stay on the same day after edit/create AppointmentsPage now reads an optional ?date=YYYY-MM-DD query param as its initial selected date. AppointmentEditPage and AppointmentCreatePage navigate back to /admin/appointments?date= on save (and the edit page's back link carries the date too), so the user returns to the day they were viewing instead of today. Test: AppointmentsPage honors ?date= and fetches that day. Co-Authored-By: Claude Opus 4.8 (1M context) --- assets/admin/pages/AppointmentCreatePage.tsx | 3 ++- assets/admin/pages/AppointmentEditPage.tsx | 5 +++-- assets/admin/pages/AppointmentsPage.test.tsx | 7 +++++++ assets/admin/pages/AppointmentsPage.tsx | 6 ++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/assets/admin/pages/AppointmentCreatePage.tsx b/assets/admin/pages/AppointmentCreatePage.tsx index c4f36c76..a771527e 100644 --- a/assets/admin/pages/AppointmentCreatePage.tsx +++ b/assets/admin/pages/AppointmentCreatePage.tsx @@ -116,7 +116,8 @@ export default function AppointmentCreatePage() { onSuccess: () => { qc.invalidateQueries({ queryKey: ['appointments'] }); toast.success('نوبت با موفقیت ثبت شد'); - navigate('/admin/appointments'); + // به همان روزِ نوبت برگرد، نه امروز. + navigate(`/admin/appointments?date=${date}`); }, onError: (e: any) => toast.error(e.message || 'خطا در ثبت نوبت'), }); diff --git a/assets/admin/pages/AppointmentEditPage.tsx b/assets/admin/pages/AppointmentEditPage.tsx index e8630a7b..66de5384 100644 --- a/assets/admin/pages/AppointmentEditPage.tsx +++ b/assets/admin/pages/AppointmentEditPage.tsx @@ -93,7 +93,8 @@ export default function AppointmentEditPage() { onSuccess: () => { qc.invalidateQueries({ queryKey: ['appointments'] }); toast.success('نوبت به‌روزرسانی شد'); - navigate('/admin/appointments'); + // به همان روزِ نوبت برگرد، نه امروز. + navigate(`/admin/appointments?date=${date}`); }, onError: (e: any) => toast.error(e.message || 'خطا در ذخیره اطلاعات'), }); @@ -111,7 +112,7 @@ export default function AppointmentEditPage() { return (
- + بازگشت
diff --git a/assets/admin/pages/AppointmentsPage.test.tsx b/assets/admin/pages/AppointmentsPage.test.tsx index 2a58cabe..6b0b6352 100644 --- a/assets/admin/pages/AppointmentsPage.test.tsx +++ b/assets/admin/pages/AppointmentsPage.test.tsx @@ -39,6 +39,13 @@ describe('AppointmentsPage — طرح نوبت‌ها', () => { expect(await screen.findByText('این روز تعطیل است')).toBeInTheDocument(); }); + it('honors the ?date= query param (returns to the same day after edit)', async () => { + renderWithProviders(, { route: '/admin/appointments?date=2024-06-01' }); + await screen.findByText('این روز تعطیل است'); + const usedDate = get.mock.calls.some((c: any[]) => typeof c[0] === 'string' && c[0].includes('date=2024-06-01')); + expect(usedDate).toBe(true); + }); + it('independent doctor profile does NOT show doctor tabs', async () => { renderWithProviders(); await screen.findByText('این روز تعطیل است'); diff --git a/assets/admin/pages/AppointmentsPage.tsx b/assets/admin/pages/AppointmentsPage.tsx index 3b2cc235..63c7bb19 100644 --- a/assets/admin/pages/AppointmentsPage.tsx +++ b/assets/admin/pages/AppointmentsPage.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef, useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useSearchParams } from 'react-router-dom'; import { PlusIcon, ChevronRightIcon, ChevronLeftIcon, CalendarDaysIcon, AdjustmentsHorizontalIcon, @@ -200,8 +200,10 @@ export default function AppointmentsPage() { const isDoctor = primaryRole === 'doctor'; const isRepresentation = primaryRole === 'representation'; + const [params] = useSearchParams(); const today = new Date().toISOString().slice(0, 10); - const [selectedDate, setSelectedDate] = useState(today); + // پس از ویرایش/ثبت، صفحه با ?date=... باز می‌شود تا همان روز نمایش داده شود. + const [selectedDate, setSelectedDate] = useState(params.get('date') || today); const [viewMode, setViewMode] = useState('timeline'); const [selectedDoctorUuid, setSelectedDoctorUuid] = useState(isDoctor && dbUuid ? dbUuid : ''); const [bookingSlot, setBookingSlot] = useState(null);