From 2379fe0187cb7e0be84c42edb6e8d43913ae4f4d Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Tue, 14 Oct 2025 20:33:42 +0900 Subject: (김준회) ITB 생성 다이얼로그에서 구매담당자 지정시 공통 구매그룹코드 선택기 사용하도록 변경 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/itb/table/create-rfq-dialog.tsx | 208 ++++++++++++------------------------ 1 file changed, 68 insertions(+), 140 deletions(-) (limited to 'lib/itb') diff --git a/lib/itb/table/create-rfq-dialog.tsx b/lib/itb/table/create-rfq-dialog.tsx index 57a4b9d4..b292b647 100644 --- a/lib/itb/table/create-rfq-dialog.tsx +++ b/lib/itb/table/create-rfq-dialog.tsx @@ -19,38 +19,23 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, -} from "@/components/ui/command"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; -import { - FileText, - Package, - AlertCircle, +import { + FileText, + Package, + AlertCircle, CheckCircle, User, - ChevronsUpDown, - Check, Loader2, - Info + Info, + X } from "lucide-react"; import { toast } from "sonner"; -import { cn } from "@/lib/utils"; import type { PurchaseRequestView } from "@/db/schema"; import { approvePurchaseRequestsAndCreateRfqs } from "../service"; -import { getPUsersForFilter } from "@/lib/rfq-last/service"; import { useRouter } from "next/navigation"; +import { PurchaseGroupCodeSingleSelector, type PurchaseGroupCodeWithUser } from "@/components/common/selectors/purchase-group-code"; interface CreateRfqDialogProps { requests: PurchaseRequestView[]; @@ -66,50 +51,17 @@ export function CreateRfqDialog({ onSuccess, }: CreateRfqDialogProps) { const [isLoading, setIsLoading] = React.useState(false); - const [userPopoverOpen, setUserPopoverOpen] = React.useState(false); - const [users, setUsers] = React.useState([]); - const [selectedUser, setSelectedUser] = React.useState(null); - const [isLoadingUsers, setIsLoadingUsers] = React.useState(false); - const [userSearchTerm, setUserSearchTerm] = React.useState(""); + const [selectorOpen, setSelectorOpen] = React.useState(false); + const [selectedPurchaseGroupCode, setSelectedPurchaseGroupCode] = React.useState(undefined); const router = useRouter(); - // 유저 목록 로드 - React.useEffect(() => { - const loadUsers = async () => { - setIsLoadingUsers(true); - try { - const userList = await getPUsersForFilter(); - setUsers(userList); - } catch (error) { - console.log("사용자 목록 로드 오류:", error); - toast.error("사용자 목록을 불러오는데 실패했습니다"); - } finally { - setIsLoadingUsers(false); - } - }; - - if (open) { - loadUsers(); - } - }, [open]); - - // 검색된 사용자 필터링 - const filteredUsers = React.useMemo(() => { - if (!userSearchTerm) return users; - - return users.filter(user => - user.name.toLowerCase().includes(userSearchTerm.toLowerCase()) || - user.userCode?.toLowerCase().includes(userSearchTerm.toLowerCase()) - ); - }, [users, userSearchTerm]); // 유효한 요청만 필터링 (이미 RFQ 생성된 것 제외) const validRequests = requests.filter(r => r.status !== "RFQ생성완료"); const invalidRequests = requests.filter(r => r.status === "RFQ생성완료"); - const handleSelectUser = (user: any) => { - setSelectedUser(user); - setUserPopoverOpen(false); + const handleSelectPurchaseGroupCode = (code: PurchaseGroupCodeWithUser) => { + setSelectedPurchaseGroupCode(code); }; const handleSubmit = async () => { @@ -124,9 +76,15 @@ export function CreateRfqDialog({ const requestIds = validRequests.map(r => r.id); const results = await approvePurchaseRequestsAndCreateRfqs( requestIds, - selectedUser?.id - ); - + selectedPurchaseGroupCode?.user?.id + ) as Array<{ + success?: boolean; + skipped?: boolean; + requestId: number; + error?: string; + message?: string; + }>; + const successCount = results.filter(r => r.success).length; const skipCount = results.filter(r => r.skipped).length; @@ -151,8 +109,7 @@ export function CreateRfqDialog({ const handleClose = () => { if (!isLoading) { - setSelectedUser(null); - setUserSearchTerm(""); + setSelectedPurchaseGroupCode(undefined); onOpenChange(false); } }; @@ -187,86 +144,57 @@ export function CreateRfqDialog({ - - - + {selectedPurchaseGroupCode && ( + - - - - - - 검색 결과가 없습니다 - - {filteredUsers.map((user) => ( - handleSelectUser(user)} - className="flex items-center justify-between" - > - - - {user.name} - {user.userCode && ( - - ({user.userCode}) - - )} - - - - ))} - - - - - + )} +

구매 담당자를 선택하지 않으면 나중에 지정할 수 있습니다

+ {/* 구매그룹코드 선택 다이얼로그 */} + + {/* RFQ 생성 대상 목록 */}