"use client"; import React, { useState, useCallback, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { ArrowLeft, Users, Menu as MenuIcon, Save } from "lucide-react"; import { roleAPI, RoleGroup } from "@/lib/api/role"; import { useAuth } from "@/hooks/useAuth"; import { useRouter } from "next/navigation"; import { AlertCircle } from "lucide-react"; import { DualListBox } from "@/components/common/DualListBox"; import { MenuPermissionsTable } from "./MenuPermissionsTable"; interface RoleDetailManagementProps { roleId: string; } /** * 권한 그룹 상세 관리 컴포넌트 * * 기능: * - 권한 그룹 정보 표시 * - 멤버 관리 (Dual List Box) * - 메뉴 권한 설정 (CRUD 체크박스) */ export function RoleDetailManagement({ roleId }: RoleDetailManagementProps) { const { user: currentUser } = useAuth(); const router = useRouter(); const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN"; // 상태 관리 const [roleGroup, setRoleGroup] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // 탭 상태 const [activeTab, setActiveTab] = useState<"members" | "permissions">("members"); // 멤버 관리 상태 const [availableUsers, setAvailableUsers] = useState>([]); const [selectedUsers, setSelectedUsers] = useState>([]); const [isSavingMembers, setIsSavingMembers] = useState(false); // 메뉴 권한 상태 const [menuPermissions, setMenuPermissions] = useState([]); const [isSavingPermissions, setIsSavingPermissions] = useState(false); // 데이터 로드 const loadRoleGroup = useCallback(async () => { setIsLoading(true); setError(null); try { const response = await roleAPI.getById(parseInt(roleId, 10)); if (response.success && response.data) { setRoleGroup(response.data); } else { setError(response.message || "권한 그룹 정보를 불러오는데 실패했습니다."); } } catch (err) { console.error("권한 그룹 정보 로드 오류:", err); setError("권한 그룹 정보를 불러오는 중 오류가 발생했습니다."); } finally { setIsLoading(false); } }, [roleId]); // 멤버 목록 로드 const loadMembers = useCallback(async () => { if (!roleGroup) return; try { // 1. 권한 그룹 멤버 조회 const membersResponse = await roleAPI.getMembers(roleGroup.objid); if (membersResponse.success && membersResponse.data) { setSelectedUsers( membersResponse.data.map((member: any) => ({ id: member.userId, label: member.userName || member.userId, description: member.deptName, })), ); } // 2. 전체 사용자 목록 조회 (같은 회사) const userAPI = await import("@/lib/api/user"); console.log("🔍 사용자 목록 조회 요청:", { companyCode: roleGroup.companyCode, size: 1000, }); const usersResponse = await userAPI.userAPI.getList({ companyCode: roleGroup.companyCode, size: 1000, // 대량 조회 }); console.log("✅ 사용자 목록 응답:", { success: usersResponse.success, count: usersResponse.data?.length, total: usersResponse.total, }); if (usersResponse.success && usersResponse.data) { setAvailableUsers( usersResponse.data.map((user: any) => ({ id: user.userId, label: user.userName || user.userId, description: user.deptName, })), ); console.log("📋 설정된 전체 사용자 수:", usersResponse.data.length); } } catch (err) { console.error("멤버 목록 로드 오류:", err); } }, [roleGroup]); // 메뉴 권한 로드 const loadMenuPermissions = useCallback(async () => { if (!roleGroup) return; console.log("🔍 [loadMenuPermissions] 메뉴 권한 로드 시작", { roleGroupId: roleGroup.objid, roleGroupName: roleGroup.authName, companyCode: roleGroup.companyCode, }); try { const response = await roleAPI.getMenuPermissions(roleGroup.objid); console.log("✅ [loadMenuPermissions] API 응답", { success: response.success, dataCount: response.data?.length, data: response.data, }); if (response.success && response.data) { setMenuPermissions(response.data); console.log("✅ [loadMenuPermissions] 상태 업데이트 완료", { count: response.data.length, }); } else { console.warn("⚠️ [loadMenuPermissions] 응답 실패", { message: response.message, }); } } catch (err) { console.error("❌ [loadMenuPermissions] 메뉴 권한 로드 오류:", err); } }, [roleGroup]); useEffect(() => { loadRoleGroup(); }, [loadRoleGroup]); useEffect(() => { if (roleGroup && activeTab === "members") { loadMembers(); } else if (roleGroup && activeTab === "permissions") { loadMenuPermissions(); } }, [roleGroup, activeTab, loadMembers, loadMenuPermissions]); // 멤버 저장 핸들러 const handleSaveMembers = useCallback(async () => { if (!roleGroup) return; setIsSavingMembers(true); try { // 현재 선택된 사용자 ID 목록 const selectedUserIds = selectedUsers.map((user) => user.id); // 멤버 업데이트 API 호출 const response = await roleAPI.updateMembers(roleGroup.objid, selectedUserIds); if (response.success) { alert("멤버가 성공적으로 저장되었습니다."); loadMembers(); // 새로고침 } else { alert(response.message || "멤버 저장에 실패했습니다."); } } catch (err) { console.error("멤버 저장 오류:", err); alert("멤버 저장 중 오류가 발생했습니다."); } finally { setIsSavingMembers(false); } }, [roleGroup, selectedUsers, loadMembers]); // 메뉴 권한 저장 핸들러 const handleSavePermissions = useCallback(async () => { if (!roleGroup) return; setIsSavingPermissions(true); try { const response = await roleAPI.setMenuPermissions(roleGroup.objid, menuPermissions); if (response.success) { alert("메뉴 권한이 성공적으로 저장되었습니다."); loadMenuPermissions(); // 새로고침 } else { alert(response.message || "메뉴 권한 저장에 실패했습니다."); } } catch (err) { console.error("메뉴 권한 저장 오류:", err); alert("메뉴 권한 저장 중 오류가 발생했습니다."); } finally { setIsSavingPermissions(false); } }, [roleGroup, menuPermissions, loadMenuPermissions]); if (isLoading) { return (

권한 그룹 정보를 불러오는 중...

); } if (error || !roleGroup) { return (

오류 발생

{error || "권한 그룹을 찾을 수 없습니다."}

); } return ( <> {/* 페이지 헤더 */}

{roleGroup.authName}

{roleGroup.authCode} • {roleGroup.companyCode}

{roleGroup.status === "active" ? "활성" : "비활성"}
{/* 탭 네비게이션 */}
{/* 탭 컨텐츠 */}
{activeTab === "members" && ( <>

멤버 관리

이 권한 그룹에 속한 사용자를 관리합니다

)} {activeTab === "permissions" && ( <>

메뉴 권한 설정

이 권한 그룹에서 접근 가능한 메뉴와 권한을 설정합니다

)}
); }