"use client"; import { useState, useRef } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose } from "@/components/ui/dialog"; import { Upload, FileText, Loader2, X, CheckCircle, AlertCircle } from "lucide-react"; import { useToast } from "@/components/ui/toast-provider"; interface UploadExcelDosenProps { onUploadSuccess: () => void; } export default function UploadExcelDosen({ onUploadSuccess }: UploadExcelDosenProps) { const { showSuccess, showError } = useToast(); const fileInputRef = useRef(null); const [isDialogOpen, setIsDialogOpen] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const [isUploading, setIsUploading] = useState(false); const [uploadResult, setUploadResult] = useState(null); // Handle file selection const handleFileSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { // Validate file type const allowedTypes = [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', 'text/csv' ]; if (allowedTypes.includes(file.type)) { setSelectedFile(file); } else { showError("File tidak valid", "Silakan pilih file Excel (.xlsx, .xls) atau CSV (.csv)"); e.target.value = ''; } } }; // Handle file upload const handleUpload = async () => { if (!selectedFile) { showError("Tidak ada file", "Silakan pilih file terlebih dahulu"); return; } try { setIsUploading(true); const formData = new FormData(); formData.append('file', selectedFile); const response = await fetch('/api/keloladata/data-dosen/upload', { method: 'POST', body: formData, }); const result = await response.json(); if (!response.ok) { throw new Error(result.message || 'Upload failed'); } setUploadResult(result); if (result.details.successCount > 0) { showSuccess("Upload berhasil!", result.message); onUploadSuccess(); // Refresh the main table } else { showError("Upload gagal", "Tidak ada data yang berhasil diupload"); } } catch (error) { console.error('Upload error:', error); showError("Error", error instanceof Error ? error.message : "Terjadi kesalahan saat upload"); } finally { setIsUploading(false); } }; // Reset dialog const resetDialog = () => { setSelectedFile(null); setUploadResult(null); if (fileInputRef.current) { fileInputRef.current.value = ''; } }; // Close dialog const handleDialogClose = () => { setIsDialogOpen(false); resetDialog(); }; return ( <> Upload Data Dosen
{/* Instructions */}

Petunjuk Upload:

  • • File harus berformat Excel (.xlsx, .xls) atau CSV (.csv)
  • • Kolom yang diperlukan: nama_dosen, nip
  • • NIP harus terdiri dari 18 karakter
  • • Jika NIP sudah ada, data akan diupdate
  • • Baris pertama harus berisi header kolom
{/* File Input */}
{selectedFile && ( )}
{selectedFile && (
{selectedFile.name} ({(selectedFile.size / 1024).toFixed(1)} KB)
)}
{/* Upload Result */} {uploadResult && (

Hasil Upload:

Berhasil: {uploadResult.details.successCount}
Gagal: {uploadResult.details.failedCount}
Total baris: {uploadResult.details.totalRows}
{/* Show errors if any */} {uploadResult.details.errors && uploadResult.details.errors.length > 0 && (
Error Details:
{uploadResult.details.errors.slice(0, 10).map((error: string, index: number) => (
{error}
))} {uploadResult.details.errors.length > 10 && (
... dan {uploadResult.details.errors.length - 10} error lainnya
)}
)}
)}
); }