import type { LucideIcon } from "lucide-react" import { Activity, Bot, Calendar, Video, Cloud, FileCog, FileText, Gauge, HardDrive, Link2, Globe, LayoutDashboard, Mail, Puzzle, ScrollText, Search, Shield, ShieldCheck, Users, } from "lucide-react" export type AdminSettingsSectionId = | "overview" | "users" | "authentication" | "security" | "storage-quotas" | "usage-quotas" | "file-policies" | "public-shares" | "llm" | "search" | "plugins" | "nextcloud" | "mailing" | "mail-domains" | "onlyoffice" | "richtext" | "ai-assistant" | "agenda" | "ultimeet" | "audit" export type AdminSettingsNavItem = { id: AdminSettingsSectionId label: string description: string href: string icon: LucideIcon } export const ADMIN_SETTINGS_NAV: AdminSettingsNavItem[] = [ { id: "overview", label: "Vue d'ensemble", description: "Statistiques et activité de la plateforme", href: "/admin/settings", icon: LayoutDashboard, }, { id: "users", label: "Utilisateurs", description: "Comptes, types d'accès, invitations et quotas", href: "/admin/settings/users", icon: Users, }, { id: "authentication", label: "Authentification", description: "Authentik, SSO et provisionnement", href: "/admin/settings/authentication", icon: Shield, }, { id: "security", label: "Sécurité", description: "Politiques 2FA et exigences d'accès", href: "/admin/settings/security", icon: ShieldCheck, }, { id: "storage-quotas", label: "Quotas stockage", description: "Limites mail, drive et photos", href: "/admin/settings/storage-quotas", icon: HardDrive, }, { id: "usage-quotas", label: "Quotas d'usage", description: "LLM, recherche web et API par utilisateur", href: "/admin/settings/usage-quotas", icon: Gauge, }, { id: "file-policies", label: "Politiques fichiers", description: "Upload, partage et rétention", href: "/admin/settings/file-policies", icon: FileCog, }, { id: "public-shares", label: "Partages externes", description: "Liens publics Drive et audit d'accès", href: "/admin/settings/public-shares", icon: Link2, }, { id: "llm", label: "Fournisseurs LLM", description: "Modèles IA organisationnels", href: "/admin/settings/llm", icon: Bot, }, { id: "search", label: "Moteur de recherche", description: "Index suite et recherche web", href: "/admin/settings/search", icon: Search, }, { id: "plugins", label: "Plugins", description: "Modules fonctionnels activables", href: "/admin/settings/plugins", icon: Puzzle, }, { id: "nextcloud", label: "Nextcloud", description: "Drive, agenda, contacts et Talk", href: "/admin/settings/nextcloud", icon: Cloud, }, { id: "agenda", label: "Agenda", description: "Thème et visioconférence par défaut", href: "/admin/settings/agenda", icon: Calendar, }, { id: "ultimeet", label: "UltiMeet", description: "Transcription, moteurs STT et actions post-réunion", href: "/admin/settings/ultimeet", icon: Video, }, { id: "mail-domains", label: "Domaines mail", description: "Hébergement Stalwart, DNS et migration", href: "/admin/settings/mail-domains", icon: Globe, }, { id: "mailing", label: "Mailing unifié", description: "SMTP des notifications suite", href: "/admin/settings/mailing", icon: Mail, }, { id: "onlyoffice", label: "OnlyOffice", description: "Édition collaborative de documents", href: "/admin/settings/onlyoffice", icon: Activity, }, { id: "richtext", label: "Éditeur rich text", description: "TipTap pour documents texte", href: "/admin/settings/richtext", icon: FileText, }, { id: "ai-assistant", label: "UltiAI", description: "Assistant IA intégré et tools suite", href: "/admin/settings/ai-assistant", icon: Bot, }, { id: "audit", label: "Journal d'audit", description: "Actions administratives et export", href: "/admin/settings/audit", icon: ScrollText, }, ] export function isAdminSettingsNavActive( pathname: string | null, item: AdminSettingsNavItem ): boolean { if (item.href === "/admin/settings") { return pathname === "/admin/settings" || pathname === "/admin/settings/overview" } return ( pathname === item.href || Boolean(pathname?.startsWith(`${item.href}/`)) ) } export function resolveAdminSettingsSection( segments: string[] | undefined ): AdminSettingsSectionId { const slug = segments?.[0] const match = ADMIN_SETTINGS_NAV.find((item) => { if (item.id === "overview") return !slug || slug === "overview" return item.href.endsWith(`/${slug}`) }) return match?.id ?? "overview" } const ADMIN_WIDE_SECTIONS: AdminSettingsSectionId[] = [ "overview", "users", "public-shares", "audit", "llm", ] export function isAdminSettingsWideLayoutPath(pathname: string | null): boolean { if (!pathname?.startsWith("/admin/settings")) return false return ADMIN_SETTINGS_NAV.some( (item) => ADMIN_WIDE_SECTIONS.includes(item.id) && isAdminSettingsNavActive(pathname, item) ) }