import React, { useState, useEffect, useRef } from 'react'; import { Users, Plus, Pencil, Trash2, Upload, Download, X, Save, Search } from 'lucide-react'; interface Teacher { id: number; name: string; nip: string; } interface ManageTeachersProps { onClose?: () => void; } const ManageTeachers: React.FC = ({ onClose }) => { const [teachers, setTeachers] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [showForm, setShowForm] = useState(false); const [editingTeacher, setEditingTeacher] = useState(null); const [formData, setFormData] = useState({ name: '', nip: '' }); const [saving, setSaving] = useState(false); const [importResult, setImportResult] = useState(null); const fileInputRef = useRef(null); const API_URL = import.meta.env.VITE_API_URL || '/api'; useEffect(() => { fetchTeachers(); }, []); const fetchTeachers = async () => { try { const response = await fetch(`${API_URL}/teachers`); const result = await response.json(); if (result.status === 'success') { setTeachers(result.data); } } catch (error) { console.error('Error fetching teachers:', error); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); try { const url = editingTeacher ? `${API_URL}/teachers/${editingTeacher.id}` : `${API_URL}/teachers`; const response = await fetch(url, { method: editingTeacher ? 'PUT' : 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); const result = await response.json(); if (result.status === 'success') { alert(result.message); fetchTeachers(); setShowForm(false); setEditingTeacher(null); setFormData({ name: '', nip: '' }); } else { alert(result.message); } } catch (error) { alert('Gagal menyimpan data'); } finally { setSaving(false); } }; const handleDelete = async (id: number) => { if (!confirm('Yakin ingin menghapus guru ini?')) return; try { const response = await fetch(`${API_URL}/teachers/${id}`, { method: 'DELETE' }); const result = await response.json(); if (result.status === 'success') { fetchTeachers(); } } catch (error) { alert('Gagal menghapus data'); } }; const handleEdit = (teacher: Teacher) => { setEditingTeacher(teacher); setFormData({ name: teacher.name, nip: teacher.nip || '' }); setShowForm(true); }; const handleImport = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; const formData = new FormData(); formData.append('file', file); try { const response = await fetch(`${API_URL}/teachers/import`, { method: 'POST', body: formData }); const result = await response.json(); setImportResult(result.message); fetchTeachers(); } catch (error) { setImportResult('Gagal import data'); } if (fileInputRef.current) fileInputRef.current.value = ''; }; const downloadTemplate = () => { window.open(`${API_URL}/teachers/template`, '_blank'); }; const filteredTeachers = teachers.filter(t => t.name.toLowerCase().includes(searchTerm.toLowerCase()) || (t.nip && t.nip.includes(searchTerm)) ); return (

Kelola Data Guru

Tambah, edit, hapus, atau import dari Excel

{onClose && ( )}
{/* Actions Bar */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 rounded-xl border border-slate-200 focus:border-school-800 outline-none" />
{/* Import Result */} {importResult && (
{importResult}
)} {/* Form Modal */} {showForm && (

{editingTeacher ? 'Edit Guru' : 'Tambah Guru Baru'}

setFormData({ ...formData, name: e.target.value })} className="w-full px-4 py-2 rounded-xl border border-slate-200 focus:border-school-800 outline-none" />
setFormData({ ...formData, nip: e.target.value })} className="w-full px-4 py-2 rounded-xl border border-slate-200 focus:border-school-800 outline-none" />
)} {/* Table */} {loading ? (
Memuat data...
) : (
{filteredTeachers.map((teacher, index) => ( ))} {filteredTeachers.length === 0 && ( )}
No Nama Guru NIP Aksi
{index + 1} {teacher.name} {teacher.nip || '-'}
Tidak ada data guru
)}
Total: {filteredTeachers.length} guru
); }; export default ManageTeachers;