diff --git a/src/locales/en.json b/src/locales/en.json index 1728e45..fc992cc 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -3227,6 +3227,7 @@ "system": "System", "permanent": "Permanent", "expired": "expired", + "envManaged": "Managed via ADMIN_IDS / ADMIN_EMAILS in env", "revoke": "Revoke", "revokeAriaLabel": "Revoke role {{role}} from {{user}}", "table": { diff --git a/src/locales/fa.json b/src/locales/fa.json index 467e54d..3bb8ee0 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -2968,6 +2968,7 @@ "system": "سیستم", "permanent": "دائمی", "expired": "منقضی شده", + "envManaged": "مدیریت از طریق ADMIN_IDS / ADMIN_EMAILS در env", "revoke": "لغو", "revokeAriaLabel": "لغو نقش {{role}} از {{user}}", "table": { diff --git a/src/locales/ru.json b/src/locales/ru.json index c361682..9fe64e0 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -3773,6 +3773,7 @@ "system": "Система", "permanent": "Бессрочно", "expired": "истекло", + "envManaged": "Управляется через ADMIN_IDS / ADMIN_EMAILS в env", "revoke": "Отозвать", "revokeAriaLabel": "Отозвать роль {{role}} у {{user}}", "table": { diff --git a/src/locales/zh.json b/src/locales/zh.json index b6c525c..d0b045a 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -2967,6 +2967,7 @@ "system": "系统", "permanent": "永久", "expired": "已过期", + "envManaged": "通过 ADMIN_IDS / ADMIN_EMAILS 环境变量管理", "revoke": "撤销", "revokeAriaLabel": "撤销 {{user}} 的角色 {{role}}", "table": { diff --git a/src/pages/AdminRoleAssign.tsx b/src/pages/AdminRoleAssign.tsx index 51b483d..e099336 100644 --- a/src/pages/AdminRoleAssign.tsx +++ b/src/pages/AdminRoleAssign.tsx @@ -79,6 +79,7 @@ const UserPlusIcon = () => ( // === Constants === const PAGE_SIZE = 10; +const SUPERADMIN_LEVEL = 999; // === Sub-components === @@ -278,10 +279,10 @@ export default function AdminRoleAssign() { enabled: !!roles && roles.length > 0, }); - // Available roles filtered by canManageRole + // Available roles filtered by canManageRole (superadmin excluded — env-only) const assignableRoles = useMemo(() => { if (!roles) return []; - return roles.filter((r) => r.is_active && canManageRole(r.level)); + return roles.filter((r) => r.is_active && r.level < SUPERADMIN_LEVEL && canManageRole(r.level)); }, [roles, canManageRole]); // Roles map for quick lookup @@ -627,20 +628,29 @@ export default function AdminRoleAssign() { {/* Actions */}
- - - + ENV + + ) : ( + + + + )}
);