Ryanhub - file viewer
filename: views/admin/dashboard.php
branch: main
back to repo
<?php
if (!isAdmin()) {
    http_response_code(403);
    require __DIR__ . '/../public/403.php';
    return;
}

$pageTitle = "Admin Dashboard";

$counts = [
    'active_members' => 0,
    'pending_members' => 0,
    'uploads_total' => 0,
    'uploads_pending' => 0,
    'visits_7d' => 0,
];

$res = $db->query("SELECT COUNT(*) AS c FROM users WHERE status = 'active'");
$counts['active_members'] = (int)($res->fetch_assoc()['c'] ?? 0);

$res = $db->query("SELECT COUNT(*) AS c FROM users WHERE status = 'pending'");
$counts['pending_members'] = (int)($res->fetch_assoc()['c'] ?? 0);

$res = $db->query("SELECT COUNT(*) AS c FROM uploads");
$counts['uploads_total'] = (int)($res->fetch_assoc()['c'] ?? 0);

$res = $db->query("SELECT COUNT(*) AS c FROM uploads WHERE is_approved = 0");
$counts['uploads_pending'] = (int)($res->fetch_assoc()['c'] ?? 0);

$res = $db->query("SELECT COUNT(*) AS c FROM visits WHERE created_at >= (CURRENT_TIMESTAMP - INTERVAL 7 DAY)");
$counts['visits_7d'] = (int)($res->fetch_assoc()['c'] ?? 0);
?>

<section class="page-grid">
    <div class="card" data-animate-initial>
        <div class="muted" style="font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; margin-bottom: 10px;">
            Admin
        </div>
        <h1 style="font-family: 'Georgia', 'Times New Roman', serif; font-weight: 400; font-size: 26px; margin: 0 0 12px;">
            Overview.
        </h1>
        <div style="margin-top: 16px; display: flex; gap: 10px; flex-wrap: wrap;">
            <a href="<?= url('admin/users') ?>" class="pill">Members</a>
            <a href="<?= url('admin/uploads') ?>" class="pill">Uploads</a>
            <a href="<?= url('admin/stats') ?>" class="pill">Visits</a>
        </div>
    </div>

    <div class="card" data-animate>
        <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px;">
            <div style="border-radius: 14px; padding: 14px 16px; border: 1px solid rgba(0,0,0,0.06); background: rgba(255,255,255,0.9);">
                <div class="muted" style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; margin-bottom: 6px;">
                    Active members
                </div>
                <div style="font-size: 26px;"><?= $counts['active_members'] ?></div>
            </div>
            <div style="border-radius: 14px; padding: 14px 16px; border: 1px solid rgba(0,0,0,0.06); background: rgba(255,255,255,0.9);">
                <div class="muted" style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; margin-bottom: 6px;">
                    Pending invitations
                </div>
                <div style="font-size: 26px;"><?= $counts['pending_members'] ?></div>
            </div>
            <div style="border-radius: 14px; padding: 14px 16px; border: 1px solid rgba(0,0,0,0.06); background: rgba(255,255,255,0.9);">
                <div class="muted" style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; margin-bottom: 6px;">
                    Uploads (pending)
                </div>
                <div style="font-size: 20px;"><?= $counts['uploads_pending'] ?> <span class="muted" style="font-size: 12px;">/ <?= $counts['uploads_total'] ?></span></div>
            </div>
            <div style="border-radius: 14px; padding: 14px 16px; border: 1px solid rgba(0,0,0,0.06); background: rgba(255,255,255,0.9);">
                <div class="muted" style="font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; margin-bottom: 6px;">
                    Visits (7 days)
                </div>
                <div style="font-size: 26px;"><?= $counts['visits_7d'] ?></div>
            </div>
        </div>
    </div>
</section>