"use client" import * as React from "react" import { type Table } from "@tanstack/react-table" import { Download, FileDown } from "lucide-react" import * as ExcelJS from 'exceljs' import { saveAs } from "file-saver" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Item } from "@/db/schema/items" import { DeleteItemsDialog } from "./delete-items-dialog" import { AddItemDialog } from "./add-items-dialog" import { exportItemTemplate } from "./item-excel-template" import { ImportItemButton } from "./import-excel-button" interface ItemsTableToolbarActionsProps { table: Table } export function ItemsTableToolbarActions({ table }: ItemsTableToolbarActionsProps) { const [refreshKey, setRefreshKey] = React.useState(0) // 가져오기 성공 후 테이블 갱신 const handleImportSuccess = () => { setRefreshKey(prev => prev + 1) } // Excel 내보내기 함수 const exportTableToExcel = async ( table: Table, options: { filename: string; excludeColumns?: string[]; sheetName?: string; } ) => { const { filename, excludeColumns = [], sheetName = "아이템 목록" } = options; // 워크북 생성 const workbook = new ExcelJS.Workbook(); workbook.creator = 'Item Management System'; workbook.created = new Date(); // 워크시트 생성 const worksheet = workbook.addWorksheet(sheetName); // 테이블 데이터 가져오기 const data = table.getFilteredRowModel().rows.map(row => row.original); // 테이블 헤더 가져오기 const headers = table.getAllColumns() .filter(column => !excludeColumns.includes(column.id)) .map(column => ({ key: column.id, header: column.columnDef.header?.toString() || column.id })); // 컬럼 정의 worksheet.columns = headers.map(header => ({ header: header.header, key: header.key, width: 20 // 기본 너비 })); // 스타일 적용 const headerRow = worksheet.getRow(1); headerRow.font = { bold: true }; headerRow.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFE0E0E0' } }; headerRow.alignment = { vertical: 'middle', horizontal: 'center' }; // 데이터 행 추가 data.forEach(item => { const row: Record = {}; headers.forEach(header => { row[header.key] = item[header.key]; }); worksheet.addRow(row); }); // 전체 셀에 테두리 추가 worksheet.eachRow((row, rowNumber) => { row.eachCell((cell) => { cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } }; }); }); try { // 워크북을 Blob으로 변환 const buffer = await workbook.xlsx.writeBuffer(); const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); saveAs(blob, `${filename}.xlsx`); return true; } catch (error) { console.error("Excel 내보내기 오류:", error); return false; } } return (
{/* 선택된 로우가 있으면 삭제 다이얼로그 */} {table.getFilteredSelectedRowModel().rows.length > 0 ? ( row.original)} onSuccess={() => table.toggleAllRowsSelected(false)} /> ) : null} {/* 새 아이템 추가 다이얼로그 */} {/* Import 버튼 */} {/* Export 드롭다운 메뉴 */} exportTableToExcel(table, { filename: "items", excludeColumns: ["select", "actions"], sheetName: "아이템 목록" }) } > 현재 데이터 내보내기 exportItemTemplate()}> 템플릿 다운로드
) }