"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 { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Check, ChevronsUpDown, Loader2, User, Users } from "lucide-react"; import { cn } from "@/lib/utils"; import { toast } from "sonner"; import { getPUsersForFilter } from "@/lib/rfq-last/service"; import { assignPicToRfqs } from "../service"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; interface User { id: number; name: string | null; userCode: string | null; deptName: string | null; isAbsent: boolean | null; isDeletedOnNonSap: boolean | null; email?: string; } interface RfqAssignPicDialogProps { open: boolean; onOpenChange: (open: boolean) => void; selectedRfqIds: number[]; selectedRfqCodes: string[]; onSuccess?: () => void; } export function RfqAssignPicDialog({ open, onOpenChange, selectedRfqIds, selectedRfqCodes, onSuccess, }: RfqAssignPicDialogProps) { const [users, setUsers] = React.useState([] as User[]); const [isLoadingUsers, setIsLoadingUsers] = React.useState(false); const [isAssigning, setIsAssigning] = React.useState(false); const [selectedUser, setSelectedUser] = React.useState(null); const [userPopoverOpen, setUserPopoverOpen] = React.useState(false); const [userSearchTerm, setUserSearchTerm] = React.useState(""); // 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(() => { const loadUsers = async () => { setIsLoadingUsers(true); try { const userList = await getPUsersForFilter(); setUsers(userList as User[]); } catch (error) { console.log("사용자 목록 로드 오류:", error); toast.error("사용자 목록을 불러오는데 실패했습니다"); } finally { setIsLoadingUsers(false); } }; if (open) { loadUsers(); // 다이얼로그 열릴 때 초기화 setSelectedUser(null); setUserSearchTerm(""); } }, [open]); // 유저 검색 const filteredUsers = React.useMemo(() => { if (!userSearchTerm || !userSearchTerm.trim()) return users; const searchTerm = userSearchTerm.trim(); return users.filter( (user) => (user.name && user.name.includes(searchTerm)) || (user.userCode && user.userCode.toLowerCase().includes(searchTerm.toLowerCase())) || (user.deptName && user.deptName.includes(searchTerm)) ); }, [users, userSearchTerm]); const handleSelectUser = (user: User) => { setSelectedUser(user); setUserPopoverOpen(false); }; const handleAssign = async () => { if (!selectedUser) { toast.error("담당자를 선택해주세요"); return; } if (itbIds.length === 0) { toast.error("선택한 항목 중 ITB가 없습니다"); return; } setIsAssigning(true); try { const result = await assignPicToRfqs({ rfqIds: itbIds, picUserId: selectedUser.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로 시작하는 코드)가 없습니다. )}
{/* 담당자 선택 */}
검색 결과가 없습니다 { // 마우스 휠 스크롤이 제대로 작동하도록 이벤트 전파 허용 e.stopPropagation(); }} > {filteredUsers.map((user) => ( handleSelectUser(user)} className="flex items-center justify-between" >
{user.name || '이름 없음'} {user.userCode && ( ({user.userCode}) )} {(user.isAbsent || user.isDeletedOnNonSap) && (
{user.isAbsent && ( 휴직 )} {user.isDeletedOnNonSap && ( 퇴직 )}
)}
{user.deptName && ( {user.deptName} )}
))}
{selectedUser && (

선택한 담당자: {selectedUser.name || '이름 없음'} {selectedUser.userCode && ` (${selectedUser.userCode})`}

{(selectedUser.isAbsent || selectedUser.isDeletedOnNonSap) && (
{selectedUser.isAbsent && ( 휴직 )} {selectedUser.isDeletedOnNonSap && ( 퇴직 )}
)}
{selectedUser.deptName && (

{selectedUser.deptName}

)}
)}
); }