Files
2026-06-11 21:18:48 +07:00

245 lines
12 KiB
JavaScript

/* ============================================================
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 = '<i class="fa-solid fa-triangle-exclamation"></i> ' + 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 = '<div class="loading">Memuat data anggota...</div>';
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 =
'<div class="ang-head">' +
'<span class="ang-name">' + window.escapeHtml(a.nama) + '</span>' +
'<span class="chip ' + chipColor + '">' + (window.labelStatusHidup[a.status_hidup] || a.status_hidup) + '</span>' +
'</div>' +
'<div class="ang-row"><span class="ang-lbl">Hubungan</span>' + (window.labelHubungan[a.hubungan_keluarga] || a.hubungan_keluarga) + '</div>' +
'<div class="ang-row"><span class="ang-lbl">Lahir</span>' + tglTxt + ' <em class="umur-em">(' + umurTxt + ')</em></div>' +
'<div class="ang-row"><span class="ang-lbl">JK</span>' + (a.jenis_kelamin === 'laki_laki' ? 'Laki-laki' : 'Perempuan') + '</div>' +
'<div class="ang-row"><span class="ang-lbl">Pendidikan</span>' + (window.labelPendidikan[a.pendidikan] || a.pendidikan) + '</div>' +
(val && !val.cocok ? '<div class="ang-warn"><i class="fa-solid fa-triangle-exclamation"></i> ' + window.escapeHtml(val.pesan) + '</div>' : '') +
(a.catatan_khusus ? '<div class="ang-row"><span class="ang-lbl">Catatan</span><em>' + window.escapeHtml(a.catatan_khusus) + '</em></div>' : '') +
(a.updated_at_fmt ? '<div class="ang-row"><span class="ang-lbl">Update</span><em class="umur-em">' + a.updated_at_fmt + '</em></div>' : '');
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 = '<i class="fa-solid fa-pen"></i> 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);
});
};