summaryrefslogtreecommitdiff
path: root/lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx')
-rw-r--r--lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx84
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx b/lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx
new file mode 100644
index 00000000..864d0f4b
--- /dev/null
+++ b/lib/rfqs-tech/vendor-table/vendors-table-toolbar-actions.tsx
@@ -0,0 +1,84 @@
+"use client"
+
+import * as React from "react"
+import { type Table } from "@tanstack/react-table"
+
+import { MatchedVendorRow } from "@/config/vendorRfbColumnsConfig"
+import { InviteVendorsDialog } from "./invite-vendors-dialog"
+import { AddVendorDialog } from "./add-vendor-dialog"
+import { Button } from "@/components/ui/button"
+import { useToast } from "@/hooks/use-toast"
+
+interface VendorsTableToolbarActionsProps {
+ table: Table<MatchedVendorRow>
+ rfqId: number
+}
+
+export function VendorsTableToolbarActions({ table, rfqId }: VendorsTableToolbarActionsProps) {
+ const { toast } = useToast()
+ const fileInputRef = React.useRef<HTMLInputElement>(null)
+
+ // 선택된 모든 행
+ const selectedRows = table.getFilteredSelectedRowModel().rows
+
+ // 조건에 맞는 협력업체만 필터링
+ const eligibleVendors = React.useMemo(() => {
+ return selectedRows
+ .map(row => row.original)
+ .filter(vendor => !vendor.rfqVendorStatus || vendor.rfqVendorStatus === "INVITED")
+ }, [selectedRows])
+
+ // 조건에 맞지 않는 협력업체 수
+ const ineligibleCount = selectedRows.length - eligibleVendors.length
+
+ function handleImportClick() {
+ fileInputRef.current?.click()
+ }
+
+ function handleInviteClick() {
+ // 조건에 맞지 않는 협력업체가 있다면 토스트 메시지 표시
+ if (ineligibleCount > 0) {
+ toast({
+ title: "일부 협력업체만 초대됩니다",
+ description: `선택한 ${selectedRows.length}개 중 ${eligibleVendors.length}개만 초대 가능합니다. 나머지 ${ineligibleCount}개는 초대 불가능한 상태입니다.`,
+ // variant: "warning",
+ })
+ }
+ }
+
+ // 다이얼로그 표시 여부 - 적합한 협력업체가 1개 이상 있으면 표시
+ const showInviteDialog = eligibleVendors.length > 0
+
+ return (
+ <div className="flex items-center gap-2">
+ {selectedRows.length > 0 && (
+ <>
+ {showInviteDialog ? (
+ <InviteVendorsDialog
+ vendors={eligibleVendors}
+ rfqId={rfqId}
+ onSuccess={() => table.toggleAllRowsSelected(false)}
+ onOpenChange={(open) => {
+ // 다이얼로그가 열릴 때만 경고 표시
+ if (open && ineligibleCount > 0) {
+ handleInviteClick()
+ }
+ }}
+ />
+ ) : (
+ <Button
+ variant="default"
+ size="sm"
+ disabled={true}
+ title="선택된 협력업체 중 초대 가능한 협력업체가 없습니다"
+ >
+ 초대 불가
+ </Button>
+ )}
+ </>
+ )}
+
+ <AddVendorDialog rfqId={rfqId} />
+ </div>
+ )
+} \ No newline at end of file