feat(admin): configurable sidebar menu order and visibility
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m7s

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-07-30 21:45:53 +02:00
1 parent 1127807aaa
commit 0224b34f15
11 files changed
+700 -5

No files matched your search

+14 -5
View File
@@ -10,6 +10,10 @@ import {
type AdminNavItem,
navItemIsAllowed,
} from "@/lib/admin-nav";
import {
type AdminNavConfig,
applyAdminNavConfig,
} from "@/lib/admin-nav-config";
import { cn } from "@/lib/utils";
const STORAGE_KEY = "admin-nav-collapsed";
@@ -59,10 +63,13 @@ function persistCollapsed(next: Record<string, boolean>) {
export function AdminSidebarNav({
allowedPermissions = [],
isSuperAdmin = false,
navConfig = {},
}: {
/** ACL slugs the staff member holds (ignored when isSuperAdmin). */
allowedPermissions?: string[];
isSuperAdmin?: boolean;
/** Owner overlay: hide + reorder groups/items (from website_settings). */
navConfig?: AdminNavConfig;
}) {
const t = useTranslations("pages.admin.nav");
const pathname = usePathname() ?? "";
@@ -79,11 +86,13 @@ export function AdminSidebarNav({
isSuperAdmin,
has: (slug: string) => allowed.has(slug),
};
return ADMIN_NAV_GROUPS.map((group) => ({
...group,
items: group.items.filter((item) => navItemIsAllowed(item, access)),
})).filter((group) => group.items.length > 0);
}, [allowed, isSuperAdmin]);
return applyAdminNavConfig(ADMIN_NAV_GROUPS, navConfig)
.map((group) => ({
...group,
items: group.items.filter((item) => navItemIsAllowed(item, access)),
}))
.filter((group) => group.items.length > 0);
}, [allowed, isSuperAdmin, navConfig]);
const allKeys = useMemo(() => groups.map((g) => g.labelKey), [groups]);