Files
2026-06-11 10:16:53 +07:00

704 lines
31 KiB
PHP

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lapor Warga WebGIS Pemetaan Sosial</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>
<style>
:root {
--blue: #30a8e0;
--blue-d: #1b8ec7;
--blue-lt: #ddf0fb;
--navy: #0b2545;
--green: #1fad63;
--green-d: #168a4f;
--green-lt: #d7f5e7;
--red: #e05050;
--orange: #f59e0b;
--glass: rgba(255,255,255,0.94);
--shadow: 0 8px 32px rgba(11,37,69,0.18);
--shadow-sm: 0 2px 12px rgba(11,37,69,0.12);
--r: 14px;
--r2: 10px;
--r3: 8px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { min-height: 100%; font-family: 'Plus Jakarta Sans', sans-serif; background: #f0f4f8; color: var(--navy); }
/* LAYOUT */
.page-wrap {
min-height: 100vh;
display: grid;
grid-template-columns: 1fr 420px;
grid-template-rows: auto 1fr;
}
/* HEADER */
.page-header {
grid-column: 1 / -1;
background: var(--glass);
backdrop-filter: blur(14px);
border-bottom: 1px solid rgba(11,37,69,0.09);
padding: 14px 24px;
display: flex; align-items: center; justify-content: space-between;
box-shadow: var(--shadow-sm);
position: sticky; top: 0; z-index: 100;
}
.header-brand { display: flex; align-items: center; gap: 10px; }
.hb-icon {
width: 36px; height: 36px;
background: linear-gradient(135deg, var(--green), var(--blue));
border-radius: 10px;
display: flex; align-items: center; justify-content: center;
font-size: 17px; box-shadow: 0 3px 10px rgba(31,173,99,0.3);
}
.hb-text .title { font-size: 14px; font-weight: 800; color: var(--navy); line-height: 1.2; }
.hb-text .subtitle{ font-size: 10px; color: rgba(11,37,69,0.42); font-weight: 500; }
.header-badge {
background: var(--orange); color: white;
font-size: 10px; font-weight: 700;
padding: 4px 11px; border-radius: 20px;
}
.back-link {
display: flex; align-items: center; gap: 6px;
font-size: 12px; font-weight: 600;
color: rgba(11,37,69,0.45);
text-decoration: none;
padding: 6px 12px; border-radius: var(--r3);
border: 1.5px solid rgba(11,37,69,0.1);
background: rgba(11,37,69,0.03);
transition: all 0.15s;
}
.back-link:hover { background: rgba(11,37,69,0.07); color: var(--navy); }
/* PETA */
.map-panel { position: relative; background: #e8eff5; }
#map-lapor { width: 100%; height: 100%; min-height: 500px; cursor: crosshair; }
.map-instruction {
position: absolute; bottom: 20px; left: 50%;
transform: translateX(-50%);
z-index: 500;
background: rgba(11,37,69,0.82); color: rgba(255,255,255,0.9);
font-size: 12px; font-weight: 500;
padding: 8px 18px; border-radius: 20px;
backdrop-filter: blur(8px); pointer-events: none; white-space: nowrap;
transition: all 0.3s;
}
.map-instruction.picked { background: rgba(31,173,99,0.88); }
.coord-pill {
position: absolute; top: 12px; left: 50%;
transform: translateX(-50%);
z-index: 500;
background: var(--glass); backdrop-filter: blur(12px);
border-radius: 20px; padding: 6px 14px;
font-size: 11px; font-weight: 600; color: var(--navy);
box-shadow: var(--shadow-sm);
display: none; align-items: center; gap: 6px;
}
.coord-pill.show { display: flex; }
/* FORM PANEL */
.form-panel {
background: white;
border-left: 1px solid rgba(11,37,69,0.08);
display: flex; flex-direction: column;
overflow-y: auto;
max-height: calc(100vh - 64px);
position: sticky; top: 64px;
}
.form-panel::-webkit-scrollbar { width: 4px; }
.form-panel::-webkit-scrollbar-thumb { background: rgba(11,37,69,0.14); border-radius: 4px; }
/* HERO FORM */
.form-hero {
background: linear-gradient(135deg, #0b2545 0%, #1a3f6f 100%);
padding: 22px 22px 18px;
position: relative; overflow: hidden;
}
.form-hero::before {
content: ''; position: absolute;
top: -20px; right: -20px; width: 100px; height: 100px;
background: rgba(48,168,224,0.15); border-radius: 50%;
}
.form-hero::after {
content: ''; position: absolute;
bottom: -30px; left: 30px; width: 80px; height: 80px;
background: rgba(31,173,99,0.1); border-radius: 50%;
}
.fh-label { font-size: 10px; font-weight: 700; color: rgba(255,255,255,0.45); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 5px; }
.fh-title { font-size: 20px; font-weight: 800; color: white; line-height: 1.2; margin-bottom: 6px; }
.fh-desc { font-size: 12px; color: rgba(255,255,255,0.55); line-height: 1.6; }
/* STEPS */
.steps-bar {
display: flex; padding: 14px 22px;
border-bottom: 1px solid rgba(11,37,69,0.08);
background: rgba(11,37,69,0.02);
}
.step { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; position: relative; }
.step:not(:last-child)::after {
content: ''; position: absolute;
top: 12px; left: 60%; width: 80%; height: 2px;
background: rgba(11,37,69,0.1); z-index: 0;
}
.step.done:not(:last-child)::after { background: var(--green); }
.step-num {
width: 24px; height: 24px; border-radius: 50%;
background: rgba(11,37,69,0.08); border: 2px solid rgba(11,37,69,0.12);
font-size: 11px; font-weight: 700; color: rgba(11,37,69,0.35);
display: flex; align-items: center; justify-content: center;
position: relative; z-index: 1; transition: all 0.25s;
}
.step.active .step-num { background: var(--blue-lt); border-color: var(--blue); color: var(--blue-d); }
.step.done .step-num { background: var(--green-lt); border-color: var(--green); color: var(--green-d); }
.step-lbl { font-size: 9px; font-weight: 600; color: rgba(11,37,69,0.35); text-align: center; }
.step.active .step-lbl { color: var(--blue-d); }
.step.done .step-lbl { color: var(--green-d); }
/* FORM BODY */
.form-body { padding: 18px 22px; flex: 1; }
.form-section { margin-bottom: 18px; }
.section-title {
font-size: 11px; font-weight: 700;
color: rgba(11,37,69,0.45);
text-transform: uppercase; letter-spacing: 0.08em;
margin-bottom: 10px;
display: flex; align-items: center; gap: 6px;
}
.section-title::after { content: ''; flex: 1; height: 1px; background: rgba(11,37,69,0.08); }
.ff { margin-bottom: 11px; }
.ff label {
display: block; font-size: 10px; font-weight: 700;
color: rgba(11,37,69,0.42); text-transform: uppercase;
letter-spacing: 0.07em; margin-bottom: 4px;
}
.ff label .req { color: var(--red); margin-left: 2px; }
.ff input, .ff select, .ff textarea {
width: 100%; padding: 9px 11px; font-size: 13px; font-family: inherit;
border: 1.5px solid rgba(11,37,69,0.12); border-radius: var(--r3);
color: var(--navy); background: rgba(11,37,69,0.02);
transition: border-color 0.18s, box-shadow 0.18s, background 0.18s;
appearance: none; -webkit-appearance: none;
}
.ff select {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%230b2545' stroke-opacity='0.35' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
background-repeat: no-repeat; background-position: right 11px center; padding-right: 32px; cursor: pointer;
}
.ff textarea { resize: vertical; min-height: 72px; line-height: 1.55; }
.ff input:focus, .ff select:focus, .ff textarea:focus {
outline: none; border-color: var(--blue);
box-shadow: 0 0 0 3px rgba(48,168,224,0.11); background: white;
}
.ff input::placeholder, .ff textarea::placeholder { color: rgba(11,37,69,0.26); }
.ff-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
/* LOKASI BOX */
.loc-box {
background: rgba(11,37,69,0.03);
border: 1.5px dashed rgba(11,37,69,0.15);
border-radius: var(--r2); padding: 12px 14px;
display: flex; align-items: center; gap: 10px;
margin-bottom: 11px; transition: all 0.2s; cursor: pointer;
}
.loc-box.filled { background: var(--green-lt); border-color: var(--green); border-style: solid; }
.loc-box-icon {
width: 36px; height: 36px; border-radius: 9px;
background: rgba(11,37,69,0.06);
display: flex; align-items: center; justify-content: center;
font-size: 16px; flex-shrink: 0; transition: background 0.2s;
}
.loc-box.filled .loc-box-icon { background: rgba(31,173,99,0.15); }
.loc-box-text .lbt-title { font-size: 12px; font-weight: 700; color: rgba(11,37,69,0.5); }
.loc-box.filled .loc-box-text .lbt-title { color: var(--green-d); }
.loc-box-text .lbt-val { font-size: 11px; color: rgba(11,37,69,0.38); margin-top: 2px; font-family: monospace; }
.loc-box.filled .loc-box-text .lbt-val { color: var(--green-d); font-weight: 600; }
/* INFO BOX */
.info-box {
background: rgba(245,158,11,0.08);
border: 1px solid rgba(245,158,11,0.25);
border-radius: var(--r2); padding: 10px 12px;
font-size: 11px; color: rgba(11,37,69,0.6);
line-height: 1.6; margin-bottom: 14px;
display: flex; gap: 8px;
}
.info-box .ib-icon { font-size: 14px; flex-shrink: 0; margin-top: 1px; }
/* FORM FOOTER */
.form-footer {
padding: 14px 22px 20px;
border-top: 1px solid rgba(11,37,69,0.08);
background: rgba(11,37,69,0.01);
}
.btn-submit {
width: 100%; padding: 13px; border: none; border-radius: var(--r2);
background: linear-gradient(135deg, var(--green), var(--blue));
color: white; font-family: inherit; font-size: 14px; font-weight: 700;
cursor: pointer; transition: all 0.2s;
display: flex; align-items: center; justify-content: center; gap: 7px;
box-shadow: 0 4px 15px rgba(31,173,99,0.3);
}
.btn-submit:hover { transform: translateY(-1px); box-shadow: 0 6px 20px rgba(31,173,99,0.4); }
.btn-submit:active { transform: scale(0.98); }
.btn-submit:disabled {
background: rgba(11,37,69,0.12); color: rgba(11,37,69,0.35);
cursor: not-allowed; box-shadow: none; transform: none;
}
.submit-note { text-align: center; font-size: 10px; color: rgba(11,37,69,0.3); margin-top: 8px; }
/* SUCCESS OVERLAY */
#success-overlay {
display: none; position: fixed; inset: 0; z-index: 9000;
background: rgba(11,37,69,0.5); backdrop-filter: blur(6px);
align-items: center; justify-content: center;
}
#success-overlay.show { display: flex; }
.success-card {
background: white; border-radius: 20px; padding: 36px 32px;
max-width: 360px; width: calc(100vw - 32px);
text-align: center; box-shadow: 0 30px 80px rgba(11,37,69,0.3);
animation: scaleIn 0.35s cubic-bezier(0.34,1.5,0.64,1);
}
@keyframes scaleIn { from { opacity:0; transform:scale(0.75); } to { opacity:1; transform:scale(1); } }
.sc-circle {
width: 72px; height: 72px; background: var(--green-lt); border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 32px; margin: 0 auto 16px;
}
.sc-title { font-size: 20px; font-weight: 800; color: var(--navy); margin-bottom: 8px; }
.sc-desc { font-size: 13px; color: rgba(11,37,69,0.5); line-height: 1.6; margin-bottom: 20px; }
.sc-id { background: var(--green-lt); border-radius: var(--r2); padding: 10px 14px; font-size: 12px; font-weight: 700; color: var(--green-d); margin-bottom: 20px; }
.btn-lapor-lagi {
width: 100%; padding: 11px; border: none; border-radius: var(--r2);
background: var(--green); color: white; font-family: inherit;
font-size: 13px; font-weight: 700; cursor: pointer; transition: background 0.15s;
}
.btn-lapor-lagi:hover { background: var(--green-d); }
/* TOAST — identik dengan index.php */
#toast {
position: fixed; bottom: 24px; left: 50%;
transform: translateX(-50%) translateY(8px);
z-index: 9999;
background: var(--navy); color: white;
font-size: 12px; font-weight: 600;
padding: 8px 20px; border-radius: 18px;
box-shadow: 0 6px 22px rgba(11,37,69,0.28);
opacity: 0; transition: all 0.28s ease; pointer-events: none;
font-family: 'Plus Jakarta Sans', sans-serif; white-space: nowrap;
}
#toast.show { opacity:1; transform: translateX(-50%) translateY(0); }
#toast.ok { background: var(--green); }
#toast.err { background: var(--red); }
/* RESPONSIVE MOBILE */
@media (max-width: 768px) {
.page-wrap { grid-template-columns: 1fr; grid-template-rows: auto auto auto; }
.map-panel { grid-row: 2; height: 280px; }
.form-panel { grid-row: 3; max-height: none; position: static; overflow-y: visible; }
#map-lapor { min-height: 280px; }
.ff-row { grid-template-columns: 1fr; }
.back-link span { display: none; }
}
</style>
<div style="
margin-top:16px; padding-top:14px;
border-top:1px dashed rgba(11,37,69,0.1);
text-align:center">
<div style="font-size:10px;font-weight:700;color:rgba(11,37,69,0.35);
text-transform:uppercase;letter-spacing:0.07em;margin-bottom:8px">
Bagikan halaman ini
</div>
<div id="self-qr" style="width:100px;height:100px;border-radius:8px;border:1.5px solid rgba(11,37,69,0.08);overflow:hidden"></div>
<div style="font-size:10px;color:rgba(11,37,69,0.3);margin-top:6px">
Scan untuk membuka di HP lain
</div>
</div>
</head>
<body>
<div class="page-wrap">
<!-- HEADER -->
<header class="page-header">
<div class="header-brand">
<div class="hb-icon">🗺️</div>
<div class="hb-text">
<div class="title">WebGIS Pemetaan Sosial</div>
<div class="subtitle">Kota Pontianak Berbasis Komunitas Rumah Ibadah</div>
</div>
</div>
<div style="display:flex;align-items:center;gap:10px">
<div class="header-badge">📢 Laporan Publik</div>
<a href="index.php" class="back-link"> <span>Kembali ke Peta</span></a>
</div>
</header>
<!-- PANEL KIRI: PETA -->
<div class="map-panel">
<div id="map-lapor"></div>
<div class="coord-pill" id="coordPill">
📍 <span id="coordText"></span>
</div>
<div class="map-instruction" id="mapHint">
Klik titik lokasi tempat tinggal di peta
</div>
</div>
<!-- PANEL KANAN: FORM -->
<div class="form-panel">
<!-- Hero -->
<div class="form-hero">
<div class="fh-label">Formulir Laporan Warga</div>
<div class="fh-title">Laporkan Keluarga<br>Tidak Mampu</div>
<div class="fh-desc">Data Anda akan diverifikasi oleh pengurus rumah ibadah setempat sebelum masuk ke peta resmi.</div>
</div>
<!-- Steps -->
<div class="steps-bar">
<div class="step done" id="step1"><div class="step-num">1</div><div class="step-lbl">Mulai</div></div>
<div class="step active" id="step2"><div class="step-num">2</div><div class="step-lbl">Lokasi</div></div>
<div class="step" id="step3"><div class="step-num">3</div><div class="step-lbl">Data Diri</div></div>
<div class="step" id="step4"><div class="step-num">4</div><div class="step-lbl">Kirim</div></div>
</div>
<!-- Body -->
<div class="form-body">
<div class="info-box">
<span class="ib-icon">💡</span>
<span>Klik di peta sebelah kiri untuk menentukan lokasi, lalu isi data di bawah ini.</span>
</div>
<!-- LOKASI -->
<div class="section-title">📍 Lokasi Tempat Tinggal</div>
<div class="loc-box" id="locBox" onclick="focusMap()">
<div class="loc-box-icon">📍</div>
<div class="loc-box-text">
<div class="lbt-title" id="locTitle">Belum dipilih klik peta</div>
<div class="lbt-val" id="locVal">Klik di peta untuk menentukan koordinat</div>
</div>
</div>
<div class="ff">
<label>Alamat Lengkap <span class="req">*</span></label>
<textarea id="f_alamat" placeholder="Contoh: Jl. Ahmad Yani No. 12, Kel. Sungai Bangkong, Kec. Pontianak Kota"></textarea>
</div>
<!-- DATA PRIBADI -->
<div class="section-title">👤 Data Kepala Keluarga</div>
<div class="ff">
<label>Nama Kepala Keluarga <span class="req">*</span></label>
<input type="text" id="f_kk" placeholder="Nama lengkap sesuai KTP" />
</div>
<div class="ff-row">
<div class="ff">
<label>Jumlah Anggota (Jiwa) <span class="req">*</span></label>
<input type="number" id="f_jml" placeholder="Contoh: 4" min="1" max="30" />
</div>
<div class="ff">
<label>Tanggal Lahir KK</label>
<input type="date" id="f_tgl_lahir" />
</div>
</div>
<div class="ff-row">
<div class="ff">
<label>Pendidikan Terakhir</label>
<select id="f_pendidikan">
<option value=""> Pilih </option>
<option value="Tidak Sekolah">Tidak Sekolah</option>
<option value="SD">SD</option>
<option value="SMP">SMP</option>
<option value="SMA">SMA</option>
<option value="D3">D3</option>
<option value="S1">S1</option>
<option value="S2">S2</option>
<option value="S3">S3</option>
</select>
</div>
<div class="ff">
<label>Pekerjaan</label>
<input type="text" id="f_pekerjaan" placeholder="Contoh: Buruh harian" />
</div>
</div>
<!-- KESEHATAN -->
<div class="section-title">🏥 Kesehatan & Jaminan Sosial</div>
<div class="ff">
<label>Riwayat Penyakit / Disabilitas</label>
<textarea id="f_penyakit" placeholder="Contoh: Diabetes, hipertensi — atau tulis 'Tidak ada'" style="min-height:56px"></textarea>
</div>
<div class="ff">
<label>Kepemilikan Jaminan Sosial</label>
<select id="f_jaminan">
<option value=""> Pilih </option>
<option value="BPJS Kesehatan">BPJS Kesehatan</option>
<option value="KIS">KIS (Kartu Indonesia Sehat)</option>
<option value="BPJS Ketenagakerjaan">BPJS Ketenagakerjaan</option>
<option value="Tidak Ada">Tidak Ada</option>
</select>
</div>
<!-- PELAPOR -->
<div class="section-title">📝 Identitas Pelapor</div>
<div class="ff">
<label>Nama Pelapor <span class="req">*</span></label>
<input type="text" id="f_pelapor" placeholder="Nama Anda (pengurus / relawan / warga)" />
</div>
<div class="ff-row">
<div class="ff">
<label>No. HP Pelapor</label>
<input type="tel" id="f_hp" placeholder="08xx-xxxx-xxxx" />
</div>
<div class="ff">
<label>Hubungan dengan KK</label>
<select id="f_hubungan">
<option value=""> Pilih </option>
<option value="Diri sendiri">Diri sendiri</option>
<option value="Tetangga">Tetangga</option>
<option value="Pengurus RT/RW">Pengurus RT/RW</option>
<option value="Relawan">Relawan</option>
<option value="Pengurus Rumah Ibadah">Pengurus Rumah Ibadah</option>
</select>
</div>
</div>
<div class="ff">
<label>Keterangan Tambahan</label>
<textarea id="f_keterangan" placeholder="Ceritakan kondisi keluarga secara singkat (opsional)"></textarea>
</div>
</div><!-- /form-body -->
<!-- Footer -->
<div class="form-footer">
<button class="btn-submit" id="btnSubmit" onclick="submitLaporan()" disabled>
📤 Kirim Laporan untuk Diverifikasi
</button>
<div class="submit-note">
⚠️ Laporan akan masuk sebagai <strong>menunggu verifikasi</strong> belum tampil di peta sebelum disetujui operator
</div>
</div>
</div><!-- /form-panel -->
</div><!-- /page-wrap -->
<!-- SUCCESS OVERLAY -->
<div id="success-overlay">
<div class="success-card">
<div class="sc-circle"></div>
<div class="sc-title">Laporan Terkirim!</div>
<div class="sc-desc">Terima kasih. Laporan Anda sudah diterima dan akan segera diverifikasi oleh pengurus rumah ibadah setempat.</div>
<div class="sc-id" id="sc-ref">ID Laporan: #—</div>
<button class="btn-lapor-lagi" onclick="resetForm()">📋 Laporkan Warga Lain</button>
</div>
</div>
<div id="toast"></div>
<script>
// =============================================
// VARIABEL GLOBAL
// =============================================
let pickedLL = null;
let tempMarker = null;
// =============================================
// INISIALISASI PETA
// =============================================
const mapLapor = L.map('map-lapor', { zoomControl: true })
.setView([-0.0548, 109.3494], 14);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19, attribution: '© OpenStreetMap'
}).addTo(mapLapor);
const mkRed = new L.Icon({
iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.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]
});
// Klik peta → simpan koordinat + tampilkan marker
mapLapor.on('click', function(e) {
pickedLL = e.latlng;
if (tempMarker) mapLapor.removeLayer(tempMarker);
tempMarker = L.marker([e.latlng.lat, e.latlng.lng], { icon: mkRed })
.addTo(mapLapor)
.bindPopup('<div style="font-family:Plus Jakarta Sans,sans-serif;font-size:12px;font-weight:600;color:#0b2545">📍 Lokasi dipilih</div>')
.openPopup();
const latStr = e.latlng.lat.toFixed(6);
const lngStr = e.latlng.lng.toFixed(6);
// Update UI koordinat
document.getElementById('coordPill').classList.add('show');
document.getElementById('coordText').textContent = latStr + ', ' + lngStr;
document.getElementById('locBox').classList.add('filled');
document.getElementById('locTitle').textContent = '✅ Lokasi ditentukan';
document.getElementById('locVal').textContent = latStr + ', ' + lngStr;
document.getElementById('mapHint').textContent = '✅ Lokasi dipilih — klik lagi untuk mengubah';
document.getElementById('mapHint').classList.add('picked');
checkSubmitReady();
});
// =============================================
// STEP INDICATOR
// =============================================
function updateSteps(cur) {
for (let i = 1; i <= 4; i++) {
const el = document.getElementById('step' + i);
el.className = 'step';
if (i < cur) el.classList.add('done');
else if (i === cur) el.classList.add('active');
}
}
// =============================================
// VALIDASI — enable/disable tombol submit
// =============================================
function checkSubmitReady() {
const ok = pickedLL
&& document.getElementById('f_kk').value.trim()
&& document.getElementById('f_jml').value
&& parseInt(document.getElementById('f_jml').value) > 0
&& document.getElementById('f_alamat').value.trim()
&& document.getElementById('f_pelapor').value.trim();
document.getElementById('btnSubmit').disabled = !ok;
if (ok) updateSteps(4);
else if (pickedLL) updateSteps(3);
else updateSteps(2);
}
// Pasang listener ke semua field wajib
['f_kk','f_jml','f_alamat','f_pelapor'].forEach(id => {
document.getElementById(id).addEventListener('input', checkSubmitReady);
});
// =============================================
// FOKUS KE PETA (klik locBox di mobile)
// =============================================
function focusMap() {
document.getElementById('map-lapor').scrollIntoView({ behavior: 'smooth', block: 'center' });
toast('🖱️ Klik di peta untuk menentukan lokasi', '');
}
// =============================================
// SUBMIT LAPORAN → api_laporan.php
// =============================================
function submitLaporan() {
if (!pickedLL) { toast('⚠️ Pilih lokasi di peta terlebih dahulu', 'err'); return; }
const kk = document.getElementById('f_kk').value.trim();
const jml = document.getElementById('f_jml').value;
const alamat = document.getElementById('f_alamat').value.trim();
const pelapor = document.getElementById('f_pelapor').value.trim();
if (!kk || !jml || !alamat || !pelapor) {
toast('⚠️ Lengkapi semua field wajib (*)', 'err');
return;
}
const btn = document.getElementById('btnSubmit');
btn.disabled = true;
btn.textContent = '⏳ Mengirim...';
const fd = new FormData();
fd.append('lat', pickedLL.lat);
fd.append('lng', pickedLL.lng);
fd.append('nama_kk', kk);
fd.append('jumlah_anggota', jml);
fd.append('alamat', alamat);
fd.append('tanggal_lahir', document.getElementById('f_tgl_lahir').value || '');
fd.append('pendidikan_terakhir', document.getElementById('f_pendidikan').value || '');
fd.append('pekerjaan', document.getElementById('f_pekerjaan').value.trim() || '');
fd.append('riwayat_penyakit', document.getElementById('f_penyakit').value.trim() || '');
fd.append('kepemilikan_jaminan', document.getElementById('f_jaminan').value || '');
fd.append('nama_pelapor', pelapor);
fd.append('hp_pelapor', document.getElementById('f_hp').value.trim() || '');
fd.append('hubungan_pelapor', document.getElementById('f_hubungan').value || '');
fd.append('keterangan', document.getElementById('f_keterangan').value.trim() || '');
fetch('api_laporan.php', { method: 'POST', body: fd })
.then(r => r.json())
.then(res => {
if (res.status === 'ok') {
document.getElementById('sc-ref').textContent = 'ID Laporan: #' + res.id;
document.getElementById('success-overlay').classList.add('show');
} else {
toast('❌ Gagal: ' + (res.pesan || 'Coba lagi'), 'err');
btn.disabled = false;
btn.innerHTML = '📤 Kirim Laporan untuk Diverifikasi';
}
})
.catch(() => {
toast('❌ Koneksi gagal. Periksa jaringan Anda.', 'err');
btn.disabled = false;
btn.innerHTML = '📤 Kirim Laporan untuk Diverifikasi';
});
}
// =============================================
// RESET — Laporan lagi
// =============================================
function resetForm() {
document.getElementById('success-overlay').classList.remove('show');
['f_kk','f_jml','f_alamat','f_tgl_lahir','f_pendidikan','f_pekerjaan',
'f_penyakit','f_jaminan','f_pelapor','f_hp','f_hubungan','f_keterangan']
.forEach(id => { const el = document.getElementById(id); if (el) el.value = ''; });
pickedLL = null;
if (tempMarker) { mapLapor.removeLayer(tempMarker); tempMarker = null; }
document.getElementById('coordPill').classList.remove('show');
document.getElementById('coordText').textContent = '—';
document.getElementById('locBox').classList.remove('filled');
document.getElementById('locTitle').textContent = 'Belum dipilih — klik peta';
document.getElementById('locVal').textContent = 'Klik di peta untuk menentukan koordinat';
document.getElementById('mapHint').textContent = 'Klik titik lokasi tempat tinggal di peta';
document.getElementById('mapHint').classList.remove('picked');
document.getElementById('btnSubmit').disabled = true;
document.getElementById('btnSubmit').innerHTML = '📤 Kirim Laporan untuk Diverifikasi';
updateSteps(2);
}
// =============================================
// TOAST — identik dengan index.php
// =============================================
function toast(msg, type) {
const t = document.getElementById('toast');
t.textContent = msg;
t.className = 'show' + (type ? ' ' + type : '');
setTimeout(() => t.className = '', 3000);
}
// QR Code untuk halaman lapor.php itu sendiri
window.addEventListener('load', function() {
const selfUrl = window.location.href;
new QRCode(document.getElementById('self-qr'), {
text: selfUrl,
width: 100,
height: 100,
colorDark: '#0b2545',
colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.M
});
});
// Init
updateSteps(2);
</script>
</body>
</html>