This commit is contained in:
2026-06-08 11:20:30 +07:00
parent bde929158b
commit af593691b2
17 changed files with 143 additions and 469 deletions
+132 -62
View File
@@ -4098,9 +4098,9 @@
map.fitBounds(bounds, { padding: [24, 24], maxZoom: 13 });
}
console.log('Layer kecamatan berhasil dimuat:', kecLayer.getLayers().length, 'fitur');
// log removed
})
.catch(err => console.log('Admin Kecamatan Error:', err));
.catch(err => {});
}
/* ── MODE ── */
@@ -4402,19 +4402,19 @@
map.closePopup();
setMode(null);
ensureLayerVisible('jalan', jalan.id);
focusFeature('jalan', jalan.id);
ensureLayerVisible('jalan', d.id);
focusFeature('jalan', d.id);
} else {
console.log(response);
// log removed
alert("Gagal simpan jalan");
}
})
.catch(err => {
console.log(err);
// log removed
alert("Error simpan jalan");
});
@@ -4423,7 +4423,7 @@
const pts = normalizeLinePoints(d.pts);
if (pts.length < 2) {
console.log('Format koordinat jalan tidak valid:', d.pts);
// log removed
return;
}
@@ -4663,19 +4663,19 @@
}
else {
console.log(response);
// log removed
alert("Gagal simpan parsil");
}
})
.catch(err => console.log("Parsil Error:", err));
.catch(err => {});
}
function renderParsil(d) {
const pts = normalizePolyPoints(d.pts);
if (pts.length < 3) {
console.log('Format koordinat parsil tidak valid:', d.pts);
// log removed
return;
}
@@ -4904,7 +4904,7 @@
state.featureRefs[type] = {};
if (type === 'kemiskinan') state.kkLayerRefs = {};
const list = document.getElementById('list-' + type);
list.querySelectorAll('.dcard').forEach(x => x.remove());
if (list) list.querySelectorAll('.dcard').forEach(x => x.remove());
state[type].forEach(d => {
if (type === 'spbu') {
@@ -5320,7 +5320,7 @@
});
})
.catch(err => console.log("SPBU Error:", err));
.catch(err => {});
}
@@ -5358,7 +5358,7 @@
});
})
.catch(err => console.log("Jalan Error:", err));
.catch(err => {});
}
@@ -5397,7 +5397,7 @@
});
})
.catch(err => console.log("Parsil Error:", err));
.catch(err => {});
}
/* ── KEMISKINAN ── */
@@ -5522,6 +5522,22 @@
<label>Jumlah Jiwa <span class="req">*</span></label>
<input type="number" id="k-jumlah" value="${escapeAttr(draft.jumlah_kk || '1')}" min="1" oninput="window._kkVulnUpdate()">
</div>
<div class="km-field">
<label>Tanggal Lahir</label>
<input type="date" id="k-tgl-lahir">
</div>
<div class="km-field">
<label>Pendidikan Terakhir</label>
<select id="k-pendidikan">
<option value="">-- Pilih Pendidikan --</option>
<option value="Tidak Sekolah">Tidak Sekolah</option>
<option value="SD/Sederajat">SD/Sederajat</option>
<option value="SMP/Sederajat">SMP/Sederajat</option>
<option value="SMA/Sederajat">SMA/Sederajat</option>
<option value="D3/S1">D3/S1</option>
<option value="S2/S3">S2/S3</option>
</select>
</div>
<div class="km-field">
<label>Alamat <span class="req">*</span></label>
<input id="k-alamat" placeholder="Alamat" value="${escapeAttr(draft.alamat)}">
@@ -5654,13 +5670,13 @@
renderDashboard();
if (window._tmpM) { map.closePopup(); map.removeLayer(window._tmpM); window._tmpM = null; }
setMode(null);
ensureLayerVisible('jalan', jalan.id);
focusFeature('jalan', jalan.id);
ensureLayerVisible('kemiskinan', d.id);
focusFeature('kemiskinan', d.id);
} else {
alert("Gagal simpan: " + (response.message || 'Error'));
}
})
.catch(err => { console.log(err); alert("Terjadi error"); });
.catch(err => { alert("Terjadi error"); });
}
function renderKemiskinan(d) {
@@ -5762,64 +5778,114 @@
});
renderDashboard();
if (state.masjid.length) refreshType('masjid');
}).catch(err => console.log("Kemiskinan Error:", err));
}).catch(err => {});
}
function openEditKemiskinan(id) {
const d = getById('kemiskinan', id);
if (!d) return;
const existing = document.getElementById('ek-overlay');
if (existing) existing.remove();
const pendOpts = ['', 'Tidak Sekolah', 'SD/Sederajat', 'SMP/Sederajat', 'SMA/Sederajat', 'D3/S1', 'S2/S3'];
const pendSelects = pendOpts.map(v => `<option value="${v}" ${d.pendidikan === v ? 'selected' : ''}>${v || '-- Pilih Pendidikan --'}</option>`).join('');
const html = `<div class="pf" style="width:300px">
<h4><i class="fas fa-edit" style="color:var(--amber)"></i> Edit KK Miskin</h4>
<label>Nama Kepala Keluarga</label>
<input id="e-k-nama" value="${(d.nama_kk || '').replace(/"/g, '&quot;')}">
<label>Jumlah Jiwa</label>
<input type="number" id="e-k-jumlah" value="${d.jumlah_kk}" min="1">
<label>Tanggal Lahir</label>
<input type="date" id="e-k-tgl-lahir" value="${d.tanggal_lahir || ''}">
<label>Pendidikan Terakhir</label>
<select id="e-k-pendidikan">${pendSelects}</select>
<label>Alamat</label>
<textarea id="e-k-alamat">${(d.alamat || '').replace(/</g, '&lt;')}</textarea>
<label>Riwayat Penyakit</label>
<textarea id="e-k-riwayat" rows="2">${(d.riwayat_penyakit || '').replace(/</g, '&lt;')}</textarea>
<label>Latitude</label>
<input id="e-k-lat" value="${Number(d.lat).toFixed(6)}">
<label>Longitude</label>
<input id="e-k-lng" value="${Number(d.lng).toFixed(6)}">
<label>Status Penanganan</label>
<select id="e-k-status">
<option ${getKKStatus(id) === 'Belum Ditangani' ? 'selected' : ''}>Belum Ditangani</option>
<option ${getKKStatus(id) === 'Diproses' ? 'selected' : ''}>Diproses</option>
<option ${getKKStatus(id) === 'Sudah Ditangani' ? 'selected' : ''}>Sudah Ditangani</option>
</select>
<button class="pbtn pbtn-y" onclick="saveEditKemiskinan(${id})">Simpan Perubahan</button>
</div>`;
map.closePopup();
L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng([d.lat, d.lng]).setContent(html).openOn(map);
const curStatus = getKKStatus(id);
const overlay = document.createElement('div');
overlay.className = 'hb-overlay';
overlay.id = 'ek-overlay';
overlay.innerHTML = `
<div class="hb-box" style="max-width:520px">
<div class="hb-head" style="background:linear-gradient(135deg,#f59e0b,#d97706)">
<div class="hb-head-icon"><i class="fas fa-user-edit"></i></div>
<div style="flex:1;min-width:0">
<div class="hb-head-title">Edit Data KK Miskin</div>
<div style="font-size:11px;opacity:.8;margin-top:1px">${escapeText(d.nama_kk)}</div>
</div>
<button class="hb-head-close" onclick="document.getElementById('ek-overlay').remove()">
<i class="fas fa-times"></i>
</button>
</div>
<div class="hb-body">
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="km-field" style="grid-column:1/-1">
<label>Nama Kepala Keluarga *</label>
<input id="ek-nama" value="${(d.nama_kk || '').replace(/"/g, '&quot;')}" placeholder="Nama lengkap">
</div>
<div class="km-field">
<label>Jumlah Jiwa *</label>
<input type="number" id="ek-jumlah" value="${d.jumlah_kk}" min="1">
</div>
<div class="km-field">
<label>Tanggal Lahir</label>
<input type="date" id="ek-tgl-lahir" value="${d.tanggal_lahir || ''}">
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Pendidikan Terakhir</label>
<select id="ek-pendidikan">${pendSelects}</select>
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Alamat *</label>
<textarea id="ek-alamat" rows="2" style="resize:vertical">${(d.alamat || '').replace(/</g, '&lt;')}</textarea>
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Riwayat Penyakit</label>
<textarea id="ek-riwayat" rows="2" style="resize:vertical">${(d.riwayat_penyakit || '').replace(/</g, '&lt;')}</textarea>
</div>
<div class="km-field">
<label>Latitude</label>
<input id="ek-lat" value="${Number(d.lat).toFixed(6)}" style="font-family:monospace;font-size:12px">
</div>
<div class="km-field">
<label>Longitude</label>
<input id="ek-lng" value="${Number(d.lng).toFixed(6)}" style="font-family:monospace;font-size:12px">
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Status Penanganan</label>
<select id="ek-status">
<option value="Belum Ditangani" ${curStatus === 'Belum Ditangani' ? 'selected' : ''}>Belum Ditangani</option>
<option value="Diproses" ${curStatus === 'Diproses' ? 'selected' : ''}>Diproses</option>
<option value="Sudah Ditangani" ${curStatus === 'Sudah Ditangani' ? 'selected' : ''}>Sudah Ditangani</option>
</select>
</div>
<button class="hb-submit" style="grid-column:1/-1;background:linear-gradient(135deg,#f59e0b,#d97706)" onclick="saveEditKemiskinan(${id})">
<i class="fas fa-save"></i> Simpan Perubahan
</button>
</div>
</div>
</div>`;
document.body.appendChild(overlay);
// Close on backdrop click
overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
}
function saveEditKemiskinan(id) {
const nama_kk = document.getElementById('e-k-nama').value.trim();
const jumlah_kk = document.getElementById('e-k-jumlah').value.trim();
const alamat = document.getElementById('e-k-alamat').value.trim();
const lat = parseFloat(document.getElementById('e-k-lat').value);
const lng = parseFloat(document.getElementById('e-k-lng').value);
const status = document.getElementById('e-k-status')?.value || getKKStatus(id);
const tanggal_lahir = document.getElementById('e-k-tgl-lahir')?.value || '';
const pendidikan = document.getElementById('e-k-pendidikan')?.value || '';
const riwayat_penyakit = document.getElementById('e-k-riwayat')?.value.trim() || '';
const nama_kk = document.getElementById('ek-nama')?.value.trim();
const jumlah_kk = document.getElementById('ek-jumlah')?.value.trim();
const alamat = document.getElementById('ek-alamat')?.value.trim();
const lat = parseFloat(document.getElementById('ek-lat')?.value);
const lng = parseFloat(document.getElementById('ek-lng')?.value);
const status = document.getElementById('ek-status')?.value || getKKStatus(id);
const tanggal_lahir = document.getElementById('ek-tgl-lahir')?.value || '';
const pendidikan = document.getElementById('ek-pendidikan')?.value || '';
const riwayat_penyakit = document.getElementById('ek-riwayat')?.value.trim() || '';
if (!nama_kk || !jumlah_kk || !alamat || !Number.isFinite(lat) || !Number.isFinite(lng)) {
alert('Data belum valid'); return;
alert('Lengkapi data: Nama, Jumlah Jiwa, dan Alamat wajib diisi!'); return;
}
const btn = document.querySelector('#ek-overlay .hb-submit');
if (btn) { btn.disabled = true; btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Menyimpan...'; }
fetch('api/update_kemiskinan.php', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, nama_kk, jumlah_kk, alamat, lat, lng, tanggal_lahir, pendidikan, riwayat_penyakit })
}).then(res => res.json()).then(resp => {
if (resp.status !== 'success') { alert('Gagal update'); return; }
if (resp.status !== 'success') {
alert('Gagal menyimpan: ' + (resp.message || 'Error'));
if (btn) { btn.disabled = false; btn.innerHTML = '<i class="fas fa-save"></i> Simpan Perubahan'; }
return;
}
const d = getById('kemiskinan', id); if (!d) return;
d.nama_kk = nama_kk; d.jumlah_kk = parseInt(jumlah_kk); d.alamat = alamat; d.lat = lat; d.lng = lng;
d.tanggal_lahir = tanggal_lahir; d.pendidikan = pendidikan; d.riwayat_penyakit = riwayat_penyakit;
@@ -5827,16 +5893,20 @@
const mapStatus = getStatusMap();
mapStatus[String(id)] = status;
localStorage.setItem(statusStoreKey, JSON.stringify(mapStatus));
// Simpan status ke database
fetch('api/update_status_kemiskinan.php', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: parseInt(id), status })
}).catch(() => console.warn('Gagal simpan status ke DB'));
}).catch(() => {});
renderDashboard();
refreshType('kemiskinan');
map.closePopup();
document.getElementById('ek-overlay')?.remove();
showToast('✅ Data berhasil disimpan', 'success');
focusFeature('kemiskinan', id);
}).catch(() => alert('Error update data'));
}).catch(() => {
alert('Error jaringan, coba lagi');
if (btn) { btn.disabled = false; btn.innerHTML = '<i class="fas fa-save"></i> Simpan Perubahan'; }
});
}
/* ── MASJID ── */
@@ -5983,7 +6053,7 @@
if (window._tmpC) { map.removeLayer(window._tmpC); window._tmpC = null; }
setMode(null);
} else { alert("Gagal simpan database"); }
}).catch(err => { console.log(err); alert("Terjadi error"); });
}).catch(err => { alert("Terjadi error"); });
}
function renderMasjid(d) {
@@ -6046,7 +6116,7 @@
addCard('masjid', m.id, m.nama_masjid, m.pic_masjid, 'Rumah Ibadah', '#0f6250');
});
renderDashboard();
}).catch(err => console.log("Masjid Error:", err));
}).catch(err => {});
}
function openEditMasjid(id) {