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 ( -