import React, { useState, useContext } from "react";
import { Link, useLocation } from "wouter";
import { Button } from "@/components/ui/button";
import { Avatar, AvatarFallback } from "@/components/ui/avatar";
import { Separator } from "@/components/ui/separator";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
ChevronDown,
LogOut,
Menu,
Bell,
HelpCircle,
User,
Settings,
Home,
Users,
UserPlus,
FolderClosed,
Monitor,
Globe,
Key,
Server,
ShieldAlert,
Filter,
ClipboardList,
Building2,
BarChart3,
LineChart,
} from "lucide-react";
import { useMobile } from "@/hooks/use-mobile";
import { useToast } from "@/hooks/use-toast";
import { AuthContext } from "@/hooks/use-auth";
import { ThemeToggle } from "@/components/theme-toggle";
type MenuItem = {
title: string;
path: string;
icon: React.ReactNode;
};
type MenuSection = {
title: string;
items: MenuItem[];
};
const menuSections: MenuSection[] = [
{
title: "Active Directory",
items: [
{ title: "Users", path: "/users", icon: },
{ title: "Groups", path: "/groups", icon: },
{ title: "Dynamic Groups", path: "/dynamic-groups", icon: },
{ title: "Organizational Units", path: "/organizational-units", icon: },
{ title: "Computers", path: "/computers", icon: },
{ title: "Domains", path: "/domains", icon: },
{ title: "Sites & Subnets", path: "/sites", icon: },
],
},
{
title: "Reporting",
items: [
{ title: "Custom Dashboards", path: "/reporting/dashboards", icon: },
],
},
{
title: "Administration",
items: [
{ title: "API Tokens", path: "/api-tokens", icon: },
{ title: "LDAP Connections", path: "/ldap-connections", icon: },
{ title: "LDAP Query Builder", path: "/ldap-query-builder", icon: },
{ title: "Audit Logs", path: "/audit-logs", icon: },
{ title: "Settings", path: "/settings", icon: },
{ title: "User Management", path: "/user-management", icon: },
],
},
];
interface DashboardLayoutProps {
children: React.ReactNode;
title: string;
description?: string;
}
export function DashboardLayout({ children, title, description }: DashboardLayoutProps) {
const [location, navigate] = useLocation();
const isMobile = useMobile();
const [sidebarOpen, setSidebarOpen] = useState(!isMobile);
const auth = useContext(AuthContext);
if (!auth) {
console.error("Auth context not available");
return
Authentication error. Please refresh the page.
;
}
const { user, logoutMutation } = auth;
const { toast } = useToast();
const handleLogout = async () => {
logoutMutation.mutate(undefined, {
onSuccess: () => {
navigate('/auth');
}
});
};
// Get user initials for avatar
const getInitials = () => {
if (!user) return "U";
if (user.fullName) {
const nameParts = user.fullName.split(" ");
if (nameParts.length > 1) {
return `${nameParts[0][0]}${nameParts[nameParts.length - 1][0]}`.toUpperCase();
}
return nameParts[0][0].toUpperCase();
}
return user.username[0].toUpperCase();
};
return (
{/* Sidebar */}
AD Management API
Dashboard
{menuSections.map((section, idx) => (
{section.title}
{section.items.map((item, itemIdx) => (
{item.icon}
{item.title}
))}
))}
{/* Main Content */}
{/* Top App Bar */}
{/* Main Content Area */}
{title}
{description &&
{description}
}
{children}
);
}
export default DashboardLayout;