freightdesk/webapp/src/views/pages/audit/detail.ejs
FreightDesk 795cc86b5a [OWL] Audit logging: cherry-pick Hermes' audit SQL, add routes + views
From Hermes' agent/default/soft-delete-audit branch:
- Add migration 004_audit_logging.sql (audit_logs table, trigger function,
  triggers on loads/shippers/vehicles/payments/portal_users,
  set_audit_user() helper function)
- Improved: uses IF NOT EXISTS, AFTER triggers, user session context var,
  distinguishes SOFT_DELETE vs HARD_DELETE, notes field

New:
- GET /audit-logs (admin-only, filterable by table/action, paginated)
- GET /audit-logs/:id (detail view with before/after JSON)
- Audit Logs link in sidebar

Keeps all existing OWL code: CI/CD, Pino, Prometheus, tests, cache-busting,
debounced search, ESLint, Prettier
2026-06-07 20:03:23 +00:00

68 lines
1.9 KiB
Text

<%- include('../partials/header', { activeMenu: 'audit' }) %>
<div class="page-header">
<div>
<h1 class="page-title">&#128220; Audit Log Detail</h1>
<p class="page-subtitle"><%= log.id %></p>
</div>
<div class="page-actions">
<a href="/audit-logs" class="btn btn-outline">&larr; Back to Logs</a>
</div>
</div>
<div class="card">
<div class="card-body">
<div class="detail-grid">
<div class="detail-item">
<label>Action</label>
<span class="badge badge-<%= log.action === 'INSERT' ? 'green' : log.action === 'UPDATE' ? 'blue' : log.action === 'SOFT_DELETE' ? 'orange' : 'red' %>"><%= log.action %></span>
</div>
<div class="detail-item">
<label>Table</label>
<code><%= log.table_name %></code>
</div>
<div class="detail-item">
<label>Row ID</label>
<code><%= log.row_id || '—' %></code>
</div>
<div class="detail-item">
<label>Timestamp</label>
<span><%= new Date(log.created_at).toLocaleString('en-IN') %></span>
</div>
<div class="detail-item">
<label>User ID</label>
<code><%= log.user_id || 'System' %></code>
</div>
<% if (log.notes) { %>
<div class="detail-item">
<label>Notes</label>
<span><%= log.notes %></span>
</div>
<% } %>
</div>
</div>
</div>
<% if (log.before_json) { %>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title">&#128450; Before (Old Values)</h3>
</div>
<div class="card-body">
<pre class="code-block"><%= JSON.stringify(log.before_json, null, 2) %></pre>
</div>
</div>
<% } %>
<% if (log.after_json) { %>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title">&#128451; After (New Values)</h3>
</div>
<div class="card-body">
<pre class="code-block"><%= JSON.stringify(log.after_json, null, 2) %></pre>
</div>
</div>
<% } %>
<%- include('../partials/footer') %>