import { createFileRoute, useParams, useNavigate } from '@tanstack/react-router' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { useState, useEffect } from 'react' import { roleDetailOptions, permissionListOptions, rbacKeys, rbacMutations } from '@/api/rbac' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Badge } from '@/components/ui/badge' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Separator } from '@/components/ui/separator' import { Skeleton } from '@/components/ui/skeleton' import { ArrowLeft } from 'lucide-react' import { toast } from 'sonner' export const Route = createFileRoute('/_authenticated/roles/$roleId')({ component: RoleDetailPage, }) function RoleDetailPage() { const { roleId } = useParams({ from: '/_authenticated/roles/$roleId' }) const navigate = useNavigate() const queryClient = useQueryClient() const { data: role, isLoading: roleLoading } = useQuery(roleDetailOptions(roleId)) const { data: permsData } = useQuery(permissionListOptions()) const [name, setName] = useState('') const [description, setDescription] = useState('') const [selectedPerms, setSelectedPerms] = useState>(new Set()) useEffect(() => { if (role) { setName(role.name) setDescription(role.description ?? '') setSelectedPerms(new Set(role.permissions ?? [])) } }, [role]) const updateMutation = useMutation({ mutationFn: (data: Record) => rbacMutations.updateRole(roleId, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: rbacKeys.role(roleId) }) queryClient.invalidateQueries({ queryKey: rbacKeys.roles }) toast.success('Role updated') }, onError: (err) => toast.error(err.message), }) function togglePermission(slug: string) { const next = new Set(selectedPerms) if (next.has(slug)) { next.delete(slug) } else { next.add(slug) } setSelectedPerms(next) } function toggleDomain(domain: string, allSlugs: string[]) { const allSelected = allSlugs.every((s) => selectedPerms.has(s)) const next = new Set(selectedPerms) for (const slug of allSlugs) { if (allSelected) next.delete(slug) else next.add(slug) } setSelectedPerms(next) } function handleSave() { updateMutation.mutate({ name, description: description || undefined, permissionSlugs: Array.from(selectedPerms), }) } if (roleLoading) { return (
) } if (!role) { return

Role not found

} // Group permissions by domain const allPerms = permsData?.data ?? [] const domains = new Map() for (const p of allPerms) { const list = domains.get(p.domain) ?? [] list.push(p) domains.set(p.domain, list) } return (

{role.name}

{role.slug} {role.isSystem && System}
Details
setName(e.target.value)} />