From 6f22fc9ebc8d175041aa18cf0986592e57d03f63 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 3 Jul 2025 02:47:09 +0000 Subject: (최겸) 기술영업 벤더별 아이템 조회 기능 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table/possible-items-table-toolbar-actions.tsx | 201 +++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 lib/tech-vendor-possible-items/table/possible-items-table-toolbar-actions.tsx (limited to 'lib/tech-vendor-possible-items/table/possible-items-table-toolbar-actions.tsx') diff --git a/lib/tech-vendor-possible-items/table/possible-items-table-toolbar-actions.tsx b/lib/tech-vendor-possible-items/table/possible-items-table-toolbar-actions.tsx new file mode 100644 index 00000000..3628f87e --- /dev/null +++ b/lib/tech-vendor-possible-items/table/possible-items-table-toolbar-actions.tsx @@ -0,0 +1,201 @@ +"use client"; + +import * as React from "react"; +import { type Table } from "@tanstack/react-table"; +import { Download, Upload, FileSpreadsheet, Trash2 } from "lucide-react"; + +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { useToast } from "@/hooks/use-toast"; +import { deleteTechVendorPossibleItems } from "@/lib/tech-vendor-possible-items/service"; +// Excel 함수들을 동적 import로만 사용하기 위해 타입만 import +type TechVendorPossibleItemsData = { + id: number; + vendorId: number; + vendorCode: string | null; + vendorName: string; + techVendorType: string; + itemCode: string; + createdAt: Date; + updatedAt: Date; +}; + +interface PossibleItemsTableToolbarActionsProps { + table: Table; +} + +export function PossibleItemsTableToolbarActions({ + table, +}: PossibleItemsTableToolbarActionsProps) { + const { toast } = useToast(); + const [isPending, startTransition] = React.useTransition(); + + const selectedRows = table.getFilteredSelectedRowModel().rows; + const hasSelection = selectedRows.length > 0; + + const handleDelete = () => { + if (!hasSelection) return; + + startTransition(async () => { + const selectedIds = selectedRows.map((row) => row.original.id); + + try { + const result = await deleteTechVendorPossibleItems(selectedIds); + + if (result.success) { + toast({ + title: "성공", + description: `${selectedIds.length}개의 아이템이 삭제되었습니다.`, + }); + table.toggleAllRowsSelected(false); + // 페이지 새로고침이나 데이터 다시 로드 필요 + window.location.reload(); + } else { + toast({ + title: "오류", + description: result.error || "삭제 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + } catch (error) { + console.error("Delete error:", error); + toast({ + title: "오류", + description: "삭제 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + }); + }; + + const handleExport = async () => { + try { + const { exportTechVendorPossibleItemsToExcel } = await import("./excel-export"); + const result = await exportTechVendorPossibleItemsToExcel(table.getFilteredRowModel().rows.map(row => row.original)); + + if (result.success) { + toast({ + title: "성공", + description: "Excel 파일이 다운로드되었습니다.", + }); + } else { + toast({ + title: "오류", + description: result.error || "내보내기 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + } catch (error) { + console.error("Export error:", error); + toast({ + title: "오류", + description: "내보내기 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + }; + + const handleImport = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + try { + const { importTechVendorPossibleItemsFromExcel } = await import("./excel-import"); + const result = await importTechVendorPossibleItemsFromExcel(file); + + if (result.success) { + toast({ + title: "성공", + description: `${result.successCount}개의 아이템이 가져와졌습니다.`, + }); + // 페이지 새로고침이나 데이터 다시 로드 필요 + window.location.reload(); + } else { + toast({ + title: "가져오기 완료", + description: `${result.successCount}개 성공, ${result.failedRows.length}개 실패`, + variant: result.successCount > 0 ? "default" : "destructive", + }); + } + } catch (error) { + console.error("Import error:", error); + toast({ + title: "오류", + description: "가져오기 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + + // Reset input + event.target.value = ""; + }; + + const handleDownloadTemplate = async () => { + try { + const { exportTechVendorPossibleItemsTemplate } = await import("./excel-template"); + const result = await exportTechVendorPossibleItemsTemplate(); + if (result.success) { + toast({ + title: "성공", + description: "템플릿 파일이 다운로드되었습니다.", + }); + } else { + toast({ + title: "오류", + description: result.error || "템플릿 다운로드 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + } catch (error) { + console.error("Template download error:", error); + toast({ + title: "오류", + description: "템플릿 다운로드 중 오류가 발생했습니다.", + variant: "destructive", + }); + } + }; + + return ( +
+ {hasSelection && ( + + )} + + + + + + + + +
+ ); +} \ No newline at end of file -- cgit v1.2.3