import React, { useState, useEffect, useRef } from 'react'; import { BookOpen, Plus, Pencil, Trash2, Upload, Download, X, Save, Search } from 'lucide-react'; interface Subject { id: number; name: string; } interface ManageSubjectsProps { onClose?: () => void; } const ManageSubjects: React.FC = ({ onClose }) => { const [subjects, setSubjects] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [showForm, setShowForm] = useState(false); const [editingSubject, setEditingSubject] = useState(null); const [formData, setFormData] = useState({ name: '' }); 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(() => { fetchSubjects(); }, []); const fetchSubjects = async () => { try { const response = await fetch(`${API_URL}/subjects`); const result = await response.json(); if (result.status === 'success') { setSubjects(result.data); } } catch (error) { console.error('Error fetching subjects:', error); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); try { const url = editingSubject ? `${API_URL}/subjects/${editingSubject.id}` : `${API_URL}/subjects`; const response = await fetch(url, { method: editingSubject ? 'PUT' : 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); const result = await response.json(); if (result.status === 'success') { alert(result.message); fetchSubjects(); setShowForm(false); setEditingSubject(null); setFormData({ name: '' }); } else { alert(result.message); } } catch (error) { alert('Gagal menyimpan data'); } finally { setSaving(false); } }; const handleDelete = async (id: number) => { if (!confirm('Yakin ingin menghapus mata pelajaran ini?')) return; try { const response = await fetch(`${API_URL}/subjects/${id}`, { method: 'DELETE' }); const result = await response.json(); if (result.status === 'success') { fetchSubjects(); } } catch (error) { alert('Gagal menghapus data'); } }; const handleEdit = (subject: Subject) => { setEditingSubject(subject); setFormData({ name: subject.name }); 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}/subjects/import`, { method: 'POST', body: formData }); const result = await response.json(); setImportResult(result.message); fetchSubjects(); } catch (error) { setImportResult('Gagal import data'); } if (fileInputRef.current) fileInputRef.current.value = ''; }; const downloadTemplate = () => { window.open(`${API_URL}/subjects/template`, '_blank'); }; const filteredSubjects = subjects.filter(s => s.name.toLowerCase().includes(searchTerm.toLowerCase()) ); return (

Kelola Mata Pelajaran

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 && (

{editingSubject ? 'Edit Mata Pelajaran' : 'Tambah Mata Pelajaran 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" placeholder="Contoh: Matematika" />
)} {/* Table */} {loading ? (
Memuat data...
) : (
{filteredSubjects.map((subject, index) => ( ))} {filteredSubjects.length === 0 && ( )}
No Mata Pelajaran Aksi
{index + 1} {subject.name}
Tidak ada data mata pelajaran
)}
Total: {filteredSubjects.length} mata pelajaran
); }; export default ManageSubjects;