"use client"; import { useState, useEffect } from "react"; import { Plus, X, Star } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import type { Department, DepartmentMember } from "@/types/department"; import * as departmentAPI from "@/lib/api/department"; interface DepartmentMembersProps { companyCode: string; selectedDepartment: Department | null; } /** * 부서 인원 관리 컴포넌트 */ export function DepartmentMembers({ companyCode, selectedDepartment }: DepartmentMembersProps) { const [members, setMembers] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isAddModalOpen, setIsAddModalOpen] = useState(false); const [searchUserId, setSearchUserId] = useState(""); // 부서원 목록 로드 useEffect(() => { if (selectedDepartment) { loadMembers(); } }, [selectedDepartment]); const loadMembers = async () => { if (!selectedDepartment) return; setIsLoading(true); try { const response = await departmentAPI.getDepartmentMembers(selectedDepartment.dept_code); if (response.success && response.data) { setMembers(response.data); } else { console.error("부서원 목록 로드 실패:", response.error); setMembers([]); } } catch (error) { console.error("부서원 목록 로드 실패:", error); setMembers([]); } finally { setIsLoading(false); } }; // 부서원 추가 const handleAddMember = async () => { if (!searchUserId.trim() || !selectedDepartment) return; try { const response = await departmentAPI.addDepartmentMember( selectedDepartment.dept_code, searchUserId ); if (response.success) { setIsAddModalOpen(false); setSearchUserId(""); loadMembers(); } else { alert(response.error || "부서원 추가에 실패했습니다."); } } catch (error) { console.error("부서원 추가 실패:", error); alert("부서원 추가 중 오류가 발생했습니다."); } }; // 부서원 제거 const handleRemoveMember = async (userId: string) => { if (!selectedDepartment) return; if (!confirm("이 부서에서 사용자를 제외하시겠습니까?")) return; try { const response = await departmentAPI.removeDepartmentMember( selectedDepartment.dept_code, userId ); if (response.success) { loadMembers(); } else { alert(response.error || "부서원 제거에 실패했습니다."); } } catch (error) { console.error("부서원 제거 실패:", error); alert("부서원 제거 중 오류가 발생했습니다."); } }; // 주 부서 설정 const handleSetPrimaryDepartment = async (userId: string) => { if (!selectedDepartment) return; try { const response = await departmentAPI.setPrimaryDepartment( selectedDepartment.dept_code, userId ); if (response.success) { loadMembers(); } else { alert(response.error || "주 부서 설정에 실패했습니다."); } } catch (error) { console.error("주 부서 설정 실패:", error); alert("주 부서 설정 중 오류가 발생했습니다."); } }; if (!selectedDepartment) { return (

좌측에서 부서를 선택하세요

); } return (
{/* 헤더 */}

{selectedDepartment.dept_name}

부서원 {members.length}명

{/* 부서원 목록 */}
{isLoading ? (
로딩 중...
) : members.length === 0 ? (
부서원이 없습니다. 부서원을 추가해주세요.
) : (
{members.map((member) => (
{member.user_name} ({member.user_id}) {member.is_primary && ( 주 부서 )}
{member.position_name && 직책: {member.position_name}} {member.email && 이메일: {member.email}} {member.phone && 전화: {member.phone}} {member.cell_phone && 휴대폰: {member.cell_phone}}
{!member.is_primary && ( )}
))}
)}
{/* 부서원 추가 모달 */} 부서원 추가
setSearchUserId(e.target.value)} placeholder="사용자 ID를 입력하세요" autoFocus />

겸직이 가능합니다. 한 사용자를 여러 부서에 추가할 수 있습니다.

); }