'use client' import { useState, useTransition } from 'react' import { Role } from '@prisma/client' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DialogClose, } from '@/components/ui/dialog' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { deleteUserAction, updateUserRolesAction, setMustResetPasswordAction, } from '@/actions/admin/users' import { debugProps } from '@/lib/debug' type UserWithRoles = { id: string username: string email: string | null must_reset_password: boolean created_at: Date roles: { role: Role }[] } const ALL_ROLES: Role[] = [Role.PRODUCT_OWNER, Role.SCRUM_MASTER, Role.DEVELOPER, Role.ADMIN] const ROLE_LABEL: Record = { PRODUCT_OWNER: 'Product Owner', SCRUM_MASTER: 'Scrum Master', DEVELOPER: 'Developer', ADMIN: 'Admin', } function RoleBadge({ role }: { role: Role }) { const cls = role === Role.ADMIN ? 'bg-status-done text-white border-transparent' : role === Role.PRODUCT_OWNER ? 'bg-status-in-progress text-white border-transparent' : role === Role.SCRUM_MASTER ? 'bg-priority-medium text-white border-transparent' : 'bg-secondary text-secondary-foreground' return {ROLE_LABEL[role]} } function RolesDialog({ user, currentUserId }: { user: UserWithRoles; currentUserId: string }) { const [open, setOpen] = useState(false) const [selected, setSelected] = useState>(new Set(user.roles.map(r => r.role))) const [pending, startTransition] = useTransition() const isSelf = user.id === currentUserId function toggle(role: Role) { setSelected(prev => { const next = new Set(prev) if (next.has(role)) next.delete(role) else next.add(role) return next }) } function handleSave() { startTransition(async () => { await updateUserRolesAction(user.id, Array.from(selected)) setOpen(false) }) } return ( }> Rollen Rollen voor {user.username}
{ALL_ROLES.map(role => { const isDisabled = isSelf && role === Role.ADMIN && selected.has(role) return ( ) })}
) } function DeleteDialog({ user, currentUserId }: { user: UserWithRoles; currentUserId: string }) { const [open, setOpen] = useState(false) const [pending, startTransition] = useTransition() const isSelf = user.id === currentUserId function handleDelete() { startTransition(async () => { await deleteUserAction(user.id) setOpen(false) }) } return ( } > Verwijder Gebruiker verwijderen

Weet je zeker dat je {user.username} wilt verwijderen? Dit kan niet ongedaan worden gemaakt.

}>Annuleer
) } function ResetToggle({ user }: { user: UserWithRoles }) { const [pending, startTransition] = useTransition() function handleToggle() { startTransition(async () => { await setMustResetPasswordAction(user.id, !user.must_reset_password) }) } return ( ) } export function UsersTable({ users, currentUserId, }: { users: UserWithRoles[] currentUserId: string }) { return ( Gebruiker Email Rollen Reset pw Aangemaakt Acties {users.map(user => ( {user.username} {user.email ?? '—'}
{user.roles.map(r => ( ))} {user.roles.length === 0 && Geen}
{user.must_reset_password ? ( Ja ) : ( )} {new Date(user.created_at).toLocaleDateString('nl-NL')}
))}
) }