import { initMap } from './modules/map.js';
import { setupDrawControls } from './modules/draw.js';
import { renderForm } from './modules/form.js';
import { spbuService, jalanService, kavlingService } from './services/api.service.js';
let appMap;
let drawControl;
// Global layer object tracker
const mapLayers = {
spbu: null,
jalan: null,
kavling: null
};
// Custom SVG Icons Generator
export const createIcon = (svgPath, color) => {
return L.divIcon({
className: 'custom-icon',
html: `
`,
iconSize: [34, 34],
iconAnchor: [17, 34],
popupAnchor: [0, -34]
});
};
export const iconSPBU = (is24h) => createIcon('', is24h ? '#10B981' : '#EF4444');
window.showToast = (msg, type='success') => {
const t = document.createElement('div');
t.className = `toast ${type}`;
t.innerHTML = msg;
document.getElementById('toast-container').appendChild(t);
setTimeout(() => { t.style.transform='translateX(100%)'; t.style.opacity=0; setTimeout(()=>t.remove(),300); }, 3000);
};
const setupCheckboxListeners = () => {
const layerConfigs = [
{ id: 'layer-spbu', key: 'spbu' },
{ id: 'layer-jalan', key: 'jalan' },
{ id: 'layer-kavling', key: 'kavling' }
];
layerConfigs.forEach(({ id, key }) => {
const checkbox = document.getElementById(id);
if (checkbox) {
checkbox.addEventListener('change', (e) => {
const layer = mapLayers[key];
if (layer) {
if (e.target.checked) {
if (!appMap.hasLayer(layer)) {
appMap.addLayer(layer);
}
} else {
if (appMap.hasLayer(layer)) {
appMap.removeLayer(layer);
}
}
}
});
}
});
};
const loadSPBUData = async () => {
try {
const spbu = await spbuService.getAll();
mapLayers.spbu = L.geoJSON(spbu, {
pointToLayer: (f, latlng) => L.marker(latlng, { icon: iconSPBU(f.properties.buka_24_jam) }),
onEachFeature: (f, l) => bindPopup(l, 'spbu', f.properties)
});
const checkbox = document.getElementById('layer-spbu');
if (checkbox && checkbox.checked) {
mapLayers.spbu.addTo(appMap);
}
} catch (e) {
console.error("Gagal meload data SPBU:", e);
window.showToast("Gagal meload data SPBU: " + e.message, 'error');
}
};
const loadJalanData = async () => {
try {
const jalan = await jalanService.getAll();
mapLayers.jalan = L.geoJSON(jalan, {
style: { color: '#F59E0B', weight: 4 },
onEachFeature: (f, l) => bindPopup(l, 'jalan', f.properties)
});
const checkbox = document.getElementById('layer-jalan');
if (checkbox && checkbox.checked) {
mapLayers.jalan.addTo(appMap);
}
} catch (e) {
console.error("Gagal meload data Jalan:", e);
window.showToast("Gagal meload data Jalan: " + e.message, 'error');
}
};
const loadKavlingData = async () => {
try {
const kavling = await kavlingService.getAll();
mapLayers.kavling = L.geoJSON(kavling, {
style: { color: '#3B82F6', weight: 2, fillColor: '#3B82F6', fillOpacity: 0.3 },
onEachFeature: (f, l) => bindPopup(l, 'kavling', f.properties)
});
const checkbox = document.getElementById('layer-kavling');
if (checkbox && checkbox.checked) {
mapLayers.kavling.addTo(appMap);
}
} catch (e) {
console.error("Gagal meload data Kavling:", e);
window.showToast("Gagal meload data Kavling: " + e.message, 'error');
}
};
const loadAllData = async () => {
await Promise.allSettled([
loadSPBUData(),
loadJalanData(),
loadKavlingData()
]);
};
const bindPopup = (layer, type, props) => {
const ext = props.buka_24_jam !== undefined ? `Buka 24 Jam: ${props.buka_24_jam ? 'Ya' : 'Tidak'}
` : '';
layer.bindPopup(`
`);
};
window.deleteData = async (type, id) => {
if(!confirm('Yakin ingin menghapus?')) return;
try {
if(type==='spbu') await spbuService.delete(id);
if(type==='jalan') await jalanService.delete(id);
if(type==='kavling') await kavlingService.delete(id);
window.showToast('Data dihapus');
setTimeout(()=>location.reload(), 800);
} catch(e) { window.showToast('Gagal hapus', 'error'); }
};
const handleGeometryCreated = (type, geometry, layer) => {
const tempLayer = L.geoJSON(geometry).addTo(appMap);
renderForm(type, geometry, async (payload) => {
try {
if(type==='spbu') await spbuService.create(payload);
if(type==='jalan') await jalanService.create(payload);
if(type==='kavling') {
const kavlingPayload = {
nama_pemilik: payload.nama,
luas: payload.luas || 0,
geometry: payload.geometry
};
await kavlingService.create(kavlingPayload);
}
window.showToast('Berhasil disimpan');
setTimeout(()=>location.reload(), 800);
} catch(e) { window.showToast('Gagal simpan', 'error'); }
}, () => {
appMap.removeLayer(tempLayer);
});
};
const init = async () => {
appMap = initMap('map');
setupCheckboxListeners();
drawControl = setupDrawControls(appMap, handleGeometryCreated);
await loadAllData();
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}