// Navigation_Sidebar.jsx — Clean Modern Matte + Glass Sidebar (no accent bars or header bubbles)
import React, { useMemo, useState } from "react";
import {
Accordion,
AccordionSummary,
AccordionDetails,
Typography,
Box,
ListItemButton,
ListItemText,
Divider,
} from "@mui/material";
import {
ExpandMore as ExpandMoreIcon,
Devices as DevicesIcon,
FilterAlt as FilterIcon,
Groups as GroupsIcon,
Schedule as ScheduleIcon,
PeopleOutline as CommunityIcon,
Apps as AssembliesIcon,
LocationCity as SitesIcon,
Dns as ServerInfoIcon,
VpnKey as CredentialIcon,
PersonOutline as UserIcon,
GitHub as GitHubIcon,
Key as KeyIcon,
AdminPanelSettings as AdminPanelSettingsIcon,
} from "@mui/icons-material";
const COLORS = {
cyan: "#7db7ff",
violet: "#c084fc",
text: "#cbd5e1",
textActive: "#e6f2ff",
matte: "#0f141c",
line: "rgba(125,183,255,0.14)",
hover: "rgba(255,255,255,0.05)",
itemActiveBg:
"linear-gradient(90deg, rgba(125,183,255,0.14) 0%, rgba(125,183,255,0.06) 55%, rgba(125,183,255,0.00) 100%)",
};
function NavigationSidebar({ currentPage, onNavigate, isAdmin = false }) {
const [expandedNav, setExpandedNav] = useState({
sites: true,
devices: true,
automation: true,
filters: true,
access: true,
admin: true,
});
const groupActive = useMemo(
() => ({
sites: currentPage === "sites",
devices: [
"devices",
"ssh_devices",
"winrm_devices",
"agent_devices",
"admin_device_approvals",
"admin_enrollment_codes",
].includes(currentPage),
automation: ["jobs", "assemblies", "community"].includes(currentPage),
filters: ["filters", "groups"].includes(currentPage),
access: [
"access_credentials",
"access_users",
"access_github_token",
].includes(currentPage),
admin: ["server_info"].includes(currentPage),
}),
[currentPage]
);
const Section = ({ title, k, children }) => (
setExpandedNav((s) => ({ ...s, [k]: e }))}
square
disableGutters
sx={{
"&:before": { display: "none" },
m: 0,
bgcolor: "transparent",
border: 0,
}}
>
}
sx={{
minHeight: 38,
"& .MuiAccordionSummary-content": { m: 0, py: 0.5 },
backgroundColor: "rgba(255,255,255,0.02)",
borderTopRightRadius: 8,
borderBottomRightRadius: 8,
px: 1.5,
}}
>
{title}
{children}
);
const NavItem = ({ icon, label, pageKey, indent = 0 }) => {
const active = currentPage === pageKey;
return (
onNavigate(pageKey)}
sx={{
pl: indent ? 4 : 2,
py: 1,
color: active ? COLORS.textActive : COLORS.text,
position: "relative",
background: active ? COLORS.itemActiveBg : "transparent",
borderTopRightRadius: 10,
borderBottomRightRadius: 10,
transition:
"background 160ms ease, box-shadow 160ms ease, color 160ms ease, transform 120ms ease",
"&:hover": {
background: active ? COLORS.itemActiveBg : COLORS.hover,
},
"&:active": { transform: "translateY(0.5px)" },
}}
selected={active}
>
{icon && (
{icon}
)}
);
};
return (
{/* Sites */}
}
label="All Sites"
pageKey="sites"
/>
{/* Inventory */}
}
label="Device Approvals"
pageKey="admin_device_approvals"
/>
}
label="Enrollment Codes"
pageKey="admin_enrollment_codes"
indent
/>
}
label="Devices"
pageKey="devices"
/>
}
label="Agent Devices"
pageKey="agent_devices"
indent
/>
}
label="SSH Devices"
pageKey="ssh_devices"
indent
/>
}
label="WinRM Devices"
pageKey="winrm_devices"
indent
/>
{/* Automation */}
}
label="Assemblies"
pageKey="assemblies"
/>
}
label="Scheduled Jobs"
pageKey="jobs"
/>
}
label="Community Content"
pageKey="community"
/>
{/* Filters & Groups */}
}
label="Filters"
pageKey="filters"
/>
}
label="Groups"
pageKey="groups"
/>
{/* Access Management */}
{isAdmin && (
}
label="Credentials"
pageKey="access_credentials"
/>
}
label="GitHub API Token"
pageKey="access_github_token"
/>
}
label="Users"
pageKey="access_users"
/>
)}
{/* Admin Settings */}
{isAdmin && (
}
label="Server Info"
pageKey="server_info"
/>
)}
);
}
export default React.memo(NavigationSidebar);