"use client"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { BarChart3, CalendarDays, Crown, Database, Droplet, Factory, Boxes, FileClock, FlaskConical, Hexagon, History, LayoutDashboard, Layers, ListTodo, type LucideIcon, MapPin, Package, Scissors, Search, Snowflake, ShoppingBag, Users, Warehouse, Wrench, Zap, } from "lucide-react"; import { cn } from "@/lib/utils"; import type { AuthUser } from "@/lib/auth/auth-context"; interface NavItem { label: string; href: string; icon: LucideIcon; // Any one of these grants visibility - used for hub pages that fold // together several previously-separate settings pages, each gated by its // own permission. permission?: string | string[]; } interface NavGroup { label: string | null; items: NavItem[]; } const NAV_GROUPS: NavGroup[] = [ { label: null, items: [ { label: "Dashboard", href: "/dashboard", icon: LayoutDashboard }, { label: "Suche", href: "/search", icon: Search }, ], }, { label: "Betrieb", items: [ { label: "Bienenstände", href: "/apiaries", icon: MapPin }, { label: "Völker", href: "/colonies", icon: Layers }, { label: "Königinnen", href: "/queens", icon: Crown }, { label: "Überwinterung", href: "/winter", icon: Snowflake, permission: "winter-checks:read", }, ], }, { label: "Arbeit", items: [ { label: "Aufgaben", href: "/tasks", icon: ListTodo }, { label: "Kalender", href: "/calendar", icon: CalendarDays }, ], }, { label: "Ernte & Lager", items: [ { label: "Ernten", href: "/harvests", icon: Scissors }, { label: "Schleuderungen", href: "/extractions", icon: FlaskConical }, { label: "Honigchargen", href: "/honey-batches", icon: Droplet }, { label: "Abfüllungen", href: "/bottling", icon: Package }, { label: "Rohstoffe", href: "/raw-materials", icon: Boxes, permission: "raw-material:read", }, { label: "Herstellungschargen", href: "/production-batches", icon: Factory, permission: "production-batch:read", }, { label: "Produkte", href: "/products", icon: ShoppingBag }, { label: "Lager", href: "/storage", icon: Warehouse }, { label: "Inventar", href: "/equipment", icon: Wrench }, ], }, { label: "Auswertung", items: [{ label: "Statistik", href: "/statistics", icon: BarChart3 }], }, ]; const ADMIN_GROUP: NavGroup = { label: "Verwaltung", items: [ { label: "Benutzer & Rollen", href: "/settings/users-roles", icon: Users, permission: ["users:read", "roles:read"], }, { label: "Automatisierung", href: "/settings/automation", icon: Zap, permission: [ "webhooks:read", "automation:read", "task-templates:read", "label-templates:read", "site-settings:read", "calendar:configure", "api-keys:manage", ], }, { label: "Backup", href: "/settings/backup", icon: Database, permission: ["backup:export", "backup:import", "import:execute"], }, { label: "Audit-Log", href: "/settings/audit-log", icon: History, permission: "audit:read", }, ], }; function SidebarLink({ item, pathname }: { item: NavItem; pathname: string }) { const Icon = item.icon; const isActive = pathname.startsWith(item.href); return ( {item.label} ); } function hasNavPermission( user: AuthUser, permission: NavItem["permission"], ): boolean { if (!permission) { return true; } const required = Array.isArray(permission) ? permission : [permission]; return required.some((key) => user.permissions.includes(key)); } export function Sidebar({ user }: { user: AuthUser }) { const pathname = usePathname(); const visibleAdminItems = ADMIN_GROUP.items.filter((item) => hasNavPermission(user, item.permission), ); const groups = visibleAdminItems.length > 0 ? [...NAV_GROUPS, { ...ADMIN_GROUP, items: visibleAdminItems }] : NAV_GROUPS; return ( ); }