diff --git a/assets/admin/pages/AppointmentDetailPage.test.tsx b/assets/admin/pages/AppointmentDetailPage.test.tsx new file mode 100644 index 00000000..23ac40aa --- /dev/null +++ b/assets/admin/pages/AppointmentDetailPage.test.tsx @@ -0,0 +1,43 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { screen, waitFor } from '@testing-library/react'; +import { Routes, Route } from 'react-router-dom'; +import { renderWithProviders } from '../test/utils'; + +vi.mock('../lib/api', () => ({ + api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, + ApiError: class extends Error {}, +})); + +import { api } from '../lib/api'; +import AppointmentDetailPage from './AppointmentDetailPage'; + +const get = api.get as ReturnType; +// 2024-06-01 12:00 محلی +const slotStart = Math.floor(new Date('2024-06-01T12:00:00').getTime() / 1000); + +beforeEach(() => { + get.mockReset(); + get.mockResolvedValue({ + success: true, + data: { + uuid: 'ap1', patient_name: 'ساغر', patient_mobile: '09120000000', + slot_start: slotStart, slot_end: slotStart + 1800, status: 'confirmed', version: 1, created_at: slotStart, + }, + }); +}); + +describe('AppointmentDetailPage — بازگشت به همان روز', () => { + it('the «نوبت‌ها» breadcrumb points back to the appointment day', async () => { + renderWithProviders( + + } /> + , + { route: '/admin/appointments/ap1' }, + ); + // پس از بارگذاری نوبت، لینک «نوبت‌ها» باید به روزِ نوبت اشاره کند + await waitFor(() => { + const link = screen.getByText('نوبت‌ها').closest('a'); + expect(link?.getAttribute('href')).toContain('date=2024-06-01'); + }); + }); +}); diff --git a/assets/admin/pages/AppointmentDetailPage.tsx b/assets/admin/pages/AppointmentDetailPage.tsx index 54423a08..cf3e4756 100644 --- a/assets/admin/pages/AppointmentDetailPage.tsx +++ b/assets/admin/pages/AppointmentDetailPage.tsx @@ -22,6 +22,13 @@ const ALL_STATUSES: { value: AppointmentStatus; label: string }[] = [ { value: 'expired', label: 'منقضی' }, ]; +// روزِ محلیِ نوبت (YYYY-MM-DD) برای بازگشت به همان تاریخ در لیست. +const isoDay = (ts?: number | null) => { + if (!ts) return ''; + const d = new Date(ts * 1000); + return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`; +}; + const timeOf = (ts?: number | null) => { const d = toDate(ts ?? null); return d @@ -73,6 +80,9 @@ export default function AppointmentDetailPage() { // پاسخ single تودرتو است: { data: { data: {...} } } const appt: any = (data?.data as any)?.data ?? data?.data; + // بازگشت به همان روزِ نوبت (نه امروز). + const day = isoDay(appt?.slot_start); + const backTo = day ? `/admin/appointments?date=${day}` : '/admin/appointments'; return (
@@ -80,11 +90,11 @@ export default function AppointmentDetailPage() { title="جزئیات نوبت" breadcrumbs={[ { label: 'داشبورد', to: '/admin/dashboard' }, - { label: 'نوبت‌ها', to: '/admin/appointments' }, + { label: 'نوبت‌ها', to: backTo }, { label: 'جزئیات' }, ]} action={ -