2025-12-18 11:21:40 +07:00
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="id">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
|
<title>Dashboard - Btekno Retribusi Admin</title>
|
|
|
|
|
<link rel="stylesheet" href="css/app.css" />
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
|
|
|
|
|
<style>
|
|
|
|
|
.video-panel {
|
|
|
|
|
background: #fff;
|
|
|
|
|
border-radius: 0.5rem;
|
|
|
|
|
border: 1px solid #e5e7eb;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
.video-panel-header {
|
|
|
|
|
padding: 1rem;
|
|
|
|
|
border-bottom: 1px solid #e5e7eb;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
.video-panel-title {
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
font-size: 0.95rem;
|
|
|
|
|
color: #111827;
|
|
|
|
|
}
|
|
|
|
|
.video-toggle {
|
|
|
|
|
padding: 0.375rem 0.75rem;
|
|
|
|
|
font-size: 0.875rem;
|
|
|
|
|
border: 1px solid #d1d5db;
|
|
|
|
|
border-radius: 0.375rem;
|
|
|
|
|
background: #fff;
|
|
|
|
|
color: #374151;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
.video-toggle:hover {
|
|
|
|
|
background: #f9fafb;
|
|
|
|
|
}
|
|
|
|
|
.video-container {
|
|
|
|
|
position: relative;
|
|
|
|
|
width: 100%;
|
|
|
|
|
aspect-ratio: 16/9;
|
|
|
|
|
background: #000;
|
|
|
|
|
}
|
|
|
|
|
.video-container video {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
object-fit: contain;
|
|
|
|
|
}
|
|
|
|
|
.video-placeholder {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
height: 100%;
|
|
|
|
|
color: #9ca3af;
|
|
|
|
|
font-size: 0.875rem;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div class="page">
|
|
|
|
|
<header class="topbar">
|
|
|
|
|
<div class="topbar-title">Dashboard Retribusi</div>
|
|
|
|
|
<div class="topbar-actions">
|
|
|
|
|
<span id="topbar-date" style="font-size:0.85rem;color:#6b7280;"></span>
|
|
|
|
|
<a href="event.html" class="topbar-link">Events</a>
|
|
|
|
|
<a href="settings.html" class="topbar-link">Pengaturan</a>
|
|
|
|
|
<button id="logout-button" class="topbar-link">
|
|
|
|
|
Logout
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<main class="container">
|
|
|
|
|
<section class="filters">
|
|
|
|
|
<div class="filter-group">
|
|
|
|
|
<label for="filter-date" class="filter-label">Tanggal</label>
|
2025-12-19 05:31:38 +07:00
|
|
|
<input id="filter-date" type="date" class="filter-control" autocomplete="off" />
|
2025-12-18 11:21:40 +07:00
|
|
|
</div>
|
|
|
|
|
<div class="filter-group">
|
|
|
|
|
<label for="filter-location" class="filter-label">Lokasi</label>
|
|
|
|
|
<select id="filter-location" class="filter-control">
|
|
|
|
|
<option value="">Semua Lokasi</option>
|
|
|
|
|
</select>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="filter-group">
|
|
|
|
|
<label for="filter-gate" class="filter-label">Gate</label>
|
|
|
|
|
<select id="filter-gate" class="filter-control">
|
|
|
|
|
<option value="">Semua Gate</option>
|
|
|
|
|
</select>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<div id="summary-error" class="error-text" style="margin-bottom:0.5rem; display:none;"></div>
|
|
|
|
|
|
|
|
|
|
<section class="summary-grid">
|
|
|
|
|
<article class="card card-success">
|
|
|
|
|
<div class="card-content">
|
|
|
|
|
<div class="card-title">Total Pendapatan</div>
|
|
|
|
|
<div id="card-total-amount" class="card-value">Rp 0</div>
|
|
|
|
|
<div class="card-subtext">Nilai bruto sebelum pemotongan</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="summary-loading" class="card-loading-overlay">Memuat data...</div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="card card-info">
|
|
|
|
|
<div class="card-content">
|
|
|
|
|
<div class="card-title">Jumlah Orang</div>
|
|
|
|
|
<div id="card-person-count" class="card-value">0</div>
|
|
|
|
|
<div class="card-subtext">Person walk (pejalan kaki)</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="card card-warning">
|
|
|
|
|
<div class="card-content">
|
|
|
|
|
<div class="card-title">Jumlah Motor</div>
|
|
|
|
|
<div id="card-motor-count" class="card-value">0</div>
|
|
|
|
|
<div class="card-subtext">Kendaraan roda dua</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="card card-danger">
|
|
|
|
|
<div class="card-content">
|
|
|
|
|
<div class="card-title">Jumlah Mobil</div>
|
|
|
|
|
<div id="card-car-count" class="card-value">0</div>
|
|
|
|
|
<div class="card-subtext">Kendaraan roda empat</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="content-grid">
|
|
|
|
|
<article class="panel">
|
|
|
|
|
<div class="panel-header">
|
|
|
|
|
<h2 class="panel-title">Trend Harian</h2>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<div class="chart-container">
|
|
|
|
|
<canvas id="daily-chart"></canvas>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
|
|
|
|
|
<article class="panel">
|
|
|
|
|
<div class="panel-header">
|
|
|
|
|
<h2 class="panel-title">Per Kategori</h2>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<div class="chart-container" style="height:240px;">
|
|
|
|
|
<canvas id="category-chart"></canvas>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section id="video-section" style="display:none; margin-top:1.5rem;">
|
|
|
|
|
<article class="video-panel">
|
|
|
|
|
<div class="video-panel-header">
|
|
|
|
|
<div id="video-panel-title" class="video-panel-title">Live Camera</div>
|
|
|
|
|
<button id="video-toggle" class="video-toggle">Hidupkan</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="video-container">
|
|
|
|
|
<video id="video-player" controls style="display:none;"></video>
|
|
|
|
|
<div id="video-placeholder" class="video-placeholder">
|
|
|
|
|
Kamera tidak aktif
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
</section>
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<script type="module">
|
|
|
|
|
import { Auth } from './js/auth.js';
|
|
|
|
|
import './js/dashboard.js';
|
|
|
|
|
import './js/realtime.js';
|
|
|
|
|
|
|
|
|
|
document.getElementById('logout-button')?.addEventListener('click', () => {
|
|
|
|
|
Auth.logout();
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
|
|
|
|
|
|