Some checks are pending
E2E / Playwright e2e (push) Waiting to run
- Introduced new components for managing admin settings, including AdminListControls, AdminSettingsCard, and TechBrandSelectLabel. - Implemented dynamic loading for admin settings sections to optimize performance. - Enhanced the layout of various admin settings sections for better user experience. - Updated the AiAssistantSection to include LLM provider management and improved model selection. - Refactored authentication settings to streamline configuration and improve accessibility.
206 lines
4.8 KiB
TypeScript
206 lines
4.8 KiB
TypeScript
import type { LucideIcon } from "lucide-react"
|
|
import {
|
|
Bot,
|
|
Calendar,
|
|
Video,
|
|
FileCog,
|
|
Gauge,
|
|
Link2,
|
|
LayoutDashboard,
|
|
Mail,
|
|
Puzzle,
|
|
ScrollText,
|
|
Search,
|
|
Shield,
|
|
ShieldCheck,
|
|
Users,
|
|
} from "lucide-react"
|
|
|
|
export type AdminSettingsSectionId =
|
|
| "overview"
|
|
| "users"
|
|
| "authentication"
|
|
| "security"
|
|
| "quotas"
|
|
| "file-policies"
|
|
| "public-shares"
|
|
| "llm"
|
|
| "search"
|
|
| "plugins"
|
|
| "mail-domains"
|
|
| "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: "quotas",
|
|
label: "Quotas",
|
|
description: "Stockage, LLM, recherche web et automatisations",
|
|
href: "/admin/settings/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: "search",
|
|
label: "Moteur de recherche",
|
|
description: "Index suite et recherche web",
|
|
href: "/admin/settings/search",
|
|
icon: Search,
|
|
},
|
|
{
|
|
id: "plugins",
|
|
label: "Plugins",
|
|
description: "Nextcloud, modules et intégrations activables",
|
|
href: "/admin/settings/plugins",
|
|
icon: Puzzle,
|
|
},
|
|
{
|
|
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: "Mail",
|
|
description: "Domaines hébergés, SMTP et migration",
|
|
href: "/admin/settings/mail-domains",
|
|
icon: Mail,
|
|
},
|
|
{
|
|
id: "ai-assistant",
|
|
label: "UltiAI",
|
|
description: "Assistant IA, fournisseurs LLM 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]
|
|
if (slug === "llm") return "ai-assistant"
|
|
if (slug === "nextcloud" || slug === "onlyoffice" || slug === "richtext") return "plugins"
|
|
if (slug === "mailing") return "mail-domains"
|
|
if (slug === "storage-quotas" || slug === "usage-quotas") return "quotas"
|
|
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",
|
|
"audit",
|
|
"ai-assistant",
|
|
"plugins",
|
|
"quotas",
|
|
"search",
|
|
"mail-domains",
|
|
"authentication",
|
|
"file-policies",
|
|
]
|
|
|
|
const ADMIN_FULL_WIDTH_SECTIONS: AdminSettingsSectionId[] = [
|
|
"users",
|
|
"public-shares",
|
|
]
|
|
|
|
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)
|
|
)
|
|
}
|
|
|
|
export function isAdminSettingsFullWidthLayoutPath(pathname: string | null): boolean {
|
|
if (!pathname?.startsWith("/admin/settings")) return false
|
|
return ADMIN_SETTINGS_NAV.some(
|
|
(item) =>
|
|
ADMIN_FULL_WIDTH_SECTIONS.includes(item.id) &&
|
|
isAdminSettingsNavActive(pathname, item)
|
|
)
|
|
}
|