204 lines
8.6 KiB
PHP
204 lines
8.6 KiB
PHP
|
|
<?= $this->extend('admin/layout') ?>
|
||
|
|
|
||
|
|
<?= $this->section('content') ?>
|
||
|
|
<div class="space-y-5 sm:space-y-6">
|
||
|
|
<!-- Page Header -->
|
||
|
|
<div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
|
||
|
|
<div>
|
||
|
|
<h2 class="text-2xl font-semibold text-gray-800 dark:text-white/90">
|
||
|
|
Audit Log
|
||
|
|
</h2>
|
||
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">
|
||
|
|
Riwayat aktivitas sistem
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Stats Card -->
|
||
|
|
<div class="grid grid-cols-1 gap-4 sm:grid-cols-1">
|
||
|
|
<div class="rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-white/[0.03]">
|
||
|
|
<div class="flex items-center justify-between">
|
||
|
|
<div>
|
||
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Total Log</p>
|
||
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-white"><?= number_format($total) ?></p>
|
||
|
|
</div>
|
||
|
|
<div class="w-12 h-12 rounded-full bg-brand-100 dark:bg-brand-900/20 flex items-center justify-center">
|
||
|
|
<i class="fe fe-clipboard text-brand-600 dark:text-brand-400 text-xl"></i>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Filters and Search -->
|
||
|
|
<div class="rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-white/[0.03]">
|
||
|
|
<form method="get" action="<?= base_url('admin/audit-logs') ?>" class="flex flex-col gap-4 sm:flex-row sm:items-center">
|
||
|
|
<div class="flex-1">
|
||
|
|
<input
|
||
|
|
type="text"
|
||
|
|
name="search"
|
||
|
|
value="<?= esc($search ?? '') ?>"
|
||
|
|
placeholder="Cari aksi, user, atau IP address..."
|
||
|
|
class="h-11 w-full rounded-lg border border-gray-300 bg-transparent px-4 py-2.5 text-sm text-gray-800 shadow-theme-xs placeholder:text-gray-400 focus:border-brand-300 focus:ring-3 focus:ring-brand-500/10 focus:outline-none dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:placeholder:text-white/30 dark:focus:border-brand-800"
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
<div>
|
||
|
|
<select
|
||
|
|
name="action"
|
||
|
|
class="h-11 rounded-lg border border-gray-300 bg-transparent px-4 py-2.5 text-sm text-gray-800 shadow-theme-xs focus:border-brand-300 focus:ring-3 focus:ring-brand-500/10 focus:outline-none dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:focus:border-brand-800"
|
||
|
|
>
|
||
|
|
<option value="">Semua Aksi</option>
|
||
|
|
<?php foreach ($actions as $action): ?>
|
||
|
|
<option value="<?= esc($action['action']) ?>" <?= ($actionFilter === $action['action']) ? 'selected' : '' ?>>
|
||
|
|
<?= esc($action['action']) ?>
|
||
|
|
</option>
|
||
|
|
<?php endforeach; ?>
|
||
|
|
</select>
|
||
|
|
</div>
|
||
|
|
<div>
|
||
|
|
<select
|
||
|
|
name="user"
|
||
|
|
class="h-11 rounded-lg border border-gray-300 bg-transparent px-4 py-2.5 text-sm text-gray-800 shadow-theme-xs focus:border-brand-300 focus:ring-3 focus:ring-brand-500/10 focus:outline-none dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:focus:border-brand-800"
|
||
|
|
>
|
||
|
|
<option value="">Semua User</option>
|
||
|
|
<?php foreach ($users as $user): ?>
|
||
|
|
<option value="<?= esc($user['id']) ?>" <?= ($userFilter == $user['id']) ? 'selected' : '' ?>>
|
||
|
|
<?= esc($user['username']) ?> (<?= esc($user['email']) ?>)
|
||
|
|
</option>
|
||
|
|
<?php endforeach; ?>
|
||
|
|
</select>
|
||
|
|
</div>
|
||
|
|
<button
|
||
|
|
type="submit"
|
||
|
|
class="inline-flex items-center justify-center gap-2 rounded-lg bg-brand-500 px-4 py-2.5 text-sm font-medium text-white shadow-theme-xs hover:bg-brand-600"
|
||
|
|
>
|
||
|
|
<i class="fe fe-search"></i>
|
||
|
|
Cari
|
||
|
|
</button>
|
||
|
|
<?php if (!empty($search) || !empty($actionFilter) || !empty($userFilter)): ?>
|
||
|
|
<a
|
||
|
|
href="<?= base_url('admin/audit-logs') ?>"
|
||
|
|
class="inline-flex items-center justify-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2.5 text-sm font-medium text-gray-700 shadow-theme-xs hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-white/[0.03]"
|
||
|
|
>
|
||
|
|
<i class="fe fe-x"></i>
|
||
|
|
Reset
|
||
|
|
</a>
|
||
|
|
<?php endif; ?>
|
||
|
|
</form>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Audit Logs Table -->
|
||
|
|
<div class="rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-white/[0.03]">
|
||
|
|
<div class="max-w-full overflow-x-auto">
|
||
|
|
<table class="min-w-full">
|
||
|
|
<thead>
|
||
|
|
<tr class="border-b border-gray-100 dark:border-gray-800">
|
||
|
|
<th class="px-5 py-3 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-500 text-xs dark:text-gray-400">
|
||
|
|
Waktu
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</th>
|
||
|
|
<th class="px-5 py-3 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-500 text-xs dark:text-gray-400">
|
||
|
|
User
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</th>
|
||
|
|
<th class="px-5 py-3 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-500 text-xs dark:text-gray-400">
|
||
|
|
Aksi
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</th>
|
||
|
|
<th class="px-5 py-3 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-500 text-xs dark:text-gray-400">
|
||
|
|
IP Address
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</th>
|
||
|
|
<th class="px-5 py-3 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-500 text-xs dark:text-gray-400">
|
||
|
|
User Agent
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</th>
|
||
|
|
</tr>
|
||
|
|
</thead>
|
||
|
|
<tbody class="divide-y divide-gray-100 dark:divide-gray-800">
|
||
|
|
<?php if (empty($auditLogs)): ?>
|
||
|
|
<tr>
|
||
|
|
<td colspan="5" class="px-5 py-8 text-center sm:px-6">
|
||
|
|
<p class="text-gray-500 dark:text-gray-400">Tidak ada log ditemukan.</p>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
<?php else: ?>
|
||
|
|
<?php foreach ($auditLogs as $log): ?>
|
||
|
|
<tr>
|
||
|
|
<td class="px-5 py-4 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="text-gray-500 text-sm dark:text-gray-400">
|
||
|
|
<?= date('d M Y H:i:s', strtotime($log['created_at'])) ?>
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
<td class="px-5 py-4 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="font-medium text-gray-800 text-sm dark:text-white/90">
|
||
|
|
<?= esc($log['username'] ?? 'System') ?>
|
||
|
|
</p>
|
||
|
|
<?php if (!empty($log['email'])): ?>
|
||
|
|
<p class="ml-2 text-xs text-gray-500 dark:text-gray-400">
|
||
|
|
(<?= esc($log['email']) ?>)
|
||
|
|
</p>
|
||
|
|
<?php endif; ?>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
<td class="px-5 py-4 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="rounded-full bg-brand-50 px-2 py-0.5 text-xs font-medium text-brand-700 dark:bg-brand-500/15 dark:text-brand-500">
|
||
|
|
<?= esc($log['action']) ?>
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
<td class="px-5 py-4 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="text-gray-500 text-sm dark:text-gray-400">
|
||
|
|
<?= esc($log['ip_address']) ?>
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
<td class="px-5 py-4 sm:px-6">
|
||
|
|
<div class="flex items-center">
|
||
|
|
<p class="text-gray-500 text-xs dark:text-gray-400 max-w-xs truncate" title="<?= esc($log['user_agent']) ?>">
|
||
|
|
<?= esc($log['user_agent']) ?>
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
<?php endforeach; ?>
|
||
|
|
<?php endif; ?>
|
||
|
|
</tbody>
|
||
|
|
</table>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Pagination -->
|
||
|
|
<?php if ($pager->hasMore() || $pager->getCurrentPage() > 1): ?>
|
||
|
|
<div class="flex items-center justify-between border-t border-gray-100 px-5 py-4 dark:border-gray-800 sm:px-6">
|
||
|
|
<div class="text-sm text-gray-500 dark:text-gray-400">
|
||
|
|
Menampilkan <?= count($auditLogs) ?> dari <?= $pager->getTotal() ?> log
|
||
|
|
</div>
|
||
|
|
<div class="flex items-center gap-2">
|
||
|
|
<?= $pager->links() ?>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<?php endif; ?>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<?= $this->endSection() ?>
|
||
|
|
|