feat: implement full authentication system and CRUD APIs for users, rumah ibadah, and penduduk miskin with database updates.

This commit is contained in:
Syariffullah
2026-06-11 08:10:42 +07:00
parent 5585c34c5c
commit b77d4f6869
48 changed files with 1439 additions and 1442 deletions
+3 -89
View File
@@ -29,9 +29,6 @@ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
}).addTo(map);
// Inisialisasi FeatureGroups untuk masing-masing layer
const spbuLayer = L.featureGroup().addTo(map);
const jalanLayer = L.featureGroup().addTo(map);
const parsilLayer = L.featureGroup().addTo(map);
const rumahIbadahLayer = L.featureGroup().addTo(map);
const pendudukMiskinLayer = L.featureGroup().addTo(map);
const geoJsonLayer = L.featureGroup().addTo(map);
@@ -66,29 +63,7 @@ window.showSearchResults = function(query) {
resultsContainer.innerHTML = '';
let results = [];
if (typeof spbuLayer !== 'undefined') {
spbuLayer.eachLayer(layer => {
if (layer.spbuData && layer.spbuData.nama && layer.spbuData.nama.toLowerCase().includes(query)) {
results.push({ type: 'SPBU', nama: layer.spbuData.nama, layer: layer });
}
});
}
if (typeof jalanLayer !== 'undefined') {
jalanLayer.eachLayer(layer => {
if (layer.jalanData && layer.jalanData.nama && layer.jalanData.nama.toLowerCase().includes(query)) {
results.push({ type: 'Jalan', nama: layer.jalanData.nama, layer: layer });
}
});
}
if (typeof parsilLayer !== 'undefined') {
parsilLayer.eachLayer(layer => {
if (layer.parsilData && layer.parsilData.nama && layer.parsilData.nama.toLowerCase().includes(query)) {
results.push({ type: 'Parsil', nama: layer.parsilData.nama, layer: layer });
}
});
}
if (typeof rumahIbadahLayer !== 'undefined') {
rumahIbadahLayer.eachLayer(layer => {
@@ -143,15 +118,6 @@ map.on('click', function() {
// Logic untuk Toggle Layer Visibility
document.getElementById('layerSpbu').addEventListener('change', function(e) {
e.target.checked ? map.addLayer(spbuLayer) : map.removeLayer(spbuLayer);
});
document.getElementById('layerJalan').addEventListener('change', function(e) {
e.target.checked ? map.addLayer(jalanLayer) : map.removeLayer(jalanLayer);
});
document.getElementById('layerParsil').addEventListener('change', function(e) {
e.target.checked ? map.addLayer(parsilLayer) : map.removeLayer(parsilLayer);
});
document.getElementById('layerRumahIbadah').addEventListener('change', function(e) {
e.target.checked ? map.addLayer(rumahIbadahLayer) : map.removeLayer(rumahIbadahLayer);
});
@@ -170,44 +136,6 @@ window.toggleSubLayer = function(subId, iconEl) {
// --- Sub-layer Filter ---
window.applySubFilter = function(type) {
if (type === 'spbu') {
const checked = [...document.querySelectorAll('.sub-spbu:checked')].map(el => el.value);
spbuLayer.eachLayer(layer => {
if (!layer.spbuData) return;
const val = layer.spbuData.is_24_jam ? '1' : '0';
if (checked.includes(val)) {
if (!spbuLayer.hasLayer(layer)) spbuLayer.addLayer(layer);
layer.getElement && layer.getElement() && (layer.getElement().style.display = '');
} else {
layer.getElement && layer.getElement() && (layer.getElement().style.display = 'none');
}
});
}
if (type === 'jalan') {
const checked = [...document.querySelectorAll('.sub-jalan:checked')].map(el => el.value);
jalanLayer.eachLayer(layer => {
if (!layer.jalanData) return;
const visible = checked.includes(layer.jalanData.status);
const display = visible ? '' : 'none';
// Sembunyikan garis polyline
if (layer._path) layer._path.style.display = display;
// Sembunyikan label teks (leaflet-textpath simpan di _textNode)
if (layer._textNode) layer._textNode.style.display = display;
});
}
if (type === 'parsil') {
const checked = [...document.querySelectorAll('.sub-parsil:checked')].map(el => el.value);
parsilLayer.eachLayer(layer => {
if (!layer.parsilData) return;
if (checked.includes(layer.parsilData.status)) {
layer._path && (layer._path.style.display = '');
} else {
layer._path && (layer._path.style.display = 'none');
}
});
}
if (type === 'miskin') {
const checked = [...document.querySelectorAll('.sub-miskin:checked')].map(el => el.value);
@@ -269,8 +197,7 @@ window.closeConfirmModal = function() {
// --- Action Menu Logic (replaced by left sidebar) ---
window.currentAddMode = null; // 'spbu' atau 'rumah_ibadah'
window.currentDrawMode = null; // 'polyline' atau 'polygon'
window.currentAddMode = null; // 'rumah_ibadah' atau 'miskin_click'
window.activateAddMode = function(mode) {
// Toggle: jika mode yang sama diklik lagi, batalkan
@@ -279,18 +206,10 @@ window.activateAddMode = function(mode) {
return;
}
// Reset draw mode if active
if (window.activeDrawHandler) {
window.activeDrawHandler.disable();
window.activeDrawHandler = null;
}
window.currentAddMode = mode;
window.currentDrawMode = null;
// Tooltip
const tooltips = {
'spbu': 'Klik untuk Tambah SPBU',
'rumah_ibadah': 'Klik untuk Tambah Rumah Ibadah'
};
if (window.cursorTooltip && tooltips[mode]) window.cursorTooltip.textContent = tooltips[mode];
@@ -301,11 +220,6 @@ window.activateAddMode = function(mode) {
window.deactivateAddMode = function() {
window.currentAddMode = null;
window.currentDrawMode = null;
if (window.activeDrawHandler) {
window.activeDrawHandler.disable();
window.activeDrawHandler = null;
}
document.getElementById('map').style.cursor = '';
if (window.cursorTooltip) window.cursorTooltip.style.display = 'none';
};
@@ -318,7 +232,7 @@ document.body.appendChild(window.cursorTooltip);
// Gunakan document-level mousemove agar selalu terpicu
// bahkan saat Leaflet Draw overlay aktif menangkap event map
document.addEventListener('mousemove', function(e) {
if (window.currentAddMode || window.currentDrawMode) {
if (window.currentAddMode) {
window.cursorTooltip.style.display = 'block';
window.cursorTooltip.style.left = e.pageX + 15 + 'px';
window.cursorTooltip.style.top = e.pageY + 15 + 'px';