import { useEffect, useState } from "react"; import type { ApiSettings } from "../../types"; import { fetchAdminOverview, type AdminOverview } from "../../api/admin"; import Card from "../../components/Card"; import Button from "../../components/Button"; import AdminPageLayout from "./components/AdminPageLayout"; import { adminErrorMessage } from "./adminUtils"; export default function AdminOverviewPanel({ settings, onSelect, availableSections }: { settings: ApiSettings; onSelect: (section: string) => void; availableSections: ReadonlySet }) { const [overview, setOverview] = useState(null); const [error, setError] = useState(""); const [loading, setLoading] = useState(true); async function load() { setLoading(true); setError(""); try { setOverview(await fetchAdminOverview(settings)); } catch (err) { setError(adminErrorMessage(err)); } finally { setLoading(false); } } useEffect(() => { void load(); }, [settings.accessToken, settings.apiBaseUrl]); const hasSystemMetrics = Boolean(overview && [ overview.tenant_count, overview.system_account_count, overview.system_group_template_count, overview.system_role_template_count ].some((value) => value !== null && value !== undefined)); return ( void load()} disabled={loading}>Reload}> {overview && <> {hasSystemMetrics && <>
System
} {hasSystemArea(availableSections) &&
{availableSections.has("system-settings") && onSelect("system-settings")} />} {availableSections.has("system-retention") && onSelect("system-retention")} />} {availableSections.has("system-tenants") && onSelect("system-tenants")} />} {availableSections.has("system-users") && onSelect("system-users")} />} {availableSections.has("system-groups") && onSelect("system-groups")} />} {availableSections.has("system-roles") && onSelect("system-roles")} />} {availableSections.has("system-role-templates") && onSelect("system-role-templates")} />} {availableSections.has("system-audit") && onSelect("system-audit")} />}
}
Active tenant: {overview.active_tenant_name}
{availableSections.has("tenant-settings") && onSelect("tenant-settings")} />} {availableSections.has("tenant-users") && onSelect("tenant-users")} />} {availableSections.has("tenant-groups") && onSelect("tenant-groups")} />} {availableSections.has("tenant-roles") && onSelect("tenant-roles")} />} {availableSections.has("tenant-api-keys") && onSelect("tenant-api-keys")} />} {availableSections.has("tenant-mail-servers") && onSelect("tenant-mail-servers")} />} {availableSections.has("tenant-retention") && onSelect("tenant-retention")} />} {availableSections.has("tenant-user-retention") && onSelect("tenant-user-retention")} />} {availableSections.has("tenant-group-retention") && onSelect("tenant-group-retention")} />} {availableSections.has("tenant-audit") && onSelect("tenant-audit")} />}
}
); } function hasSystemArea(sections: ReadonlySet): boolean { return ["system-settings", "system-retention", "system-tenants", "system-users", "system-groups", "system-roles", "system-role-templates", "system-audit"].some((section) => sections.has(section)); } function Metric({ title, value, text }: { title: string; value: string | number; text: string }) { return {value}

{text}

; } function AreaLink({ title, text, onClick }: { title: string; text: string; onClick: () => void }) { return ; }