Convert backends to Firebase and combine projects
This commit is contained in:
104
RIT-EMS-main/frontend/src/components/Sidebar.tsx
Normal file
104
RIT-EMS-main/frontend/src/components/Sidebar.tsx
Normal file
@@ -0,0 +1,104 @@
|
||||
import React, { useState } from 'react';
|
||||
import {
|
||||
LayoutGrid,
|
||||
ClipboardList,
|
||||
CheckSquare,
|
||||
History as HistoryIcon,
|
||||
Zap,
|
||||
BookOpen,
|
||||
PlusCircle,
|
||||
ChevronRight,
|
||||
ShieldCheck,
|
||||
Users,
|
||||
Calendar,
|
||||
HelpCircle,
|
||||
ExternalLink,
|
||||
CheckCircle
|
||||
} from 'lucide-react';
|
||||
import { cn } from '../lib/utils';
|
||||
import { motion } from 'framer-motion';
|
||||
import ritLogo from '../assets/images/college-logo.png';
|
||||
import { useAuth } from '../context/AuthContext';
|
||||
|
||||
interface SidebarProps {
|
||||
activeItem: string;
|
||||
onItemClick: (id: string) => void;
|
||||
}
|
||||
|
||||
export const Sidebar: React.FC<SidebarProps> = ({ activeItem, onItemClick }) => {
|
||||
const { user } = useAuth();
|
||||
const isClubAuthorized = user?.isClubCoordinator || user?.role === 'ADMIN';
|
||||
|
||||
const menuItems = [
|
||||
{ icon: LayoutGrid, label: 'Dashboard', id: 'dashboard' },
|
||||
...((user?.role === 'HOD' || user?.role === 'PRINCIPAL') ? [{ icon: CheckCircle, label: 'Approvals', id: 'approvals' }] : []),
|
||||
...(isClubAuthorized ? [{ icon: ShieldCheck, label: 'Clubs', id: 'clubs' }] : []),
|
||||
{ icon: ClipboardList, label: 'All Events', id: 'events' },
|
||||
{ icon: CheckSquare, label: 'Checklist', id: 'checklist' },
|
||||
{ icon: HistoryIcon, label: 'History', id: 'history' },
|
||||
...((user?.role === 'ADMIN' || user?.role === 'PRINCIPAL' || user?.role === 'HOD') ? [{ icon: Zap, label: 'Automation', id: 'automation' }] : []),
|
||||
...(user?.role === 'ADMIN' ? [{ icon: BookOpen, label: 'Classes', id: 'classes' }] : []),
|
||||
...(user?.role === 'ADMIN' ? [{ icon: Users, label: 'Manage Users', id: 'user-management' }] : [])
|
||||
];
|
||||
|
||||
return (
|
||||
<aside className="floating-sidebar">
|
||||
{/* Logo */}
|
||||
<div className="flex items-center gap-3 mb-8 px-2">
|
||||
<img src={ritLogo} alt="College Logo" className="h-14 w-auto object-contain" />
|
||||
</div>
|
||||
|
||||
|
||||
{/* Navigation */}
|
||||
<nav className="flex-1 space-y-1.5 overflow-y-auto custom-scrollbar pr-1">
|
||||
<p className="px-4 text-[10px] font-black uppercase tracking-widest text-slate-400 mb-4">Main Menu</p>
|
||||
{menuItems.map((item) => (
|
||||
<motion.div
|
||||
key={item.id}
|
||||
whileHover={{ x: 4 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
onClick={() => onItemClick(item.id)}
|
||||
className={cn(
|
||||
"sidebar-item group relative",
|
||||
activeItem === item.id && "sidebar-item-active"
|
||||
)}
|
||||
>
|
||||
<div className={cn(
|
||||
"p-2 rounded-xl transition-all",
|
||||
activeItem === item.id ? "bg-white shadow-sm" : "bg-transparent group-hover:bg-white/50"
|
||||
)}>
|
||||
<item.icon className="w-4.5 h-4.5" strokeWidth={2.5} />
|
||||
</div>
|
||||
<span className="flex-1 text-sm">{item.label}</span>
|
||||
{activeItem === item.id && (
|
||||
<div className="w-1.5 h-1.5 rounded-full bg-brand-indigo" />
|
||||
)}
|
||||
</motion.div>
|
||||
))}
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
{/* Footer Build Info */}
|
||||
<div className="mt-auto px-4 pt-6 border-t border-slate-50">
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<div className="flex items-center gap-1.5 px-3 py-1 bg-brand-glow text-brand-indigo rounded-full border border-brand-indigo/10 backdrop-blur-sm group/beta hover:bg-brand-indigo hover:text-white transition-all duration-300 cursor-default">
|
||||
<div className="w-1 h-1 bg-brand-indigo rounded-full group-hover/beta:bg-white animate-pulse" />
|
||||
<span className="text-[9px] font-black uppercase tracking-[0.2em]">Beta</span>
|
||||
</div>
|
||||
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-slate-300">
|
||||
v0.1.5
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<div className="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse" />
|
||||
<span className="text-[9px] font-black uppercase tracking-[0.2em] text-emerald-500/70">
|
||||
Live Systems
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user