diff options
Diffstat (limited to 'components/bidding/bidding-conditions-edit.tsx')
| -rw-r--r-- | components/bidding/bidding-conditions-edit.tsx | 164 |
1 files changed, 140 insertions, 24 deletions
diff --git a/components/bidding/bidding-conditions-edit.tsx b/components/bidding/bidding-conditions-edit.tsx index 6541bdff..51b1a688 100644 --- a/components/bidding/bidding-conditions-edit.tsx +++ b/components/bidding/bidding-conditions-edit.tsx @@ -17,21 +17,28 @@ import { } from "@/components/ui/select" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Pencil, Save, X } from "lucide-react" -import { getBiddingConditions, updateBiddingConditions, getActivePaymentTerms, getActiveIncoterms } from "@/lib/bidding/service" +import { getBiddingConditions, updateBiddingConditions } from "@/lib/bidding/service" +import { getIncotermsForSelection, getPaymentTermsForSelection, getPlaceOfShippingForSelection, getPlaceOfDestinationForSelection } from "@/lib/procurement-select/service" import { useToast } from "@/hooks/use-toast" interface BiddingConditionsEditProps { biddingId: number initialConditions?: any | null - paymentTermsOptions: Array<{code: string, description: string}> - incotermsOptions: Array<{code: string, description: string}> } -export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTermsOptions, incotermsOptions }: BiddingConditionsEditProps) { +export function BiddingConditionsEdit({ biddingId, initialConditions }: BiddingConditionsEditProps) { const router = useRouter() const { toast } = useToast() const [isPending, startTransition] = useTransition() const [isEditing, setIsEditing] = React.useState(false) + + // Procurement 데이터 상태들 + const [paymentTermsOptions, setPaymentTermsOptions] = React.useState<Array<{code: string, description: string}>>([]) + const [incotermsOptions, setIncotermsOptions] = React.useState<Array<{code: string, description: string}>>([]) + const [shippingPlaces, setShippingPlaces] = React.useState<Array<{code: string, description: string}>>([]) + const [destinationPlaces, setDestinationPlaces] = React.useState<Array<{code: string, description: string}>>([]) + const [procurementLoading, setProcurementLoading] = React.useState(false) + const [conditions, setConditions] = React.useState({ paymentTerms: initialConditions?.paymentTerms || "", taxConditions: initialConditions?.taxConditions || "", @@ -77,13 +84,92 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer }) } + // Procurement 데이터 로드 함수들 + const loadPaymentTerms = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPaymentTermsForSelection(); + setPaymentTermsOptions(data); + } catch (error) { + console.error("Failed to load payment terms:", error); + toast({ + title: "오류", + description: "결제조건 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadIncoterms = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getIncotermsForSelection(); + setIncotermsOptions(data); + } catch (error) { + console.error("Failed to load incoterms:", error); + toast({ + title: "오류", + description: "운송조건 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadShippingPlaces = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPlaceOfShippingForSelection(); + setShippingPlaces(data); + } catch (error) { + console.error("Failed to load shipping places:", error); + toast({ + title: "오류", + description: "선적지 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadDestinationPlaces = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPlaceOfDestinationForSelection(); + setDestinationPlaces(data); + } catch (error) { + console.error("Failed to load destination places:", error); + toast({ + title: "오류", + description: "하역지 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + // 편집 모드로 전환할 때 procurement 데이터 로드 + React.useEffect(() => { + if (isEditing) { + loadPaymentTerms(); + loadIncoterms(); + loadShippingPlaces(); + loadDestinationPlaces(); + } + }, [isEditing, loadPaymentTerms, loadIncoterms, loadShippingPlaces, loadDestinationPlaces]); + const handleCancel = () => { setConditions({ paymentTerms: initialConditions?.paymentTerms || "", taxConditions: initialConditions?.taxConditions || "", incoterms: initialConditions?.incoterms || "", - contractDeliveryDate: initialConditions?.contractDeliveryDate - ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] + contractDeliveryDate: initialConditions?.contractDeliveryDate + ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] : "", shippingPort: initialConditions?.shippingPort || "", destinationPort: initialConditions?.destinationPort || "", @@ -146,7 +232,7 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer <p className="font-medium">{conditions.shippingPort || "미설정"}</p> </div> <div> - <Label className="text-muted-foreground">도착지</Label> + <Label className="text-muted-foreground">하역지</Label> <p className="font-medium">{conditions.destinationPort || "미설정"}</p> </div> <div> @@ -212,8 +298,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer </SelectItem> )) ) : ( - <SelectItem value="no-data" disabled> - 데이터 없음 + <SelectItem value="loading" disabled> + 데이터를 불러오는 중... </SelectItem> )} </SelectContent> @@ -253,8 +339,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer </SelectItem> )) ) : ( - <SelectItem value="no-data" disabled> - 데이터 없음 + <SelectItem value="loading" disabled> + 데이터를 불러오는 중... </SelectItem> )} </SelectContent> @@ -276,28 +362,58 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer <div className="space-y-2"> <Label htmlFor="shippingPort">선적지</Label> - <Input - id="shippingPort" - placeholder="예: 부산항, 인천항" + <Select value={conditions.shippingPort} - onChange={(e) => setConditions(prev => ({ + onValueChange={(value) => setConditions(prev => ({ ...prev, - shippingPort: e.target.value + shippingPort: value }))} - /> + > + <SelectTrigger> + <SelectValue placeholder="선적지 선택" /> + </SelectTrigger> + <SelectContent> + {shippingPlaces.length > 0 ? ( + shippingPlaces.map((place) => ( + <SelectItem key={place.code} value={place.code}> + {place.code} {place.description && `(${place.description})`} + </SelectItem> + )) + ) : ( + <SelectItem value="loading" disabled> + 데이터를 불러오는 중... + </SelectItem> + )} + </SelectContent> + </Select> </div> <div className="space-y-2"> - <Label htmlFor="destinationPort">도착지</Label> - <Input - id="destinationPort" - placeholder="예: 현장 직납, 창고 납품" + <Label htmlFor="destinationPort">하역지</Label> + <Select value={conditions.destinationPort} - onChange={(e) => setConditions(prev => ({ + onValueChange={(value) => setConditions(prev => ({ ...prev, - destinationPort: e.target.value + destinationPort: value }))} - /> + > + <SelectTrigger> + <SelectValue placeholder="하역지 선택" /> + </SelectTrigger> + <SelectContent> + {destinationPlaces.length > 0 ? ( + destinationPlaces.map((place) => ( + <SelectItem key={place.code} value={place.code}> + {place.code} {place.description && `(${place.description})`} + </SelectItem> + )) + ) : ( + <SelectItem value="loading" disabled> + 데이터를 불러오는 중... + </SelectItem> + )} + </SelectContent> + </Select> </div> </div> |
