Upload files to "/"
This commit is contained in:
+540
@@ -0,0 +1,540 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/config/auth.php';
|
||||
require_login();
|
||||
$user = current_user();
|
||||
$role = current_role();
|
||||
|
||||
$roleLabel = [
|
||||
'admin' => 'Administrator Sistem',
|
||||
'dinas' => 'Dinas Sosial',
|
||||
'rumah_ibadah' => 'Pengurus Rumah Ibadah',
|
||||
'relawan' => 'Relawan Lapangan',
|
||||
'masyarakat' => 'Masyarakat'
|
||||
][$role] ?? 'Pengguna';
|
||||
|
||||
$canManageRI = in_array($role, ['admin','dinas','rumah_ibadah'], true);
|
||||
$canCreateRI = in_array($role, ['admin','dinas'], true);
|
||||
$canVerify = in_array($role, ['admin','dinas','relawan'], true);
|
||||
$canAnalyze = in_array($role, ['admin','dinas'], true);
|
||||
$canRecordBantuan = in_array($role, ['admin','dinas','rumah_ibadah','relawan'], true);
|
||||
$canExport = in_array($role, ['admin','dinas'], true);
|
||||
$canManageUsers = $role === 'admin';
|
||||
$canReportMusibah = true;
|
||||
$canManageMusibah = in_array($role, ['admin','dinas','relawan','rumah_ibadah'], true);
|
||||
$canManagePemberdayaan = in_array($role, ['admin','dinas','relawan','rumah_ibadah'], true);
|
||||
|
||||
$tabLabels = [
|
||||
'dashboard' => 'Ringkasan',
|
||||
'peta' => $role === 'masyarakat' ? 'Usulan Saya' : 'Peta Data',
|
||||
'input' => $role === 'masyarakat' ? 'Ajukan Bantuan' : 'Input Keluarga',
|
||||
'rumah_ibadah' => $role === 'rumah_ibadah' ? 'Layanan Saya' : 'Rumah Ibadah',
|
||||
'validasi' => 'Verifikasi',
|
||||
'bantuan' => 'Penyaluran',
|
||||
'laporan' => 'Laporan',
|
||||
'akun' => 'Akun Masuk',
|
||||
'musibah' => 'Musibah',
|
||||
'pemberdayaan' => 'Pemberdayaan'
|
||||
];
|
||||
|
||||
$roleDescription = [
|
||||
'admin' => 'Mengelola akun, data utama, verifikasi, dan laporan sistem.',
|
||||
'dinas' => 'Memantau cakupan bantuan dan menentukan prioritas wilayah.',
|
||||
'rumah_ibadah' => 'Mengatur radius layanan, kuota, dan pencatatan bantuan.',
|
||||
'relawan' => 'Membantu input data, survei, dan verifikasi lapangan.',
|
||||
'masyarakat' => 'Mengajukan data keluarga yang membutuhkan bantuan.'
|
||||
][$role] ?? 'Mengakses fitur sesuai hak pengguna.';
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="id">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WebGIS SIPANTAS</title>
|
||||
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet-routing-machine@latest/dist/leaflet-routing-machine.css">
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
<link rel="stylesheet" href="assets/css/responsive-fix.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="map"></div>
|
||||
|
||||
<aside class="app-shell">
|
||||
<header class="brand-panel">
|
||||
<div class="brand-logo">S</div>
|
||||
<div>
|
||||
<h1>SIPANTAS</h1>
|
||||
<p>WebGIS Sosial</p>
|
||||
</div>
|
||||
<button class="panel-toggle" id="btnPanelCollapse" type="button" aria-label="Sembunyikan panel">‹</button>
|
||||
<button class="help-button" id="btnOpenGuide" type="button">Panduan</button>
|
||||
<a class="logout" href="logout.php">Keluar</a>
|
||||
</header>
|
||||
|
||||
<section class="user-box">
|
||||
<div class="user-main">
|
||||
<b><?= htmlspecialchars($user['nama']) ?></b>
|
||||
<span><?= htmlspecialchars($user['email']) ?></span>
|
||||
</div>
|
||||
<span class="role-chip"><?= htmlspecialchars($roleLabel) ?></span>
|
||||
<p><?= htmlspecialchars($roleDescription) ?></p>
|
||||
</section>
|
||||
|
||||
<section class="quick-guide-card" id="quickGuideCard">
|
||||
<div>
|
||||
<small>Mulai dari sini</small>
|
||||
<b id="quickGuideTitle">Panduan singkat</b>
|
||||
<span id="quickGuideText">Ikuti langkah sesuai peran akun kamu.</span>
|
||||
</div>
|
||||
<button type="button" id="btnGuidePrimary">Mulai</button>
|
||||
</section>
|
||||
|
||||
<nav class="tabs" aria-label="Navigasi fitur">
|
||||
<button class="tab active" data-tab="dashboard"><?= htmlspecialchars($tabLabels['dashboard']) ?></button>
|
||||
<button class="tab" data-tab="peta"><?= htmlspecialchars($tabLabels['peta']) ?></button>
|
||||
<button class="tab" data-tab="input"><?= htmlspecialchars($tabLabels['input']) ?></button>
|
||||
<?php if ($canReportMusibah): ?>
|
||||
<button class="tab" data-tab="musibah"><?= htmlspecialchars($tabLabels['musibah']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canManagePemberdayaan): ?>
|
||||
<button class="tab" data-tab="pemberdayaan"><?= htmlspecialchars($tabLabels['pemberdayaan']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canManageRI): ?>
|
||||
<button class="tab" data-tab="rumah-ibadah"><?= htmlspecialchars($tabLabels['rumah_ibadah']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canVerify): ?>
|
||||
<button class="tab" data-tab="validasi"><?= htmlspecialchars($tabLabels['validasi']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canRecordBantuan): ?>
|
||||
<button class="tab" data-tab="bantuan"><?= htmlspecialchars($tabLabels['bantuan']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canExport): ?>
|
||||
<button class="tab" data-tab="laporan"><?= htmlspecialchars($tabLabels['laporan']) ?></button>
|
||||
<?php endif; ?>
|
||||
<?php if ($canManageUsers): ?>
|
||||
<button class="tab" data-tab="akun"><?= htmlspecialchars($tabLabels['akun']) ?></button>
|
||||
<?php endif; ?>
|
||||
</nav>
|
||||
|
||||
<main class="panel-body">
|
||||
<section id="tab-dashboard" class="tab-panel active">
|
||||
<div class="hero-card dashboard-hero">
|
||||
<small>Ringkasan</small>
|
||||
<h2 id="dashboardTitle">Cakupan Bantuan Sosial</h2>
|
||||
<p id="dashboardSubtitle">Pantau kondisi terbaru, lalu lanjutkan tindakan utama dari panel ini.</p>
|
||||
<div class="hero-actions">
|
||||
<button class="btn hero-btn" type="button" id="btnGoInput">Tambah Usulan</button>
|
||||
<button class="btn hero-btn ghost" type="button" id="btnGoMap">Lihat Peta</button>
|
||||
<button class="btn hero-btn danger" type="button" id="btnGoMusibah">Laporkan Musibah</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="guide-stepper" id="roleSteps"></div>
|
||||
|
||||
<div class="stats stats-wide">
|
||||
<div class="stat-card"><span id="totalRumahIbadah">0</span><small>Rumah Ibadah Aktif</small></div>
|
||||
<div class="stat-card"><span id="totalKeluarga">0</span><small>Keluarga Terdata</small></div>
|
||||
<div class="stat-card green-card"><span id="totalDitanggung">0</span><small>Ditanggung</small></div>
|
||||
<div class="stat-card red-card"><span id="totalBlankSpot">0</span><small>Blank Spot</small></div>
|
||||
<div class="stat-card yellow-card"><span id="totalMenunggu">0</span><small>Menunggu Verifikasi</small></div>
|
||||
<div class="stat-card danger-card"><span id="totalMusibahAktif">0</span><small>Musibah Aktif</small></div>
|
||||
<div class="stat-card"><span id="totalProduktif">0</span><small>Calon Pemberdayaan</small></div>
|
||||
<div class="stat-card"><span id="cakupanBantuan">0%</span><small>Cakupan Bantuan</small></div>
|
||||
</div>
|
||||
|
||||
<div class="progress-wrap">
|
||||
<div class="progress-label"><span>Cakupan keluarga valid</span><b id="cakupanLabel">0%</b></div>
|
||||
<div class="progress"><div id="cakupanBar" class="progress-bar"></div></div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">Tindakan Berikutnya</div>
|
||||
<?php if ($canAnalyze): ?>
|
||||
<button class="btn btn-primary" id="btnAnalisis">Jalankan Analisis Tanggungan</button>
|
||||
<?php else: ?>
|
||||
<div class="info-box">Data tersedia sesuai akses akun kamu.</div>
|
||||
<?php endif; ?>
|
||||
<button class="btn btn-secondary" id="btnLocate">Gunakan Lokasi Saya</button>
|
||||
</section>
|
||||
|
||||
<section id="tab-peta" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Peta Data</b>
|
||||
<span>Gunakan filter untuk menemukan keluarga, melihat tanggungan, dan membuka rute bantuan.</span>
|
||||
</div>
|
||||
<div class="section-title">Filter Peta</div>
|
||||
<label>Status Bantuan</label>
|
||||
<select id="filterStatus">
|
||||
<option value="semua">Semua Status</option>
|
||||
<option>Ditanggung</option>
|
||||
<option>Blank Spot</option>
|
||||
<option>Menunggu Verifikasi</option>
|
||||
<option>Tidak Valid</option>
|
||||
<option>Bantuan Pemerintah</option>
|
||||
<option>Butuh Bantuan Lanjutan</option>
|
||||
</select>
|
||||
|
||||
<label>Pencarian Nama / Alamat</label>
|
||||
<input id="searchText" placeholder="Cari keluarga, alamat, atau rumah ibadah">
|
||||
|
||||
<div class="quick-actions">
|
||||
<button class="btn btn-secondary" id="btnRefresh">Muat Ulang Data</button>
|
||||
<button class="btn btn-secondary" id="btnFitMap">Tampilkan Semua Titik</button>
|
||||
</div>
|
||||
|
||||
<div class="section-title">Daftar Keluarga</div>
|
||||
<div id="listKeluarga" class="list-box"></div>
|
||||
</section>
|
||||
|
||||
<section id="tab-input" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Ajukan / Input Keluarga</b>
|
||||
<span>Langkahnya sederhana: klik lokasi rumah di peta, lengkapi data, lalu simpan.</span>
|
||||
</div>
|
||||
<div class="mini-step-list">
|
||||
<span><b>1</b> Klik titik rumah di peta</span>
|
||||
<span><b>2</b> Isi data keluarga</span>
|
||||
<span><b>3</b> Simpan usulan</span>
|
||||
</div>
|
||||
|
||||
<label>Nama Kepala Keluarga</label>
|
||||
<input id="kelNama" placeholder="Contoh: Keluarga Bapak Ahmad">
|
||||
|
||||
<label>Alamat</label>
|
||||
<textarea id="kelAlamat" placeholder="Klik peta agar alamat terisi otomatis, atau isi manual"></textarea>
|
||||
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>No. KK</label>
|
||||
<input id="kelNoKK" placeholder="Nomor KK">
|
||||
</div>
|
||||
<div>
|
||||
<label>NIK Kepala Keluarga</label>
|
||||
<input id="kelNik" placeholder="NIK">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label>Tingkat Kerentanan</label>
|
||||
<select id="kelKerentanan">
|
||||
<option>Miskin Ekstrem</option>
|
||||
<option>Sangat Miskin</option>
|
||||
<option>Miskin</option>
|
||||
<option>Rentan Miskin</option>
|
||||
</select>
|
||||
|
||||
<label>Kebutuhan Prioritas</label>
|
||||
<select id="kelKebutuhan">
|
||||
<option>Sembako</option>
|
||||
<option>Biaya Pendidikan</option>
|
||||
<option>Kesehatan</option>
|
||||
<option>Tempat Tinggal</option>
|
||||
<option>Modal Usaha</option>
|
||||
<option>Lainnya</option>
|
||||
</select>
|
||||
|
||||
<div class="section-title">Anggota Keluarga</div>
|
||||
<div class="info-box small-note">Isi data anggota sesuai KK. Centang kemampuan bekerja agar sistem bisa merekomendasikan program pemberdayaan.</div>
|
||||
<div id="anggotaContainer" class="anggota-container"></div>
|
||||
<button class="btn btn-secondary" type="button" id="btnTambahAnggota">Tambah Anggota</button>
|
||||
|
||||
<?php if ($canVerify): ?>
|
||||
<label>Status Verifikasi Awal</label>
|
||||
<select id="kelStatusVerifikasi">
|
||||
<option>Menunggu Verifikasi</option>
|
||||
<option>Valid</option>
|
||||
<option>Tidak Valid</option>
|
||||
<option>Perlu Survei Ulang</option>
|
||||
</select>
|
||||
<?php else: ?>
|
||||
<input type="hidden" id="kelStatusVerifikasi" value="Menunggu Verifikasi">
|
||||
<?php endif; ?>
|
||||
|
||||
<label>Catatan Kondisi</label>
|
||||
<textarea id="kelCatatan" placeholder="Contoh: membutuhkan bantuan sembako bulanan"></textarea>
|
||||
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>Latitude</label>
|
||||
<input id="lat" readonly>
|
||||
</div>
|
||||
<div>
|
||||
<label>Longitude</label>
|
||||
<input id="lng" readonly>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary" id="btnSimpanKeluarga">Simpan Usulan Keluarga</button>
|
||||
<button class="btn btn-secondary" id="btnBersihkanKeluarga">Bersihkan Form</button>
|
||||
</section>
|
||||
|
||||
<?php if ($canReportMusibah): ?>
|
||||
<section id="tab-musibah" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Laporan Musibah</b>
|
||||
<span>Gunakan menu ini untuk kondisi mendadak seperti sakit, kebakaran, banjir, kehilangan pekerjaan, atau kebutuhan darurat lain.</span>
|
||||
</div>
|
||||
<div class="mini-step-list">
|
||||
<span><b>1</b> Pilih keluarga terdata atau klik lokasi kejadian</span>
|
||||
<span><b>2</b> Isi jenis musibah dan kebutuhan mendesak</span>
|
||||
<span><b>3</b> Kirim agar bisa ditindaklanjuti</span>
|
||||
</div>
|
||||
|
||||
<label>Keluarga Terkait (opsional)</label>
|
||||
<select id="musibahKeluarga"></select>
|
||||
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>Jenis Musibah</label>
|
||||
<select id="musibahJenis">
|
||||
<option>Kebakaran</option>
|
||||
<option>Banjir</option>
|
||||
<option>Sakit Mendesak</option>
|
||||
<option>Kehilangan Pekerjaan</option>
|
||||
<option>Kematian Tulang Punggung Keluarga</option>
|
||||
<option>Rumah Rusak</option>
|
||||
<option>Lainnya</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label>Tingkat Urgensi</label>
|
||||
<select id="musibahUrgensi">
|
||||
<option>Sedang</option>
|
||||
<option>Tinggi</option>
|
||||
<option>Darurat</option>
|
||||
<option>Rendah</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label>Tanggal Kejadian</label>
|
||||
<input id="musibahTanggal" type="date">
|
||||
|
||||
<label>Alamat / Lokasi Kejadian</label>
|
||||
<textarea id="musibahAlamat" placeholder="Pilih keluarga, klik peta, atau isi manual"></textarea>
|
||||
|
||||
<label>Kronologi Singkat</label>
|
||||
<textarea id="musibahDeskripsi" placeholder="Jelaskan apa yang terjadi secara singkat"></textarea>
|
||||
|
||||
<label>Kebutuhan Mendesak</label>
|
||||
<textarea id="musibahKebutuhan" placeholder="Contoh: obat, biaya transportasi, makanan, tempat tinggal sementara"></textarea>
|
||||
|
||||
<div class="two-col">
|
||||
<div><label>Latitude</label><input id="musibahLat" readonly></div>
|
||||
<div><label>Longitude</label><input id="musibahLng" readonly></div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary" id="btnSimpanMusibah">Kirim Laporan Musibah</button>
|
||||
<div class="section-title">Daftar Laporan Musibah</div>
|
||||
<div id="listMusibah" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canManagePemberdayaan): ?>
|
||||
<section id="tab-pemberdayaan" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Pemberdayaan Keluarga</b>
|
||||
<span>Temukan anggota keluarga yang masih mampu bekerja, lalu arahkan ke pelatihan, modal usaha, atau program kerja.</span>
|
||||
</div>
|
||||
<div class="info-box">Daftar ini diambil dari anggota keluarga dengan status mampu bekerja. Tujuannya agar bantuan tidak hanya konsumtif, tetapi juga membantu keluarga mandiri.</div>
|
||||
<div class="section-title">Calon Penerima Program</div>
|
||||
<div id="listPemberdayaan" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canManageRI): ?>
|
||||
<section id="tab-rumah-ibadah" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b><?= $canCreateRI ? 'Manajemen Rumah Ibadah' : 'Layanan Rumah Ibadah Saya' ?></b>
|
||||
<span><?= $canCreateRI ? 'Tambah lokasi rumah ibadah dan atur kapasitas layanan.' : 'Atur radius, kuota, dan dana sosial agar cakupan bantuan lebih sesuai.' ?></span>
|
||||
</div>
|
||||
<div class="mini-step-list">
|
||||
<span><b>1</b> Pastikan data lokasi benar</span>
|
||||
<span><b>2</b> Atur radius dan kuota</span>
|
||||
<span><b>3</b> Simpan perubahan</span>
|
||||
</div>
|
||||
<div class="section-title"><?= $canCreateRI ? 'Data Rumah Ibadah' : 'Profil Layanan' ?></div>
|
||||
<input type="hidden" id="riId">
|
||||
|
||||
<label>Nama Rumah Ibadah</label>
|
||||
<input id="riNama" placeholder="Contoh: Masjid Al-Ikhlas" <?= $canCreateRI ? '' : 'readonly' ?>>
|
||||
|
||||
<label>Alamat</label>
|
||||
<textarea id="riAlamat" placeholder="Klik peta atau isi manual" <?= $canCreateRI ? '' : 'readonly' ?>></textarea>
|
||||
|
||||
<label>Kategori</label>
|
||||
<select id="riKategori" <?= $canCreateRI ? '' : 'disabled' ?>>
|
||||
<option>Masjid</option>
|
||||
<option>Gereja</option>
|
||||
<option>Vihara</option>
|
||||
<option>Klenteng</option>
|
||||
<option>Pura</option>
|
||||
<option>Lainnya</option>
|
||||
</select>
|
||||
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>Pengurus</label>
|
||||
<input id="riPengurus" placeholder="Nama penanggung jawab">
|
||||
</div>
|
||||
<div>
|
||||
<label>Kontak</label>
|
||||
<input id="riKontak" placeholder="Nomor HP/WA">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>Dana Sosial per Bulan</label>
|
||||
<input id="riDana" type="number" placeholder="Contoh: 5000000">
|
||||
</div>
|
||||
<div>
|
||||
<label>Kuota KK</label>
|
||||
<input id="riKuota" type="number" placeholder="Contoh: 25">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label>Radius Tanggungan: <span id="riRadiusLabel">500</span> meter</label>
|
||||
<input id="riRadius" type="range" min="100" max="5000" step="100" value="500">
|
||||
|
||||
<?php if ($canCreateRI): ?>
|
||||
<div class="two-col">
|
||||
<div>
|
||||
<label>Latitude</label>
|
||||
<input id="riLat" readonly>
|
||||
</div>
|
||||
<div>
|
||||
<label>Longitude</label>
|
||||
<input id="riLng" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<input type="hidden" id="riLat">
|
||||
<input type="hidden" id="riLng">
|
||||
<?php endif; ?>
|
||||
|
||||
<button class="btn btn-primary" id="btnSimpanRI"><?= $canCreateRI ? 'Simpan / Perbarui Rumah Ibadah' : 'Perbarui Radius, Kuota, dan Dana Sosial' ?></button>
|
||||
<?php if ($canCreateRI): ?>
|
||||
<button class="btn btn-secondary" id="btnRIBaru">Tambah Rumah Ibadah Baru</button>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="section-title">Daftar Rumah Ibadah</div>
|
||||
<div id="listRumahIbadah" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canVerify): ?>
|
||||
<section id="tab-validasi" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Verifikasi Lapangan</b>
|
||||
<span>Periksa usulan yang masuk. Tandai valid bila data sudah layak digunakan untuk analisis.</span>
|
||||
</div>
|
||||
<div class="section-title">Antrian Validasi</div>
|
||||
<div id="listValidasi" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canRecordBantuan): ?>
|
||||
<section id="tab-bantuan" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Penyaluran Bantuan</b>
|
||||
<span>Lihat keluarga yang sudah masuk tanggungan dan catat riwayat bantuan yang diberikan.</span>
|
||||
</div>
|
||||
<div class="section-title">Daftar Tanggungan</div>
|
||||
<div id="listBantuan" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canExport): ?>
|
||||
<section id="tab-laporan" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Laporan</b>
|
||||
<span>Unduh data prioritas atau cetak ringkasan untuk kebutuhan koordinasi.</span>
|
||||
</div>
|
||||
<div class="section-title">Dokumen Laporan</div>
|
||||
<div class="report-grid">
|
||||
<a class="report-card" href="export_blankspot.php" target="_blank">
|
||||
<b>Export Blank Spot</b>
|
||||
<span>Unduh daftar prioritas.</span>
|
||||
</a>
|
||||
<button class="report-card" id="btnPrintSummary" type="button">
|
||||
<b>Cetak Ringkasan Dashboard</b>
|
||||
<span>Cetak statistik utama.</span>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
<?php if ($canManageUsers): ?>
|
||||
<section id="tab-akun" class="tab-panel">
|
||||
<div class="tab-intro">
|
||||
<b>Verifikasi Akun</b>
|
||||
<span>Setujui akun resmi agar akses rumah ibadah dan relawan tetap terkendali.</span>
|
||||
</div>
|
||||
<div class="info-box">Akun masyarakat aktif otomatis. Akun rumah ibadah dan relawan perlu disetujui lebih dulu.</div>
|
||||
<div id="listAkun" class="list-box"></div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
</main>
|
||||
</aside>
|
||||
|
||||
<button id="btnPanelOpen" class="panel-open" type="button" aria-label="Tampilkan panel">☰ Panel</button>
|
||||
|
||||
<div class="map-toolbar">
|
||||
<button id="btnLayerRadius" class="tool-btn active">Radius</button>
|
||||
<button id="btnLayerRI" class="tool-btn active">Rumah Ibadah</button>
|
||||
<button id="btnLayerKK" class="tool-btn active">Keluarga</button>
|
||||
</div>
|
||||
|
||||
<div class="legend">
|
||||
<b>Legenda</b><br>
|
||||
<span class="dot blue"></span> Rumah Ibadah<br>
|
||||
<span class="dot green"></span> Ditanggung<br>
|
||||
<span class="dot red"></span> Blank Spot<br>
|
||||
<span class="dot yellow"></span> Menunggu Verifikasi<br>
|
||||
<span class="dot gray"></span> Tidak Valid
|
||||
</div>
|
||||
|
||||
<div class="map-helper" id="mapHelper">
|
||||
<b>Panduan peta</b>
|
||||
<span id="mapHelperText">Geser atau zoom peta untuk melihat sebaran data.</span>
|
||||
</div>
|
||||
|
||||
<div class="guide-modal" id="guideModal" aria-hidden="true">
|
||||
<div class="guide-backdrop" id="guideBackdrop"></div>
|
||||
<section class="guide-dialog" role="dialog" aria-modal="true" aria-labelledby="guideTitle">
|
||||
<button class="guide-close" id="btnCloseGuide" type="button" aria-label="Tutup panduan">×</button>
|
||||
<small>Panduan penggunaan</small>
|
||||
<h2 id="guideTitle">Mulai menggunakan SIPANTAS</h2>
|
||||
<p id="guideDescription">Ikuti langkah sesuai peran akun kamu.</p>
|
||||
<div class="guide-list" id="guideList"></div>
|
||||
<div class="guide-dialog-actions">
|
||||
<button class="btn btn-primary" id="btnGuideAction" type="button">Mulai Sekarang</button>
|
||||
<button class="btn btn-secondary" id="btnGuideLater" type="button">Nanti Saja</button>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div id="toast" class="toast"></div>
|
||||
|
||||
<script>
|
||||
window.SIPANTAS_USER = <?= json_encode($user, JSON_UNESCAPED_UNICODE) ?>;
|
||||
window.SIPANTAS_ROLE = <?= json_encode($role) ?>;
|
||||
window.SIPANTAS_CAPS = <?= json_encode([
|
||||
'canManageRI' => $canManageRI,
|
||||
'canCreateRI' => $canCreateRI,
|
||||
'canVerify' => $canVerify,
|
||||
'canAnalyze' => $canAnalyze,
|
||||
'canRecordBantuan' => $canRecordBantuan,
|
||||
'canExport' => $canExport,
|
||||
'canManageUsers' => $canManageUsers,
|
||||
'canReportMusibah' => $canReportMusibah,
|
||||
'canManageMusibah' => $canManageMusibah,
|
||||
'canManagePemberdayaan' => $canManagePemberdayaan,
|
||||
]) ?>;
|
||||
</script>
|
||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||
<script src="https://unpkg.com/leaflet-routing-machine@latest/dist/leaflet-routing-machine.js"></script>
|
||||
<script src="assets/js/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/config/auth.php';
|
||||
require_once __DIR__ . '/config/database.php';
|
||||
require_login();
|
||||
|
||||
if (!role_in(['admin','dinas'])) {
|
||||
http_response_code(403);
|
||||
die('Akses ditolak. Export hanya tersedia untuk Admin dan Dinas Sosial.');
|
||||
}
|
||||
|
||||
header('Content-Type: text/csv; charset=utf-8');
|
||||
header('Content-Disposition: attachment; filename="data_blank_spot_sipantas.csv"');
|
||||
|
||||
$output = fopen('php://output', 'w');
|
||||
fputcsv($output, ['Nama KK', 'Alamat', 'No KK', 'NIK', 'Kerentanan', 'Kebutuhan', 'Status Verifikasi', 'Status Bantuan', 'Latitude', 'Longitude', 'Catatan']);
|
||||
|
||||
$stmt = $pdo->query('SELECT nama_kk, alamat, no_kk, nik, kerentanan, kebutuhan, status_verifikasi, status_bantuan, lat, lng, catatan
|
||||
FROM keluarga
|
||||
WHERE status_bantuan = "Blank Spot"
|
||||
ORDER BY FIELD(kerentanan, "Miskin Ekstrem", "Sangat Miskin", "Miskin", "Rentan Miskin"), nama_kk ASC');
|
||||
|
||||
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
fputcsv($output, $row);
|
||||
}
|
||||
|
||||
fclose($output);
|
||||
exit;
|
||||
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/config/auth.php';
|
||||
$loggedIn = is_logged_in();
|
||||
$dashboardUrl = 'dashboard.php';
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="id">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>SIPANTAS</title>
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
<link rel="stylesheet" href="assets/css/landing.css">
|
||||
<link rel="stylesheet" href="assets/css/responsive-fix.css">
|
||||
</head>
|
||||
<body class="landing-page">
|
||||
<header class="landing-nav">
|
||||
<a class="landing-brand" href="index.php" aria-label="SIPANTAS">
|
||||
<span>S</span>
|
||||
<b>SIPANTAS</b>
|
||||
</a>
|
||||
|
||||
<nav class="landing-menu" aria-label="Menu utama">
|
||||
<a href="#fitur">Fitur</a>
|
||||
<a href="#alur">Alur</a>
|
||||
<a href="#akses">Akses</a>
|
||||
</nav>
|
||||
|
||||
<div class="landing-actions">
|
||||
<?php if ($loggedIn): ?>
|
||||
<a class="btn-pill ghost" href="logout.php">Keluar</a>
|
||||
<a class="btn-pill solid" href="<?= $dashboardUrl ?>">Dashboard</a>
|
||||
<?php else: ?>
|
||||
<a class="btn-pill ghost" href="register.php">Daftar</a>
|
||||
<a class="btn-pill solid" href="login.php">Masuk</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<?php if (isset($_GET['logout'])): ?>
|
||||
<div class="landing-toast">Kamu berhasil keluar.</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<main>
|
||||
<section class="hero-section">
|
||||
<div class="hero-copy">
|
||||
<div class="eyebrow">WebGIS SIPANTAS</div>
|
||||
<h1>Peta sosial untuk penyaluran bantuan yang lebih terarah.</h1>
|
||||
<p>Kelola titik keluarga, rumah ibadah, radius layanan, dan status bantuan dalam satu peta interaktif.</p>
|
||||
|
||||
<div class="hero-buttons">
|
||||
<?php if ($loggedIn): ?>
|
||||
<a class="cta-primary" href="<?= $dashboardUrl ?>">Buka Dashboard</a>
|
||||
<?php else: ?>
|
||||
<a class="cta-primary" href="register.php">Daftar Akun</a>
|
||||
<a class="cta-secondary" href="login.php">Masuk</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hero-visual" aria-label="Ilustrasi peta SIPANTAS">
|
||||
<div class="map-card">
|
||||
<div class="map-grid"></div>
|
||||
<div class="map-river"></div>
|
||||
<div class="map-radius r1"></div>
|
||||
<div class="map-radius r2"></div>
|
||||
<div class="pin ri p1">RI</div>
|
||||
<div class="pin ri p2">RI</div>
|
||||
<div class="pin ok p3"></div>
|
||||
<div class="pin wait p4"></div>
|
||||
<div class="pin danger p5"></div>
|
||||
<div class="route"></div>
|
||||
<div class="map-stat">
|
||||
<small>Cakupan</small>
|
||||
<b>76%</b>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="fitur" class="landing-section compact-section">
|
||||
<div class="section-heading">
|
||||
<small>Fitur</small>
|
||||
<h2>Ringkas, jelas, dan langsung dipakai.</h2>
|
||||
</div>
|
||||
|
||||
<div class="feature-grid clean-grid">
|
||||
<article class="feature-card">
|
||||
<span class="feature-icon blue-icon">⌖</span>
|
||||
<h3>Pemetaan Data</h3>
|
||||
<p>Titik rumah ibadah dan keluarga tampil langsung di peta.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span class="feature-icon green-icon">◎</span>
|
||||
<h3>Radius Layanan</h3>
|
||||
<p>Jangkauan rumah ibadah dapat disesuaikan sesuai kapasitas.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span class="feature-icon red-icon">!</span>
|
||||
<h3>Blank Spot</h3>
|
||||
<p>Area yang belum tercakup dapat terlihat lebih cepat.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span class="feature-icon purple-icon">↝</span>
|
||||
<h3>Rute Bantuan</h3>
|
||||
<p>Distribusi bantuan dapat diarahkan melalui jalur peta.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="alur" class="landing-section flow-section">
|
||||
<div class="section-heading left">
|
||||
<small>Alur</small>
|
||||
<h2>Mulai dari data, lanjut ke verifikasi, lalu pemetaan.</h2>
|
||||
</div>
|
||||
|
||||
<div class="flow-cards">
|
||||
<article><b>01</b><span>Input data</span></article>
|
||||
<article><b>02</b><span>Verifikasi</span></article>
|
||||
<article><b>03</b><span>Analisis peta</span></article>
|
||||
<article><b>04</b><span>Monitoring</span></article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="akses" class="access-section clean-access">
|
||||
<div>
|
||||
<small>Portal</small>
|
||||
<h2>Masuk ke sistem</h2>
|
||||
<p>Buat akun sesuai peran, atau masuk dengan akun yang sudah terdaftar.</p>
|
||||
</div>
|
||||
<div class="hero-buttons access-buttons">
|
||||
<?php if ($loggedIn): ?>
|
||||
<a class="cta-primary" href="<?= $dashboardUrl ?>">Buka Dashboard</a>
|
||||
<?php else: ?>
|
||||
<a class="cta-primary" href="register.php">Daftar</a>
|
||||
<a class="cta-secondary" href="login.php">Masuk</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="landing-footer">
|
||||
<span>© <?= date('Y') ?> SIPANTAS</span>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once __DIR__ . '/config/database.php';
|
||||
|
||||
$error = '';
|
||||
|
||||
if (isset($_SESSION['user'])) {
|
||||
header('Location: dashboard.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$password = trim($_POST['password'] ?? '');
|
||||
|
||||
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? LIMIT 1');
|
||||
$stmt->execute([$email]);
|
||||
$user = $stmt->fetch();
|
||||
|
||||
$isValid = false;
|
||||
if ($user) {
|
||||
// Mendukung hash SHA-256 dari seed awal database.
|
||||
$isValid = hash('sha256', $password) === $user['password_hash'];
|
||||
// Jika nanti kamu memakai password_hash(), baris ini juga tetap mendukungnya.
|
||||
if (!$isValid && password_verify($password, $user['password_hash'])) {
|
||||
$isValid = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($isValid) {
|
||||
$statusAkun = $user['status_akun'] ?? 'Aktif';
|
||||
if ($statusAkun !== 'Aktif') {
|
||||
if ($statusAkun === 'Menunggu Verifikasi') {
|
||||
$error = 'Akun kamu masih menunggu verifikasi administrator.';
|
||||
} else {
|
||||
$error = 'Akun kamu belum dapat digunakan. Silakan hubungi administrator.';
|
||||
}
|
||||
} else {
|
||||
$_SESSION['user'] = [
|
||||
'id' => (int)$user['id'],
|
||||
'nama' => $user['nama'],
|
||||
'email' => $user['email'],
|
||||
'role' => $user['role'],
|
||||
'rumah_ibadah_id' => $user['rumah_ibadah_id'] ? (int)$user['rumah_ibadah_id'] : null,
|
||||
'status_akun' => $statusAkun,
|
||||
];
|
||||
header('Location: dashboard.php');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ($error === '') {
|
||||
$error = 'Email atau password salah.';
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="id">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Login - SIPANTAS</title>
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
<link rel="stylesheet" href="assets/css/landing.css">
|
||||
<link rel="stylesheet" href="assets/css/responsive-fix.css">
|
||||
</head>
|
||||
<body class="login-page">
|
||||
<main class="login-card">
|
||||
<div class="brand-badge">SIPANTAS</div>
|
||||
<h1>Masuk</h1>
|
||||
<p>Gunakan akun yang sudah terdaftar.</p>
|
||||
<a class="login-back" href="index.php">← Kembali ke beranda</a>
|
||||
|
||||
<?php if ($error): ?>
|
||||
<div class="alert alert-danger"><?= htmlspecialchars($error) ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="POST">
|
||||
<label>Email</label>
|
||||
<input type="email" name="email" placeholder="nama@email.com" required>
|
||||
|
||||
<label>Password</label>
|
||||
<input type="password" name="password" placeholder="Masukkan password" required>
|
||||
|
||||
<button class="btn btn-primary" type="submit">Masuk</button>
|
||||
</form>
|
||||
|
||||
<p class="auth-switch">Belum punya akun? <a href="register.php">Daftar akun</a>.</p>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
session_start();
|
||||
session_destroy();
|
||||
header('Location: index.php?logout=1');
|
||||
exit;
|
||||
Reference in New Issue
Block a user