summaryrefslogtreecommitdiff
path: root/lib/bidding/vendor/partners-bidding-list.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-04 08:31:31 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-04 08:31:31 +0000
commitb67e36df49f067cbd5ba899f9fbcc755f38d4b4f (patch)
tree5a71c5960f90d988cd509e3ef26bff497a277661 /lib/bidding/vendor/partners-bidding-list.tsx
parentb7f54b06c1ef9e619f5358fb0a5caad9703c8905 (diff)
(대표님, 최겸, 임수민) 작업사항 커밋
Diffstat (limited to 'lib/bidding/vendor/partners-bidding-list.tsx')
-rw-r--r--lib/bidding/vendor/partners-bidding-list.tsx105
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}
+ />
</>
)
}