'use client'; /* IMPORT */ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; import { Download, Plus, Trash2, Upload } from 'lucide-react'; import { exportTableToExcel } from '@/lib/export'; import { importRegEvalCriteriaExcel, removeRegEvalCriteria } from '../service'; import { toast } from 'sonner'; import { type RegEvalCriteriaView } from '@/db/schema'; import { type Table } from '@tanstack/react-table'; import { ChangeEvent, useMemo, useRef, useState } from 'react'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ interface RegEvalCriteriaTableToolbarActionsProps { table: Table, onCreateCriteria: () => void, onRefresh: () => void, } // ---------------------------------------------------------------------------------------------------- /* REGULAR EVALUATION CRITERIA TABLE TOOLBAR ACTIONS COMPONENT */ function RegEvalCriteriaTableToolbarActions(props: RegEvalCriteriaTableToolbarActionsProps) { const { table, onCreateCriteria, onRefresh } = props; const [isDeleting, setIsDeleting] = useState(false); const selectedRows = table.getFilteredSelectedRowModel().rows; const hasSelection = selectedRows.length > 0; const selectedIds = useMemo(() => { return [...new Set(selectedRows.map(row => row.original.criteriaId))]; }, [selectedRows]); const fileInputRef = useRef(null); // Function for Create New Criteria const handleCreateNew = () => { onCreateCriteria(); } const handleDeleteSelected = async () => { if (!hasSelection) { return; } try { setIsDeleting(true); for (const selectedId of selectedIds) { if (selectedId) { await removeRegEvalCriteria(selectedId); } } table.resetRowSelection(); toast.success(`${selectedIds.length}개의 평가 기준이 삭제되었습니다.`); onRefresh(); } catch (error) { console.error('Error in Deleting Regular Evaluation Critria: ', error); toast.error( error instanceof Error ? error.message : '평가 기준 삭제 중 오류가 발생했습니다.' ); } finally { setIsDeleting(false); } } // Excel Import function handleImport() { fileInputRef.current?.click(); }; async function onFileChange(event: ChangeEvent) { const file = event.target.files?.[0]; if (!file) { toast.error('가져올 파일을 선택해주세요.'); return; } if (!file.name.endsWith('.xlsx') && !file.name.endsWith('.xls')) { toast.error('.xlsx 또는 .xls 확장자인 Excel 파일만 업로드 가능합니다.'); return; } event.target.value = ''; try { const { errorFile, errorMessage, successMessage } = await importRegEvalCriteriaExcel(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(successMessage || 'Excel 파일이 성공적으로 업로드 되었습니다.'); } } catch (error) { toast.error('Excel 파일 업로드 중 오류가 발생했습니다.'); console.error('Error in Excel File Upload: ', error); } finally { onRefresh(); } }; // Excel Export const handleExport = () => { try { exportTableToExcel(table, { filename: 'Regular_Evaluation_Criteria', excludeColumns: ['select', 'actions'], }); toast.success('Excel 파일이 다운로드되었습니다.'); } catch (error) { console.error('Error in Exporting to Excel: ', error); toast.error('Excel 내보내기 중 오류가 발생했습니다.'); } }; return (
{hasSelection && ( 정말 삭제하시겠습니까? 선택된 {selectedIds.length}개의 협력업체 평가 기준 항목이 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없으며, 연관된 평가 기준과 항목들도 함께 삭제됩니다. Cancel {isDeleting ? 'Deleting...' : 'Delete'} )}
); } // ---------------------------------------------------------------------------------------------------- /* EXPORT */ export default RegEvalCriteriaTableToolbarActions;