diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-04 08:31:31 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-04 08:31:31 +0000 |
| commit | b67e36df49f067cbd5ba899f9fbcc755f38d4b4f (patch) | |
| tree | 5a71c5960f90d988cd509e3ef26bff497a277661 /lib/bidding/vendor/partners-bidding-list.tsx | |
| parent | b7f54b06c1ef9e619f5358fb0a5caad9703c8905 (diff) | |
(대표님, 최겸, 임수민) 작업사항 커밋
Diffstat (limited to 'lib/bidding/vendor/partners-bidding-list.tsx')
| -rw-r--r-- | lib/bidding/vendor/partners-bidding-list.tsx | 105 |
1 files changed, 88 insertions, 17 deletions
diff --git a/lib/bidding/vendor/partners-bidding-list.tsx b/lib/bidding/vendor/partners-bidding-list.tsx index aa185c3a..a13334ef 100644 --- a/lib/bidding/vendor/partners-bidding-list.tsx +++ b/lib/bidding/vendor/partners-bidding-list.tsx @@ -15,6 +15,9 @@ import { getPartnersBiddingListColumns } from './partners-bidding-list-columns' import { getBiddingListForPartners, PartnersBiddingListItem } from '../detail/service' import { PartnersBiddingToolbarActions } from './partners-bidding-toolbar-actions' import { PartnersBiddingAttendanceDialog } from './partners-bidding-attendance-dialog' +import { PartnersBiddingParticipationDialog } from './partners-bidding-participation-dialog' +import { VendorPreQuoteParticipationDialog } from './vendor-prequote-participation-dialog' +import { setPreQuoteParticipation, getBiddingCompaniesForPartners } from '../pre-quote/service' interface PartnersBiddingListProps { companyId: number @@ -24,10 +27,59 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { const [data, setData] = React.useState<PartnersBiddingListItem[]>([]) const [pageCount, setPageCount] = React.useState<number>(1) const [isLoading, setIsLoading] = React.useState(true) - const [rowAction, setRowAction] = React.useState<DataTableRowAction<PartnersBiddingListItem> | null>(null) + const [rowAction, setRowAction] = React.useState<{ type: string; row: { original: PartnersBiddingListItem } } | null>(null) + const [isParticipationDialogOpen, setIsParticipationDialogOpen] = React.useState(false) + const [selectedBiddingForParticipation, setSelectedBiddingForParticipation] = React.useState<PartnersBiddingListItem | null>(null) + const [isPreQuoteParticipationDialogOpen, setIsPreQuoteParticipationDialogOpen] = React.useState(false) + const [selectedBiddingForPreQuoteParticipation, setSelectedBiddingForPreQuoteParticipation] = React.useState<any | null>(null) const router = useRouter() + // 데이터 새로고침 함수 + const refreshData = React.useCallback(async () => { + try { + setIsLoading(true) + const result = await getBiddingListForPartners(companyId) + setData(result) + } catch (error) { + console.error('Failed to refresh bidding list:', error) + } finally { + setIsLoading(false) + } + }, [companyId]) + + // 사전견적 참여의사 결정을 위한 상세 데이터 로드 + const loadBiddingDetailForParticipation = React.useCallback(async (bidding: PartnersBiddingListItem) => { + try { + const biddingDetail = await getBiddingCompaniesForPartners(bidding.biddingId, companyId) + if (biddingDetail) { + setSelectedBiddingForPreQuoteParticipation(biddingDetail) + setIsPreQuoteParticipationDialogOpen(true) + } + } catch (error) { + console.error('Failed to load bidding detail for participation:', error) + } + }, [companyId]) + + // 사전견적 참여의사 결정 핸들러 + const handlePreQuoteParticipationDecision = React.useCallback(async (participate: boolean) => { + if (!selectedBiddingForPreQuoteParticipation?.biddingCompanyId) { + throw new Error('업체 정보를 찾을 수 없습니다.') + } + + const result = await setPreQuoteParticipation( + selectedBiddingForPreQuoteParticipation.biddingCompanyId, + participate, + 'current-user' // TODO: 실제 사용자 ID + ) + + if (result.success) { + await refreshData() // 데이터 새로고침 + } else { + throw new Error(result.error) + } + }, [selectedBiddingForPreQuoteParticipation?.biddingCompanyId, refreshData]) + // 데이터 로드 React.useEffect(() => { const loadData = async () => { @@ -47,7 +99,7 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { loadData() }, [companyId]) - // rowAction 변경 감지하여 해당 페이지로 이동 + // rowAction 변경 감지하여 해당 페이지로 이동 또는 다이얼로그 열기 React.useEffect(() => { if (rowAction) { switch (rowAction.type) { @@ -55,11 +107,20 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { // 상세 페이지로 이동 (biddingId 사용) router.push(`/partners/bid/${rowAction.row.original.biddingId}`) break + case 'pre-quote': + // 사전견적 페이지로 이동 + router.push(`/partners/bid/${rowAction.row.original.biddingId}/pre-quote`) + break + case 'participation': + // 사전견적 참여 의사 결정 다이얼로그 열기 - 상세 데이터 로드 필요 + loadBiddingDetailForParticipation(rowAction.row.original) + setRowAction(null) // rowAction 초기화 + break default: break } } - }, [rowAction, router]) + }, [rowAction, router, loadBiddingDetailForParticipation]) const columns = React.useMemo( () => getPartnersBiddingListColumns({ setRowAction }), @@ -135,19 +196,6 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { clearOnDefault: true, }) - // 데이터 새로고침 함수 - const refreshData = React.useCallback(async () => { - try { - setIsLoading(true) - const result = await getBiddingListForPartners(companyId) - setData(result) - } catch (error) { - console.error('Failed to refresh bidding list:', error) - } finally { - setIsLoading(false) - } - }, [companyId]) - if (isLoading) { return ( <div className="flex items-center justify-center py-12"> @@ -167,7 +215,7 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { filterFields={advancedFilterFields} shallow={false} > - <PartnersBiddingToolbarActions table={table} onRefresh={refreshData} setRowAction={setRowAction} /> + <PartnersBiddingToolbarActions table={table} companyId={companyId} onRefresh={refreshData} setRowAction={setRowAction} /> </DataTableAdvancedToolbar> </DataTable> @@ -186,6 +234,29 @@ export function PartnersBiddingList({ companyId }: PartnersBiddingListProps) { isAttending={rowAction?.row.original?.isAttendingMeeting || null} onSuccess={refreshData} /> + + <PartnersBiddingParticipationDialog + open={isParticipationDialogOpen} + onOpenChange={setIsParticipationDialogOpen} + bidding={selectedBiddingForParticipation} + companyId={companyId} + onSuccess={() => { + refreshData() + setSelectedBiddingForParticipation(null) + }} + /> + + <VendorPreQuoteParticipationDialog + open={isPreQuoteParticipationDialogOpen} + onOpenChange={(open) => { + setIsPreQuoteParticipationDialogOpen(open) + if (!open) { + setSelectedBiddingForPreQuoteParticipation(null) + } + }} + biddingDetail={selectedBiddingForPreQuoteParticipation} + onParticipationDecision={handlePreQuoteParticipationDecision} + /> </> ) } |
