Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/Components/ui/Table'; import { Badge } from '@/Components/ui/Badge'; import { Button } from '@/Components/ui/Button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/Components/ui/DropdownMenu'; import { MoreHorizontal, Edit, Trash2, Shield, Users } from 'lucide-react'; interface Role { id: number; name: string; slug: string; users_count: number; permissions_count: number; } interface RoleTableProps { roles: Role[]; onEdit: (role: Role) => void; onDelete: (role: Role) => void; } export function RoleTable({ roles, onEdit, onDelete }: RoleTableProps) { const isSystemRole = (slug: string) => ['admin', 'user'].includes(slug); return ( <Table> <TableHeader> <TableRow> <TableHead>Name</TableHead> <TableHead>Slug</TableHead> <TableHead>Users</TableHead> <TableHead>Permissions</TableHead> <TableHead>Type</TableHead> <TableHead className="w-[70px]">Actions</TableHead> </TableRow> </TableHeader> <TableBody> {roles.length === 0 ? ( <TableRow> <TableCell colSpan={6} className="text-center py-8 text-muted-foreground"> No roles found </TableCell> </TableRow> ) : ( roles.map((role) => ( <TableRow key={role.id}> <TableCell className="font-medium"> <div className="flex items-center gap-2"> <Shield className="h-4 w-4 text-muted-foreground" /> {role.name} </div> </TableCell> <TableCell> <code className="text-sm bg-muted px-2 py-1 rounded"> {role.slug} </code> </TableCell> <TableCell> <div className="flex items-center gap-2"> <Users className="h-4 w-4 text-muted-foreground" /> {role.users_count} </div> </TableCell> <TableCell> <Badge variant="secondary"> {role.permissions_count} permissions </Badge> </TableCell> <TableCell> {isSystemRole(role.slug) ? ( <Badge variant="outline">System</Badge> ) : ( <Badge variant="default">Custom</Badge> )} </TableCell> <TableCell> <DropdownMenu> <DropdownMenuTrigger asChild> <Button variant="ghost" className="h-8 w-8 p-0"> <span className="sr-only">Open menu</span> <MoreHorizontal className="h-4 w-4" /> </Button> </DropdownMenuTrigger> <DropdownMenuContent align="end"> <DropdownMenuItem onClick={() => onEdit(role)}> <Edit className="mr-2 h-4 w-4" /> Edit </DropdownMenuItem> {!isSystemRole(role.slug) && ( <DropdownMenuItem onClick={() => onDelete(role)} className="text-destructive" disabled={role.users_count > 0} > <Trash2 className="mr-2 h-4 w-4" /> Delete </DropdownMenuItem> )} </DropdownMenuContent> </DropdownMenu> </TableCell> </TableRow> )) )} </TableBody> </Table> ); } |