summaryrefslogtreecommitdiff
path: root/lib/contact-possible-items/table/contact-possible-items-table-toolbar-actions.tsx
blob: 4125399b35c2414b3e72d5688d926c38bd8f186e (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
"use client"

import * as React from "react"
import { type Table } from "@tanstack/react-table"
import { Download } from "lucide-react"
import * as ExcelJS from 'exceljs'

import { Button } from "@/components/ui/button"
import { ContactPossibleItemDetail } from "../service"

interface ContactPossibleItemsTableToolbarActionsProps {
  table: Table<ContactPossibleItemDetail>
}

export function ContactPossibleItemsTableToolbarActions({
  table,
}: ContactPossibleItemsTableToolbarActionsProps) {

  const handleExport = () => {
    // 현재 테이블의 모든 데이터를 Excel로 내보내기
    const data = table.getFilteredRowModel().rows.map(row => ({
      "벤더 코드": row.original.vendorCode,
      "벤더명": row.original.vendorName,
      "벤더 국가": row.original.vendorCountry,
      "벤더 타입": row.original.techVendorType,
      "담당자명": row.original.contactName,
      "담당자 직책": row.original.contactPosition,
      "담당자 이메일": row.original.contactEmail,
      "담당자 전화번호": row.original.contactPhone,
      "담당자 국가": row.original.contactCountry,
      "주담당자": row.original.isPrimary ? "예" : "아니오",
      "아이템 코드": row.original.itemCode,
      "아이템명": row.original.itemList,
      "공종": row.original.workType,
      "선종": row.original.shipTypes,
      "서브아이템": row.original.subItemList,
      "생성일": new Date(row.original.createdAt).toLocaleDateString("ko-KR"),
      "수정일": new Date(row.original.updatedAt).toLocaleDateString("ko-KR"),
    }))

    downloadExcel(data, "contact_possible_items.xlsx")
  }

  return (
    <div className="flex items-center gap-2">
      <Button
        variant="outline"
        size="sm"
        onClick={handleExport}
      >
        <Download className="mr-2 h-4 w-4" />
        Excel 내보내기
      </Button>
    </div>
  )
}

// Excel 파일 다운로드
function downloadExcel(data: Array<Record<string, unknown>>, filename: string) {
  const workbook = new ExcelJS.Workbook()
  const worksheet = workbook.addWorksheet("Data")

  if (data.length > 0) {
    // 헤더 추가
    const headers = Object.keys(data[0])
    worksheet.addRow(headers)

    // 데이터 추가
    data.forEach(row => {
      worksheet.addRow(Object.values(row))
    })

    // 스타일 적용
    worksheet.getRow(1).font = { bold: true }
    worksheet.columns.forEach(column => {
      column.width = 15
    })
  }

  // 파일 다운로드
  workbook.xlsx.writeBuffer().then(buffer => {
    const blob = new Blob([buffer], { 
      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    })
    const url = window.URL.createObjectURL(blob)
    const a = document.createElement("a")
    a.href = url
    a.download = filename
    a.click()
    window.URL.revokeObjectURL(url)
  })
}