'use client' import { useState, useMemo, useActionState, useEffect, useRef } from 'react' import { Search, Calendar, Clock, Trash2, Building2, Sparkles, Filter, Edit3, Loader2, History, RotateCcw, Printer } from 'lucide-react' import { InstantScheduleModal } from './InstantScheduleModal' import { JadwalFormModal } from './JadwalFormModal' import { CetakPDFJadwal } from './CetakPDFJadwal' import { CetakBatchJadwalModal } from './CetakBatchJadwalModal' import { deleteSchedulesByDate, deleteJadwal, archiveSchedulesByMonth, deleteAllHistory } from './action-jadwal' import { showSwal } from '@/lib/swal' interface JadwalWithPosyandu { id: string posyandu_id: string tanggal: string jam_mulai: string jam_selesai: string diedit_oleh: string detail_posyandu: { nama_posyandu: string alamat: string } } interface Props { data: JadwalWithPosyandu[] userName: string } export function JadwalTable({ data, userName }: Props) { const [searchTerm, setSearchTerm] = useState('') const [filterDate, setFilterDate] = useState('') const [showHistory, setShowHistory] = useState(false) const [isInstantModalOpen, setIsInstantModalOpen] = useState(false) const [isEditModalOpen, setIsEditModalOpen] = useState(false) const [selectedJadwal, setSelectedJadwal] = useState(null) const [isDeleting, setIsDeleting] = useState(null) const now = new Date() const currentMonth = now.getMonth() const currentYear = now.getFullYear() const filteredData = useMemo(() => { return data.filter(j => { const isHistoryRecord = j.diedit_oleh.startsWith('[HISTORY]') // History View Logic if (showHistory) { if (!isHistoryRecord) return false } else { if (isHistoryRecord) return false } const dateObj = new Date(j.tanggal) const isCurrentMonth = dateObj.getMonth() === currentMonth && dateObj.getFullYear() === currentYear // Monthly Filter Logic for Non-History if (!showHistory && !isCurrentMonth) return false const searchTermClean = searchTerm.toLowerCase() const matchesSearch = j.detail_posyandu.nama_posyandu.toLowerCase().includes(searchTermClean) || j.diedit_oleh.toLowerCase().includes(searchTermClean) const matchesDate = filterDate ? j.tanggal === filterDate : true return matchesSearch && matchesDate }) }, [data, searchTerm, filterDate, showHistory, currentMonth, currentYear]) const isScheduledThisMonth = useMemo(() => { return data.some(j => { const dateObj = new Date(j.tanggal) const isCurrentMonth = dateObj.getMonth() === currentMonth && dateObj.getFullYear() === currentYear return isCurrentMonth && !j.diedit_oleh.startsWith('[HISTORY]') }) }, [data, currentMonth, currentYear]) const handleDeleteDate = async () => { if (!filterDate) { showSwal.error('Pilih Tanggal', 'Silakan pilih tanggal terlebih dahulu untuk menghapus jadwal pada hari tersebut.') return } const confirm = await showSwal.confirm( 'Hapus Jadwal Hari Ini?', `Seluruh jadwal untuk tanggal ${new Date(filterDate).toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric' })} akan dihapus.` ) if (confirm.isConfirmed) { const res = await deleteSchedulesByDate(filterDate) if (res.success) showSwal.success('Berhasil!', res.message) else showSwal.error('Gagal!', res.message) } } const handleResetMonth = async () => { const confirm = await showSwal.confirm( 'Arsipkan Jadwal Bulan Ini?', 'Jadwal bulan ini akan dipindahkan ke Histori dan disembunyikan dari tabel utama. Anda bisa melihatnya kembali di fitur Lihat Histori.' ) if (confirm.isConfirmed) { const res = await archiveSchedulesByMonth(currentMonth, currentYear) if (res.success) showSwal.success('Berhasil!', res.message) else showSwal.error('Gagal!', res.message) } } const handleClearHistory = async () => { const confirm = await showSwal.confirm( 'Hapus Seluruh Histori?', 'Tindakan ini akan menghapus SELURUH data di riwayat penjadwalan secara PERMANEN. Data tidak dapat dipulihkan.' ) if (confirm.isConfirmed) { const res = await deleteAllHistory() if (res.success) showSwal.success('Berhasil!', res.message) else showSwal.error('Gagal!', res.message) } } const handleDeleteJadwal = async (id: string, name: string) => { const confirm = await showSwal.confirm( 'Hapus Jadwal?', `Apakah Anda yakin ingin menghapus jadwal untuk ${name}?` ) if (confirm.isConfirmed) { setIsDeleting(id) const res = await deleteJadwal(id) if (res.success) showSwal.success('Berhasil!', res.message) else showSwal.error('Gagal!', res.message) setIsDeleting(null) } } const handleEditJadwal = (jadwal: JadwalWithPosyandu) => { setSelectedJadwal(jadwal) setIsEditModalOpen(true) } const monthNames = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"] return (
{/* Header / Action Bar */}
{/* Search */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2.5 bg-gray-50 border-2 border-transparent focus:border-black rounded-xl text-xs font-bold outline-none transition-all" />
{/* Date Filter */}
setFilterDate(e.target.value)} className="w-full pl-10 pr-4 py-2.5 bg-gray-50 border-2 border-transparent focus:border-black rounded-xl text-xs font-bold outline-none transition-all" />
{showHistory ? ( ) : ( <> {isScheduledThisMonth && ( )} )}
{/* Table */}
{filteredData.length === 0 ? ( ) : ( filteredData.map((j, idx) => ( )) )}
No Waktu & Sesi Detail Posyandu Oleh Admin Aksi

Belum ada jadwal ditemukan

Gunakan Penjadwalan Instan untuk membuat jadwal otomatis.

{idx + 1}
{j.jam_mulai.slice(0, 5)} - {j.jam_selesai.slice(0, 5)}
{new Date(j.tanggal).toLocaleDateString('id-ID', { weekday: 'long', day: 'numeric', month: 'long' })}
{j.detail_posyandu.nama_posyandu}
{j.detail_posyandu.alamat}
{j.diedit_oleh.replace('[HISTORY] ', '').charAt(0).toUpperCase()}
{j.diedit_oleh.replace('[HISTORY] ', '')}
setIsInstantModalOpen(false)} adminName={userName} /> setIsEditModalOpen(false)} data={selectedJadwal} adminName={userName} />
) }