diff --git a/src/components/orders/QuotationSelectDialog.tsx b/src/components/orders/QuotationSelectDialog.tsx index 952e8c53..acb4c90c 100644 --- a/src/components/orders/QuotationSelectDialog.tsx +++ b/src/components/orders/QuotationSelectDialog.tsx @@ -74,21 +74,17 @@ export function QuotationSelectDialog({ } }, []); - // 다이얼로그 열릴 때 데이터 로드 - useEffect(() => { - if (open) { - setSearchTerm(""); - fetchQuotations(); - } - }, [open, fetchQuotations]); - - // 검색어 변경 시 디바운스 적용하여 API 호출 + // 다이얼로그 열릴 때 데이터 로드 + 검색어 변경 시 디바운스 적용 useEffect(() => { if (!open) return; + // 검색어가 빈 문자열이면 즉시 호출 (다이얼로그 열림 시) + // 검색어가 있으면 디바운스 적용 + const delay = searchTerm === "" ? 0 : 300; + const timer = setTimeout(() => { fetchQuotations(searchTerm || undefined); - }, 300); + }, delay); return () => clearTimeout(timer); }, [searchTerm, open, fetchQuotations]); diff --git a/src/components/orders/actions.ts b/src/components/orders/actions.ts index 8d60ee8b..0b215f4a 100644 --- a/src/components/orders/actions.ts +++ b/src/components/orders/actions.ts @@ -1043,6 +1043,8 @@ export async function getQuotesForSelect(params?: { searchParams.set('status', 'finalized'); // 품목 포함 (수주 전환용) searchParams.set('with_items', 'true'); + // 수주 전환용: 이미 수주가 생성된 견적 제외 (이중 체크) + searchParams.set('for_order', 'true'); if (params?.q) searchParams.set('q', params.q); if (params?.page) searchParams.set('page', String(params.page)); if (params?.size) searchParams.set('size', String(params.size || 50));