summaryrefslogtreecommitdiff
path: root/lib/vendors/rfq-history-table/rfq-history-table-toolbar-actions.tsx
blob: 46eaa6a6fb939d02d94619e6579450754dac2ed9 (plain)
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
131
132
133
134
135
136
"use client"

import * as React from "react"
import { type Table } from "@tanstack/react-table"
import { Download, Upload } from "lucide-react"
import { toast } from "sonner"

import { exportTableToExcel } from "@/lib/export"
import { Button } from "@/components/ui/button"
import { DataTableViewOptions } from "@/components/data-table/data-table-view-options"


// 만약 서버 액션이나 API 라우트를 이용해 업로드 처리한다면 import
import { importTasksExcel } from "@/lib/tasks/service" // 예시
import {   VendorItem } from "@/db/schema/vendors"
// import { AddItemDialog } from "./add-item-dialog"

interface RfqHistoryRow {
  id: number;
  rfqCode: string | null;
  projectCode: string | null;
  projectName: string | null;
  description: string | null;
  dueDate: Date;
  status: "DRAFT" | "PUBLISHED" | "EVALUATION" | "AWARDED";
  vendorStatus: string;
  totalAmount: number | null;
  currency: string | null;
  leadTime: string | null;
  itemCount: number;
  tbeResult: string | null;
  cbeResult: string | null;
  createdAt: Date;
  items: {
    rfqId: number;
    id: number;
    itemCode: string;
    description: string | null;
    quantity: number | null;
    uom: string | null;
  }[];
}

interface RfqHistoryTableToolbarActionsProps {
  table: Table<RfqHistoryRow>
}

export function RfqHistoryTableToolbarActions({
  table,
}: RfqHistoryTableToolbarActionsProps) {
  // 파일 input을 숨기고, 버튼 클릭 시 참조해 클릭하는 방식
  const fileInputRef = React.useRef<HTMLInputElement>(null)

  // 파일이 선택되었을 때 처리
  async function onFileChange(event: React.ChangeEvent<HTMLInputElement>) {
    const file = event.target.files?.[0]
    if (!file) return

    // 파일 초기화 (동일 파일 재업로드 시에도 onChange가 트리거되도록)
    event.target.value = ""

    // 서버 액션 or API 호출
    try {
      // 예: 서버 액션 호출
      const { errorFile, errorMessage } = await importTasksExcel(file)

      if (errorMessage) {
        toast.error(errorMessage)
      }
      if (errorFile) {
        // 에러 엑셀을 다운로드
        const url = URL.createObjectURL(errorFile)
        const link = document.createElement("a")
        link.href = url
        link.download = "errors.xlsx"
        link.click()
        URL.revokeObjectURL(url)
      } else {
        // 성공
        toast.success("Import success")
        // 필요 시 revalidateTag("tasks") 등
      }

    } catch (err) {
      toast.error("파일 업로드 중 오류가 발생했습니다.")
      
    }
  }

  // function handleImportClick() {
  //   // 숨겨진 <input type="file" /> 요소를 클릭
  //   fileInputRef.current?.click()
  // }

  return (
    <div className="flex items-center gap-2">
      <DataTableViewOptions table={table} />

      {/* 조회만 하는 모듈 */}
      {/* <AddItemDialog vendorId={vendorId}/> */}

      {/** 3) Import 버튼 (파일 업로드) */}
      {/* <Button variant="outline" size="sm" className="gap-2" onClick={handleImportClick}>
        <Upload className="size-4" aria-hidden="true" />
        <span className="hidden sm:inline">Import</span>
      </Button> */}
      {/*
        실제로는 숨겨진 input과 연결:
        - accept=".xlsx,.xls" 등으로 Excel 파일만 업로드 허용
      */}
      <input
        ref={fileInputRef}
        type="file"
        accept=".xlsx,.xls"
        className="hidden"
        onChange={onFileChange}
      />

      {/** 4) Export 버튼 */}
      <Button
        variant="outline"
        size="sm"
        onClick={() =>
          exportTableToExcel(table, {
            filename: "rfq-history",
            excludeColumns: ["select", "actions"],
          })
        }
        className="gap-2"
      >
        <Download className="size-4" aria-hidden="true" />
        <span className="hidden sm:inline">Export</span>
      </Button>
    </div>
  )
}