import { Outlet, Link, useNavigate, useLocation } from "react-router-dom"; import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"; import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarHeader, SidebarFooter, SidebarSeparator, useSidebar, } from "@/components/ui/sidebar"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { NavLink } from "@/components/NavLink"; import { useAuth } from "@/contexts/AuthContext"; import NotificationDropdown from "@/components/NotificationDropdown"; import AiAssistantDrawer from "@/components/ai/AiAssistantDrawer"; import AiSearchBar from "@/components/ai/AiSearchBar"; import { usePermissions } from "@/hooks/usePermissions"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; import { GraduationCap, LogOut, User, Settings, LayoutDashboard, ClipboardList, FileText, Layers, BookOpen, Wand2, GitBranch, Users, BarChart3, Building2, History, CreditCard, Ticket, BookA, PenTool, Calendar, ChevronDown, HelpCircle, LucideIcon, Target, FolderOpen, CalendarDays, Landmark, UserPlus, ScrollText, Award, HelpCircle as FaqIcon, Bell, Workflow, CalendarOff, DollarSign, BookMarked, BarChartHorizontal, TrendingUp, Library, Activity, Warehouse, UserCog, } from "lucide-react"; import React from "react"; // ============= Navigation Config ============= interface NavItem { title: string; url: string; icon: LucideIcon } const overviewItems: NavItem[] = [ { title: "Admin Dashboard", url: "/admin/dashboard", icon: LayoutDashboard }, { title: "Platform Dashboard", url: "/admin/platform", icon: BarChart3 }, ]; const lmsItems: NavItem[] = [ { title: "Courses", url: "/admin/courses", icon: BookOpen }, { title: "Students", url: "/admin/students", icon: Users }, { title: "Teachers", url: "/admin/teachers", icon: GraduationCap }, { title: "Batches", url: "/admin/batches", icon: Layers }, { title: "Timetable", url: "/admin/timetable", icon: Calendar }, { title: "Reports", url: "/admin/reports", icon: BarChart3 }, ]; const academicItems: NavItem[] = [ { title: "Assignments", url: "/admin/assignments", icon: ClipboardList }, { title: "Exams List", url: "/admin/examsList", icon: FileText }, { title: "Exam Structures", url: "/admin/exam-structures", icon: Layers }, { title: "Rubrics", url: "/admin/rubrics", icon: BookOpen }, { title: "Generation", url: "/admin/generation", icon: Wand2 }, { title: "Approval Workflows", url: "/admin/approval-workflows", icon: GitBranch }, ]; const adaptiveItems: NavItem[] = [ { title: "Taxonomy", url: "/admin/taxonomy", icon: Target }, { title: "Resources", url: "/admin/resources", icon: FolderOpen }, ]; const institutionalItems: NavItem[] = [ { title: "Academic Years", url: "/admin/academic-years", icon: CalendarDays }, { title: "Departments", url: "/admin/departments", icon: Landmark }, { title: "Admissions", url: "/admin/admissions", icon: UserPlus }, { title: "Admission Register", url: "/admin/admission-register", icon: ScrollText }, { title: "Exam Sessions", url: "/admin/exam-sessions", icon: FileText }, { title: "Marksheets", url: "/admin/marksheets", icon: Award }, { title: "Student Leave", url: "/admin/student-leave", icon: CalendarOff }, { title: "Fees & Payments", url: "/admin/fees", icon: DollarSign }, { title: "Lessons", url: "/admin/lessons", icon: BookMarked }, { title: "Gradebook", url: "/admin/gradebook", icon: BarChartHorizontal }, { title: "Student Progress", url: "/admin/student-progress", icon: TrendingUp }, { title: "Library", url: "/admin/library", icon: Library }, { title: "Activities", url: "/admin/activities", icon: Activity }, { title: "Facilities", url: "/admin/facilities", icon: Warehouse }, ]; const managementItems: NavItem[] = [ { title: "Users", url: "/admin/users", icon: Users }, { title: "Entities", url: "/admin/entities", icon: Building2 }, { title: "Classrooms", url: "/admin/classrooms", icon: GraduationCap }, { title: "User Roles", url: "/admin/user-roles", icon: UserCog }, { title: "Roles & Permissions", url: "/admin/roles-permissions", icon: Settings }, { title: "Authority Matrix", url: "/admin/authority-matrix", icon: Workflow }, ]; const reportItems: NavItem[] = [ { title: "Student Performance", url: "/admin/student-performance", icon: BarChart3 }, { title: "Stats Corporate", url: "/admin/stats-corporate", icon: Building2 }, { title: "Record", url: "/admin/record", icon: History }, ]; const trainingItems: NavItem[] = [ { title: "Vocabulary", url: "/admin/training/vocabulary", icon: BookA }, { title: "Grammar", url: "/admin/training/grammar", icon: PenTool }, ]; const configItems: NavItem[] = [ { title: "FAQ Manager", url: "/admin/faq", icon: FaqIcon }, { title: "Notification Rules", url: "/admin/notification-rules", icon: Bell }, { title: "Approval Config", url: "/admin/approval-config", icon: Workflow }, ]; const supportItems: NavItem[] = [ { title: "Payment Record", url: "/admin/payment-record", icon: CreditCard }, { title: "Tickets", url: "/admin/tickets", icon: Ticket }, { title: "Settings", url: "/admin/settings-platform", icon: Settings }, ]; // ============= Reusable sidebar group ============= function SidebarNavGroup({ label, items }: { label: string; items: NavItem[] }) { const { state } = useSidebar(); const collapsed = state === "collapsed"; return ( {label} {items.map((item) => ( {!collapsed && {item.title}} ))} ); } // ============= Breadcrumbs ============= const routeLabels: Record = { admin: "Admin", dashboard: "Dashboard", platform: "Platform", courses: "Courses", students: "Students", teachers: "Teachers", batches: "Batches", timetable: "Timetable", reports: "Reports", assignments: "Assignments", examsList: "Exams List", "exam-structures": "Exam Structures", rubrics: "Rubrics", generation: "Generation", "approval-workflows": "Approval Workflows", users: "Users", entities: "Entities", classrooms: "Classrooms", "student-performance": "Student Performance", "stats-corporate": "Stats Corporate", record: "Record", training: "Training", vocabulary: "Vocabulary", grammar: "Grammar", "payment-record": "Payment Record", tickets: "Tickets", "settings-platform": "Settings", settings: "Settings", profile: "Profile", exam: "Exam", "academic-years": "Academic Years", departments: "Departments", admissions: "Admissions", "admission-register": "Admission Register", "exam-sessions": "Exam Sessions", marksheets: "Marksheets", faq: "FAQ Manager", "notification-rules": "Notification Rules", "approval-config": "Approval Config", "student-leave": "Student Leave", fees: "Fees & Payments", lessons: "Lessons", gradebook: "Gradebook", "student-progress": "Student Progress", library: "Library", activities: "Activities", facilities: "Facilities", }; function AppBreadcrumbs() { const location = useLocation(); const segments = location.pathname.split("/").filter(Boolean); return ( Home {segments.map((seg, i) => { const path = "/" + segments.slice(0, i + 1).join("/"); const label = routeLabels[seg] || seg.charAt(0).toUpperCase() + seg.slice(1); const isLast = i === segments.length - 1; return ( {isLast ? {label} : {label}} ); })} ); } // ============= Main Layout ============= export default function AdminLmsLayout() { const { user, logout } = useAuth(); const navigate = useNavigate(); const initials = user?.name?.split(" ").map(w => w[0]).join("").slice(0, 2).toUpperCase() ?? "??"; const handleLogout = async () => { await logout(); navigate("/login"); }; return ( navigate("/admin/tickets")} className="text-muted-foreground hover:text-foreground"> {initials} {user?.name ?? "User"} {user?.email ?? ""} navigate("/admin/profile")}> Profile navigate("/admin/settings-platform")}> Settings Logout Need help? ); } // ============= Admin Sidebar ============= function AdminSidebar() { const { state } = useSidebar(); const collapsed = state === "collapsed"; const { user } = useAuth(); const { hasAnyPermission, isAdmin } = usePermissions(); const showManagement = isAdmin || hasAnyPermission(["view_entities", "view_students", "view_teachers"]); const showReports = isAdmin || hasAnyPermission(["view_statistics", "view_student_performance", "view_entity_statistics"]); const showPayments = isAdmin || hasAnyPermission(["view_payment_record", "pay_entity"]); return ( {!collapsed && ( En Coach )} {showManagement && } {showReports && } Training {!collapsed && } {trainingItems.map((item) => ( {!collapsed && {item.title}} ))} i.url !== "/admin/payment-record")} /> {user?.name?.split(" ").map(w => w[0]).join("").slice(0, 2).toUpperCase() ?? "??"} {!collapsed && ( {user?.name ?? "User"} {user?.email ?? ""} )} ); }
{user?.name ?? "User"}
{user?.email ?? ""}