209 lines
4.6 KiB
TypeScript
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)
|
|
)
|
|
}
|