// ===== Panel Management =====
// Mengelola Left Sidebar Toggle + Right Panel + Layer Control
(function () {
// ---- State ----
let activePanel = null;
// ---- Elements ----
const sidebarToggleBtn = document.getElementById('sidebarToggleBtn');
const sidebarToggleIcon = document.getElementById('sidebarToggleIcon');
const leftSidebar = document.getElementById('leftSidebar');
const rightPanel = document.getElementById('rightPanel');
const rightPanelTitle = document.getElementById('rightPanelTitle');
const rightPanelActions = document.getElementById('rightPanelActions');
const rightPanelBody = document.getElementById('rightPanelBody');
const rightPanelClose = document.getElementById('rightPanelClose');
// ---- Sidebar Toggle ----
if (sidebarToggleBtn) {
sidebarToggleBtn.addEventListener('click', function () {
const isOpen = leftSidebar.style.display !== 'none';
if (isOpen) {
leftSidebar.style.display = 'none';
sidebarToggleBtn.classList.remove('open');
sidebarToggleIcon.className = 'fas fa-chevron-right';
} else {
leftSidebar.style.display = 'flex';
sidebarToggleBtn.classList.add('open');
sidebarToggleIcon.className = 'fas fa-chevron-left';
}
});
}
// ---- Sidebar Buttons ----
document.querySelectorAll('.sidebar-btn').forEach(btn => {
btn.addEventListener('click', function () {
const panel = this.dataset.panel;
if (activePanel === panel) {
closePanel();
} else {
openPanel(panel);
}
});
});
if (rightPanelClose) {
rightPanelClose.addEventListener('click', closePanel);
}
// ---- Open / Close Panel ----
function openPanel(panel) {
if (typeof window.deactivateAddMode === 'function') window.deactivateAddMode();
activePanel = panel;
rightPanel.classList.add('open');
document.body.classList.add('right-panel-open');
document.querySelectorAll('.sidebar-btn').forEach(b => b.classList.remove('active'));
const activeBtn = document.querySelector(`.sidebar-btn[data-panel="${panel}"]`);
if (activeBtn) activeBtn.classList.add('active');
renderPanel(panel);
}
function closePanel() {
if (typeof window.deactivateAddMode === 'function') window.deactivateAddMode();
activePanel = null;
rightPanel.classList.remove('open');
document.body.classList.remove('right-panel-open');
document.querySelectorAll('.sidebar-btn').forEach(b => b.classList.remove('active'));
}
window.refreshActivePanel = function () {
if (activePanel && activePanel !== 'layer') renderPanel(activePanel);
};
// ---- Render Panel by Type ----
function renderPanel(type) {
rightPanelBody.innerHTML = '
Memuat data...
';
rightPanelActions.innerHTML = '';
switch (type) {
case 'spbu': renderSpbuPanel(); break;
case 'jalan': renderJalanPanel(); break;
case 'parsil': renderParsilPanel(); break;
}
}
// ==========================
// ===== SPBU Panel =======
// ==========================
function renderSpbuPanel() {
rightPanelTitle.textContent = 'β½ Daftar SPBU';
const isAdmin = !!(window.currentUser && window.currentUser.role === 'admin');
if (isAdmin) {
rightPanelActions.innerHTML = `
β½
${escHtml(d.nama)}
π ${escHtml(d.no_wa || '-')} β’ π ${d.is_24_jam ? '24 Jam' : 'Tidak 24 Jam'}
${actionButtons}
`;
if (isAdmin) {
card.querySelector('.btn-card-edit').addEventListener('click', (e) => { e.stopPropagation(); window.openEditSpbuModal(d.id); });
card.querySelector('.btn-card-delete').addEventListener('click', (e) => { e.stopPropagation(); window.deleteSpbu(d.id); });
}
card.addEventListener('click', () => {
spbuLayer.eachLayer(l => {
if (l.spbuData && l.spbuData.id == d.id) {
map.setView(l.getLatLng(), 17); l.openPopup();
}
});
});
rightPanelBody.appendChild(card);
});
}
// ==========================
// ===== Jalan Panel =======
// ==========================
function renderJalanPanel() {
rightPanelTitle.textContent = 'π£οΈ Daftar Jalan';
const isAdmin = !!(window.currentUser && window.currentUser.role === 'admin');
rightPanelActions.innerHTML = '';
const items = [];
jalanLayer.eachLayer(l => {
if (l.jalanData) items.push(l.jalanData);
});
if (!items.length) {
rightPanelBody.innerHTML = '
π£οΈ
${escHtml(d.nama)}
π ${d.panjang.toFixed(2)} m β’ π·οΈ ${escHtml(d.status)}
${actionButtons}
`;
if (isAdmin) {
card.querySelector('.btn-card-edit').addEventListener('click', (e) => { e.stopPropagation(); window.openEditJalanModal(d.id); });
card.querySelector('.btn-card-delete').addEventListener('click', (e) => { e.stopPropagation(); window.deleteJalan(d.id); });
}
card.addEventListener('click', () => {
jalanLayer.eachLayer(l => {
if (l.jalanData && l.jalanData.id == d.id) {
map.fitBounds(l.getBounds()); l.openPopup();
}
});
});
rightPanelBody.appendChild(card);
});
}
// ==========================
// ===== Parsil Panel =======
// ==========================
function renderParsilPanel() {
rightPanelTitle.textContent = 'πΊοΈ Daftar Parsil Tanah';
const isAdmin = !!(window.currentUser && window.currentUser.role === 'admin');
rightPanelActions.innerHTML = '';
const items = [];
parsilLayer.eachLayer(l => {
if (l.parsilData) items.push(l.parsilData);
});
if (!items.length) {
rightPanelBody.innerHTML = '
πΊοΈ
${escHtml(d.nama || 'Tanpa Nama')}
π ${d.luas.toFixed(2)} mΒ² β’ π·οΈ ${escHtml(d.status)}
${actionButtons}
`;
if (isAdmin) {
card.querySelector('.btn-card-edit').addEventListener('click', (e) => { e.stopPropagation(); window.openEditParsilModal(d.id); });
card.querySelector('.btn-card-delete').addEventListener('click', (e) => { e.stopPropagation(); window.deleteParsil(d.id); });
}
card.addEventListener('click', () => {
parsilLayer.eachLayer(l => {
if (l.parsilData && l.parsilData.id == d.id) {
map.fitBounds(l.getBounds()); l.openPopup();
}
});
});
rightPanelBody.appendChild(card);
});
}
// ---- Utility ----
function escHtml(str) {
if (!str) return '';
return String(str).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');
}
// ---- Expose ----
window.openRightPanel = openPanel;
})();