import { useState, useMemo } from 'react'; import { Tabs, DataTable, Badge, Avatar, Button, Input, Modal, FormField, Select, AlertDialog, StatCard, Spinner, } from '@cameleer/design-system'; import type { Column } from '@cameleer/design-system'; import { useUsers, useUser, useGroups, useGroup, useRoles, useRole, useRbacStats, useCreateUser, useUpdateUser, useDeleteUser, useAssignRoleToUser, useRemoveRoleFromUser, useAddUserToGroup, useRemoveUserFromGroup, useCreateGroup, useUpdateGroup, useDeleteGroup, useCreateRole, useUpdateRole, useDeleteRole, useAssignRoleToGroup, useRemoveRoleFromGroup, } from '../../api/queries/admin/rbac'; export default function RbacPage() { const [tab, setTab] = useState('users'); const { data: stats } = useRbacStats(); return (

RBAC Management

{tab === 'users' && } {tab === 'groups' && } {tab === 'roles' && }
); } function UsersTab() { const { data: users, isLoading } = useUsers(); const [createOpen, setCreateOpen] = useState(false); const [deleteId, setDeleteId] = useState(null); const [form, setForm] = useState({ username: '', displayName: '', email: '', password: '' }); const createUser = useCreateUser(); const deleteUser = useDeleteUser(); const columns: Column[] = [ { key: 'userId', header: 'Username', render: (v) => {String(v)} }, { key: 'displayName', header: 'Display Name' }, { key: 'email', header: 'Email' }, { key: 'provider', header: 'Provider', render: (v) => }, { key: 'effectiveRoles', header: 'Roles', render: (v) => (
{(v as any[] || []).map((r: any) => )}
), }, ]; if (isLoading) return ; const rows = (users || []).map((u: any) => ({ ...u, id: u.userId })); return (
setCreateOpen(false)} title="Create User">
setForm({ ...form, username: e.target.value })} /> setForm({ ...form, displayName: e.target.value })} /> setForm({ ...form, email: e.target.value })} /> setForm({ ...form, password: e.target.value })} />
setDeleteId(null)} onConfirm={() => { if (deleteId) deleteUser.mutate(deleteId); setDeleteId(null); }} title="Delete User" description={`Are you sure you want to delete user "${deleteId}"?`} confirmLabel="Delete" variant="danger" />
); } function GroupsTab() { const { data: groups, isLoading } = useGroups(); const [createOpen, setCreateOpen] = useState(false); const [form, setForm] = useState({ name: '' }); const createGroup = useCreateGroup(); const columns: Column[] = [ { key: 'name', header: 'Name', render: (v) => {String(v)} }, { key: 'members', header: 'Members', render: (v) => String((v as any[])?.length ?? 0) }, { key: 'effectiveRoles', header: 'Roles', render: (v) => (
{(v as any[] || []).map((r: any) => )}
), }, ]; if (isLoading) return ; return (
setCreateOpen(false)} title="Create Group">
setForm({ ...form, name: e.target.value })} />
); } function RolesTab() { const { data: roles, isLoading } = useRoles(); const [createOpen, setCreateOpen] = useState(false); const [form, setForm] = useState({ name: '', description: '', scope: '' }); const createRole = useCreateRole(); const columns: Column[] = [ { key: 'name', header: 'Name', render: (v) => {String(v)} }, { key: 'description', header: 'Description' }, { key: 'scope', header: 'Scope', render: (v) => v ? : null }, { key: 'system', header: 'System', render: (v) => v ? : null }, { key: 'effectivePrincipals', header: 'Users', render: (v) => String((v as any[])?.length ?? 0) }, ]; if (isLoading) return ; return (
setCreateOpen(false)} title="Create Role">
setForm({ ...form, name: e.target.value })} /> setForm({ ...form, description: e.target.value })} /> setForm({ ...form, scope: e.target.value })} />
); }