102 lines
4.9 KiB
PHP
102 lines
4.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require_once __DIR__ . '/app.php';
|
|
require_admin();
|
|
|
|
$statusFilter = trim((string) ($_GET['status'] ?? ''));
|
|
$requests = fetch_requests($statusFilter !== '' ? $statusFilter : null);
|
|
$metrics = dashboard_metrics();
|
|
|
|
render_head(project_name() . ' | Dashboard', 'Admin dashboard for reviewing incoming project requests.', true);
|
|
render_navbar('dashboard');
|
|
render_flash_toast();
|
|
?>
|
|
<main>
|
|
<section class="py-4 py-lg-5 border-bottom bg-white">
|
|
<div class="container">
|
|
<div class="d-flex flex-column flex-lg-row justify-content-between align-items-lg-end gap-3 mb-4">
|
|
<div>
|
|
<div class="section-kicker">Dashboard</div>
|
|
<h1 class="h2 mb-2">Project request queue</h1>
|
|
<p class="text-secondary mb-0">Review the latest submissions, filter by status, and open each request detail page.</p>
|
|
</div>
|
|
<a class="btn btn-dark" href="/#request-form">Create another request</a>
|
|
</div>
|
|
<div class="row g-3">
|
|
<div class="col-sm-6 col-xl-3">
|
|
<div class="stat-card"><div class="small text-secondary">Total requests</div><div class="stat-value"><?= e((string) $metrics['total']) ?></div></div>
|
|
</div>
|
|
<div class="col-sm-6 col-xl-3">
|
|
<div class="stat-card"><div class="small text-secondary">New</div><div class="stat-value"><?= e((string) $metrics['new']) ?></div></div>
|
|
</div>
|
|
<div class="col-sm-6 col-xl-3">
|
|
<div class="stat-card"><div class="small text-secondary">Reviewed</div><div class="stat-value"><?= e((string) $metrics['reviewed']) ?></div></div>
|
|
</div>
|
|
<div class="col-sm-6 col-xl-3">
|
|
<div class="stat-card"><div class="small text-secondary">Qualified</div><div class="stat-value"><?= e((string) $metrics['qualified']) ?></div></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="py-4 py-lg-5" id="requests">
|
|
<div class="container">
|
|
<div class="d-flex flex-column flex-lg-row justify-content-between align-items-lg-center gap-3 mb-3">
|
|
<div>
|
|
<h2 class="h4 mb-1">All requests</h2>
|
|
<p class="text-secondary mb-0">Thin-slice admin table with filters and drill-down details.</p>
|
|
</div>
|
|
<div class="d-flex flex-wrap gap-2">
|
|
<a href="/dashboard.php" class="btn btn-sm <?= $statusFilter === '' ? 'btn-dark' : 'btn-outline-secondary' ?>">All</a>
|
|
<?php foreach (request_status_options() as $value => $label): ?>
|
|
<a href="/dashboard.php?status=<?= urlencode($value) ?>" class="btn btn-sm <?= $statusFilter === $value ? 'btn-dark' : 'btn-outline-secondary' ?>"><?= e($label) ?></a>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
<div class="panel-card p-0 overflow-hidden">
|
|
<?php if (!$requests): ?>
|
|
<div class="empty-state p-5 text-center">
|
|
<h3 class="h5 mb-2">No requests yet</h3>
|
|
<p class="text-secondary mb-3">Submit the first project request from the home page to populate the queue.</p>
|
|
<a class="btn btn-dark btn-sm" href="/#request-form">Create the first request</a>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="table-responsive">
|
|
<table class="table align-middle mb-0 admin-table">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Reference</th>
|
|
<th scope="col">Contact</th>
|
|
<th scope="col">Type</th>
|
|
<th scope="col">Timeline</th>
|
|
<th scope="col">Status</th>
|
|
<th scope="col">Submitted</th>
|
|
<th scope="col" class="text-end">Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($requests as $request): ?>
|
|
<tr>
|
|
<td class="fw-semibold"><?= e(request_reference((int) $request['id'])) ?></td>
|
|
<td>
|
|
<div><?= e($request['name']) ?></div>
|
|
<div class="small text-secondary"><?= e($request['email']) ?></div>
|
|
</td>
|
|
<td><?= e($request['project_type']) ?></td>
|
|
<td><?= e(timeline_options()[$request['timeline']] ?? $request['timeline']) ?></td>
|
|
<td><span class="badge <?= e(status_badge_class($request['status'])) ?>"><?= e(request_status_options()[$request['status']] ?? ucfirst((string) $request['status'])) ?></span></td>
|
|
<td class="small text-secondary"><?= e(format_datetime((string) $request['created_at'])) ?></td>
|
|
<td class="text-end"><a class="btn btn-sm btn-outline-secondary" href="/submission.php?id=<?= e((string) $request['id']) ?>">Open</a></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
<?php render_footer('dashboard'); ?>
|