mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 21:20:57 +00:00
251 lines
7.1 KiB
TypeScript
251 lines
7.1 KiB
TypeScript
import { Link, useLocation } from "react-router-dom";
|
|
import {
|
|
Archive,
|
|
BarChart,
|
|
Building2,
|
|
ChartAreaIcon,
|
|
ClipboardList,
|
|
FileText,
|
|
Globe,
|
|
Settings,
|
|
Users2,
|
|
UsersRound,
|
|
} from "lucide-react";
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
import { useAuth } from "@/shared/context/AuthContext";
|
|
import {
|
|
SidebarGroup,
|
|
SidebarGroupContent,
|
|
SidebarGroupLabel,
|
|
SidebarMenu,
|
|
SidebarMenuButton,
|
|
SidebarMenuItem,
|
|
useSidebar,
|
|
} from "@/shared/common/ui/sidebar";
|
|
|
|
export interface MenuItem {
|
|
label: string;
|
|
href: string;
|
|
icon: React.ReactNode;
|
|
roles?: string[];
|
|
/** Sidebar section this item is bucketed under. */
|
|
group: string;
|
|
}
|
|
|
|
// Section render order; groups with no role-visible items are skipped.
|
|
const GROUP_ORDER = [
|
|
"Overview",
|
|
"Organizations",
|
|
"Content",
|
|
"Records",
|
|
"Configuration",
|
|
"Archive",
|
|
"System",
|
|
];
|
|
|
|
export const AppMenuTabs = () => {
|
|
const { user } = useAuth();
|
|
const { pathname } = useLocation();
|
|
const { setOpenMobile } = useSidebar();
|
|
const { t } = useTranslation();
|
|
|
|
const userRoles = user?.roles.map((role) => role.key) || [];
|
|
|
|
const menuItems: MenuItem[] = [
|
|
{
|
|
label: "dashboard",
|
|
href: "/user-management/dashboard",
|
|
icon: <BarChart className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Overview",
|
|
},
|
|
{
|
|
label: "organizations",
|
|
href: "/user-management/organizations",
|
|
icon: <Building2 className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Organizations",
|
|
},
|
|
{
|
|
label: "organizationAdmins",
|
|
href: "/user-management/organization_admins",
|
|
icon: <Users2 className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Organizations",
|
|
},
|
|
{
|
|
label: "externalUsers",
|
|
href: "/user-management/external_users",
|
|
icon: <Users2 className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Organizations",
|
|
},
|
|
{
|
|
label: "dashboard",
|
|
href: "/user-management/user_management-dashboard",
|
|
icon: <BarChart className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Overview",
|
|
},
|
|
{
|
|
label: "userManagement",
|
|
href: "/user-management/user_management",
|
|
icon: <UsersRound className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Overview",
|
|
},
|
|
{
|
|
label: "contentManagement",
|
|
href: "/user-management/content-management",
|
|
icon: <FileText className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Content",
|
|
},
|
|
{
|
|
label: "webManagement",
|
|
href: "/user-management/web-management",
|
|
icon: <Globe className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Content",
|
|
},
|
|
{
|
|
label: "Bulk",
|
|
href: "/user-management/bulk-upload",
|
|
icon: <FileText className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Content",
|
|
},
|
|
{
|
|
label: "Position",
|
|
href: "/user-management/position-management",
|
|
icon: <FileText className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin", "super_admin"],
|
|
group: "Configuration",
|
|
},
|
|
{
|
|
label: "settings",
|
|
href: "/user-management/organization-settings",
|
|
icon: <Settings className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Configuration",
|
|
},
|
|
{
|
|
label: "Add Site",
|
|
href: "/user-management/add-site",
|
|
icon: <Globe className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Configuration",
|
|
},
|
|
{
|
|
label: "migratedRecords",
|
|
href: "/user-management/migrated-records-management",
|
|
icon: <FileText className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Records",
|
|
},
|
|
{
|
|
label: "Sector Reports",
|
|
href: "/user-management/sector-reports",
|
|
icon: <ChartAreaIcon className="h-4 w-4" />,
|
|
roles: ["unit_admin", "admin", "organization_admin"],
|
|
group: "Records",
|
|
},
|
|
{
|
|
label: "Archive Users",
|
|
href: "/user-management/archive-users",
|
|
icon: <Archive className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Archive",
|
|
},
|
|
{
|
|
label: "Archived Organizations",
|
|
href: "/user-management/archived-organizations",
|
|
icon: <Archive className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "Archive",
|
|
},
|
|
{
|
|
label: "Archive Users",
|
|
href: "/user-management/archives",
|
|
icon: <Archive className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Archive",
|
|
},
|
|
{
|
|
label: "Archived Units & Positions",
|
|
href: "/user-management/archived",
|
|
icon: <Archive className="h-4 w-4" />,
|
|
roles: ["admin", "organization_admin", "unit_admin"],
|
|
group: "Archive",
|
|
},
|
|
{
|
|
label: "activityLog",
|
|
href: "/user-management/activity_log",
|
|
icon: <ClipboardList className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "System",
|
|
},
|
|
{
|
|
label: "setting",
|
|
href: "/user-management/settings",
|
|
icon: <Settings className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "System",
|
|
},
|
|
{
|
|
label: "Letter Template",
|
|
href: "/user-management/templates",
|
|
icon: <FileText className="h-4 w-4" />,
|
|
roles: ["super_admin"],
|
|
group: "System",
|
|
},
|
|
];
|
|
|
|
const filteredMenu = menuItems.filter((item) =>
|
|
item.roles?.some((r) => userRoles.includes(r)),
|
|
);
|
|
|
|
const isActive = (href: string) =>
|
|
pathname === href || pathname.startsWith(`${href}/`);
|
|
|
|
return (
|
|
<>
|
|
{GROUP_ORDER.map((group) => {
|
|
const items = filteredMenu.filter((item) => item.group === group);
|
|
if (items.length === 0) return null;
|
|
|
|
return (
|
|
<SidebarGroup key={group} className="pb-0">
|
|
<SidebarGroupLabel>{group}</SidebarGroupLabel>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>
|
|
{items.map((item) => {
|
|
const label = t(`organization.${item.label}`, item.label);
|
|
return (
|
|
<SidebarMenuItem key={item.href}>
|
|
<SidebarMenuButton
|
|
asChild
|
|
isActive={isActive(item.href)}
|
|
tooltip={label}
|
|
>
|
|
<Link
|
|
to={item.href}
|
|
onClick={() => setOpenMobile(false)}
|
|
>
|
|
{item.icon}
|
|
<span>{label}</span>
|
|
</Link>
|
|
</SidebarMenuButton>
|
|
</SidebarMenuItem>
|
|
);
|
|
})}
|
|
</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
);
|
|
})}
|
|
</>
|
|
);
|
|
};
|