diff --git a/resources/views/data.blade.php b/resources/views/data.blade.php index 9adf8c6..b0fff16 100644 --- a/resources/views/data.blade.php +++ b/resources/views/data.blade.php @@ -359,6 +359,127 @@ + + + + + + + + + + + +
@@ -443,7 +564,9 @@ ${item.kondisi_rumah || '-'} ${parseFloat(item.latitude).toFixed(4)}, ${parseFloat(item.longitude).toFixed(4)} -
+
+ + ${canEditMiskin ? `` : ''} ${canEditMiskin ? `` : ''}
@@ -711,6 +834,128 @@ setTimeout(() => t.remove(), 3000); } + // ── ANGGOTA KELUARGA ─────────────────────────────────────────────────── + let currentAnggotaRumah = null; + const canEditAnggota = {{ auth()->user()->hasRole('administrator') || auth()->user()->hasRole('petugas_pendataan') ? 'true' : 'false' }}; + + async function openAnggotaModal(idRumah) { + currentAnggotaRumah = idRumah; + const rm = miskinData.find(m => m.id_rumah === idRumah); + document.getElementById('anggota_rumah_label').textContent = `ID: ${idRumah} — ${rm?.nama_kk || '-'}`; + document.getElementById('modal_anggota').showModal(); + await loadAnggota(idRumah); + } + + async function loadAnggota(idRumah) { + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(idRumah)}/anggota`, { headers: { 'X-CSRF-TOKEN': csrfToken } }); + const list = await res.json(); + document.getElementById('bodyAnggota').innerHTML = list.length ? list.map(a => ` + + ${esc(a.nama)} + ${esc(a.hubungan.replace('_', ' '))} + ${a.jenis_kelamin === 'laki_laki' ? 'L' : a.jenis_kelamin === 'perempuan' ? 'P' : '-'} + ${a.umur !== null ? esc(String(a.umur)) + ' th' : '-'} + ${a.pendidikan ? esc(a.pendidikan.replace(/_/g, ' ')) : '-'} + ${esc(a.status_hidup)} + ${canEditAnggota ? `` : ''} + `).join('') + : 'Belum ada anggota'; + } + + async function simpanAnggota() { + const body = { + nama: document.getElementById('anggota_nama').value.trim(), + hubungan: document.getElementById('anggota_hubungan').value, + jenis_kelamin: document.getElementById('anggota_kelamin').value || null, + tanggal_lahir: document.getElementById('anggota_tgl_lahir').value || null, + pendidikan: document.getElementById('anggota_pendidikan').value || null, + status_hidup: document.getElementById('anggota_status').value, + }; + if (!body.nama) { showToast('Nama wajib diisi', 'error'); return; } + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.success) { showToast('Anggota ditambahkan', 'success'); loadAnggota(currentAnggotaRumah); } + else showToast('Gagal menambah anggota', 'error'); + } + + async function deleteAnggota(id) { + if (!confirm('Hapus anggota ini?')) return; + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentAnggotaRumah)}/anggota/${id}`, { + method: 'DELETE', headers: { 'X-CSRF-TOKEN': csrfToken }, + }); + const json = await res.json(); + if (json.success) { showToast('Anggota dihapus', 'success'); loadAnggota(currentAnggotaRumah); } + else showToast('Gagal hapus', 'error'); + } + + // ── RIWAYAT BANTUAN ──────────────────────────────────────────────────── + let currentBantuanRumah = null; + const canDeleteBantuan = {{ auth()->user()->hasRole('administrator') ? 'true' : 'false' }}; + + async function openBantuanModal(idRumah) { + currentBantuanRumah = idRumah; + const rm = miskinData.find(m => m.id_rumah === idRumah); + document.getElementById('bantuan_rumah_label').textContent = `ID: ${idRumah} — ${rm?.nama_kk || '-'}`; + + const sel = document.getElementById('bantuan_ibadah'); + if (sel) { + sel.innerHTML = '' + + ibadahData.map(ib => ``).join(''); + } + + const tgl = document.getElementById('bantuan_tanggal'); + if (tgl) tgl.value = new Date().toISOString().split('T')[0]; + + document.getElementById('modal_bantuan').showModal(); + await loadBantuan(idRumah); + } + + async function loadBantuan(idRumah) { + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(idRumah)}/bantuan`, { headers: { 'X-CSRF-TOKEN': csrfToken } }); + const list = await res.json(); + document.getElementById('bodyBantuan').innerHTML = list.length ? list.map(b => ` + + ${esc(b.tanggal_bantuan)} + ${esc(b.jenis_bantuan)} + ${esc(b.ibadah_nama || '-')} + ${esc(b.pencatat_nama)} + ${canDeleteBantuan ? `` : ''} + `).join('') + : 'Belum ada riwayat bantuan'; + } + + async function simpanBantuan() { + const body = { + jenis_bantuan: document.getElementById('bantuan_jenis').value.trim(), + tanggal_bantuan: document.getElementById('bantuan_tanggal').value, + keterangan: document.getElementById('bantuan_ket').value.trim() || null, + ibadah_id: document.getElementById('bantuan_ibadah').value || null, + }; + if (!body.jenis_bantuan || !body.tanggal_bantuan) { showToast('Jenis bantuan dan tanggal wajib diisi', 'error'); return; } + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentBantuanRumah)}/bantuan`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.success) { showToast('Bantuan dicatat', 'success'); loadBantuan(currentBantuanRumah); } + else showToast('Gagal menyimpan bantuan', 'error'); + } + + async function deleteBantuan(id) { + if (!confirm('Hapus riwayat bantuan ini?')) return; + const res = await fetch(`{{ url('/api/miskin') }}/${encodeURIComponent(currentBantuanRumah)}/bantuan/${id}`, { + method: 'DELETE', headers: { 'X-CSRF-TOKEN': csrfToken }, + }); + const json = await res.json(); + if (json.success) { showToast('Bantuan dihapus', 'success'); loadBantuan(currentBantuanRumah); } + else showToast('Gagal hapus', 'error'); + } + // ── NOTIFIKASI PERUBAHAN DATA ──────────────────────────────────────── (function initNotifPolling() { const POLL_MS = 30000;