/* ============================================================ js/anggota.js — Profil individu anggota keluarga v2.1 ============================================================ */ window.labelHubungan = { kepala_keluarga:'Kepala Keluarga', istri:'Istri/Suami', anak:'Anak', orang_tua:'Orang Tua', saudara:'Saudara', lainnya:'Lainnya' }; window.labelStatusHidup = { hidup:'Hidup', meninggal:'Meninggal', pindah:'Pindah', menikah_keluar:'Menikah/Keluar' }; window.labelPendidikan = { belum_sekolah:'Belum Sekolah', paud:'PAUD/TK', sd:'SD', smp:'SMP', sma:'SMA/SMK', kuliah:'Kuliah/S1', pesantren:'Pesantren', pelatihan:'Pelatihan Vokasi', bekerja:'Bekerja', tidak_sekolah:'Tidak Sekolah' }; window.getSaranPendidikan = function (umur) { if (umur === null || umur < 0) return null; if (umur < 5) return { saran: 'PAUD/TK atau belum sekolah' }; if (umur <= 12) return { saran: 'SD (usia ' + umur + ' tahun)' }; if (umur <= 15) return { saran: 'SMP (usia ' + umur + ' tahun)' }; if (umur <= 18) return { saran: 'SMA/SMK (usia ' + umur + ' tahun)' }; if (umur <= 24) return { saran: 'Kuliah / Pelatihan Vokasi (usia ' + umur + ' tahun)' }; return { saran: 'Pelatihan / Bekerja (usia ' + umur + ' tahun)' }; }; window.validasiPendidikan = function (umur, pendidikan) { if (umur === null || !pendidikan) return null; var map = { belum_sekolah:[0,5], paud:[3,7], sd:[6,13], smp:[12,16], sma:[15,19], kuliah:[18,30], pesantren:[6,25], pelatihan:[15,99], bekerja:[17,99], tidak_sekolah:[0,99] }; var range = map[pendidikan]; if (!range) return null; if (umur < range[0] || umur > range[1]) { var saran = window.getSaranPendidikan(umur); return { cocok: false, pesan: 'Umur ' + umur + ' th tidak sesuai dengan "' + (window.labelPendidikan[pendidikan]||pendidikan) + '".' + (saran ? ' Disarankan: ' + saran.saran : '') }; } return { cocok: true, pesan: null }; }; window._hitungUmur = function (tglLahir) { if (!tglLahir) return null; var today = new Date(), lahir = new Date(tglLahir); if (isNaN(lahir.getTime())) return null; var u = today.getFullYear() - lahir.getFullYear(); var m = today.getMonth() - lahir.getMonth(); if (m < 0 || (m === 0 && today.getDate() < lahir.getDate())) u--; return u; }; /* ── Buka modal tambah / edit ── */ window.openTambahAnggotaModal = function (kemiskinanId, namaKK) { document.getElementById('anggota-kem-id').value = kemiskinanId; document.getElementById('anggota-edit-id').value = ''; document.getElementById('anggota-nama').value = ''; document.getElementById('anggota-tgl-lahir').value = ''; document.getElementById('anggota-jk').value = 'laki_laki'; document.getElementById('anggota-hubungan').value = 'anak'; document.getElementById('anggota-status').value = 'hidup'; document.getElementById('anggota-pendidikan').value = 'belum_sekolah'; document.getElementById('anggota-catatan').value = ''; var s = document.getElementById('anggota-saran'); if (s) { s.textContent = ''; s.className = 'saran-box'; s.style.display = 'none'; } document.getElementById('modal-anggota-title').textContent = 'Tambah Anggota — ' + window.escapeHtml(namaKK); var modal = document.getElementById('modal-anggota'); modal.style.display = 'flex'; document.getElementById('anggota-nama').focus(); modal.onclick = function (e) { if (e.target === this) this.style.display = 'none'; }; window._bindAnggotaEvents(); document.getElementById('btn-submit-anggota').onclick = window._submitTambahAnggota; }; window.openEditAnggotaModal = function (a, namaKK) { document.getElementById('anggota-kem-id').value = a.kemiskinan_id; document.getElementById('anggota-edit-id').value = a.id; document.getElementById('anggota-nama').value = a.nama; document.getElementById('anggota-tgl-lahir').value = a.tanggal_lahir || ''; document.getElementById('anggota-jk').value = a.jenis_kelamin; document.getElementById('anggota-hubungan').value = a.hubungan_keluarga; document.getElementById('anggota-status').value = a.status_hidup; document.getElementById('anggota-pendidikan').value = a.pendidikan; document.getElementById('anggota-catatan').value = a.catatan_khusus || ''; document.getElementById('modal-anggota-title').textContent = 'Edit Anggota — ' + window.escapeHtml(namaKK); var modal = document.getElementById('modal-anggota'); modal.style.display = 'flex'; document.getElementById('anggota-nama').focus(); modal.onclick = function (e) { if (e.target === this) this.style.display = 'none'; }; window._bindAnggotaEvents(); window._updateAnggotaSaran(); document.getElementById('btn-submit-anggota').onclick = window._submitEditAnggota; }; window._bindAnggotaEvents = function () { var tgl = document.getElementById('anggota-tgl-lahir'); var pend = document.getElementById('anggota-pendidikan'); if (!tgl._bound) { tgl.addEventListener('change', window._updateAnggotaSaran); pend.addEventListener('change', window._updateAnggotaSaran); tgl._bound = true; } }; window._updateAnggotaSaran = function () { var tgl = document.getElementById('anggota-tgl-lahir').value; var pend = document.getElementById('anggota-pendidikan').value; var s = document.getElementById('anggota-saran'); if (!s) return; var umur = window._hitungUmur(tgl); if (umur === null) { s.style.display = 'none'; s.textContent = ''; return; } s.style.display = 'block'; var v = window.validasiPendidikan(umur, pend); if (!v) { s.className = 'saran-box info'; s.textContent = 'Umur: ' + umur + ' tahun'; return; } if (v.cocok) { var sar = window.getSaranPendidikan(umur); s.className = 'saran-box ok'; s.textContent = '✓ Umur ' + umur + ' tahun — pendidikan sesuai.'; } else { s.className = 'saran-box warn'; s.innerHTML = ' ' + v.pesan; } }; window._submitTambahAnggota = async function () { var btn = document.getElementById('btn-submit-anggota'); btn.disabled = true; btn.textContent = 'Menyimpan...'; try { await window.postForm('php/create_anggota.php', window._collectAnggotaForm()); document.getElementById('modal-anggota').style.display = 'none'; window.showToast('Anggota berhasil ditambahkan.', 'success'); if (window._currentDetailItem) window.openDetailPanel(window._currentDetailItem); } catch (err) { window.showToast('Gagal: ' + err.message, 'error'); } finally { btn.disabled = false; btn.textContent = 'Simpan'; } }; window._submitEditAnggota = async function () { var btn = document.getElementById('btn-submit-anggota'); btn.disabled = true; btn.textContent = 'Menyimpan...'; var payload = window._collectAnggotaForm(); payload.id = document.getElementById('anggota-edit-id').value; try { await window.postForm('php/update_anggota.php', payload); document.getElementById('modal-anggota').style.display = 'none'; window.showToast('Data anggota diperbarui.', 'success'); if (window._currentDetailItem) window.openDetailPanel(window._currentDetailItem); } catch (err) { window.showToast('Gagal: ' + err.message, 'error'); } finally { btn.disabled = false; btn.textContent = 'Simpan'; } }; window._collectAnggotaForm = function () { return { kemiskinan_id: document.getElementById('anggota-kem-id').value, nama: document.getElementById('anggota-nama').value.trim(), tanggal_lahir: document.getElementById('anggota-tgl-lahir').value, jenis_kelamin: document.getElementById('anggota-jk').value, hubungan_keluarga: document.getElementById('anggota-hubungan').value, status_hidup: document.getElementById('anggota-status').value, pendidikan: document.getElementById('anggota-pendidikan').value, catatan_khusus: document.getElementById('anggota-catatan').value.trim() }; }; window.deleteAnggota = async function (id, nama) { if (!confirm('Hapus anggota "' + nama + '"?')) return; try { await window.postForm('php/delete_anggota.php', { id }); window.showToast('Anggota dihapus.', 'success'); if (window._currentDetailItem) window.openDetailPanel(window._currentDetailItem); } catch (err) { window.showToast('Gagal: ' + err.message, 'error'); } }; /* ── Render tab anggota ── */ window.renderTabAnggota = async function (item) { var container = document.getElementById('detail-tab-anggota'); if (!container) return; container.innerHTML = '