245 lines
12 KiB
JavaScript
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);
|
|
});
|
|
};
|