ultisuite-client/lib/admin-settings/settings-nav.ts
R3D347HR4Y 303b2b1074
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
wow
2026-06-11 01:22:40 +02:00

209 lines
4.6 KiB
TypeScript

import type { LucideIcon } from "lucide-react"
import {
Activity,
Bot,
Cloud,
FileCog,
FileText,
Gauge,
HardDrive,
Link2,
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"
| "onlyoffice"
| "richtext"
| "ai-assistant"
| "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: "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)
)
}