import React, { useState, useRef, useEffect } from 'react';
import {
Calendar,
List,
Image as ImageIcon,
FileSpreadsheet,
Printer,
PlusCircle,
Users,
BookOpen,
CheckCircle2,
Trash2,
Camera,
MapPin
} from 'lucide-react';
export default function AgendaMengajar() {
const [activeTab, setActiveTab] = useState('form');
const [agendas, setAgendas] = useState([]);
const [notification, setNotification] = useState(null);
// State untuk Form
const [formData, setFormData] = useState({
nama_guru: '',
nama_mapel: '',
nama_kelas: '', // Field baru
tanggal: new Date().toISOString().split('T')[0],
jam_ke: '', // Menggantikan pertemuan_ke
materi: '',
jml_hadir: '',
jml_absen: '',
ket_sakit: '0',
ket_izin: '0',
ket_alpa: '0',
nama_siswa_absen: '', // Field baru
foto_bukti: null
});
const fileInputRef = useRef(null);
// Notifikasi Timer
useEffect(() => {
if (notification) {
const timer = setTimeout(() => setNotification(null), 3000);
return () => clearTimeout(timer);
}
}, [notification]);
const handleInputChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
// Auto-kalkulasi absen jika sakit/izin/alpa diubah
if (['ket_sakit', 'ket_izin', 'ket_alpa'].includes(name)) {
setTimeout(() => {
setFormData(current => {
const totalAbsen =
(parseInt(current.ket_sakit) || 0) +
(parseInt(current.ket_izin) || 0) +
(parseInt(current.ket_alpa) || 0);
return { ...current, jml_absen: totalAbsen.toString() };
});
}, 0);
}
};
const handleFileChange = (e) => {
const file = e.target.files[0];
if (file) {
// Validasi ukuran file (maks 5MB untuk mengakomodasi kamera HP)
if (file.size > 5 * 1024 * 1024) {
showNotification('Ukuran file terlalu besar! Maksimal 5MB.', 'error');
return;
}
const reader = new FileReader();
reader.onloadend = () => {
setFormData(prev => ({ ...prev, foto_bukti: reader.result }));
};
reader.readAsDataURL(file);
}
};
const showNotification = (message, type = 'success') => {
setNotification({ message, type });
};
const handleSubmit = (e) => {
e.preventDefault();
// Validasi sederhana
if (!formData.nama_guru || !formData.nama_mapel || !formData.nama_kelas || !formData.tanggal || !formData.jam_ke || !formData.materi || !formData.jml_hadir) {
showNotification('Mohon lengkapi field yang wajib diisi!', 'error');
return;
}
const newAgenda = {
id: Date.now(),
...formData,
timestamp: new Date().toLocaleString('id-ID')
};
setAgendas(prev => [newAgenda, ...prev]);
showNotification('Agenda berhasil disimpan!');
// Reset Form
setFormData(prev => ({
...prev, // Menyimpan nama_guru, nama_mapel, dan nama_kelas
tanggal: new Date().toISOString().split('T')[0],
jam_ke: '', // Dikosongkan karena format bisa "1-2"
materi: '',
jml_hadir: '',
jml_absen: '0',
ket_sakit: '0',
ket_izin: '0',
ket_alpa: '0',
nama_siswa_absen: '',
foto_bukti: null
}));
if (fileInputRef.current) fileInputRef.current.value = '';
// Pindah ke tab riwayat
setActiveTab('riwayat');
};
const handleDelete = (id) => {
setAgendas(prev => prev.filter(agenda => agenda.id !== id));
showNotification('Agenda dihapus.');
};
const exportToCSV = () => {
if (agendas.length === 0) {
showNotification('Tidak ada data untuk diekspor', 'error');
return;
}
const headers = ['Nama Guru', 'Mata Pelajaran', 'Kelas', 'Tanggal', 'Jam Ke', 'Materi', 'Hadir', 'Absen', 'Sakit', 'Izin', 'Alpa', 'Siswa Absen', 'Waktu Input'];
const rows = agendas.map(a => [
`"${a.nama_guru}"`,
`"${a.nama_mapel}"`,
`"${a.nama_kelas}"`,
a.tanggal,
`"${a.jam_ke}"`,
`"${a.materi.replace(/"/g, '""')}"`,
a.jml_hadir,
a.jml_absen,
a.ket_sakit,
a.ket_izin,
a.ket_alpa,
`"${(a.nama_siswa_absen || '').replace(/"/g, '""')}"`,
a.timestamp
]);
const csvContent = "data:text/csv;charset=utf-8,"
+ [headers.join(','), ...rows.map(e => e.join(','))].join('\n');
const encodedUri = encodeURI(csvContent);
const link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", `Agenda_Mengajar_${new Date().toISOString().split('T')[0]}.csv`);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
const printDocument = () => {
window.print();
};
return (
{/* Header - Disembunyikan saat print */}
Agenda Mengajar
Portal Guru
{/* Navigasi Tabs - Disembunyikan saat print */}
{/* Notifikasi Toast */}
{notification && (
)}
{/* Konten Utama */}
{/* TAB FORM INPUT */}
{activeTab === 'form' && (
Form Agenda Baru
Isi detail aktivitas belajar mengajar hari ini.
)}
{/* TAB RIWAYAT / DASHBOARD */}
{activeTab === 'riwayat' && (
{/* Header Riwayat */}
Riwayat Agenda
Daftar aktivitas mengajar yang telah diinput.
{/* Header Khusus Print (Hanya muncul saat dicetak) */}
Laporan Agenda Mengajar Guru
Dicetak pada: {new Date().toLocaleDateString('id-ID')}
{/* Tabel Data (Diberi pembungkus overflow-x-auto agar bisa digeser horizontal di HP) */}
{agendas.length === 0 ? (
Belum ada agenda
Silakan input agenda mengajar Anda pada tab form.
) : (
| Tanggal |
Guru & Mapel |
Kelas |
Jam |
Materi |
Hadir |
Absen & Ket |
Bukti |
Aksi |
{agendas.map((item) => (
|
{new Date(item.tanggal).toLocaleDateString('id-ID', { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' })}
|
{item.nama_guru}
{item.nama_mapel}
|
{item.nama_kelas}
|
{item.jam_ke}
|
{item.materi}
|
{item.jml_hadir}
|
0 ? 'bg-rose-100 text-rose-800' : 'bg-slate-100 text-slate-600'} py-1 px-2.5 rounded-md font-medium text-xs print:bg-transparent print:p-0`}>
{item.jml_absen}
S:{item.ket_sakit} | I:{item.ket_izin} | A:{item.ket_alpa}
{item.nama_siswa_absen && (
{item.nama_siswa_absen}
)}
|
{item.foto_bukti ? (
) : (
-
)}
|
|
))}
)}
)}
);
}