diff --git a/assets/admin/pages/DoctorDetailPage.tsx b/assets/admin/pages/DoctorDetailPage.tsx index 954655da..9096c38e 100644 --- a/assets/admin/pages/DoctorDetailPage.tsx +++ b/assets/admin/pages/DoctorDetailPage.tsx @@ -1274,6 +1274,18 @@ function WeeklyScheduleTab({ doctorUuid, addresses }: { doctorUuid: string; addr
{Array.from({ length: 4 }).map((_, i) =>
)}
); + if (addresses.length === 0) return ( +
+
+ +
+
+

ابتدا آدرس مطب را ثبت کنید

+

برنامه کاری نیاز به حداقل یک مکان نوبت دارد

+
+
+ ); + return (
{/* ─ خلاصه کل هفته */} @@ -1537,6 +1549,18 @@ function DateOverridesTab({ doctorUuid, addresses }: { doctorUuid: string; addre
{Array.from({ length: 3 }).map((_, i) =>
)}
); + if (addresses.length === 0) return ( +
+
+ +
+
+

ابتدا آدرس مطب را ثبت کنید

+

برنامه کاری نیاز به حداقل یک مکان نوبت دارد

+
+
+ ); + return (
diff --git a/assets/admin/pages/MySecretariesPage.tsx b/assets/admin/pages/MySecretariesPage.tsx index 8393c4b7..2755b617 100644 --- a/assets/admin/pages/MySecretariesPage.tsx +++ b/assets/admin/pages/MySecretariesPage.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { PlusIcon, PencilIcon, TrashIcon, IdentificationIcon, PhoneIcon } from '@heroicons/react/24/outline'; +import { PlusIcon, PencilIcon, NoSymbolIcon, CheckCircleIcon, IdentificationIcon, PhoneIcon } from '@heroicons/react/24/outline'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; @@ -132,7 +132,8 @@ function PermissionsMatrix({ // ── Create form schema ───────────────────────────────────────────────────── const createSchema = z.object({ - mobile_number: z.string().min(10, 'شماره موبایل معتبر نیست'), + name: z.string().min(2, 'نام الزامی است'), + mobile_number: z.string().regex(/^09[0-9]{9}$/, 'شماره موبایل معتبر نیست'), }); type CreateForm = z.infer; @@ -182,6 +183,7 @@ export default function MySecretariesPage() { const secretaries = isClinic ? (clinicSecrData?.data ?? []) : (doctorSecrData?.data ?? []); + const activeSecretaryCount = secretaries.filter((s) => s.is_active).length; const isLoading = isClinic ? clinicSecrLoading : doctorSecrLoading; const createForm = useForm({ resolver: zodResolver(createSchema) }); @@ -211,10 +213,11 @@ export default function MySecretariesPage() { onError: (e: any) => toast.error(e.message), }); - const deleteMutation = useMutation({ - mutationFn: (uuid: string) => api.delete(`/api/v1/secretary/${uuid}`), - onSuccess: () => { - toast.success('منشی غیرفعال شد'); + const toggleActiveMutation = useMutation({ + mutationFn: ({ uuid, active }: { uuid: string; active: boolean }) => + api.patch(`/api/v1/secretary/${uuid}`, { active }), + onSuccess: (_, { active }) => { + toast.success(active ? 'منشی فعال شد' : 'منشی غیرفعال شد'); setDeleteTarget(null); qc.invalidateQueries({ queryKey: ['my-secretaries'] }); qc.invalidateQueries({ queryKey: ['my-secretaries-clinic'] }); @@ -298,8 +301,15 @@ export default function MySecretariesPage() { -
), @@ -312,7 +322,7 @@ export default function MySecretariesPage() { title="منشیان من" description="مدیریت منشیان و دسترسی‌های آن‌ها" action={ - secretaries.length >= maxSecretaries ? ( + activeSecretaryCount >= maxSecretaries ? ( ارتقاء پنل برای افزودن منشی @@ -378,33 +388,74 @@ export default function MySecretariesPage() { )} {/* Modal افزودن منشی */} - setCreateOpen(false)} title="افزودن منشی جدید"> + { setCreateOpen(false); createForm.reset(); }} + title="افزودن منشی جدید" + size="sm" + footer={ + <> + + + + } + > {isClinic && selectedDoctorName && ( -
- منشی برای دکتر {selectedDoctorName} اضافه می‌شود +
+ + منشی برای {selectedDoctorName} ثبت می‌شود
)} -
createMutation.mutate(d))}> + createMutation.mutate(d))}>
+ + + {createForm.formState.errors.name && ( + {createForm.formState.errors.name.message} + )} +
+
{ + const digits = e.target.value.replace(/\D/g, ''); + createForm.setValue('mobile_number', digits, { shouldValidate: createForm.formState.isSubmitted }); + }} + style={createForm.formState.errors.mobile_number ? { borderColor: 'var(--danger)' } : undefined} /> {createForm.formState.errors.mobile_number && ( {createForm.formState.errors.mobile_number.message} )}
-

- کاربری با این شماره در سیستم جستجو شده و به عنوان منشی اضافه می‌شود. +

+ شماره باید با ۰۹ شروع شده و ۱۱ رقم باشد. اگر کاربری با این شماره در سیستم وجود داشته باشد، به عنوان منشی اضافه می‌شود.

-
- - -
@@ -430,15 +481,18 @@ export default function MySecretariesPage() { - {/* Confirm غیرفعال‌سازی */} + {/* Confirm تغییر وضعیت منشی */} deleteTarget && deleteMutation.mutate(deleteTarget.uuid)} + title={deleteTarget?.is_active ? 'غیرفعال‌سازی منشی' : 'فعال‌سازی منشی'} + message={deleteTarget?.is_active + ? `آیا مطمئن هستید که می‌خواهید منشی «${deleteTarget?.user_name}» را غیرفعال کنید؟` + : `آیا مطمئن هستید که می‌خواهید منشی «${deleteTarget?.user_name}» را دوباره فعال کنید؟` + } + confirmLabel={deleteTarget?.is_active ? 'غیرفعال‌سازی' : 'فعال‌سازی'} + danger={deleteTarget?.is_active} + loading={toggleActiveMutation.isPending} + onConfirm={() => deleteTarget && toggleActiveMutation.mutate({ uuid: deleteTarget.uuid, active: !deleteTarget.is_active })} onCancel={() => setDeleteTarget(null)} /> diff --git a/src/Secretary/Controller/SecretaryController.php b/src/Secretary/Controller/SecretaryController.php index b7eb200d..c4fd37e8 100644 --- a/src/Secretary/Controller/SecretaryController.php +++ b/src/Secretary/Controller/SecretaryController.php @@ -78,6 +78,9 @@ class SecretaryController extends BaseController $secretaryUser->setPasswordHash($hash); } } + if (!empty($data['name'])) { + $secretaryUser->setRealName(trim($data['name'])); + } // Assign ROLE_SECRETARY $roles = $secretaryUser->getRoles(); @@ -151,7 +154,7 @@ class SecretaryController extends BaseController } #[Route('/api/v1/secretary/{uuid}', methods: ['DELETE'])] - public function delete(string $uuid, #[CurrentUser] User $currentUser): JsonResponse + public function deactivate(string $uuid, #[CurrentUser] User $currentUser): JsonResponse { $secretary = $this->secretaryRepo->findByUuid($uuid); if ($secretary === null) { @@ -162,9 +165,10 @@ class SecretaryController extends BaseController return $this->error(ErrorCodes::ERR_AUTH_006, 'دسترسی ممنوع', 403); } - $this->secretaryRepo->remove($secretary); + $secretary->setActive(false); + $this->secretaryRepo->save($secretary); - return $this->success(['message' => 'منشی با موفقیت حذف شد']); + return $this->success(['message' => 'منشی غیرفعال شد']); } /** لیست منشیان مطب شخصی یک دکتر */