/* ============================================================ 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 = '
Memuat data anggota...
'; var data = await window.fetchJson('php/read_anggota.php?kemiskinan_id=' + item.id, []); container.innerHTML = ''; if (window.appAuth.role === 'pengurus_masjid') { var btnAdd = document.createElement('button'); btnAdd.className = 'btn btn-add'; btnAdd.innerHTML = '+ Tambah Anggota'; btnAdd.onclick = function () { window.openTambahAnggotaModal(item.id, item.nama_kepala_keluarga); }; container.appendChild(btnAdd); } if (!data.length) { var empty = document.createElement('div'); empty.className = 'empty'; empty.textContent = 'Belum ada data anggota.'; container.appendChild(empty); return; } data.forEach(function (a) { var umur = a.umur !== null ? parseInt(a.umur) : null; var umurTxt = umur !== null ? umur + ' tahun' : '—'; var tglTxt = a.tgl_lahir_fmt || '—'; var val = umur !== null ? window.validasiPendidikan(umur, a.pendidikan) : null; var card = document.createElement('div'); card.className = 'anggota-card ' + a.status_hidup; /* Status chip */ var chipColors = { hidup:'chip-green', meninggal:'chip-gray', pindah:'chip-amber', menikah_keluar:'chip-purple' }; var chipColor = chipColors[a.status_hidup] || 'chip-gray'; card.innerHTML = '
' + '' + window.escapeHtml(a.nama) + '' + '' + (window.labelStatusHidup[a.status_hidup] || a.status_hidup) + '' + '
' + '
Hubungan' + (window.labelHubungan[a.hubungan_keluarga] || a.hubungan_keluarga) + '
' + '
Lahir' + tglTxt + ' (' + umurTxt + ')
' + '
JK' + (a.jenis_kelamin === 'laki_laki' ? 'Laki-laki' : 'Perempuan') + '
' + '
Pendidikan' + (window.labelPendidikan[a.pendidikan] || a.pendidikan) + '
' + (val && !val.cocok ? '
' + window.escapeHtml(val.pesan) + '
' : '') + (a.catatan_khusus ? '
Catatan' + window.escapeHtml(a.catatan_khusus) + '
' : '') + (a.updated_at_fmt ? '
Update' + a.updated_at_fmt + '
' : ''); if (window.appAuth.role === 'pengurus_masjid') { var acts = document.createElement('div'); acts.className = 'ang-acts'; var btnE = document.createElement('button'); btnE.className = 'btn btn-edit'; btnE.innerHTML = ' Edit'; btnE.onclick = (function(aa){ return function(){ window.openEditAnggotaModal(aa, item.nama_kepala_keluarga); }; })(a); var btnH = document.createElement('button'); btnH.className = 'btn btn-delete'; btnH.textContent = 'Hapus'; btnH.onclick = (function(aa){ return function(){ window.deleteAnggota(aa.id, aa.nama); }; })(a); acts.appendChild(btnE); acts.appendChild(btnH); card.appendChild(acts); } container.appendChild(card); }); };