mengubah sistem menjadi lebih terfokus ke poverty

This commit is contained in:
Abimanyu Ridho
2026-06-11 01:50:37 +07:00
parent 739e360018
commit 468541b1c8
46 changed files with 5753 additions and 2805 deletions
+119
View File
@@ -0,0 +1,119 @@
<div class="dashboard-content">
<!-- Page Header -->
<div class="page-header">
<div class="page-title-group">
<h1>👥 Daftar Penduduk Miskin</h1>
<p>Data lengkap seluruh penduduk miskin yang terdata dalam sistem.</p>
</div>
<div class="page-actions">
<button class="btn btn-ghost" id="btn-export" onclick="exportCSV()">📥 Ekspor CSV</button>
<button class="btn btn-primary admin-only" onclick="window.location.href='?page=map'"> Tambah Data</button>
</div>
</div>
<!-- Summary Stats -->
<div class="summary-bar" id="summary-bar">
<div class="summary-item">
<div class="summary-icon purple">👥</div>
<div>
<div class="summary-val" id="sum-total"></div>
<div class="summary-label">Total KK</div>
</div>
</div>
<div class="summary-item">
<div class="summary-icon purple">👨‍👩‍👧‍👦</div>
<div>
<div class="summary-val" id="sum-jiwa"></div>
<div class="summary-label">Total Jiwa</div>
</div>
</div>
<div class="summary-item">
<div class="summary-icon green"></div>
<div>
<div class="summary-val" id="sum-dalam"></div>
<div class="summary-label">Dalam Radius</div>
</div>
</div>
<div class="summary-item">
<div class="summary-icon red"></div>
<div>
<div class="summary-val" id="sum-luar"></div>
<div class="summary-label">Luar Radius</div>
</div>
</div>
<div class="summary-item">
<div class="summary-icon blue">🎁</div>
<div>
<div class="summary-val" id="sum-bantuan"></div>
<div class="summary-label">Penerima Bantuan</div>
</div>
</div>
</div>
<!-- Filter Bar -->
<div class="filter-bar">
<div class="filter-search">
<span class="filter-search-icon"></span>
<input type="search" id="search-input" placeholder="Cari nama, NIK, atau alamat…" autocomplete="off"
oninput="applyFilters()">
</div>
<select class="filter-select" id="filter-proximity" onchange="applyFilters()">
<option value="">Semua Status</option>
<option value="dalam_radius">Dalam Radius</option>
<option value="luar_radius">Luar Radius</option>
</select>
<select class="filter-select" id="filter-ri" onchange="applyFilters()">
<option value="">Semua Rumah Ibadah</option>
</select>
<select class="filter-select" id="filter-bantuan" onchange="applyFilters()">
<option value="">Semua Bantuan</option>
<option value="pernah">Pernah Menerima</option>
<option value="belum">Belum Pernah</option>
</select>
<span class="filter-count" id="filter-count"></span>
</div>
<!-- Table -->
<div class="table-container">
<div class="table-scrollwrap">
<table class="pm-table" id="pm-table">
<thead>
<tr>
<th onclick="sortBy('nama')">Nama <span class="sort-icon"></span></th>
<th onclick="sortBy('nik')">NIK <span class="sort-icon"></span></th>
<th onclick="sortBy('jumlah_anggota')">Keluarga <span class="sort-icon"></span></th>
<th>Status</th>
<th>Rumah Ibadah</th>
<th onclick="sortBy('total_bantuan')">Bantuan <span class="sort-icon"></span></th>
<th>Aksi</th>
</tr>
</thead>
<tbody id="pm-tbody">
<tr>
<td colspan="7" class="loading" style="text-align:center;padding:40px"><span class="spinner"></span>
Memuat data…</td>
</tr>
</tbody>
</table>
</div>
<div class="pagination" id="pagination" style="display:none">
<div class="pagination-info" id="pagination-info"></div>
<div class="pagination-btns" id="pagination-btns"></div>
</div>
</div>
</div>
<div class="detail-overlay" id="detail-overlay" onclick="closeDrawer(event)">
<div class="detail-drawer" id="detail-drawer">
<div class="drawer-head">
<h2 id="drawer-title">Detail Penduduk Miskin</h2>
<button class="drawer-close" onclick="closeDrawer()"></button>
</div>
<div class="drawer-body" id="drawer-body">
<div class="loading-spinner-wrap"><span class="spinner" style="width:20px;height:20px;border-width:3px;"></span>
</div>
</div>
</div>
</div>
+114
View File
@@ -0,0 +1,114 @@
<div class="dashboard-content">
<!-- Dashboard Header -->
<header class="dashboard-header">
<div class="dashboard-title">
<h1 id="greeting-title">Selamat Datang</h1>
<p>Berikut adalah ringkasan data WebGIS Poverty saat ini.</p>
</div>
<div class="dashboard-date" id="current-date">Rabu, 10 Juni 2026</div>
</header>
<!-- KPI Stat Cards Grid -->
<section class="stats-grid">
<!-- Stat Card 1 -->
<div class="stat-card">
<div class="stat-icon purple">👥</div>
<div class="stat-details">
<div class="stat-label">Penduduk Miskin</div>
<div class="stat-val" id="pm-total-kk">0 KK</div>
<div class="stat-sub" id="pm-total-jiwa">0 Jiwa terdata</div>
</div>
</div>
<!-- Stat Card 2 -->
<div class="stat-card">
<div class="stat-icon green"></div>
<div class="stat-details">
<div class="stat-label">Rumah Ibadah</div>
<div class="stat-val" id="ri-total">0</div>
<div class="stat-sub">Rumah ibadah terdaftar</div>
</div>
</div>
<!-- Stat Card 5 -->
<div class="stat-card">
<div class="stat-icon rose">🎁</div>
<div class="stat-details">
<div class="stat-label">Bantuan Sosial</div>
<div class="stat-val" id="lb-total-count">0 kali</div>
<div class="stat-sub" id="lb-total-nilai">Total Rp 0</div>
</div>
</div>
</section>
<!-- Charts Visualization Section Grid -->
<section class="charts-grid">
<!-- Chart 1: Proximity Analysis -->
<div class="chart-card">
<h3 class="chart-title">Analisis Kedekatan Warga Miskin (Proximity)</h3>
<div class="chart-container">
<canvas id="chart-proximity"></canvas>
</div>
</div>
<!-- Chart 2: Aid Distribution Type -->
<div class="chart-card">
<h3 class="chart-title">Distribusi Tipe Bantuan Sosial</h3>
<div class="chart-container">
<canvas id="chart-bantuan-tipe"></canvas>
</div>
</div>
</section>
<!-- Data Tables Grid -->
<section class="tables-grid">
<!-- Table 1: Recent Activity (Log Bantuan Terbaru) -->
<div class="table-card">
<h3 class="table-title">Aktivitas Penyaluran Bantuan Terbaru</h3>
<div class="db-table-wrapper">
<table class="db-table">
<thead>
<tr>
<th>Tanggal</th>
<th>Penerima</th>
<th>Tipe Bantuan</th>
<th>Sub Kategori</th>
<th>Nilai (Rp)</th>
<th>Penyalur</th>
</tr>
</thead>
<tbody id="table-bantuan-body">
<tr>
<td colspan="6" class="loading">Memuat data aktivitas...</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Table 2: Top Active Houses of Worship -->
<div class="table-card">
<h3 class="table-title">Rumah Ibadah Penyalur Teraktif</h3>
<div class="db-table-wrapper">
<table class="db-table">
<thead>
<tr>
<th>Nama Rumah Ibadah</th>
<th>Frekuensi</th>
<th>Total Nilai (Rp)</th>
</tr>
</thead>
<tbody id="table-ri-body">
<tr>
<td colspan="3" class="loading">Memuat data penyalur...</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
</div>
+110
View File
@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Masuk - WebGIS Poverty Mapping</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="css/layout.css">
<link rel="stylesheet" href="css/components.css">
<style>
/* Ensure the login page body is visible immediately */
body {
display: flex !important;
visibility: visible !important;
opacity: 1 !important;
}
</style>
</head>
<body class="login-body">
<div class="login-container">
<div class="login-header">
<span class="login-logo">🗺️</span>
<h1>WebGIS Poverty</h1>
<p>Sistem Informasi Geografis & Manajemen Kemiskinan</p>
</div>
<div class="login-error" id="login-error-msg"></div>
<form class="login-form" id="login-form" onsubmit="handleLogin(event)">
<div class="form-group">
<label class="form-label" for="username">Username</label>
<input class="form-input" type="text" id="username" autocomplete="username" placeholder="Masukkan username..." required>
</div>
<div class="form-group">
<label class="form-label" for="password">Password</label>
<input class="form-input" type="password" id="password" autocomplete="current-password" placeholder="Masukkan password..." required>
</div>
<button class="btn btn-primary btn-login" type="submit" id="btn-submit">
<span>Masuk</span>
</button>
</form>
</div>
<script>
// Redirect if session is already active
(async function() {
try {
const res = await fetch('api/me.php');
const data = await res.json();
if (data.status === 'success') {
window.location.href = '?page=dashboard';
}
} catch (e) {}
})();
async function handleLogin(event) {
event.preventDefault();
const errorMsg = document.getElementById('login-error-msg');
const btnSubmit = document.getElementById('btn-submit');
const usernameInput = document.getElementById('username');
const passwordInput = document.getElementById('password');
errorMsg.style.display = 'none';
btnSubmit.disabled = true;
btnSubmit.innerHTML = '<span>Memproses...</span>';
const body = {
username: usernameInput.value.trim(),
password: passwordInput.value
};
try {
const response = await fetch('api/login.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
});
const result = await response.json();
if (result.status === 'success') {
// Success: redirect to default page (map)
window.location.href = '?page=dashboard';
} else {
// Error: show error message
errorMsg.textContent = result.message || 'Username atau password salah.';
errorMsg.style.display = 'block';
btnSubmit.disabled = false;
btnSubmit.innerHTML = '<span>Masuk</span>';
}
} catch (err) {
errorMsg.textContent = 'Gagal terhubung ke server. Pastikan Apache & MySQL menyala.';
errorMsg.style.display = 'block';
btnSubmit.disabled = false;
btnSubmit.innerHTML = '<span>Masuk</span>';
}
}
</script>
</body>
</html>
+61
View File
@@ -0,0 +1,61 @@
<div class="dashboard-content">
<!-- Page Header -->
<div class="page-header">
<div class="page-title-group">
<h1>🏛️ Manajemen Akun Rumah Ibadah</h1>
<p>Kelola akun dan pantau statistik penyaluran bantuan masing-masing rumah ibadah.</p>
</div>
<div class="page-actions">
<button class="btn btn-primary" onclick="window.location.href='?page=map#tambah-ri'" id="btn-tambah-ri">
Tambah Rumah Ibadah
</button>
</div>
</div>
<!-- Filter & Search Bar -->
<div class="filter-bar">
<div class="filter-search">
<span class="filter-search-icon"></span>
<input type="search" id="search-input" placeholder="Cari nama atau jenis rumah ibadah…" autocomplete="off" oninput="filterCards()">
</div>
<select class="filter-select" id="filter-jenis" onchange="filterCards()">
<option value="">Semua Jenis</option>
<option value="Masjid">Masjid</option>
<option value="Gereja">Gereja</option>
<option value="Pura">Pura</option>
<option value="Vihara">Vihara</option>
<option value="Klenteng">Klenteng</option>
<option value="Lainnya">Lainnya</option>
</select>
<select class="filter-select" id="filter-akun" onchange="filterCards()">
<option value="">Semua Status Akun</option>
<option value="active">Akun Aktif</option>
<option value="inactive">Belum Ada Akun</option>
</select>
<span class="filter-count" id="filter-count"></span>
</div>
<!-- Cards Grid -->
<div class="ri-grid" id="ri-grid">
<div class="loading-spinner-wrap">
<span class="spinner" style="width:20px;height:20px;border-width:3px;"></span>
<p style="margin-top:12px">Memuat data rumah ibadah…</p>
</div>
</div>
</div>
<div class="detail-overlay" id="detail-overlay" onclick="closeDrawer(event)">
<div class="detail-drawer" id="detail-drawer">
<div class="drawer-head">
<h2 id="drawer-title">Detail Rumah Ibadah</h2>
<button class="drawer-close" onclick="closeDrawer()"></button>
</div>
<div class="drawer-body" id="drawer-body">
<div class="loading-spinner-wrap">
<span class="spinner" style="width:20px;height:20px;border-width:3px;"></span>
</div>
</div>
</div>
</div>
+35
View File
@@ -0,0 +1,35 @@
<div id="app">
<header id="header">
<div class="nav-tabs" role="tablist" aria-label="Pilih layer" style="display:none"></div>
<div class="header-search" id="header-search">
<div class="search-box">
<span class="search-icon"></span>
<input id="search-input" type="search" autocomplete="off"
placeholder="Telusuri Webgis Poverty" aria-label="Cari objek peta" />
</div>
<div class="search-results" id="search-results" aria-label="Hasil pencarian"></div>
</div>
<div class="header-right">
<div class="coord-display" id="coord-display">Lat: - | Lng: -</div>
<div class="status-pill"><span id="status-zoom">Zoom: 13</span></div>
</div>
</header>
<main id="main">
<section id="map-wrap">
<div id="instruction-banner"></div>
<div id="map"></div>
</section>
<aside id="panel">
<div id="panel-head">
<h2 id="panel-title">Rumah Ibadah & Kemiskinan</h2>
</div>
<div id="panel-body">
<div class="loading"><span class="spinner"></span>Memuat data...</div>
</div>
</aside>
</main>
</div>