From afd656779f30f28b92038e2fadee7eca1f128c2b Mon Sep 17 00:00:00 2001 From: MAGHFIRA IZZATI Date: Mon, 8 Jun 2026 17:07:17 +0700 Subject: [PATCH] up --- 01/api/delete_data.php | 21 - 01/api/delete_jalan.php | 21 - 01/api/delete_parsil.php | 21 - 01/api/read_data.php | 25 - 01/api/read_jalan.php | 25 - 01/api/read_parsil.php | 25 - 01/api/save_data.php | 53 - 01/api/save_jalan.php | 59 - 01/api/save_parsil.php | 60 - 01/api/update_data.php | 27 - 01/api/update_jalan.php | 35 - 01/api/update_parsil.php | 36 - 01/index.html | 762 +--- 01/index.html.bak | 7482 ++++++++++++++++++++++++++++++++++++++ 14 files changed, 7510 insertions(+), 1142 deletions(-) delete mode 100644 01/api/delete_data.php delete mode 100644 01/api/delete_jalan.php delete mode 100644 01/api/delete_parsil.php delete mode 100644 01/api/read_data.php delete mode 100644 01/api/read_jalan.php delete mode 100644 01/api/read_parsil.php delete mode 100644 01/api/save_data.php delete mode 100644 01/api/save_jalan.php delete mode 100644 01/api/save_parsil.php delete mode 100644 01/api/update_data.php delete mode 100644 01/api/update_jalan.php delete mode 100644 01/api/update_parsil.php create mode 100644 01/index.html.bak diff --git a/01/api/delete_data.php b/01/api/delete_data.php deleted file mode 100644 index a387307..0000000 --- a/01/api/delete_data.php +++ /dev/null @@ -1,21 +0,0 @@ - "error", "message" => "ID tidak valid"]); - exit; -} - -$sql = "DELETE FROM spbu WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/api/delete_jalan.php b/01/api/delete_jalan.php deleted file mode 100644 index 08c4943..0000000 --- a/01/api/delete_jalan.php +++ /dev/null @@ -1,21 +0,0 @@ - "error", "message" => "ID tidak valid"]); - exit; -} - -$sql = "DELETE FROM jalan WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/api/delete_parsil.php b/01/api/delete_parsil.php deleted file mode 100644 index 3f4496b..0000000 --- a/01/api/delete_parsil.php +++ /dev/null @@ -1,21 +0,0 @@ - "error", "message" => "ID tidak valid"]); - exit; -} - -$sql = "DELETE FROM parsil WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/api/read_data.php b/01/api/read_data.php deleted file mode 100644 index 64845fd..0000000 --- a/01/api/read_data.php +++ /dev/null @@ -1,25 +0,0 @@ -query($sql); - -if (!$result) { -echo json_encode([ -"status" => "error", -"message" => "Gagal membaca tabel spbu", -"detail" => $conn->error -]); -exit; -} - -$data = []; - -while($row = $result->fetch_assoc()){ -$data[] = $row; -} - -echo json_encode($data); -?> \ No newline at end of file diff --git a/01/api/read_jalan.php b/01/api/read_jalan.php deleted file mode 100644 index 65ab6d4..0000000 --- a/01/api/read_jalan.php +++ /dev/null @@ -1,25 +0,0 @@ -query($sql); - -if (!$result) { -echo json_encode([ -"status" => "error", -"message" => "Gagal membaca tabel jalan", -"detail" => $conn->error -]); -exit; -} - -$data = []; - -while($row = $result->fetch_assoc()){ -$data[] = $row; -} - -echo json_encode($data); -?> \ No newline at end of file diff --git a/01/api/read_parsil.php b/01/api/read_parsil.php deleted file mode 100644 index 078a4cc..0000000 --- a/01/api/read_parsil.php +++ /dev/null @@ -1,25 +0,0 @@ -query($sql); - -if (!$result) { -echo json_encode([ -"status" => "error", -"message" => "Gagal membaca tabel parsil", -"detail" => $conn->error -]); -exit; -} - -$data = []; - -while($row = $result->fetch_assoc()){ -$data[] = $row; -} - -echo json_encode($data); -?> \ No newline at end of file diff --git a/01/api/save_data.php b/01/api/save_data.php deleted file mode 100644 index 62b6c1f..0000000 --- a/01/api/save_data.php +++ /dev/null @@ -1,53 +0,0 @@ - "error", "message" => "Data tidak lengkap"]); - exit; -} - -try { - $stmt = $conn->prepare("INSERT INTO spbu (nama,no,status,lat,lng) VALUES (?,?,?,?,?)"); - if(!$stmt) { - $err = $conn->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU PREPARE ERR: $err\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]); - exit; - } - - $stmt->bind_param("sssdd", $nama, $no, $status, $lat, $lng); - - if($stmt->execute()){ - $id = $stmt->insert_id; - ob_clean(); - echo json_encode(["status"=>"success","id"=>$id]); - } else { - $err = $stmt->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU EXEC ERR: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]); - } - $stmt->close(); -} catch (Exception $e) { - $err = $e->getMessage(); - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU EXCEPTION: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]); -} -?> \ No newline at end of file diff --git a/01/api/save_jalan.php b/01/api/save_jalan.php deleted file mode 100644 index 828e75c..0000000 --- a/01/api/save_jalan.php +++ /dev/null @@ -1,59 +0,0 @@ - "error", "message" => "Nama tidak boleh kosong"]); - exit; -} - -try { - $stmt = $conn->prepare("INSERT INTO jalan (nama,status,panjang,koordinat) VALUES (?,?,?,?)"); - if(!$stmt) { - $err = $conn->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN PREPARE ERR: $err\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]); - exit; - } - - $stmt->bind_param("ssds", $nama, $status, $panjang, $koordinat); - - if($stmt->execute()){ - $id = $stmt->insert_id; - ob_clean(); - echo json_encode(["status"=>"success","id"=>$id]); - } else { - $err = $stmt->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN EXEC ERR: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]); - } - $stmt->close(); -} catch (Exception $e) { - $err = $e->getMessage(); - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN EXCEPTION: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]); -} -?> \ No newline at end of file diff --git a/01/api/save_parsil.php b/01/api/save_parsil.php deleted file mode 100644 index 2542008..0000000 --- a/01/api/save_parsil.php +++ /dev/null @@ -1,60 +0,0 @@ - "error", "message" => "Nama tidak boleh kosong"]); - exit; -} - -try { - $stmt = $conn->prepare("INSERT INTO parsil (nama, pemilik, status, luas, koordinat) VALUES (?,?,?,?,?)"); - if(!$stmt) { - $err = $conn->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL PREPARE ERR: $err\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]); - exit; - } - - $stmt->bind_param("sssds", $nama, $pemilik, $status, $luas, $koordinat); - - if($stmt->execute()){ - $id = $stmt->insert_id; - ob_clean(); - echo json_encode(["status"=>"success","id"=>$id]); - } else { - $err = $stmt->error; - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL EXEC ERR: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]); - } - $stmt->close(); -} catch (Exception $e) { - $err = $e->getMessage(); - file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL EXCEPTION: $err | Payload: $raw\n", FILE_APPEND); - ob_clean(); - echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]); -} -?> \ No newline at end of file diff --git a/01/api/update_data.php b/01/api/update_data.php deleted file mode 100644 index f5f82b3..0000000 --- a/01/api/update_data.php +++ /dev/null @@ -1,27 +0,0 @@ -real_escape_string($data['nama'] ?? ''); -$no = $conn->real_escape_string($data['no'] ?? ''); -$status = $conn->real_escape_string($data['status'] ?? 'Tidak'); -$lat = isset($data['lat']) ? floatval($data['lat']) : 0; -$lng = isset($data['lng']) ? floatval($data['lng']) : 0; - -if ($id <= 0 || $nama === '' || $no === '') { - echo json_encode(["status" => "error", "message" => "Data tidak valid"]); - exit; -} - -$sql = "UPDATE spbu SET nama='$nama', no='$no', status='$status', lat='$lat', lng='$lng' WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/api/update_jalan.php b/01/api/update_jalan.php deleted file mode 100644 index 4ce6b3e..0000000 --- a/01/api/update_jalan.php +++ /dev/null @@ -1,35 +0,0 @@ -real_escape_string($data['nama'] ?? ''); -$status = $conn->real_escape_string($data['status'] ?? 'Kabupaten'); -$panjang = isset($data['panjang']) ? floatval($data['panjang']) : 0; -$koordinatInput = $data['koordinat'] ?? []; - -if ($id <= 0 || $nama === '') { - echo json_encode(["status" => "error", "message" => "Data tidak valid"]); - exit; -} - -if (is_string($koordinatInput)) { - $decoded = json_decode($koordinatInput, true); - $koordinat = (json_last_error() === JSON_ERROR_NONE) ? json_encode($decoded) : '[]'; -} else { - $koordinat = json_encode($koordinatInput); -} - -$koordinat = $conn->real_escape_string($koordinat); - -$sql = "UPDATE jalan SET nama='$nama', status='$status', panjang='$panjang', koordinat='$koordinat' WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/api/update_parsil.php b/01/api/update_parsil.php deleted file mode 100644 index b8b225c..0000000 --- a/01/api/update_parsil.php +++ /dev/null @@ -1,36 +0,0 @@ -real_escape_string($data['nama'] ?? ''); -$pemilik = $conn->real_escape_string($data['pemilik'] ?? ''); -$status = $conn->real_escape_string($data['status'] ?? 'SHM'); -$luas = isset($data['luas']) ? floatval($data['luas']) : 0; -$koordinatInput = $data['koordinat'] ?? []; - -if ($id <= 0 || $nama === '') { - echo json_encode(["status" => "error", "message" => "Data tidak valid"]); - exit; -} - -if (is_string($koordinatInput)) { - $decoded = json_decode($koordinatInput, true); - $koordinat = (json_last_error() === JSON_ERROR_NONE) ? json_encode($decoded) : '[]'; -} else { - $koordinat = json_encode($koordinatInput); -} - -$koordinat = $conn->real_escape_string($koordinat); - -$sql = "UPDATE parsil SET nama='$nama', pemilik='$pemilik', status='$status', luas='$luas', koordinat='$koordinat' WHERE id=$id"; - -if ($conn->query($sql)) { - echo json_encode(["status" => "success"]); -} else { - echo json_encode(["status" => "error", "message" => $conn->error]); -} -?> \ No newline at end of file diff --git a/01/index.html b/01/index.html index cea55b0..20de51e 100644 --- a/01/index.html +++ b/01/index.html @@ -2950,10 +2950,7 @@ } .pf h4 i { font-size: 15px !important; opacity: .9; } /* Color the h4 based on icon color */ - .pf h4:has(.fa-gas-pump) { background: linear-gradient(135deg,#064e3b,#059669); } - .pf h4:has(.fa-road) { background: linear-gradient(135deg,#1e3a8a,#2563eb); } - .pf h4:has(.fa-vector-square){ background: linear-gradient(135deg,#78350f,#d97706); } - + .pf label { display: block; font-size: 10px !important; @@ -3284,10 +3281,7 @@ - - - - +
Legenda Peta
@@ -3341,20 +3335,7 @@ Rumah Ibadah Tambah lokasi ibadah
-
Opsional
-
- - SPBU Tambah titik SPBU
-
- - Jalan Gambar ruas jalan -
-
- - Parsil / Lahan Gambar area persil -
- @@ -3523,10 +3504,10 @@ /* STATE */ const state = { - mode: null, spbu: [], jalan: [], parsil: [], kemiskinan: [], masjid: [], - featureRefs: { spbu: {}, jalan: {}, parsil: {}, kemiskinan: {}, masjid: {} }, + mode: null, kemiskinan: [], masjid: [], + featureRefs: { kemiskinan: {}, masjid: {} }, kkLayerRefs: {}, blankRefs: {}, useSatellite: false, geometryEdit: null, activeCard: null, - spbuFilterVis: { open24: true, non24: true }, drawingLine: false, drawingPoly: false, + drawingLine: false, drawingPoly: false, tempPoints: [], tempMarkers: [], tempPolyline: null, tempPolygon: null }; @@ -3542,22 +3523,12 @@ const layers = { kemiskinan: L.layerGroup().addTo(map), masjid: L.layerGroup().addTo(map), - blankspot: L.layerGroup().addTo(map), - // Layer opsional — OFF by default (tidak .addTo(map)) - spbu24: L.layerGroup(), - spbuNon24: L.layerGroup(), - jalan: L.layerGroup(), - parsil: L.layerGroup() - }; + blankspot: L.layerGroup().addTo(map),}; const layersControl = L.control.layers(null, { 'KemiskinanData KK miskin': layers.kemiskinan, 'Rumah IbadahFasilitas ibadah': layers.masjid, 'Blank SpotDi luar radius rumah ibadah': layers.blankspot, - 'SPBU 24 JamBuka 24 jam': layers.spbu24, - 'SPBU Non-24Tidak 24 jam': layers.spbuNon24, - 'JalanJaringan jalan': layers.jalan, - 'Parsil / LahanData persil tanah': layers.parsil, - }, { collapsed: false, position: 'topright' }).addTo(map); + }, { collapsed: false, position: 'topright' }).addTo(map); decorateLayersControl(); function decorateLayersControl() { const container = layersControl.getContainer(); @@ -3565,7 +3536,7 @@ const overlays = container.querySelector('.leaflet-control-layers-overlays'); if (!overlays) return; const labels = Array.from(overlays.querySelectorAll('label')); - if (labels.length < 6) return; + if (labels.length < 3) return; overlays.innerHTML = ''; const addGroup = (title, items, color) => { const head = document.createElement('div'); @@ -3613,7 +3584,7 @@ }); }; addGroup('Tematik Utama', [labels[0], labels[1], labels[2]]); - addGroup('Opsional', [labels[3], labels[4], labels[5], labels[6]], '#64748b'); + } const statusStoreKey = 'gis-kemiskinan-status'; @@ -3897,18 +3868,6 @@ const fWarga = state.kemiskinan.find(d => (`${d.nama_kk} ${d.alamat}`).toLowerCase().includes(q)); if (fWarga) return focusFeature('kemiskinan', fWarga.id); - // 3. Cari SPBU - const fSpbu = state.spbu.find(d => (d.nama || '').toLowerCase().includes(q)); - if (fSpbu) return focusFeature('spbu', fSpbu.id); - - // 4. Cari Jalan - const fJalan = state.jalan.find(d => (d.nama || '').toLowerCase().includes(q)); - if (fJalan) return focusFeature('jalan', fJalan.id); - - // 5. Cari Parsil - const fParsil = state.parsil.find(d => (`${d.nama} ${d.pemilik}`).toLowerCase().includes(q)); - if (fParsil) return focusFeature('parsil', fParsil.id); - // Jika tidak ketemu alert('Data "' + q + '" tidak ditemukan.'); } @@ -4124,7 +4083,7 @@ function setMode(m) { cancelDrawing(); state.mode = state.mode === m ? null : m; - ['kemiskinan', 'masjid', 'spbu', 'jalan', 'parsil'].forEach(x => { + ['kemiskinan', 'masjid'].forEach(x => { const el = document.getElementById('btn-' + x); if (el) el.className = 'mbtn'; }); @@ -4134,11 +4093,6 @@ const msgs = { kemiskinan: 'Klik peta untuk menambah data Kemiskinan', masjid: 'Klik peta untuk menambah titik Rumah Ibadah', - spbu: 'Klik peta untuk menambah titik SPBU', - jalan: 'Klik untuk gambar jalan — klik ganda untuk selesai', - parsil: 'Klik untuk gambar parsil — klik titik awal atau dbl-klik selesai', - line: 'Klik untuk gambar jalan — klik ganda untuk selesai', - poly: 'Klik untuk gambar parsil — klik titik awal atau dbl-klik selesai', }; hint.textContent = msgs[m] || 'Klik peta'; hint.classList.add('show'); @@ -4157,14 +4111,9 @@ if (!state.mode) return; if (state.mode === 'kemiskinan') handleKemiskinanClick(e); else if (state.mode === 'masjid') handleMasjidClick(e); - else if (state.mode === 'spbu') handlePointClick(e); - else if (state.mode === 'jalan') handleLineClick(e); - else if (state.mode === 'parsil') handlePolyClick(e); }); map.on('dblclick', function (e) { - if ((state.mode === 'jalan' || state.mode === 'line') && state.drawingLine) finishLine(e); - if ((state.mode === 'parsil' || state.mode === 'poly') && state.drawingPoly) finishPoly(e); - if (['jalan','parsil','line','poly'].includes(state.mode)) L.DomEvent.stopPropagation(e); + }); /* ── MODERN MARKER ICON ── */ @@ -4229,102 +4178,9 @@ window._tmpM = tmpM; } - function savePoint() { + - const nama = document.getElementById('p-nama').value.trim(); - const no = document.getElementById('p-no').value.trim(); - const status = document.getElementById('p-status').value; - const lat = parseFloat(document.getElementById('p-lat').value); - const lng = parseFloat(document.getElementById('p-lng').value); - - if (!nama || !no) { - alert('Lengkapi nama dan nomor SPBU!'); - return; - } - - fetch("api/save_data.php", { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - nama: nama, - no: no, - status: status, - lat: lat, - lng: lng - }) - }) - .then(res => res.json()) - .then(response => { - - if (response.status == "success") { - - const d = { - id: response.id || Date.now(), - nama, - no, - status, - lat, - lng - }; - - state.spbu.push(d); - - renderSPBU(d); - - updateCount('spbu', state.spbu.length); - - addCard( - 'spbu', - d.id, - nama, - 'No: ' + no, - status === 'Ya' ? 'Buka 24 Jam' : 'Tidak Buka 24 Jam', - status === 'Ya' ? '#1a6b3c' : '#b93328' - ); - - if (window._tmpM) { - map.closePopup(); - map.removeLayer(window._tmpM); - window._tmpM = null; - } - - setMode(null); - ensureLayerVisible('spbu', d.id); - focusFeature('spbu', d.id); - - } else { - alert("Gagal menyimpan: " + (response.message || "Periksa database")); - } - - }) - .catch(err => { - console.error(err); - alert("Terjadi error jaringan"); - }); - - } - - function renderSPBU(d) { - const color = d.status === 'Ya' ? '#10b981' : '#ef4444'; - const icon = createModernMarker(color, 'fas fa-gas-pump', d.nama); - const m = L.marker([d.lat, d.lng], { icon, draggable: true }); - m.bindPopup(`
-

${d.nama}

-
-
No. SPBU${d.no}
-
Status${d.status === 'Ya' ? '✔ Buka 24 Jam' : '✖ Tidak Buka 24 Jam'}
-
Koordinat${d.lat.toFixed(5)}, ${d.lng.toFixed(5)}
-
-
- - -
-
`, { autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }); - m.addTo(d.status === 'Ya' ? layers.spbu24 : layers.spbuNon24); - state.featureRefs.spbu[String(d.id)] = m; - } + /* ── JALAN ── */ function handleLineClick(e) { @@ -4337,231 +4193,14 @@ document.getElementById('hint').textContent = `📍 ${state.tempPoints.length} titik — klik ganda untuk selesai`; } - function finishLine(e) { - if (state.tempPoints.length < 2) { alert('Minimal 2 titik!'); return; } - const pts = [...state.tempPoints]; - const len = calcLen(pts); - window._tempLinePts = pts; - window._tempLineLen = len; - clearTemp(); - L.popup({ closeOnClick: false, keepInView: true, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }) - .setLatLng(pts[Math.floor(pts.length / 2)]) - .setContent(`
-

Tambah Jalan

- - - - -
- - Panjang terukur: - ${fmtLen(len)} -
- -
`).addTo(map); - } + - function saveLine() { - const pts = window._tempLinePts || []; - const len = window._tempLineLen || 0; + + - const nama = document.getElementById('j-nama').value.trim(); - const status = document.getElementById('j-status').value; + - if (!nama) { - alert('Isi nama jalan!'); - return; - } - - fetch("api/save_jalan.php", { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - nama: nama, - status: status, - panjang: len, - koordinat: pts - }) - }) - .then(res => res.json()) - .then(response => { - - if (response.status == "success") { - - const d = { - id: response.id || Date.now(), - nama, - status, - pts, - len - }; - - state.jalan.push(d); - - renderJalan(d); - - updateCount('jalan', state.jalan.length); - - addCard( - 'jalan', - d.id, - nama, - status + ' · ' + fmtLen(len), - status, - jColor[status] - ); - - map.closePopup(); - setMode(null); - ensureLayerVisible('jalan', d.id); - focusFeature('jalan', d.id); - - } else { - - // log removed - alert("Gagal simpan jalan"); - - } - - }) - .catch(err => { - // log removed - alert("Error simpan jalan"); - }); - - } - function renderJalan(d) { - - const pts = normalizeLinePoints(d.pts); - if (pts.length < 2) { - // log removed - return; - } - - const c = jColor[d.status] || '#ef4444'; - - const w = - d.status === 'Nasional' ? 6 : - d.status === 'Provinsi' ? 5 : 4; - - const line = L.polyline(pts, { - color: c, - weight: w, - opacity: 0.95, - lineCap: 'round', - lineJoin: 'round', - className: 'path-glow' - }) - .bindPopup(` -
-

${d.nama}

- -
-
- Status - ${d.status} -
-
- Panjang - ${fmtLen(d.len)} -
-
- -
- - -
- -
-`, { autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }) - .addTo(layers.jalan); - - state.featureRefs.jalan[String(d.id)] = line; - - } - - function normalizeLinePoints(raw) { - - let pts = raw; - - if (typeof pts === 'string') { - try { - pts = JSON.parse(pts); - } catch (_) { - return []; - } - } - - // Kompatibilitas data lama: koordinat sempat tersimpan sebagai JSON string di dalam JSON string. - if (typeof pts === 'string') { - try { - pts = JSON.parse(pts); - } catch (_) { - return []; - } - } - - if (!Array.isArray(pts) || pts.length === 0) return []; - - if (Array.isArray(pts[0])) { - return pts - .map(p => [parseFloat(p[0]), parseFloat(p[1])]) - .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1])); - } - - if (pts[0] && typeof pts[0] === 'object' && pts[0].lat !== undefined) { - return pts - .map(p => [parseFloat(p.lat), parseFloat(p.lng)]) - .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1])); - } - - return []; - - } - - function normalizePolyPoints(raw) { - - let pts = raw; - - if (typeof pts === 'string') { - try { - pts = JSON.parse(pts); - } catch (_) { - return []; - } - } - - if (typeof pts === 'string') { - try { - pts = JSON.parse(pts); - } catch (_) { - return []; - } - } - - if (!Array.isArray(pts) || pts.length === 0) return []; - - if (Array.isArray(pts[0])) { - return pts - .map(p => [parseFloat(p[0]), parseFloat(p[1])]) - .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1])); - } - - if (pts[0] && typeof pts[0] === 'object' && pts[0].lat !== undefined) { - return pts - .map(p => [parseFloat(p.lat), parseFloat(p.lng)]) - .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1])); - } - - return []; - - } + /* ── PARSIL ── */ function handlePolyClick(e) { @@ -4585,160 +4224,11 @@ `🗺️ ${state.tempPoints.length} titik — klik titik awal atau dbl-klik selesai`; } - function finishPoly(e) { - if (state.tempPoints.length < 3) { alert('Minimal 3 titik!'); return; } - const pts = [...state.tempPoints]; - const area = calcArea(pts); - window._tempPolyPts = pts; - window._tempPolyArea = area; - clearTemp(); - const center = L.polygon(pts).getBounds().getCenter(); - L.popup({ closeOnClick: false, keepInView: true, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }) - .setLatLng(center) - .setContent(`
-

Tambah Parsil / Lahan

- - - - - - -
- - Luas terukur: - ${fmtArea(area)} -
- -
`).addTo(map); - } + - function saveParsil() { - const pts = window._tempPolyPts || []; - const area = window._tempPolyArea || 0; + - const nama = document.getElementById('ps-nama').value.trim(); - const pemilik = document.getElementById('ps-pemilik').value.trim(); - const status = document.getElementById('ps-status').value; - - if (!nama) { - alert('Isi nama parsil!'); - return; - } - - fetch("api/save_parsil.php", { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - nama: nama, - pemilik: pemilik, - status: status, - luas: area, - koordinat: pts - }) - }) - .then(res => res.json()) - .then(response => { - - if (response.status == "success") { - - const parsil = { - id: response.id || Date.now(), - nama, - pemilik, - status, - pts, - area - }; - - state.parsil.push(parsil); - - renderParsil(parsil); - - updateCount('parsil', state.parsil.length); - - addCard( - 'parsil', - parsil.id, - parsil.nama, - parsil.status, - parsil.status, - '#1a5276' - ); - - map.closePopup(); - setMode(null); - ensureLayerVisible('parsil', parsil.id); - focusFeature('parsil', parsil.id); - - } - - else { - // log removed - alert("Gagal simpan parsil"); - } - - }) - .catch(err => {}); - } - - function renderParsil(d) { - - const pts = normalizePolyPoints(d.pts); - if (pts.length < 3) { - // log removed - return; - } - - const c = pColor[d.status]; - - const poly = L.polygon(pts, { - color: c, - fillColor: c, - fillOpacity: 0.25, - weight: 3, - dashArray: '8, 6', - lineCap: 'round', - lineJoin: 'round', - className: 'parsil-glow' - }) - .bindPopup(` -
-

${d.nama}

- -
-
- Pemilik - ${d.pemilik || '-'} -
-
- Status - ${d.status} -
-
- Luas - ${fmtArea(d.area)} -
-
- -
- - -
- -
-`) - .addTo(layers.parsil); - - state.featureRefs.parsil[String(d.id)] = poly; - - } + function getById(type, id) { return state[type].find(x => String(x.id) === String(id)); @@ -4911,11 +4401,7 @@ } function refreshType(type) { - if (state.geometryEdit && state.geometryEdit.type === type) stopGeometryEdit(); - if (type === 'spbu') { - layers.spbu24.clearLayers(); - layers.spbuNon24.clearLayers(); - } else { + if (state.geometryEdit && state.geometryEdit.type === type) stopGeometryEdit(); else { layers[type].clearLayers(); } state.featureRefs[type] = {}; @@ -4952,31 +4438,7 @@ renderDashboard(); } - function openEditSpbu(id) { - const d = getById('spbu', id); - if (!d) return; - const ref = state.featureRefs.spbu[String(id)]; - const ll = ref && ref.getLatLng ? ref.getLatLng() : { lat: d.lat, lng: d.lng }; - const html = `
-

Edit SPBU

- - - - - - - - - - - -
`; - map.closePopup(); - L.popup({ maxWidth: 290, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng([ll.lat, ll.lng]).setContent(html).openOn(map); - } + function saveEditSpbu(id) { const nama = document.getElementById('e-spbu-nama').value.trim(); @@ -5011,33 +4473,7 @@ .catch(() => alert('Error update SPBU')); } - function openEditJalan(id) { - if (state.geometryEdit && (state.geometryEdit.type !== 'jalan' || String(state.geometryEdit.id) !== String(id))) { - stopGeometryEdit(); - } - const d = getById('jalan', id); - if (!d) return; - const pts = normalizeLinePoints(d.pts); - const ref = state.featureRefs.jalan[String(id)]; - const center = ref && ref.getBounds ? ref.getBounds().getCenter() : map.getCenter(); - const html = `
-

Edit Jalan

- - - - - - - - -
`; - map.closePopup(); - L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng(center).setContent(html).openOn(map); - } + function saveEditJalan(id) { if (state.geometryEdit && state.geometryEdit.type === 'jalan' && String(state.geometryEdit.id) === String(id)) { @@ -5075,36 +4511,7 @@ .catch(() => alert('Error update jalan')); } - function openEditParsil(id) { - if (state.geometryEdit && (state.geometryEdit.type !== 'parsil' || String(state.geometryEdit.id) !== String(id))) { - stopGeometryEdit(); - } - const d = getById('parsil', id); - if (!d) return; - const pts = normalizePolyPoints(d.pts); - const ref = state.featureRefs.parsil[String(id)]; - const center = ref && ref.getBounds ? ref.getBounds().getCenter() : map.getCenter(); - const html = `
-

Edit Parsil

- - - - - - - - - - -
`; - map.closePopup(); - L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng(center).setContent(html).openOn(map); - } + function saveEditParsil(id) { if (state.geometryEdit && state.geometryEdit.type === 'parsil' && String(state.geometryEdit.id) === String(id)) { @@ -5290,10 +4697,6 @@ document.addEventListener("DOMContentLoaded", function () { - loadSPBU(); - loadJalan(); - loadParsil(); - // Kemiskinan butuh data Masjid untuk hitung Blank Spot (merah/hijau) // Jadi pastikan loadMasjid selesai dulu baru loadKemiskinan loadMasjid().then(() => { @@ -5302,120 +4705,11 @@ }); - function loadSPBU() { + - fetch("api/read_data.php") - .then(res => res.json()) - .then(data => { + - data.forEach(d => { - - const spbu = { - id: d.id, - nama: d.nama, - no: d.no, - status: d.status, - lat: parseFloat(d.lat), - lng: parseFloat(d.lng) - }; - - state.spbu.push(spbu); - - renderSPBU(spbu); - - updateCount('spbu', state.spbu.length); - - addCard( - 'spbu', - spbu.id, - spbu.nama, - 'No: ' + spbu.no, - spbu.status === 'Ya' ? 'Buka 24 Jam' : 'Tidak Buka 24 Jam', - spbu.status === 'Ya' ? '#1a6b3c' : '#b93328' - ); - - }); - - }) - .catch(err => {}); - - } - - function loadJalan() { - - fetch("api/read_jalan.php") - .then(res => res.json()) - .then(data => { - - data.forEach(d => { - - const jalan = { - id: d.id, - nama: d.nama, - status: d.status, - len: parseFloat(d.panjang), - pts: d.koordinat - }; - - state.jalan.push(jalan); - - renderJalan(jalan); - - updateCount('jalan', state.jalan.length); - - addCard( - 'jalan', - jalan.id, - jalan.nama, - jalan.status, - jalan.status, - '#e74c3c' - ); - - }); - - }) - .catch(err => {}); - - } - - function loadParsil() { - - fetch("api/read_parsil.php") - .then(res => res.json()) - .then(data => { - - data.forEach(d => { - - const parsil = { - id: d.id, - nama: d.nama, - pemilik: d.pemilik, - status: d.status, - area: parseFloat(d.luas), - pts: d.koordinat - }; - - state.parsil.push(parsil); - - renderParsil(parsil); - - updateCount('parsil', state.parsil.length); - - addCard( - 'parsil', - parsil.id, - parsil.nama, - parsil.status, - parsil.status, - '#1a5276' - ); - - }); - - }) - .catch(err => {}); - } + /* ── KEMISKINAN ── */ function getKemiskinanDraft() { diff --git a/01/index.html.bak b/01/index.html.bak new file mode 100644 index 0000000..cea55b0 --- /dev/null +++ b/01/index.html.bak @@ -0,0 +1,7482 @@ + + + + + + + SiPetaSos — Sistem Informasi Peta Sosial + + + + + + + + + + + +
+ +
+ + Mode Publik — Data KK miskin tidak ditampilkan. + Login untuk akses penuh termasuk peta, daftar, dan pencarian data. + +
+ +
+
+ +
+ SiPetaSos + Sistem Informasi Peta Sosial & Rumah Ibadah +
+
+ +
+ + +
+ +
+
Pilih Jenis Data
+
+ + Data KK Miskin Tambah keluarga miskin +
+
+ + Rumah Ibadah Tambah lokasi ibadah +
+
+
Opsional
+
+ + SPBU Tambah titik SPBU +
+
+ + Jalan Gambar ruas jalan +
+
+ + Parsil / Lahan Gambar area persil +
+
+
+ + + + + + + + + + + +
+
+ +
+
+
Admin
+
Administrator
+
+
+ Profil Saya +
Ganti Sandi
+ Kelola Akun +
+
Keluar
+
+
+ + + + +
+
+ +
+
+
+ + + + + +
+ +
+
+
Area Terproteksi
+
Login diperlukan untuk akses penuh
+
+
+ +
+

Daftar KK miskin dan detail informasi hanya dapat diakses oleh pengguna yang telah masuk ke + sistem.

+
    +
  • + + Daftar lengkap KK miskin +
  • +
  • + + Titik peta interaktif +
  • +
  • + + Ekspor laporan data +
  • +
  • + + Monitoring blank spot +
  • +
+ +  Masuk ke Sistem + +

 Statistik & titik peta dapat dilihat tanpa + login.

+
+
+
+
+
+ + + + + + + + + + + + +