This commit is contained in:
2026-06-08 11:20:30 +07:00
parent bde929158b
commit af593691b2
17 changed files with 143 additions and 469 deletions
-28
View File
@@ -1,28 +0,0 @@
<?php
include "db_config.php";
$columns = [
"ALTER TABLE kemiskinan ADD COLUMN tanggal_lahir DATE NULL AFTER nama_kk",
"ALTER TABLE kemiskinan ADD COLUMN pendidikan VARCHAR(100) NULL AFTER tanggal_lahir",
"ALTER TABLE kemiskinan ADD COLUMN riwayat_penyakit TEXT NULL AFTER pendidikan",
];
foreach ($columns as $sql) {
$result = $conn->query($sql);
preg_match('/ADD COLUMN (\w+)/', $sql, $m);
$colName = $m[1] ?? $sql;
if ($result) {
echo "Kolom $colName: OK\n";
} else {
if ($conn->errno == 1060) {
echo "Kolom $colName: Sudah ada (skip)\n";
} else {
echo "Kolom $colName: GAGAL - " . $conn->error . "\n";
}
}
}
echo "\nDatabase sudah siap!\n";
?>
-24
View File
@@ -1,24 +0,0 @@
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once 'db_config.php';
$res = $conn->query("SHOW TABLES");
if($res) {
while($row = $res->fetch_array()) {
echo $row[0] . "<br>";
}
} else {
echo "Error showing tables: " . $conn->error;
}
echo "<hr>";
$sql = "INSERT INTO spbu (nama,no,status,lat,lng) VALUES ('Test','123','Ya','0','0')";
if($conn->query($sql)){
echo "Insert SPBU success: ID " . $conn->insert_id;
}else{
echo "Insert SPBU error: " . $conn->error;
}
?>
-15
View File
@@ -1,15 +0,0 @@
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json');
$raw = file_get_contents("php://input");
echo json_encode([
"raw_input" => $raw,
"json_decoded" => json_decode($raw, true),
"json_error" => json_last_error_msg(),
"request_method" => $_SERVER['REQUEST_METHOD'],
"content_type" => $_SERVER['CONTENT_TYPE'] ?? 'not set',
]);
?>
-46
View File
@@ -1,46 +0,0 @@
<?php
require_once 'db_config.php';
$sqls = [
"CREATE TABLE IF NOT EXISTS spbu (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
no VARCHAR(60) NOT NULL,
status ENUM('Ya','Tidak') NOT NULL DEFAULT 'Tidak',
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"CREATE TABLE IF NOT EXISTS jalan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
status ENUM('Nasional','Provinsi','Kabupaten') NOT NULL DEFAULT 'Kabupaten',
panjang DECIMAL(12,2) NOT NULL DEFAULT 0,
koordinat LONGTEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"CREATE TABLE IF NOT EXISTS parsil (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
pemilik VARCHAR(200) NOT NULL,
status ENUM('SHM','HGB','Sewa','Lainnya') NOT NULL DEFAULT 'SHM',
luas DECIMAL(14,2) NOT NULL DEFAULT 0,
koordinat LONGTEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
];
foreach($sqls as $sql) {
if ($conn->query($sql) === TRUE) {
echo "Tabel berhasil dibuat/diperbarui.<br>";
} else {
echo "Error: " . $conn->error . "<br>";
}
}
echo "Selesai!";
?>
-19
View File
@@ -1,19 +0,0 @@
<?php
include "db_config.php";
// Cek data user walikota
$r = $conn->query("SELECT username, nama_lengkap, role FROM users WHERE username='walikota'");
$row = $r->fetch_assoc();
echo "Data di DB:\n";
print_r($row);
// Fix: update role ke walikota jika salah
$fix = $conn->query("UPDATE users SET role='walikota' WHERE username='walikota'");
echo "\nUpdate role: " . ($fix ? "OK (affected: ".$conn->affected_rows.")" : "GAGAL - ".$conn->error) . "\n";
// Cek lagi setelah fix
$r2 = $conn->query("SELECT username, nama_lengkap, role FROM users WHERE username='walikota'");
$row2 = $r2->fetch_assoc();
echo "\nData setelah fix:\n";
print_r($row2);
?>
-49
View File
@@ -1,49 +0,0 @@
CREATE DATABASE IF NOT EXISTS kemiskinan_ibadah
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE kemiskinan_ibadah;
DROP TABLE IF EXISTS rumah_ibadah;
DROP TABLE IF EXISTS kemiskinan;
CREATE TABLE kemiskinan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_kk VARCHAR(200) NOT NULL,
jumlah_kk INT NOT NULL DEFAULT 1,
alamat TEXT NOT NULL,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_rumah_ibadah VARCHAR(200) NOT NULL,
penanggung_jawab VARCHAR(200) NOT NULL,
alamat TEXT NOT NULL,
radius INT NOT NULL DEFAULT 500,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO kemiskinan (nama_kk, jumlah_kk, alamat, lat, lng) VALUES
('Siti Aminah', 4, 'Jl. Tanjung Raya II, Pontianak Timur', -0.0268500, 109.3611200),
('Budi Santoso', 5, 'Jl. Panglima Aim, Pontianak Timur', -0.0314200, 109.3553800),
('Rohani', 3, 'Gg. Karya Bakti, Pontianak Kota', -0.0226400, 109.3337600),
('M. Yusuf', 6, 'Jl. Kom Yos Sudarso, Pontianak Barat', -0.0149800, 109.3079200),
('Nurhayati', 2, 'Jl. Imam Bonjol, Pontianak Selatan', -0.0412200, 109.3420600),
('Hendra Saputra', 4, 'Jl. Parit H. Husin II, Pontianak Tenggara', -0.0556100, 109.3659200),
('Ramlah', 5, 'Jl. Gusti Situt Mahmud, Pontianak Utara', 0.0021400, 109.3288800),
('Agus Salim', 3, 'Jl. Sungai Raya Dalam, Pontianak Tenggara', -0.0614600, 109.3785400);
INSERT INTO rumah_ibadah (nama_rumah_ibadah, penanggung_jawab, alamat, radius, lat, lng) VALUES
('Masjid Raya Mujahidin', 'H. Ahmad Fauzi', 'Jl. Jenderal Ahmad Yani, Pontianak', 800, -0.0446400, 109.3369800),
('Gereja Katedral Santo Yosef', 'Pastor Markus', 'Jl. Pattimura, Pontianak Kota', 650, -0.0241300, 109.3374500),
('Vihara Bodhisatva Karaniya Metta', 'Lina Wijaya', 'Jl. Sultan Muhammad, Pontianak Kota', 500, -0.0212600, 109.3413400),
('Masjid Jami Sultan Syarif Abdurrahman', 'H. Sulaiman', 'Kampung Beting, Pontianak Timur', 700, -0.0264100, 109.3567600),
('Gereja HKBP Pontianak', 'St. Daniel Simanjuntak', 'Jl. Gajah Mada, Pontianak Selatan', 550, -0.0356200, 109.3459600),
('Pura Giripati Mulawarman', 'I Wayan Sudana', 'Jl. Adi Sucipto, Pontianak Tenggara', 500, -0.0643600, 109.3774200);
-50
View File
@@ -1,50 +0,0 @@
<?php
// Script ini hanya dijalankan SEKALI untuk membuat tabel users dan akun admin default.
// Hapus file ini setelah selesai dijalankan.
require_once 'db_config.php';
// 1. Buat tabel users
$sql_table = "CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
nama_lengkap VARCHAR(200) NOT NULL,
role ENUM('admin','operator') NOT NULL DEFAULT 'operator',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
if ($conn->query($sql_table)) {
echo "<p style='color:green'>✓ Tabel <strong>users</strong> berhasil dibuat.</p>";
} else {
echo "<p style='color:red'>✗ Gagal membuat tabel users: " . $conn->error . "</p>";
}
// 2. Insert akun admin default (password: admin123)
$password_hash = password_hash('admin123', PASSWORD_BCRYPT);
$stmt = $conn->prepare("INSERT IGNORE INTO users (username, password, nama_lengkap, role) VALUES (?, ?, ?, 'admin')");
$username = 'admin';
$nama = 'Administrator';
$stmt->bind_param('sss', $username, $password_hash, $nama);
if ($stmt->execute()) {
if ($stmt->affected_rows > 0) {
echo "<p style='color:green'>✓ Akun admin berhasil dibuat.</p>";
} else {
echo "<p style='color:orange'>⚠ Akun admin sudah ada (tidak diubah).</p>";
}
} else {
echo "<p style='color:red'>✗ Gagal membuat akun admin: " . $stmt->error . "</p>";
}
$stmt->close();
$conn->close();
echo "<hr>";
echo "<p><strong>Kredensial Login:</strong></p>";
echo "<p>Username: <code>admin</code></p>";
echo "<p>Password: <code>admin123</code></p>";
echo "<hr>";
echo "<p style='color:red'><strong>PENTING:</strong> Hapus file ini setelah setup selesai!</p>";
?>
-14
View File
@@ -1,14 +0,0 @@
USE kemiskinan_ibadah;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
nama_lengkap VARCHAR(200) NOT NULL,
role ENUM('admin','operator') NOT NULL DEFAULT 'operator',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Password default: admin123 (bcrypt hashed)
INSERT IGNORE INTO users (username, password, nama_lengkap, role) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Administrator', 'admin');
-27
View File
@@ -1,27 +0,0 @@
<?php
require_once 'db_config.php';
$sql = "
CREATE TABLE IF NOT EXISTS warga (
id INT AUTO_INCREMENT PRIMARY KEY,
kemiskinan_id INT NOT NULL,
nik VARCHAR(50) DEFAULT NULL,
nama_warga VARCHAR(200) NOT NULL,
hubungan_keluarga VARCHAR(100) DEFAULT NULL,
tanggal_lahir DATE DEFAULT NULL,
pendidikan VARCHAR(100) DEFAULT NULL,
riwayat_penyakit TEXT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (kemiskinan_id) REFERENCES kemiskinan(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
";
if ($conn->query($sql) === TRUE) {
echo "Table 'warga' created successfully\n";
} else {
echo "Error creating table: " . $conn->error . "\n";
}
$conn->close();
?>
-60
View File
@@ -1,60 +0,0 @@
CREATE DATABASE IF NOT EXISTS webgis
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE webgis;
CREATE TABLE IF NOT EXISTS spbu (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
no VARCHAR(60) NOT NULL,
status ENUM('Ya','Tidak') NOT NULL DEFAULT 'Tidak',
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS jalan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
status ENUM('Nasional','Provinsi','Kabupaten') NOT NULL DEFAULT 'Kabupaten',
panjang DECIMAL(12,2) NOT NULL DEFAULT 0,
koordinat LONGTEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS parsil (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL,
pemilik VARCHAR(200) NOT NULL,
status ENUM('SHM','HGB','Sewa','Lainnya') NOT NULL DEFAULT 'SHM',
luas DECIMAL(14,2) NOT NULL DEFAULT 0,
koordinat LONGTEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS kemiskinan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_kk VARCHAR(200) NOT NULL,
jumlah_kk INT NOT NULL DEFAULT 1,
alamat TEXT NOT NULL,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS masjid (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_masjid VARCHAR(200) NOT NULL,
pic_masjid VARCHAR(200) NOT NULL,
alamat_masjid TEXT NOT NULL,
radius INT NOT NULL DEFAULT 500,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-5
View File
@@ -1,5 +0,0 @@
<?php
require 'db_config.php';
$res = $conn->query('DESCRIBE jalan');
while($row = $res->fetch_assoc()) echo json_encode($row)."\n";
?>
-11
View File
@@ -1,11 +0,0 @@
<?php
require 'db_config.php';
$stmt = $conn->prepare("INSERT INTO jalan (nama, status, panjang, koordinat) VALUES (?, ?, ?, ?)");
$nama = 'Test';
$status = 'Jalan Kabupaten';
$panjang = 10;
$koordinat = '[]';
$stmt->bind_param("ssds", $nama, $status, $panjang, $koordinat);
$stmt->execute();
echo $stmt->error;
?>
-38
View File
@@ -1,38 +0,0 @@
USE kemiskinan_ibadah;
-- 1. Update USERS table role ENUM
ALTER TABLE users MODIFY COLUMN role ENUM('admin', 'operator', 'walikota') NOT NULL DEFAULT 'operator';
-- 2. Add walikota user (password: walikota123, hash generated previously or will generate)
-- Let's use the hash for 'walikota123': $2y$10$w6QO8q/s28pX83JgY3WvM.Hw2N2G1aN9M0iR8L7Pq4z8i5u0N72E. (Wait, let's just create a PHP script to insert to avoid hash issues)
-- 3. Modify KEMISKINAN table
ALTER TABLE kemiskinan
ADD COLUMN tanggal_lahir DATE NULL AFTER nama_kk,
ADD COLUMN pendidikan VARCHAR(100) NULL AFTER tanggal_lahir,
ADD COLUMN riwayat_penyakit TEXT NULL AFTER pendidikan;
-- 4. Create LAPORAN_MASYARAKAT table
CREATE TABLE IF NOT EXISTS laporan_masyarakat (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(150) NOT NULL,
kontak VARCHAR(50) NULL,
deskripsi_laporan TEXT NOT NULL,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
foto VARCHAR(255) NULL,
status ENUM('menunggu', 'diproses', 'selesai') NOT NULL DEFAULT 'menunggu',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 5. Create HISTORI_BANTUAN table
CREATE TABLE IF NOT EXISTS histori_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
kemiskinan_id INT NOT NULL,
jenis_bantuan VARCHAR(150) NOT NULL,
tanggal DATE NOT NULL,
keterangan TEXT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kemiskinan_id) REFERENCES kemiskinan(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+11 -1
View File
@@ -10,7 +10,6 @@ $jumlah_kk = isset($data['jumlah_kk']) ? intval($data['jumlah_kk']) :
$alamat = $conn->real_escape_string($data['alamat'] ?? '');
$lat = isset($data['lat']) ? floatval($data['lat']) : 0;
$lng = isset($data['lng']) ? floatval($data['lng']) : 0;
// Kolom baru
$tanggal_lahir = $conn->real_escape_string($data['tanggal_lahir'] ?? '');
$pendidikan = $conn->real_escape_string($data['pendidikan'] ?? '');
$riwayat_penyakit = $conn->real_escape_string($data['riwayat_penyakit'] ?? '');
@@ -22,6 +21,7 @@ if ($id <= 0 || $nama_kk === '') {
$tgl_val = !empty($tanggal_lahir) ? "'$tanggal_lahir'" : "NULL";
// 1. Update tabel kemiskinan
$sql = "UPDATE kemiskinan SET
nama_kk='$nama_kk',
jumlah_kk=$jumlah_kk,
@@ -34,8 +34,18 @@ $sql = "UPDATE kemiskinan SET
WHERE id=$id";
if ($conn->query($sql)) {
// 2. Sync data ke tabel warga (baris Kepala Keluarga)
$sql_warga = "UPDATE warga SET
nama_warga='$nama_kk',
tanggal_lahir=$tgl_val,
pendidikan='$pendidikan',
riwayat_penyakit='$riwayat_penyakit'
WHERE kemiskinan_id=$id AND hubungan_keluarga='Kepala Keluarga'";
$conn->query($sql_warga);
echo json_encode(["status" => "success"]);
} else {
echo json_encode(["status" => "error", "message" => $conn->error]);
}
?>
+132 -62
View File
@@ -4098,9 +4098,9 @@
map.fitBounds(bounds, { padding: [24, 24], maxZoom: 13 });
}
console.log('Layer kecamatan berhasil dimuat:', kecLayer.getLayers().length, 'fitur');
// log removed
})
.catch(err => console.log('Admin Kecamatan Error:', err));
.catch(err => {});
}
/* ── MODE ── */
@@ -4402,19 +4402,19 @@
map.closePopup();
setMode(null);
ensureLayerVisible('jalan', jalan.id);
focusFeature('jalan', jalan.id);
ensureLayerVisible('jalan', d.id);
focusFeature('jalan', d.id);
} else {
console.log(response);
// log removed
alert("Gagal simpan jalan");
}
})
.catch(err => {
console.log(err);
// log removed
alert("Error simpan jalan");
});
@@ -4423,7 +4423,7 @@
const pts = normalizeLinePoints(d.pts);
if (pts.length < 2) {
console.log('Format koordinat jalan tidak valid:', d.pts);
// log removed
return;
}
@@ -4663,19 +4663,19 @@
}
else {
console.log(response);
// log removed
alert("Gagal simpan parsil");
}
})
.catch(err => console.log("Parsil Error:", err));
.catch(err => {});
}
function renderParsil(d) {
const pts = normalizePolyPoints(d.pts);
if (pts.length < 3) {
console.log('Format koordinat parsil tidak valid:', d.pts);
// log removed
return;
}
@@ -4904,7 +4904,7 @@
state.featureRefs[type] = {};
if (type === 'kemiskinan') state.kkLayerRefs = {};
const list = document.getElementById('list-' + type);
list.querySelectorAll('.dcard').forEach(x => x.remove());
if (list) list.querySelectorAll('.dcard').forEach(x => x.remove());
state[type].forEach(d => {
if (type === 'spbu') {
@@ -5320,7 +5320,7 @@
});
})
.catch(err => console.log("SPBU Error:", err));
.catch(err => {});
}
@@ -5358,7 +5358,7 @@
});
})
.catch(err => console.log("Jalan Error:", err));
.catch(err => {});
}
@@ -5397,7 +5397,7 @@
});
})
.catch(err => console.log("Parsil Error:", err));
.catch(err => {});
}
/* ── KEMISKINAN ── */
@@ -5522,6 +5522,22 @@
<label>Jumlah Jiwa <span class="req">*</span></label>
<input type="number" id="k-jumlah" value="${escapeAttr(draft.jumlah_kk || '1')}" min="1" oninput="window._kkVulnUpdate()">
</div>
<div class="km-field">
<label>Tanggal Lahir</label>
<input type="date" id="k-tgl-lahir">
</div>
<div class="km-field">
<label>Pendidikan Terakhir</label>
<select id="k-pendidikan">
<option value="">-- Pilih Pendidikan --</option>
<option value="Tidak Sekolah">Tidak Sekolah</option>
<option value="SD/Sederajat">SD/Sederajat</option>
<option value="SMP/Sederajat">SMP/Sederajat</option>
<option value="SMA/Sederajat">SMA/Sederajat</option>
<option value="D3/S1">D3/S1</option>
<option value="S2/S3">S2/S3</option>
</select>
</div>
<div class="km-field">
<label>Alamat <span class="req">*</span></label>
<input id="k-alamat" placeholder="Alamat" value="${escapeAttr(draft.alamat)}">
@@ -5654,13 +5670,13 @@
renderDashboard();
if (window._tmpM) { map.closePopup(); map.removeLayer(window._tmpM); window._tmpM = null; }
setMode(null);
ensureLayerVisible('jalan', jalan.id);
focusFeature('jalan', jalan.id);
ensureLayerVisible('kemiskinan', d.id);
focusFeature('kemiskinan', d.id);
} else {
alert("Gagal simpan: " + (response.message || 'Error'));
}
})
.catch(err => { console.log(err); alert("Terjadi error"); });
.catch(err => { alert("Terjadi error"); });
}
function renderKemiskinan(d) {
@@ -5762,64 +5778,114 @@
});
renderDashboard();
if (state.masjid.length) refreshType('masjid');
}).catch(err => console.log("Kemiskinan Error:", err));
}).catch(err => {});
}
function openEditKemiskinan(id) {
const d = getById('kemiskinan', id);
if (!d) return;
const existing = document.getElementById('ek-overlay');
if (existing) existing.remove();
const pendOpts = ['', 'Tidak Sekolah', 'SD/Sederajat', 'SMP/Sederajat', 'SMA/Sederajat', 'D3/S1', 'S2/S3'];
const pendSelects = pendOpts.map(v => `<option value="${v}" ${d.pendidikan === v ? 'selected' : ''}>${v || '-- Pilih Pendidikan --'}</option>`).join('');
const html = `<div class="pf" style="width:300px">
<h4><i class="fas fa-edit" style="color:var(--amber)"></i> Edit KK Miskin</h4>
<label>Nama Kepala Keluarga</label>
<input id="e-k-nama" value="${(d.nama_kk || '').replace(/"/g, '&quot;')}">
<label>Jumlah Jiwa</label>
<input type="number" id="e-k-jumlah" value="${d.jumlah_kk}" min="1">
<label>Tanggal Lahir</label>
<input type="date" id="e-k-tgl-lahir" value="${d.tanggal_lahir || ''}">
<label>Pendidikan Terakhir</label>
<select id="e-k-pendidikan">${pendSelects}</select>
<label>Alamat</label>
<textarea id="e-k-alamat">${(d.alamat || '').replace(/</g, '&lt;')}</textarea>
<label>Riwayat Penyakit</label>
<textarea id="e-k-riwayat" rows="2">${(d.riwayat_penyakit || '').replace(/</g, '&lt;')}</textarea>
<label>Latitude</label>
<input id="e-k-lat" value="${Number(d.lat).toFixed(6)}">
<label>Longitude</label>
<input id="e-k-lng" value="${Number(d.lng).toFixed(6)}">
<label>Status Penanganan</label>
<select id="e-k-status">
<option ${getKKStatus(id) === 'Belum Ditangani' ? 'selected' : ''}>Belum Ditangani</option>
<option ${getKKStatus(id) === 'Diproses' ? 'selected' : ''}>Diproses</option>
<option ${getKKStatus(id) === 'Sudah Ditangani' ? 'selected' : ''}>Sudah Ditangani</option>
</select>
<button class="pbtn pbtn-y" onclick="saveEditKemiskinan(${id})">Simpan Perubahan</button>
</div>`;
map.closePopup();
L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng([d.lat, d.lng]).setContent(html).openOn(map);
const curStatus = getKKStatus(id);
const overlay = document.createElement('div');
overlay.className = 'hb-overlay';
overlay.id = 'ek-overlay';
overlay.innerHTML = `
<div class="hb-box" style="max-width:520px">
<div class="hb-head" style="background:linear-gradient(135deg,#f59e0b,#d97706)">
<div class="hb-head-icon"><i class="fas fa-user-edit"></i></div>
<div style="flex:1;min-width:0">
<div class="hb-head-title">Edit Data KK Miskin</div>
<div style="font-size:11px;opacity:.8;margin-top:1px">${escapeText(d.nama_kk)}</div>
</div>
<button class="hb-head-close" onclick="document.getElementById('ek-overlay').remove()">
<i class="fas fa-times"></i>
</button>
</div>
<div class="hb-body">
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="km-field" style="grid-column:1/-1">
<label>Nama Kepala Keluarga *</label>
<input id="ek-nama" value="${(d.nama_kk || '').replace(/"/g, '&quot;')}" placeholder="Nama lengkap">
</div>
<div class="km-field">
<label>Jumlah Jiwa *</label>
<input type="number" id="ek-jumlah" value="${d.jumlah_kk}" min="1">
</div>
<div class="km-field">
<label>Tanggal Lahir</label>
<input type="date" id="ek-tgl-lahir" value="${d.tanggal_lahir || ''}">
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Pendidikan Terakhir</label>
<select id="ek-pendidikan">${pendSelects}</select>
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Alamat *</label>
<textarea id="ek-alamat" rows="2" style="resize:vertical">${(d.alamat || '').replace(/</g, '&lt;')}</textarea>
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Riwayat Penyakit</label>
<textarea id="ek-riwayat" rows="2" style="resize:vertical">${(d.riwayat_penyakit || '').replace(/</g, '&lt;')}</textarea>
</div>
<div class="km-field">
<label>Latitude</label>
<input id="ek-lat" value="${Number(d.lat).toFixed(6)}" style="font-family:monospace;font-size:12px">
</div>
<div class="km-field">
<label>Longitude</label>
<input id="ek-lng" value="${Number(d.lng).toFixed(6)}" style="font-family:monospace;font-size:12px">
</div>
<div class="km-field" style="grid-column:1/-1">
<label>Status Penanganan</label>
<select id="ek-status">
<option value="Belum Ditangani" ${curStatus === 'Belum Ditangani' ? 'selected' : ''}>Belum Ditangani</option>
<option value="Diproses" ${curStatus === 'Diproses' ? 'selected' : ''}>Diproses</option>
<option value="Sudah Ditangani" ${curStatus === 'Sudah Ditangani' ? 'selected' : ''}>Sudah Ditangani</option>
</select>
</div>
<button class="hb-submit" style="grid-column:1/-1;background:linear-gradient(135deg,#f59e0b,#d97706)" onclick="saveEditKemiskinan(${id})">
<i class="fas fa-save"></i> Simpan Perubahan
</button>
</div>
</div>
</div>`;
document.body.appendChild(overlay);
// Close on backdrop click
overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
}
function saveEditKemiskinan(id) {
const nama_kk = document.getElementById('e-k-nama').value.trim();
const jumlah_kk = document.getElementById('e-k-jumlah').value.trim();
const alamat = document.getElementById('e-k-alamat').value.trim();
const lat = parseFloat(document.getElementById('e-k-lat').value);
const lng = parseFloat(document.getElementById('e-k-lng').value);
const status = document.getElementById('e-k-status')?.value || getKKStatus(id);
const tanggal_lahir = document.getElementById('e-k-tgl-lahir')?.value || '';
const pendidikan = document.getElementById('e-k-pendidikan')?.value || '';
const riwayat_penyakit = document.getElementById('e-k-riwayat')?.value.trim() || '';
const nama_kk = document.getElementById('ek-nama')?.value.trim();
const jumlah_kk = document.getElementById('ek-jumlah')?.value.trim();
const alamat = document.getElementById('ek-alamat')?.value.trim();
const lat = parseFloat(document.getElementById('ek-lat')?.value);
const lng = parseFloat(document.getElementById('ek-lng')?.value);
const status = document.getElementById('ek-status')?.value || getKKStatus(id);
const tanggal_lahir = document.getElementById('ek-tgl-lahir')?.value || '';
const pendidikan = document.getElementById('ek-pendidikan')?.value || '';
const riwayat_penyakit = document.getElementById('ek-riwayat')?.value.trim() || '';
if (!nama_kk || !jumlah_kk || !alamat || !Number.isFinite(lat) || !Number.isFinite(lng)) {
alert('Data belum valid'); return;
alert('Lengkapi data: Nama, Jumlah Jiwa, dan Alamat wajib diisi!'); return;
}
const btn = document.querySelector('#ek-overlay .hb-submit');
if (btn) { btn.disabled = true; btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Menyimpan...'; }
fetch('api/update_kemiskinan.php', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, nama_kk, jumlah_kk, alamat, lat, lng, tanggal_lahir, pendidikan, riwayat_penyakit })
}).then(res => res.json()).then(resp => {
if (resp.status !== 'success') { alert('Gagal update'); return; }
if (resp.status !== 'success') {
alert('Gagal menyimpan: ' + (resp.message || 'Error'));
if (btn) { btn.disabled = false; btn.innerHTML = '<i class="fas fa-save"></i> Simpan Perubahan'; }
return;
}
const d = getById('kemiskinan', id); if (!d) return;
d.nama_kk = nama_kk; d.jumlah_kk = parseInt(jumlah_kk); d.alamat = alamat; d.lat = lat; d.lng = lng;
d.tanggal_lahir = tanggal_lahir; d.pendidikan = pendidikan; d.riwayat_penyakit = riwayat_penyakit;
@@ -5827,16 +5893,20 @@
const mapStatus = getStatusMap();
mapStatus[String(id)] = status;
localStorage.setItem(statusStoreKey, JSON.stringify(mapStatus));
// Simpan status ke database
fetch('api/update_status_kemiskinan.php', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: parseInt(id), status })
}).catch(() => console.warn('Gagal simpan status ke DB'));
}).catch(() => {});
renderDashboard();
refreshType('kemiskinan');
map.closePopup();
document.getElementById('ek-overlay')?.remove();
showToast('✅ Data berhasil disimpan', 'success');
focusFeature('kemiskinan', id);
}).catch(() => alert('Error update data'));
}).catch(() => {
alert('Error jaringan, coba lagi');
if (btn) { btn.disabled = false; btn.innerHTML = '<i class="fas fa-save"></i> Simpan Perubahan'; }
});
}
/* ── MASJID ── */
@@ -5983,7 +6053,7 @@
if (window._tmpC) { map.removeLayer(window._tmpC); window._tmpC = null; }
setMode(null);
} else { alert("Gagal simpan database"); }
}).catch(err => { console.log(err); alert("Terjadi error"); });
}).catch(err => { alert("Terjadi error"); });
}
function renderMasjid(d) {
@@ -6046,7 +6116,7 @@
addCard('masjid', m.id, m.nama_masjid, m.pic_masjid, 'Rumah Ibadah', '#0f6250');
});
renderDashboard();
}).catch(err => console.log("Masjid Error:", err));
}).catch(err => {});
}
function openEditMasjid(id) {
-10
View File
@@ -1,10 +0,0 @@
<?php
$ch = curl_init('http://localhost/webtugas/01/api/save_jalan.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"nama":"Jl. Test","status":"Kabupaten","panjang":100,"koordinat":[[0,0]]}');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$res = curl_exec($ch);
echo "RAW RESPONSE: |" . $res . "|\n";
echo "JSON DECODE: " . (json_decode($res) ? "OK" : json_last_error_msg());
?>
-10
View File
@@ -1,10 +0,0 @@
<?php
$ch = curl_init('http://localhost/webtugas/01/api/save_jalan.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"nama":"Jl. Test","status":"Jalan Kabupaten","panjang":100,"koordinat":[[0,0]]}');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$res = curl_exec($ch);
echo "RAW RESPONSE: |" . $res . "|\n";
echo "JSON DECODE: " . (json_decode($res) ? "OK" : json_last_error_msg());
?>