// components/permissions/role-permission-manager.tsx "use client"; import { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { toast } from "sonner"; import { assignPermissionsToRole, getRolePermissions } from "@/lib/permissions/service"; import { RoleSelector } from "@/components/permissions/role-selector"; export function RolePermissionManager() { const [selectedRole, setSelectedRole] = useState(""); const [permissions, setPermissions] = useState([]); const [selectedPermissions, setSelectedPermissions] = useState>(new Set()); const [loading, setLoading] = useState(false); console.log(selectedRole) useEffect(() => { if (selectedRole) { loadRolePermissions(selectedRole.id); } }, [selectedRole]); const loadRolePermissions = async (roleId: string) => { try { const data = await getRolePermissions(parseInt(roleId)); setPermissions(data.permissions); setSelectedPermissions(new Set(data.assignedPermissionIds)); } catch (error) { toast.error("권한 목록을 불러오는데 실패했습니다."); } }; const handleSave = async () => { if (!selectedRole) { toast.error("역할을 선택해주세요."); return; } try { setLoading(true); await assignPermissionsToRole( parseInt(selectedRole.id), Array.from(selectedPermissions) ); toast.success("권한이 성공적으로 저장되었습니다."); } catch (error) { toast.error("권한 저장에 실패했습니다."); } finally { setLoading(false); } }; const togglePermission = (permissionId: number) => { const newSet = new Set(selectedPermissions); if (newSet.has(permissionId)) { newSet.delete(permissionId); } else { newSet.add(permissionId); } setSelectedPermissions(newSet); }; // 권한 그룹별로 정리 const groupedPermissions = permissions.reduce((acc, perm) => { const group = perm.menuPath || "기타"; if (!acc[group]) acc[group] = []; acc[group].push(perm); return acc; }, {} as Record); return ( 역할별 권한 설정 역할을 선택하고 해당 역할에 부여할 권한을 선택하세요.
{/* 역할 선택 */}
{/* 권한 목록 */} {selectedRole && (
선택 메뉴/그룹 권한명 타입 범위 설명 {Object.entries(groupedPermissions).map(([group, perms]) => ( <> {group} {perms.map((permission) => ( togglePermission(permission.id)} /> {permission.resource} {permission.name} {permission.permissionType} {permission.scope} {permission.description} ))} ))}
)}
); }