feat : penambahan rumah ibadah

This commit is contained in:
unknown
2026-06-09 13:49:51 +07:00
parent 6c1437956c
commit 03c764a9c7
4 changed files with 181 additions and 201 deletions
+52 -61
View File
@@ -60,73 +60,41 @@
</div>
</section>
<section class="px-6 max-w-3xl mx-auto w-full">
<h3 class="text-xl font-bold text-gray-800 mb-6 text-center">Pertanyaan yang Sering Diajukan</h3>
<div class="space-y-4">
<div class="bg-white p-5 rounded-xl border border-gray-100 shadow-sm">
<h4 class="font-bold text-gray-800">Bagaimana jika NIK saya tidak ditemukan?</h4>
<p class="text-gray-600 text-sm mt-2">Pastikan Anda memasukkan 16 digit angka dengan benar. Jika masih tidak ditemukan, silakan laporkan ke RT/RW setempat untuk pendataan ulang.</p>
</div>
<div class="bg-white p-5 rounded-xl border border-gray-100 shadow-sm">
<h4 class="font-bold text-gray-800">Berapa lama proses verifikasi lapangan?</h4>
<p class="text-gray-600 text-sm mt-2">Proses verifikasi oleh petugas lapangan membutuhkan waktu maksimal 14 hari kerja sejak data masuk ke dalam sistem.</p>
</div>
</div>
</section>
</main>
<footer class="bg-gray-900 text-gray-300 pt-10 pb-6 px-6 mt-auto">
<div class="max-w-5xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8 border-b border-gray-700 pb-8 mb-6">
<div>
<h4 class="text-white text-lg font-bold mb-4">Pusat Bantuan & Pengaduan</h4>
<p class="text-sm mb-2">Email: pengaduan@dinsos.pontianak.go.id (Dummy)</p>
<p class="text-sm mb-2">Telepon: (0561) 123-4567 (Dummy)</p>
<p class="text-sm">Jam Operasional: Senin - Jumat (08.00 - 15.00 WIB)</p>
</div>
<div class="md:text-right">
<h4 class="text-white text-lg font-bold mb-4">Tautan Penting</h4>
<ul class="text-sm space-y-2">
<li><a href="#" class="hover:text-emerald-400 transition">Kebijakan Privasi</a></li>
<li><a href="#" class="hover:text-emerald-400 transition">Syarat & Ketentuan</a></li>
</ul>
</div>
</div>
<div class="text-center text-sm text-gray-500">
&copy; 2026 Dinas Sosial Kota Pontianak (Dummy). All rights reserved.
</div>
</footer>
<script>
const leaflet_map = L.map('map_container').setView([-0.0227, 109.3425], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(leaflet_map);
let map_marker = null;
let map_marker_warga = null;
let map_marker_pangkalan = null;
let map_garis_hubung = null;
// Custom ikon untuk pangkalan distribusi (Rumah Ibadah)
const ikon_pangkalan = L.icon({
iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png',
shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
iconSize: [25, 41],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
shadowSize: [41, 41]
});
async function muat_statistik_publik() {
try {
// Diubah ke relative path
const respons_http = await fetch('/api/survey/statistik');
if (!respons_http.ok) throw new Error('Gagal mengambil data statistik');
const data_agregat = await respons_http.json();
document.getElementById('stat_publik_terverifikasi').textContent = data_agregat.terverifikasi || 0;
document.getElementById('stat_publik_diproses').textContent = data_agregat.diproses || 0;
const objek_waktu_sekarang = new Date();
const waktu_terformat_wib = objek_waktu_sekarang.toLocaleTimeString('id-ID', {
hour: '2-digit',
minute: '2-digit',
timeZone: 'Asia/Jakarta'
});
const waktu_terformat_wib = new Date().toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit', timeZone: 'Asia/Jakarta' });
document.getElementById('stat_publik_waktu').textContent = `Hari ini, ${waktu_terformat_wib} WIB`;
} catch (error_sistem) {
console.error("Sinkronisasi statistik gagal:", error_sistem.message);
document.getElementById('stat_publik_waktu').textContent = 'Sistem Terhubung';
}
}
@@ -137,38 +105,61 @@
const pesan_hasil = document.getElementById('pesan_hasil');
const tombol_cari = document.getElementById('btn_cari');
if (!/^\d{16}$/.test(input_nik_value)) {
return alert('Masukkan NIK yang valid (16 digit angka).');
}
if (!/^\d{16}$/.test(input_nik_value)) return alert('Masukkan NIK yang valid (16 digit angka).');
tombol_cari.disabled = true;
tombol_cari.textContent = 'Mencari...';
try {
// Diubah ke relative path
const http_response = await fetch(`/api/survey/cek-nik/${input_nik_value}`);
if (!http_response.ok) {
throw new Error('Data tidak ditemukan');
}
if (!http_response.ok) throw new Error('Data tidak ditemukan');
const json_data = await http_response.json();
kotak_hasil.classList.remove('hidden', 'bg-red-50', 'bg-emerald-50', 'border-red-200', 'border-emerald-200');
kotak_hasil.classList.add('bg-emerald-50', 'border-emerald-200');
pesan_hasil.className = 'text-emerald-700';
pesan_hasil.textContent = `Data ditemukan: ${json_data.nama_kk} | Status: ${json_data.status_validasi}`;
let teks_respons = `Data ditemukan: ${json_data.nama_kk} | Status: ${json_data.status_validasi}`;
if (json_data.rumah_ibadah_nama) {
teks_respons += `<br><span class="text-xs text-emerald-600 font-normal mt-1 block">📍 Tempat Penyaluran: ${json_data.rumah_ibadah_nama}</span>`;
}
pesan_hasil.innerHTML = teks_respons;
// Menghapus layer peta sebelumnya secara bersih
if (map_marker_warga) leaflet_map.removeLayer(map_marker_warga);
if (map_marker_pangkalan) leaflet_map.removeLayer(map_marker_pangkalan);
if (map_garis_hubung) leaflet_map.removeLayer(map_garis_hubung);
if (json_data.lat && json_data.lng) {
if (map_marker) {
leaflet_map.removeLayer(map_marker);
}
const koordinat_warga = [parseFloat(json_data.lat), parseFloat(json_data.lng)];
leaflet_map.setView(koordinat_warga, 16);
map_marker = L.marker(koordinat_warga).addTo(leaflet_map)
// Merender titik lokasi rumah mustahik (ikon biru bawaan)
map_marker_warga = L.marker(koordinat_warga).addTo(leaflet_map)
.bindPopup(`<b>${json_data.nama_kk}</b><br>Status: ${json_data.status_validasi}`)
.openPopup();
// Baris Kompleks: Jika data pangkalan silang (JOIN) tersedia, kita merender ikon hijau khusus
// pada koordinat rumah ibadah, lalu menggambar objek vektor polyline merah putus-putus
// untuk memvisualisasikan jarak dan rute dari rumah warga menuju pangkalan penyaluran.
if (json_data.rumah_ibadah_lat && json_data.rumah_ibadah_lng) {
const koordinat_pangkalan = [parseFloat(json_data.rumah_ibadah_lat), parseFloat(json_data.rumah_ibadah_lng)];
map_marker_pangkalan = L.marker(koordinat_pangkalan, { icon: ikon_pangkalan }).addTo(leaflet_map)
.bindPopup(`<b>Pusat Penyaluran</b><br>${json_data.rumah_ibadah_nama}`);
map_garis_hubung = L.polyline([koordinat_warga, koordinat_pangkalan], {
color: 'red',
weight: 3,
dashArray: '10, 10',
opacity: 0.7
}).addTo(leaflet_map);
// Menyesuaikan bidang pandang kamera agar kedua titik terlihat di layar
leaflet_map.fitBounds(map_garis_hubung.getBounds(), { padding: [50, 50] });
} else {
leaflet_map.setView(koordinat_warga, 16);
}
}
} catch (error_object) {