Update admin theme/layout and refresh README details.

Align the project baseline with the latest admin interface styling and layout structure while documenting setup and usage updates in README.
This commit is contained in:
vlad
2026-07-14 17:12:28 +03:00
commit 86cc3fa541
278 changed files with 19416 additions and 0 deletions
@@ -0,0 +1,54 @@
import { useEffect, useState } from "react";
import { useIsSuperuser } from "@modules/auth";
import { getVisibleAdminTabs, type AdminTab } from "../config/adminTabs";
import { postAdminUiActivity } from "../api/adminApi";
import { AdminActivityPanel } from "./AdminActivityPanel";
import { AdminContentPanel } from "./AdminContentPanel";
import { AdminDiagnosticsPanel } from "./AdminDiagnosticsPanel";
import { AdminShell } from "./AdminShell";
import { AdminSecurityPanel } from "./AdminSecurityPanel";
import { AdminUsersTable } from "./AdminUsersTable";
function AdminTabPanel({ tab, isSuperuser }: { tab: AdminTab; isSuperuser: boolean }): JSX.Element | null {
switch (tab) {
case "users":
return <AdminUsersTable />;
case "content":
return <AdminContentPanel />;
case "security":
return isSuperuser ? <AdminSecurityPanel /> : null;
case "diagnostics":
return isSuperuser ? <AdminDiagnosticsPanel /> : null;
case "activity":
return <AdminActivityPanel />;
default:
return null;
}
}
export function AdminPanel(): JSX.Element {
const isSuperuser = useIsSuperuser();
const [tab, setTab] = useState<AdminTab>("users");
const visibleTabs = getVisibleAdminTabs(isSuperuser);
useEffect(() => {
if (!visibleTabs.some((item) => item.id === tab)) {
setTab(visibleTabs[0]?.id ?? "users");
}
}, [isSuperuser, tab, visibleTabs]);
return (
<AdminShell
tab={tab}
isSuperuser={isSuperuser}
onSelectTab={(nextTab) => {
setTab(nextTab);
void postAdminUiActivity("admin_tab_change", { tab: nextTab });
}}
>
<div key={tab} className="wesp-admin-section-enter wesp-admin-block">
<AdminTabPanel tab={tab} isSuperuser={isSuperuser} />
</div>
</AdminShell>
);
}