feat: add doctor invitation modal and appointment creation API

- Implemented InviteDoctorModal component for inviting doctors to clinics.
- Updated ClinicDashboard to include a button for inviting doctors and handle modal state.
- Added createAppointment API endpoint in AdminApiController for scheduling appointments.
- Enhanced ClinicInvitationController to check user access when inviting doctors.
- Updated MyAppointmentsController to ensure unique appointment records.
- Added seed_test_data.php for populating test data including doctors, clinics, and appointments.
- Refactored styles to include new appointment status badges and updated font imports.
This commit is contained in:
hamed
2026-06-11 13:36:54 +03:30
parent 04b51273e3
commit 82e1c264a1
18 changed files with 1095 additions and 274 deletions
+9 -6
View File
@@ -1,5 +1,5 @@
import React, { useEffect } from 'react';
import { Routes, Route, Navigate } from 'react-router-dom';
import { Routes, Route, Navigate, useLocation } from 'react-router-dom';
import { useAuthStore } from './stores/authStore';
import AdminLayout from './components/layout/AdminLayout';
import LoginPage from './pages/LoginPage';
@@ -33,6 +33,7 @@ import SettingsPage from './pages/SettingsPage';
function PrivateRoute({ children }: { children: React.ReactNode }) {
const { isAuthenticated, primaryRole, availableContexts, dbUuid, fetchMe } = useAuthStore();
const location = useLocation();
useEffect(() => {
if (isAuthenticated && !primaryRole) {
@@ -47,8 +48,8 @@ function PrivateRoute({ children }: { children: React.ReactNode }) {
return <div style={{ padding: 40, textAlign: 'center' }}>در حال بارگذاری...</div>;
}
// اگر چند context دارد و هنوز انتخاب نشده — به صفحه انتخاب برو
if (availableContexts.length > 1 && !dbUuid) {
// اگر چند context دارد و هنوز انتخاب نشده و روی صفحه انتخاب نیستیم
if (availableContexts.length > 1 && !dbUuid && location.pathname !== '/admin/select-context') {
return <Navigate to="/admin/select-context" replace />;
}
@@ -126,9 +127,11 @@ export default function App() {
{/* ادمین + کلینیک */}
<Route path="clinics/:uuid" element={<RoleRoute roles={['admin', 'clinic']}><ClinicDetailPage /></RoleRoute>} />
<Route path="doctors" element={<RoleRoute roles={['admin', 'clinic']}><DoctorsPage /></RoleRoute>} />
<Route path="doctors/new" element={<RoleRoute roles={['admin', 'clinic']}><DoctorFormPage /></RoleRoute>} />
<Route path="doctors/:uuid" element={<RoleRoute roles={['admin', 'clinic', 'doctor']}><DoctorDetailPage /></RoleRoute>} />
{/* فقط ادمین — کلینیک از طریق دعوتنامه در صفحه کلینیک خود دکتر اضافه می‌کند */}
<Route path="doctors" element={<RoleRoute roles={['admin']}><DoctorsPage /></RoleRoute>} />
<Route path="doctors/new" element={<RoleRoute roles={['admin']}><DoctorFormPage /></RoleRoute>} />
<Route path="doctors/:uuid" element={<RoleRoute roles={['admin', 'doctor']}><DoctorDetailPage /></RoleRoute>} />
</Route>
<Route path="*" element={<Navigate to="/admin/dashboard" replace />} />