diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-27 12:06:26 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-27 12:06:26 +0000 |
| commit | 7548e2ad6948f1c6aa102fcac408bc6c9c0f9796 (patch) | |
| tree | 8e66703ec821888ad51dcc242a508813a027bf71 /lib/bidding/detail/table/bidding-detail-content.tsx | |
| parent | 7eac558470ef179dad626a8e82db5784fe86a556 (diff) | |
(대표님, 최겸) 기본계약, 입찰, 파일라우트, 계약서명라우트, 인포메이션, 메뉴설정, PQ(메일템플릿 관련)
Diffstat (limited to 'lib/bidding/detail/table/bidding-detail-content.tsx')
| -rw-r--r-- | lib/bidding/detail/table/bidding-detail-content.tsx | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/bidding/detail/table/bidding-detail-content.tsx b/lib/bidding/detail/table/bidding-detail-content.tsx new file mode 100644 index 00000000..090e7218 --- /dev/null +++ b/lib/bidding/detail/table/bidding-detail-content.tsx @@ -0,0 +1,93 @@ +'use client' + +import * as React from 'react' +import { Bidding } from '@/db/schema' +import { QuotationDetails, QuotationVendor } from '@/lib/bidding/detail/service' +import { BiddingDetailHeader } from './bidding-detail-header' +import { BiddingDetailVendorTableContent } from './bidding-detail-vendor-table' +import { BiddingDetailItemsDialog } from './bidding-detail-items-dialog' +import { BiddingDetailTargetPriceDialog } from './bidding-detail-target-price-dialog' +import { BiddingDetailSelectionReasonDialog } from './bidding-detail-selection-reason-dialog' + +interface BiddingDetailContentProps { + bidding: Bidding + quotationDetails: QuotationDetails | null + quotationVendors: QuotationVendor[] + biddingCompanies: any[] + prItems: any[] +} + +export function BiddingDetailContent({ + bidding, + quotationDetails, + quotationVendors, + biddingCompanies, + prItems +}: BiddingDetailContentProps) { + const [dialogStates, setDialogStates] = React.useState({ + items: false, + targetPrice: false, + selectionReason: false + }) + + const [refreshTrigger, setRefreshTrigger] = React.useState(0) + + const handleRefresh = React.useCallback(() => { + setRefreshTrigger(prev => prev + 1) + }, []) + + const openDialog = React.useCallback((type: keyof typeof dialogStates) => { + setDialogStates(prev => ({ ...prev, [type]: true })) + }, []) + + const closeDialog = React.useCallback((type: keyof typeof dialogStates) => { + setDialogStates(prev => ({ ...prev, [type]: false })) + }, []) + + return ( + <div className="container py-6"> + <section className="overflow-hidden rounded-[0.5rem] border bg-background shadow"> + <div className="p-6"> + <BiddingDetailHeader bidding={bidding} /> + + <div className="mt-6"> + <BiddingDetailVendorTableContent + biddingId={bidding.id} + vendors={quotationVendors} + biddingCompanies={biddingCompanies} + onRefresh={handleRefresh} + onOpenItemsDialog={() => openDialog('items')} + onOpenTargetPriceDialog={() => openDialog('targetPrice')} + onOpenSelectionReasonDialog={() => openDialog('selectionReason')} + onEdit={undefined} + onDelete={undefined} + onSelectWinner={undefined} + /> + </div> + </div> + </section> + + <BiddingDetailItemsDialog + open={dialogStates.items} + onOpenChange={(open) => closeDialog('items')} + prItems={prItems} + bidding={bidding} + /> + + <BiddingDetailTargetPriceDialog + open={dialogStates.targetPrice} + onOpenChange={(open) => closeDialog('targetPrice')} + quotationDetails={quotationDetails} + bidding={bidding} + onSuccess={handleRefresh} + /> + + <BiddingDetailSelectionReasonDialog + open={dialogStates.selectionReason} + onOpenChange={(open) => closeDialog('selectionReason')} + bidding={bidding} + onSuccess={handleRefresh} + /> + </div> + ) +} |
