"use client"; import * as React from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Loader2, Users } from "lucide-react"; import { toast } from "sonner"; import { assignPicToRfqs } from "../service"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { PurchaseGroupCodeSingleSelector, PurchaseGroupCodeWithUser } from "@/components/common/selectors/purchase-group-code"; interface RfqAssignPicDialogProps { open: boolean; onOpenChange: (open: boolean) => void; selectedRfqIds: number[]; selectedRfqCodes: string[]; onSuccess?: () => void; } export function RfqAssignPicDialog({ open, onOpenChange, selectedRfqIds, selectedRfqCodes, onSuccess, }: RfqAssignPicDialogProps) { const [isAssigning, setIsAssigning] = React.useState(false); const [selectedCode, setSelectedCode] = React.useState(undefined); const [selectorOpen, setSelectorOpen] = React.useState(false); // ITB만 필터링 (rfqCode가 "I"로 시작하는 것) const itbCodes = React.useMemo(() => { return selectedRfqCodes.filter(code => code.startsWith("I")); }, [selectedRfqCodes]); const itbIds = React.useMemo(() => { return selectedRfqIds.filter((id, index) => selectedRfqCodes[index]?.startsWith("I")); }, [selectedRfqIds, selectedRfqCodes]); // 다이얼로그 열릴 때 초기화 React.useEffect(() => { if (open) { setSelectedCode(undefined); } }, [open]); const handleCodeSelect = (code: PurchaseGroupCodeWithUser) => { setSelectedCode(code); // 유저 정보가 없는 경우 toast로 알림 if (!code.user) { toast.warning( `해당 구매그룹코드(${code.PURCHASE_GROUP_CODE})의 사번 정보의 유저가 없습니다`, { description: `사번: ${code.EMPLOYEE_NUMBER}`, duration: 5000, } ); } }; const handleAssign = async () => { if (!selectedCode) { toast.error("구매그룹코드를 선택해주세요"); return; } if (!selectedCode.user) { toast.error("선택한 구매그룹코드에 연결된 사용자가 없습니다"); return; } if (itbIds.length === 0) { toast.error("선택한 항목 중 ITB가 없습니다"); return; } setIsAssigning(true); try { const result = await assignPicToRfqs({ rfqIds: itbIds, picUserId: selectedCode.user.id, }); if (result.success) { toast.success(result.message); onSuccess?.(); onOpenChange(false); } else { toast.error(result.message); } } catch (error) { console.error("담당자 지정 오류:", error); toast.error("담당자 지정 중 오류가 발생했습니다"); } finally { setIsAssigning(false); } }; return ( 담당자 지정 선택한 ITB에 구매 담당자를 지정합니다
{/* 선택된 ITB 정보 */}
{itbCodes.length}건 {itbCodes.length !== selectedRfqCodes.length && ( (전체 {selectedRfqCodes.length}건 중) )}
{itbCodes.slice(0, 10).map((code, index) => ( {code} ))} {itbCodes.length > 10 && ( +{itbCodes.length - 10}개 )}
{itbCodes.length === 0 && ( 선택한 항목 중 ITB (I로 시작하는 코드)가 없습니다. )}
{/* 구매 담당자 선택 (구매그룹코드) */}
{selectedCode && !selectedCode.user && ( 선택한 구매그룹코드에 연결된 사용자가 없습니다. 다른 구매그룹코드를 선택해주세요. )}
{/* 구매그룹코드 선택 다이얼로그 */}
); }