diff --git a/src/food-market.api/Seed/DevDataSeeder.cs b/src/food-market.api/Seed/DevDataSeeder.cs index 517535e..e792d66 100644 --- a/src/food-market.api/Seed/DevDataSeeder.cs +++ b/src/food-market.api/Seed/DevDataSeeder.cs @@ -78,14 +78,18 @@ public async Task StartAsync(CancellationToken ct) var result = await userMgr.CreateAsync(admin, "Admin12345!"); if (result.Succeeded) { - await userMgr.AddToRoleAsync(admin, SystemRoles.Admin); + // Только SuperAdmin как Identity-роль. «Администратор» — + // организационная роль внутри Employee, не Identity. await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin); } } - else if (!await userMgr.IsInRoleAsync(admin, SystemRoles.SuperAdmin)) + else { - // Существующий admin без SuperAdmin — догоняем (для уже развёрнутых стендов). - await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin); + if (!await userMgr.IsInRoleAsync(admin, SystemRoles.SuperAdmin)) + await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin); + // Чистим дублирующую Identity-роль Admin (если оставалась с прошлых сидов). + if (await userMgr.IsInRoleAsync(admin, SystemRoles.Admin)) + await userMgr.RemoveFromRoleAsync(admin, SystemRoles.Admin); } await SeedAdminEmployeeAsync(db, demoOrg.Id, admin?.Id, ct); diff --git a/src/food-market.web/src/components/AppLayout.tsx b/src/food-market.web/src/components/AppLayout.tsx index 69f34ed..394301d 100644 --- a/src/food-market.web/src/components/AppLayout.tsx +++ b/src/food-market.web/src/components/AppLayout.tsx @@ -23,6 +23,22 @@ interface MeResponse { type NavItem = { to: string; icon: typeof LayoutDashboard; label: string; end?: boolean } type NavSection = { group: string; items: NavItem[] } +const ROLE_RU: Record = { + SuperAdmin: 'Супер администратор', + Admin: 'Администратор', + Manager: 'Менеджер', + Cashier: 'Кассир', + Storekeeper: 'Кладовщик', +} +const HIDDEN_ROLES = new Set(['Admin']) // org-уровневая роль показывается через Employee, не Identity + +function translateRoles(roles: string[]): string { + return roles + .filter((r) => !HIDDEN_ROLES.has(r)) + .map((r) => ROLE_RU[r] ?? r) + .join(', ') +} + function buildNav(isSuperAdmin: boolean): NavSection[] { const catalog: NavItem[] = [ { to: '/catalog/products', icon: Package, label: 'Товары' }, @@ -147,7 +163,7 @@ export function AppLayout() { {me && (
{me.name}
-
{me.roles.join(', ')}
+
{translateRoles(me.roles)}
)}