1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
"use client"
import * as React from "react"
import { type Table } from "@tanstack/react-table"
import { useTransition } from "react"
import { Button } from "@/components/ui/button"
import { Plus, Send, Mail, CheckSquare } from "lucide-react"
import { BiddingCompany } from "./bidding-pre-quote-vendor-columns"
import { BiddingPreQuoteVendorCreateDialog } from "./bidding-pre-quote-vendor-create-dialog"
import { BiddingPreQuoteInvitationDialog } from "./bidding-pre-quote-invitation-dialog"
import { BiddingPreQuoteSelectionDialog } from "./bidding-pre-quote-selection-dialog"
import { Bidding } from "@/db/schema"
import { useToast } from "@/hooks/use-toast"
interface BiddingPreQuoteVendorToolbarActionsProps {
table: Table<BiddingCompany>
biddingId: number
bidding: Bidding
biddingCompanies: BiddingCompany[]
onOpenItemsDialog: () => void
onOpenTargetPriceDialog: () => void
onOpenSelectionReasonDialog: () => void
onSuccess: () => void
}
export function BiddingPreQuoteVendorToolbarActions({
table,
biddingId,
bidding,
biddingCompanies,
onOpenItemsDialog,
onOpenTargetPriceDialog,
onOpenSelectionReasonDialog,
onSuccess
}: BiddingPreQuoteVendorToolbarActionsProps) {
const { toast } = useToast()
const [isPending, startTransition] = useTransition()
const [isCreateDialogOpen, setIsCreateDialogOpen] = React.useState(false)
const [isInvitationDialogOpen, setIsInvitationDialogOpen] = React.useState(false)
const [isSelectionDialogOpen, setIsSelectionDialogOpen] = React.useState(false)
const handleCreateCompany = () => {
setIsCreateDialogOpen(true)
}
const handleSendInvitations = () => {
setIsInvitationDialogOpen(true)
}
const handleManageSelection = () => {
const selectedRows = table.getFilteredSelectedRowModel().rows
if (selectedRows.length === 0) {
toast({
title: '선택 필요',
description: '본입찰 선정 상태를 변경할 업체를 선택해주세요.',
variant: 'destructive',
})
return
}
setIsSelectionDialogOpen(true)
}
return (
<>
<div className="flex items-center gap-2">
<Button
variant="outline"
size="sm"
onClick={handleCreateCompany}
disabled={isPending}
>
<Plus className="mr-2 h-4 w-4" />
업체 추가
</Button>
<Button
variant="default"
size="sm"
onClick={handleSendInvitations}
disabled={isPending}
>
<Mail className="mr-2 h-4 w-4" />
초대 발송
</Button>
<Button
variant="secondary"
size="sm"
onClick={handleManageSelection}
disabled={isPending}
>
<CheckSquare className="mr-2 h-4 w-4" />
본입찰 선정
</Button>
</div>
<BiddingPreQuoteVendorCreateDialog
biddingId={biddingId}
open={isCreateDialogOpen}
onOpenChange={setIsCreateDialogOpen}
onSuccess={() => {
onSuccess()
setIsCreateDialogOpen(false)
}}
/>
<BiddingPreQuoteInvitationDialog
open={isInvitationDialogOpen}
onOpenChange={setIsInvitationDialogOpen}
companies={biddingCompanies}
biddingId={biddingId}
biddingTitle={bidding.title}
projectName={bidding.projectName}
onSuccess={onSuccess}
/>
<BiddingPreQuoteSelectionDialog
open={isSelectionDialogOpen}
onOpenChange={setIsSelectionDialogOpen}
selectedCompanies={table.getFilteredSelectedRowModel().rows.map(row => row.original)}
onSuccess={() => {
onSuccess()
table.resetRowSelection()
}}
/>
</>
)
}
|