function renderRumahIbadahPanel(pb) { return Promise.all([callAPI('rumah_ibadah.php'), callAPI('penduduk_miskin.php')]).then(([riRes, pmRes]) => { const ri = riRes.data || []; const pm = pmRes.data || []; pb.innerHTML = `
Visibilitas Layer
${mkLayerItem('rumahIbadah', '#f59e0b', 'Rumah Ibadah', ri.length)} ${mkLayerItem('ibadahRadius', '#fbbf24', 'Radius Jangkauan', ri.length, true)} ${mkLayerItem('pendudukMiskin', '#16a34a', 'Penduduk Miskin', pm.length)}
Tambah Data
Rumah Ibadah (${ri.length})
${ri.length ? ri.map(r => `
${esc(r.nama)}
${r.jenis} · R=${r.radius_meter}m
${(window.currentUser && (window.currentUser.role === 'admin' || (window.currentUser.role === 'petugas_lapangan' && String(window.currentUser.rumah_ibadah_id) === String(r.id)))) ? `` : ''} ${(window.currentUser && window.currentUser.role === 'admin') ? `` : ''}
`).join('') : '
Belum ada data
'}
`; loadRILayer(ri); loadPMLayer(pm); registerSearchEntries('ri', ri.map(r => ({ key: `ri:${r.id}`, label: r.nama, subtitle: `Rumah Ibadah · ${r.jenis}${r.alamat ? ` · ${r.alamat}` : ''}`, typeLabel: 'Rumah Ibadah', icon: '⛪', searchText: normalizeSearchText(`${r.nama} ${r.jenis} rumah ibadah`), focus: () => focusMarkerById('rumahIbadah', r.id) }))); registerSearchEntries('pm', pm.map(p => ({ key: `pm:${p.id}`, label: p.nama, subtitle: `Penduduk Miskin · ${p.jumlah_anggota} jiwa${p.alamat ? ` · ${p.alamat}` : ''}`, typeLabel: 'Penduduk Miskin', icon: '👤', searchText: normalizeSearchText(`${p.nama} ${p.nik || ''} penduduk miskin`), focus: () => focusMarkerById('pendudukMiskin', p.id) }))); updateStatusCount(); }); } function renderPendudukMiskinPanel(pb) { return Promise.all([callAPI('rumah_ibadah.php'), callAPI('penduduk_miskin.php')]).then(([riRes, pmRes]) => { const ri = riRes.data || []; const pm = pmRes.data || []; // Filter Penduduk Miskin for petugas_lapangan to only show those in their radius let filteredPm = pm; if (window.currentUser && window.currentUser.role === 'petugas_lapangan') { const userRiId = String(window.currentUser.rumah_ibadah_id); filteredPm = pm.filter(p => p.status_proximity === 'dalam_radius' && String(p.rumah_ibadah_id) === userRiId); } pb.innerHTML = `
Visibilitas Layer
${mkLayerItem('rumahIbadah', '#f59e0b', 'Rumah Ibadah', ri.length)} ${mkLayerItem('ibadahRadius', '#fbbf24', 'Radius Jangkauan', ri.length, true)} ${mkLayerItem('pendudukMiskin', '#16a34a', 'Penduduk Miskin', pm.length)}
Tambah Data
Penduduk Miskin (${filteredPm.length})
${filteredPm.length ? filteredPm.map(p => `
${pmEmoji(p)}
${esc(p.nama)}
${p.total_bantuan} bantuan · ${p.jumlah_anggota} jiwa
${p.status_proximity === 'dalam_radius' ? 'DALAM' : 'LUAR'}
${(window.currentUser && (window.currentUser.role === 'admin' || (window.currentUser.role === 'petugas_lapangan' && p.status_proximity === 'dalam_radius' && String(p.rumah_ibadah_id) === String(window.currentUser.rumah_ibadah_id)))) ? ` ` : ''} ${(window.currentUser && window.currentUser.role === 'admin') ? `` : ''}
`).join('') : '
Belum ada data
'}
`; loadRILayer(ri); loadPMLayer(pm); registerSearchEntries('ri', ri.map(r => ({ key: `ri:${r.id}`, label: r.nama, subtitle: `Rumah Ibadah · ${r.jenis}${r.alamat ? ` · ${r.alamat}` : ''}`, typeLabel: 'Rumah Ibadah', icon: '⛪', searchText: normalizeSearchText(`${r.nama} ${r.jenis} rumah ibadah`), focus: () => focusMarkerById('rumahIbadah', r.id) }))); registerSearchEntries('pm', pm.map(p => ({ key: `pm:${p.id}`, label: p.nama, subtitle: `Penduduk Miskin · ${p.jumlah_anggota} jiwa${p.alamat ? ` · ${p.alamat}` : ''}`, typeLabel: 'Penduduk Miskin', icon: '👤', searchText: normalizeSearchText(`${p.nama} ${p.nik || ''} penduduk miskin`), focus: () => focusMarkerById('pendudukMiskin', p.id) }))); updateStatusCount(); }); } function mkLayerItem(key, color, label, count, isRing = false) { const dot = isRing ? `
` : `
`; return `
${layerVisible[key] ? '✓' : ''}
${dot}
${label}
${count}
`; } function pmEmoji(p) { if (p.bantuan_pemberdayaan > 0 && p.bantuan_konsumtif > 0) return '🔗'; if (p.bantuan_pemberdayaan > 0) return '📚'; if (p.bantuan_konsumtif > 0) return '🛍'; return '👤'; }