updatee
This commit is contained in:
+132
-62
@@ -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, '"')}">
|
||||
<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, '<')}</textarea>
|
||||
<label>Riwayat Penyakit</label>
|
||||
<textarea id="e-k-riwayat" rows="2">${(d.riwayat_penyakit || '').replace(/</g, '<')}</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, '"')}" 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, '<')}</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, '<')}</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) {
|
||||
|
||||
Reference in New Issue
Block a user