"use client"; import { useState } 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, FileSpreadsheet, Loader2 } from "lucide-react"; import { useToast } from "@/components/ui/toast-provider"; interface UploadFileNilaiMahasiswaProps { onUploadSuccess: () => void; } export default function UploadFileNilaiMahasiswa({ onUploadSuccess }: UploadFileNilaiMahasiswaProps) { const { showSuccess, showError } = useToast(); const [isDialogOpen, setIsDialogOpen] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const [isUploading, setIsUploading] = useState(false); // Handle file selection const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { // Validate file type const validTypes = [ 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/csv' ]; if (!validTypes.includes(file.type)) { showError("Error!", "File harus berformat Excel (.xlsx, .xls) atau CSV (.csv)"); return; } setSelectedFile(file); } }; // Handle file upload const handleUpload = async () => { if (!selectedFile) { showError("Error!", "Silakan pilih file terlebih dahulu"); return; } try { setIsUploading(true); const formData = new FormData(); formData.append('file', selectedFile); const response = await fetch('/api/keloladata/data-nilai-mahasiswa/upload', { method: 'POST', body: formData, }); const result = await response.json(); if (!response.ok) { let errorMessage = result.message || 'Upload failed'; if (result.errors && result.errors.length > 0) { errorMessage += '\n\nErrors:\n' + result.errors.slice(0, 5).join('\n'); } throw new Error(errorMessage); } // Create success message based on insert and update counts const inserted = result.inserted || 0; const updated = result.updated || 0; const total = inserted + updated; let successMessage = `${total} nilai mahasiswa berhasil diproses`; if (inserted > 0 && updated > 0) { successMessage += ` (${inserted} ditambahkan, ${updated} diperbarui)`; } else if (inserted > 0) { successMessage += ` (${inserted} ditambahkan)`; } else if (updated > 0) { successMessage += ` (${updated} diperbarui)`; } showSuccess("Berhasil!", successMessage); onUploadSuccess(); setIsDialogOpen(false); setSelectedFile(null); // Reset file input const fileInput = document.getElementById('file-upload-nilai') as HTMLInputElement; if (fileInput) { fileInput.value = ''; } } catch (error) { console.error('Upload error:', error); showError("Gagal!", error instanceof Error ? error.message : "Terjadi kesalahan saat upload"); } finally { setIsUploading(false); } }; return ( <> Import Data Nilai Mahasiswa

Format yang didukung: .xlsx, .xls, .csv (Max: 10MB)

{selectedFile && (

File terpilih:

{selectedFile.name}

Ukuran: {(selectedFile.size / 1024 / 1024).toFixed(2)} MB

)}

Format File:

Header kolom: NIM, Kode MK, Semester, Nilai Huruf, Nilai Angka

NIM: Harus sudah terdaftar di sistem (contoh: D1041231002)

Kode MK: Harus sesuai persis dengan database (contoh: INF-55201-101)

Semester: Angka 1-8

Nilai Huruf: A, B+, B, C+, C, D+, D, E

Nilai Angka: 0-4 (bisa menggunakan koma: 3,5 atau titik: 3.5)

); }