////////// PROJECT FILE SEPARATION LINE ////////// CODE AFTER THIS LINE ARE FROM: /Data/Engine/web-interface/src/Navigation_Sidebar.jsx 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, Dashboard as PageTemplateIcon, AdminPanelSettings as AdminPanelSettingsIcon, ReceiptLong as LogsIcon, } 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", "log_management", "page_template"].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" /> } label="Log Management" pageKey="log_management" /> } label="Page Template" pageKey="page_template" />
)}
); } export default React.memo(NavigationSidebar);