'use client'; /** * 수주 선택 모달 * API 연동 완료 (2025-12-26) */ import { useState, useEffect, useCallback } from 'react'; import { Search, FileText, Loader2 } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { toast } from 'sonner'; import { getSalesOrdersForWorkOrder } from './actions'; import type { SalesOrder } from './types'; interface SalesOrderSelectModalProps { open: boolean; onOpenChange: (open: boolean) => void; onSelect: (order: SalesOrder) => void; } export function SalesOrderSelectModal({ open, onOpenChange, onSelect, }: SalesOrderSelectModalProps) { const [searchTerm, setSearchTerm] = useState(''); const [salesOrders, setSalesOrders] = useState([]); const [isLoading, setIsLoading] = useState(false); // API로 수주 목록 로드 const loadSalesOrders = useCallback(async () => { setIsLoading(true); try { const result = await getSalesOrdersForWorkOrder({ q: searchTerm || undefined, }); if (result.success) { // API 응답을 SalesOrder 타입으로 변환 const orders: SalesOrder[] = result.data.map((item) => ({ id: String(item.id), orderNo: item.orderNo, client: item.client, projectName: item.projectName, dueDate: item.dueDate, status: item.status, itemCount: item.itemCount, splitCount: item.splitCount, })); setSalesOrders(orders); } else { toast.error(result.error || '수주 목록 조회에 실패했습니다.'); } } catch (error) { console.error('[SalesOrderSelectModal] loadSalesOrders error:', error); toast.error('수주 목록 로드 중 오류가 발생했습니다.'); } finally { setIsLoading(false); } }, [searchTerm]); // 모달이 열릴 때 데이터 로드 useEffect(() => { if (open) { loadSalesOrders(); } }, [open, loadSalesOrders]); const handleSelect = (order: SalesOrder) => { onSelect(order); onOpenChange(false); }; return ( 수주 선택 {/* 검색 */}
setSearchTerm(e.target.value)} className="pl-9" />
{/* 안내 문구 */}

생산지시 가능한 수주 {salesOrders.length}건 (회계확인 완료 상태)

{/* 수주 목록 */}
{isLoading ? (
) : salesOrders.map((order) => (
handleSelect(order)} className="p-4 border rounded-lg cursor-pointer hover:bg-muted/50 transition-colors" >
{order.orderNo} {order.status}
납기: {order.dueDate}
{order.client}
{order.projectName}
{order.itemCount}개 품목 분할 {order.splitCount}건
))} {!isLoading && salesOrders.length === 0 && (

검색 결과가 없습니다.

)}
); }