aethex-forge/client/components/admin/AdminSidebar.tsx
Builder.io dfcd77a823 completionId: cgen-192ef40629cf46e1984e79cb2608dbff
cgen-192ef40629cf46e1984e79cb2608dbff
2025-11-11 23:25:26 +00:00

252 lines
7.1 KiB
TypeScript

import { useLocation } from "react-router-dom";
import { cn } from "@/lib/utils";
import {
BarChart3,
FileText,
Users,
MessageSquare,
Grid3x3,
Settings,
Award,
Shield,
Rocket,
PenTool,
Command,
Activity,
ClipboardList,
BookOpen,
Home,
ArrowRight,
Music,
} from "lucide-react";
interface SidebarSection {
label: string;
items: {
id: string;
label: string;
icon: React.ReactNode;
onClick: () => void;
}[];
}
interface AdminSidebarProps {
activeTab: string;
onTabChange: (tab: string) => void;
}
export default function AdminSidebar({
activeTab,
onTabChange,
}: AdminSidebarProps) {
const location = useLocation();
const sections: SidebarSection[] = [
{
label: "Overview",
items: [
{
id: "overview",
label: "Dashboard",
icon: <BarChart3 className="h-4 w-4" />,
onClick: () => onTabChange("overview"),
},
{
id: "system-map",
label: "System Map",
icon: <Grid3x3 className="h-4 w-4" />,
onClick: () => onTabChange("system-map"),
},
{
id: "roadmap",
label: "Roadmap",
icon: <Rocket className="h-4 w-4" />,
onClick: () => onTabChange("roadmap"),
},
],
},
{
label: "Staff Management",
items: [
{
id: "staff",
label: "Staff Operations",
icon: <Shield className="h-4 w-4" />,
onClick: () => onTabChange("staff"),
},
{
id: "blogs",
label: "Blog Posts",
icon: <PenTool className="h-4 w-4" />,
onClick: () => onTabChange("blogs"),
},
{
id: "community",
label: "Community",
icon: <Users className="h-4 w-4" />,
onClick: () => onTabChange("community"),
},
{
id: "mentorship",
label: "Mentorship",
icon: <Award className="h-4 w-4" />,
onClick: () => onTabChange("mentorship"),
},
],
},
{
label: "Staff Resources",
items: [
{
id: "announcements",
label: "Announcements",
icon: <MessageSquare className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/announcements"),
},
{
id: "knowledge-base",
label: "Knowledge Base",
icon: <BookOpen className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/knowledge-base"),
},
{
id: "team-handbook",
label: "Team Handbook",
icon: <FileText className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/team-handbook"),
},
{
id: "learning-portal",
label: "Learning Portal",
icon: <BookOpen className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/learning-portal"),
},
{
id: "project-tracking",
label: "Project Tracking",
icon: <ClipboardList className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/project-tracking"),
},
{
id: "performance-reviews",
label: "Performance Reviews",
icon: <Award className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/performance-reviews"),
},
{
id: "expense-reports",
label: "Expense Reports",
icon: <FileText className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/expense-reports"),
},
{
id: "marketplace",
label: "Internal Marketplace",
icon: <Grid3x3 className="h-4 w-4" />,
onClick: () => (window.location.href = "/staff/marketplace"),
},
],
},
{
label: "Platform",
items: [
{
id: "arm-metrics",
label: "Arm Metrics",
icon: <Activity className="h-4 w-4" />,
onClick: () => onTabChange("arm-metrics"),
},
{
id: "ethos",
label: "Ethos Verification",
icon: <Music className="h-4 w-4" />,
onClick: () => onTabChange("ethos"),
},
{
id: "discord",
label: "Discord Management",
icon: <Command className="h-4 w-4" />,
onClick: () => onTabChange("discord"),
},
{
id: "operations",
label: "Operations",
icon: <Settings className="h-4 w-4" />,
onClick: () => onTabChange("operations"),
},
],
},
{
label: "Resources",
items: [
{
id: "internal-docs",
label: "Internal Docs",
icon: <BookOpen className="h-4 w-4" />,
onClick: () => (window.location.href = "/internal-docs"),
},
],
},
];
return (
<aside className="hidden lg:flex flex-col w-64 bg-background/50 border-r border-border/40 backdrop-blur">
{/* Header */}
<div className="p-6 border-b border-border/40">
<div className="flex items-center gap-2">
<div className="h-8 w-8 rounded-lg bg-gradient-to-br from-aethex-500 to-purple-600 flex items-center justify-center">
<Shield className="h-4 w-4 text-white" />
</div>
<div>
<h1 className="text-sm font-semibold">Admin Control</h1>
<p className="text-xs text-muted-foreground">Staff Portal</p>
</div>
</div>
</div>
{/* Navigation Sections */}
<div className="flex-1 overflow-y-auto p-4 space-y-8">
{sections.map((section) => (
<div key={section.label} className="space-y-2">
<h3 className="px-3 text-xs font-semibold text-muted-foreground uppercase tracking-wider">
{section.label}
</h3>
<nav className="space-y-1">
{section.items.map((item) => (
<button
key={item.id}
onClick={item.onClick}
className={cn(
"w-full flex items-center gap-3 px-3 py-2 rounded-md text-sm font-medium transition-colors",
activeTab === item.id
? "bg-aethex-500/20 text-aethex-200 border border-aethex-400/30"
: "text-muted-foreground hover:text-foreground hover:bg-muted/50",
)}
>
{item.icon}
<span className="flex-1 text-left">{item.label}</span>
{activeTab === item.id && (
<ArrowRight className="h-3 w-3 opacity-50" />
)}
</button>
))}
</nav>
</div>
))}
</div>
{/* Footer */}
<div className="p-4 border-t border-border/40 space-y-2">
<p className="text-xs text-muted-foreground px-3">
Need help? Check the{" "}
<button
onClick={() => (window.location.href = "/internal-docs")}
className="text-aethex-300 hover:text-aethex-200 underline"
>
docs
</button>
</p>
</div>
</aside>
);
}