'use client' import { useState, useMemo } from 'react' import { Search, Plus, MapPin, Phone, User, Edit3, Trash2, Eye, ExternalLink, Building2 } from 'lucide-react' import { PosyanduFormModal } from './PosyanduFormModal' import { useRouter } from 'next/navigation' import { supabase } from '@/lib/supabase' import { showSwal } from '@/lib/swal' interface PosyanduWithPetugas { id: string nama_posyandu: string alamat: string kontak: string | null latitude: number | null longitude: number | null link_google_maps: string | null petugas?: { nama_petugas: string nomor_hp: string | null jabatan: string | null }[] } interface Props { data: PosyanduWithPetugas[] } export function ManajemenPosyanduTable({ data }: Props) { const router = useRouter() const [searchTerm, setSearchTerm] = useState('') const [isModalOpen, setIsModalOpen] = useState(false) const [selectedPosyandu, setSelectedPosyandu] = useState(null) const [isDeleting, setIsDeleting] = useState(null) const filteredData = useMemo(() => { return data.filter(p => p.nama_posyandu.toLowerCase().includes(searchTerm.toLowerCase()) || p.alamat.toLowerCase().includes(searchTerm.toLowerCase()) || p.petugas?.some(petugas => petugas.nama_petugas?.toLowerCase().includes(searchTerm.toLowerCase())) ) }, [data, searchTerm]) const handleEdit = (posyandu: PosyanduWithPetugas) => { setSelectedPosyandu(posyandu) setIsModalOpen(true) } const handleDelete = async (id: string, name: string) => { const result = await showSwal.confirm( 'Hapus Data?', `Apakah Anda yakin ingin menghapus data Posyandu ${name}? Seluruh data petugas terkait juga akan dihapus.` ) if (!result.isConfirmed) return setIsDeleting(id) try { // First delete local petugas (due to FK) await supabase.from('petugas_posyandu_lokal').delete().eq('posyandu_id', id) // Then delete the posyandu const { error } = await supabase.from('detail_posyandu').delete().eq('id', id) if (error) throw error await showSwal.success('Terhapus!', `Data Posyandu ${name} telah berhasil dihapus.`) router.refresh() } catch (err: any) { showSwal.error('Gagal!', `Gagal menghapus data: ${err.message}`) } finally { setIsDeleting('') } } return (
{/* Action Bar */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2.5 bg-gray-50 border-2 border-gray-100 focus:border-black rounded-xl text-sm font-semibold outline-none transition-all" />
{/* Table */}
{filteredData.length === 0 ? ( ) : ( filteredData.map((p, idx) => ( )) )}
No Informasi Posyandu Petugas & Kontak Lokasi Aksi

Tidak ada data posyandu ditemukan

{idx + 1}
{p.nama_posyandu}
{p.alamat}
{p.petugas && p.petugas.length > 0 ? ( p.petugas.map((petugas, i) => (
{petugas.nama_petugas} {petugas.jabatan && ( {petugas.jabatan} )}
{petugas.nomor_hp && (
{petugas.nomor_hp}
)}
)) ) : (
Belum ada petugas
)}
{p.link_google_maps ? ( Cek Maps ) : ( Belum diset )}
{isModalOpen && ( setIsModalOpen(false)} selectedData={selectedPosyandu} /> )}
) } function Loader2(props: any) { return ( ) }