From 7fb805be27db5764836b8f7ecfba876a476a2ee9 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Wed, 10 Jun 2026 20:45:13 +0330 Subject: [PATCH] Refactor code structure for improved readability and maintainability --- .gitignore | 1 + .../admin/components/layout/AdminLayout.tsx | 33 +- assets/admin/components/layout/Sidebar.tsx | 182 ++-- assets/admin/components/layout/Topbar.tsx | 246 ++++- assets/admin/components/ui/ConfirmDialog.tsx | 53 +- assets/admin/components/ui/DataTable.tsx | 59 +- assets/admin/components/ui/Modal.tsx | 51 +- assets/admin/components/ui/PageHeader.tsx | 21 +- assets/admin/components/ui/Pagination.tsx | 24 +- assets/admin/components/ui/StatusBadge.tsx | 70 +- assets/admin/pages/AppointmentDetailPage.tsx | 2 +- assets/admin/pages/AppointmentsPage.tsx | 129 ++- assets/admin/pages/BlogFormPage.tsx | 14 +- assets/admin/pages/BlogsPage.tsx | 96 +- assets/admin/pages/CategoriesPage.tsx | 697 ++++++-------- assets/admin/pages/ClinicsPage.tsx | 78 +- assets/admin/pages/CommentsPage.tsx | 68 +- assets/admin/pages/DashboardPage.tsx | 760 +++++++-------- assets/admin/pages/DoctorDetailPage.tsx | 16 +- assets/admin/pages/DoctorsPage.tsx | 902 +++++------------- assets/admin/pages/LoginPage.tsx | 200 ++-- assets/admin/pages/PaymentsPage.tsx | 126 ++- assets/admin/pages/RatingsPage.tsx | 66 +- .../admin/pages/RepresentationDetailPage.tsx | 12 +- assets/admin/pages/RepresentationsPage.tsx | 133 ++- assets/admin/pages/SecretariesPage.tsx | 89 +- assets/admin/pages/SettlementsPage.tsx | 98 +- assets/admin/pages/SmsPage.tsx | 165 ++-- assets/admin/pages/UserDetailPage.tsx | 4 +- assets/admin/pages/UsersPage.tsx | 585 ++++-------- assets/admin/stores/uiStore.ts | 52 +- assets/admin/styles.css | 653 +++++++++++-- 32 files changed, 2808 insertions(+), 2877 deletions(-) diff --git a/.gitignore b/.gitignore index 5c1f99a2..6204f2bd 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ npm-debug.log yarn-error.log ###< symfony/webpack-encore-bundle ### +clinicpro/* \ No newline at end of file diff --git a/assets/admin/components/layout/AdminLayout.tsx b/assets/admin/components/layout/AdminLayout.tsx index 0d76c445..522e692d 100644 --- a/assets/admin/components/layout/AdminLayout.tsx +++ b/assets/admin/components/layout/AdminLayout.tsx @@ -1,22 +1,37 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { Outlet } from 'react-router-dom'; import Sidebar from './Sidebar'; import Topbar from './Topbar'; import { useUiStore } from '../../stores/uiStore'; export default function AdminLayout() { - const darkMode = useUiStore((s) => s.darkMode); + const darkMode = useUiStore((s) => s.darkMode); + const density = useUiStore((s) => s.density); + const brandHue = useUiStore((s) => s.brandHue); + const sidebarOpen = useUiStore((s) => s.sidebarOpen); + const setSidebarOpen = useUiStore((s) => s.setSidebarOpen); + const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { - document.documentElement.classList.toggle('dark', darkMode); - }, [darkMode]); + const root = document.documentElement; + root.classList.toggle('dark', darkMode); + root.setAttribute('data-theme', darkMode ? 'dark' : 'light'); + root.setAttribute('data-density', density); + root.style.setProperty('--brand-h', String(brandHue.h)); + root.style.setProperty('--brand-c', String(brandHue.c)); + }, [darkMode, density, brandHue]); return ( -
- -
- -
+
+
setMobileOpen(false)} /> + setMobileOpen(false)} /> +
+ setMobileOpen(true)} /> +
diff --git a/assets/admin/components/layout/Sidebar.tsx b/assets/admin/components/layout/Sidebar.tsx index 6010d5ec..e3cd05eb 100644 --- a/assets/admin/components/layout/Sidebar.tsx +++ b/assets/admin/components/layout/Sidebar.tsx @@ -1,21 +1,10 @@ import React from 'react'; import { NavLink, useNavigate } from 'react-router-dom'; import { - ChartBarIcon, - UserGroupIcon, - HeartIcon, - BuildingOffice2Icon, - CalendarDaysIcon, - CreditCardIcon, - BanknotesIcon, - UsersIcon, - ChatBubbleLeftEllipsisIcon, - StarIcon, - DevicePhoneMobileIcon, - TagIcon, - DocumentTextIcon, - KeyIcon, - Bars3Icon, + ChartBarIcon, UserGroupIcon, HeartIcon, BuildingOffice2Icon, + CalendarDaysIcon, CreditCardIcon, BanknotesIcon, + ChatBubbleLeftEllipsisIcon, StarIcon, DevicePhoneMobileIcon, + TagIcon, DocumentTextIcon, UsersIcon, KeyIcon, ArrowLeftOnRectangleIcon, } from '@heroicons/react/24/outline'; import { useUiStore } from '../../stores/uiStore'; @@ -25,144 +14,111 @@ const sections = [ { label: 'عمومی', items: [ - { to: '/admin/dashboard', icon: ChartBarIcon, label: 'داشبورد' }, - { to: '/admin/users', icon: UserGroupIcon, label: 'کاربران' }, - { to: '/admin/doctors', icon: HeartIcon, label: 'پزشکان' }, - { to: '/admin/clinics', icon: BuildingOffice2Icon, label: 'کلینیک‌ها' }, + { to: '/admin/dashboard', icon: ChartBarIcon, label: 'داشبورد' }, + { to: '/admin/users', icon: UserGroupIcon, label: 'کاربران' }, + { to: '/admin/doctors', icon: HeartIcon, label: 'پزشکان' }, + { to: '/admin/clinics', icon: BuildingOffice2Icon, label: 'کلینیک‌ها' }, ], }, { label: 'مدیریت', items: [ - { to: '/admin/appointments', icon: CalendarDaysIcon, label: 'نوبت‌ها' }, - { to: '/admin/payments', icon: CreditCardIcon, label: 'پرداخت‌ها' }, - { to: '/admin/settlements', icon: BanknotesIcon, label: 'تسویه‌حساب' }, + { to: '/admin/appointments', icon: CalendarDaysIcon, label: 'نوبت‌ها' }, + { to: '/admin/payments', icon: CreditCardIcon, label: 'پرداخت‌ها' }, + { to: '/admin/settlements', icon: BanknotesIcon, label: 'تسویه‌حساب' }, ], }, { label: 'محتوا', items: [ - { to: '/admin/comments', icon: ChatBubbleLeftEllipsisIcon, label: 'نظرات' }, - { to: '/admin/ratings', icon: StarIcon, label: 'امتیازها' }, - { to: '/admin/blogs', icon: DocumentTextIcon, label: 'بلاگ' }, - { to: '/admin/sms', icon: DevicePhoneMobileIcon, label: 'پیامک' }, + { to: '/admin/comments', icon: ChatBubbleLeftEllipsisIcon, label: 'نظرات' }, + { to: '/admin/ratings', icon: StarIcon, label: 'امتیازها' }, + { to: '/admin/blogs', icon: DocumentTextIcon, label: 'بلاگ' }, + { to: '/admin/sms', icon: DevicePhoneMobileIcon, label: 'پیامک' }, ], }, { label: 'سیستم', items: [ - { to: '/admin/categories', icon: TagIcon, label: 'دسته‌بندی‌ها' }, - { to: '/admin/representations', icon: UsersIcon, label: 'نمایندگان' }, - { to: '/admin/secretaries', icon: KeyIcon, label: 'منشی‌ها' }, + { to: '/admin/categories', icon: TagIcon, label: 'دسته‌بندی‌ها' }, + { to: '/admin/representations', icon: UsersIcon, label: 'نمایندگان' }, + { to: '/admin/secretaries', icon: KeyIcon, label: 'منشی‌ها' }, ], }, ]; -export default function Sidebar() { - const open = useUiStore((s) => s.sidebarOpen); - const toggle = useUiStore((s) => s.toggleSidebar); +interface Props { + mobileOpen?: boolean; + onMobileClose?: () => void; +} + +export default function Sidebar({ mobileOpen: _mobileOpen, onMobileClose: _onMobileClose }: Props) { + const sidebarOpen = useUiStore((s) => s.sidebarOpen); + const toggleSidebar = useUiStore((s) => s.toggleSidebar); const logout = useAuthStore((s) => s.logout); const navigate = useNavigate(); return ( -