"use client"; import React, { useState, useCallback, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Plus, Edit, Trash2, Users, Menu, Filter, X } from "lucide-react"; import { roleAPI, RoleGroup } from "@/lib/api/role"; import { useAuth } from "@/hooks/useAuth"; import { AlertCircle } from "lucide-react"; import { RoleFormModal } from "./RoleFormModal"; import { RoleDeleteModal } from "./RoleDeleteModal"; import { useRouter } from "next/navigation"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { companyAPI } from "@/lib/api/company"; /** * 권한 그룹 관리 메인 컴포넌트 * * 기능: * - 권한 그룹 목록 조회 (회사별) * - 권한 그룹 생성/수정/삭제 * - 상세 페이지로 이동 (멤버 관리 + 메뉴 권한 설정) */ export function RoleManagement() { const { user: currentUser } = useAuth(); const router = useRouter(); // 회사 관리자 또는 최고 관리자 여부 const isAdmin = (currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN") || currentUser?.userType === "COMPANY_ADMIN"; const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN"; // 상태 관리 const [roleGroups, setRoleGroups] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // 회사 필터 (최고 관리자 전용) const [companies, setCompanies] = useState>([]); const [selectedCompany, setSelectedCompany] = useState("all"); // 모달 상태 const [formModal, setFormModal] = useState({ isOpen: false, editingRole: null as RoleGroup | null, }); const [deleteModal, setDeleteModal] = useState({ isOpen: false, role: null as RoleGroup | null, }); // 회사 목록 로드 (최고 관리자만) const loadCompanies = useCallback(async () => { if (!isSuperAdmin) return; try { const companies = await companyAPI.getList(); setCompanies(companies); } catch (error) { console.error("회사 목록 로드 오류:", error); } }, [isSuperAdmin]); // 데이터 로드 const loadRoleGroups = useCallback(async () => { setIsLoading(true); setError(null); try { // 최고 관리자: selectedCompany에 따라 필터링 (all이면 전체 조회) // 회사 관리자: 자기 회사만 조회 const companyFilter = isSuperAdmin && selectedCompany !== "all" ? selectedCompany : isSuperAdmin ? undefined : currentUser?.companyCode; console.log("권한 그룹 목록 조회:", { isSuperAdmin, selectedCompany, companyFilter }); const response = await roleAPI.getList({ companyCode: companyFilter, }); if (response.success && response.data) { setRoleGroups(response.data); console.log("권한 그룹 조회 성공:", response.data.length, "개"); } else { setError(response.message || "권한 그룹 목록을 불러오는데 실패했습니다."); } } catch (err) { console.error("권한 그룹 목록 로드 오류:", err); setError("권한 그룹 목록을 불러오는 중 오류가 발생했습니다."); } finally { setIsLoading(false); } }, [isSuperAdmin, selectedCompany, currentUser?.companyCode]); useEffect(() => { if (isAdmin) { if (isSuperAdmin) { loadCompanies(); // 최고 관리자는 회사 목록 먼저 로드 } loadRoleGroups(); } else { setIsLoading(false); } }, [isAdmin, isSuperAdmin, loadRoleGroups, loadCompanies]); // 권한 그룹 생성 핸들러 const handleCreateRole = useCallback(() => { setFormModal({ isOpen: true, editingRole: null }); }, []); // 권한 그룹 수정 핸들러 const handleEditRole = useCallback((role: RoleGroup) => { setFormModal({ isOpen: true, editingRole: role }); }, []); // 권한 그룹 삭제 핸들러 const handleDeleteRole = useCallback((role: RoleGroup) => { setDeleteModal({ isOpen: true, role }); }, []); // 폼 모달 닫기 const handleFormModalClose = useCallback(() => { setFormModal({ isOpen: false, editingRole: null }); }, []); // 삭제 모달 닫기 const handleDeleteModalClose = useCallback(() => { setDeleteModal({ isOpen: false, role: null }); }, []); // 모달 성공 후 새로고침 const handleModalSuccess = useCallback(() => { loadRoleGroups(); }, [loadRoleGroups]); // 상세 페이지로 이동 const handleViewDetail = useCallback( (role: RoleGroup) => { router.push(`/admin/roles/${role.objid}`); }, [router], ); // 관리자가 아니면 접근 제한 if (!isAdmin) { return (

접근 권한 없음

권한 그룹 관리는 회사 관리자 이상만 접근할 수 있습니다.

); } return ( <> {/* 에러 메시지 */} {error && (

오류가 발생했습니다

{error}

)} {/* 액션 버튼 영역 */}

권한 그룹 목록 ({roleGroups.length})

{/* 최고 관리자 전용: 회사 필터 */} {isSuperAdmin && (
{selectedCompany !== "all" && ( )}
)}
{/* 권한 그룹 목록 */} {isLoading ? (

권한 그룹 목록을 불러오는 중...

) : roleGroups.length === 0 ? (

등록된 권한 그룹이 없습니다.

권한 그룹을 생성하여 멤버를 관리해보세요.

) : (
{roleGroups.map((role) => (
{/* 헤더 (클릭 시 상세 페이지) */}
handleViewDetail(role)} >

{role.authName}

{role.authCode}

{role.status === "active" ? "활성" : "비활성"}
{/* 정보 */}
{/* 최고 관리자는 회사명 표시 */} {isSuperAdmin && (
회사 {companies.find((c) => c.company_code === role.companyCode)?.company_name || role.companyCode}
)}
멤버 수 {role.memberCount || 0}명
메뉴 권한 {role.menuCount || 0}개
{/* 액션 버튼 */}
))}
)} {/* 모달들 */} ); }