Adopt the shopdb-flask visual language across the PXE webapp (presentation only, Flask/Jinja logic unchanged): - New static/pxe-theme.css: GE Aerospace palette (atmosphere-blue sidebar, sky-blue primary, avionics-green), Inter font stack, light/dark theming via data-theme + localStorage (key pxe-theme) with system-pref fallback, and card/button/table/form/badge/alert component styles layered over Bootstrap. - base.html: shopdb-style sidebar (logo + title, nav sections, footer light/dark toggle) + theme boot script. - All 13 content templates restyled to the new page-header + card/table/badge vocabulary; unattend_editor grouped per unattend-UX research. - Fixed a pre-existing CRITICAL bug found during review: nested <form>s in image_config.html made Adopt submit the delete form and Delete-selected post every orphan filename regardless of checkboxes; split into standalone forms wired via the form= attribute. Built by a Fable-orchestrated Opus workflow (17 agents). All 14 templates parse clean under Jinja2.
61 lines
1.9 KiB
HTML
61 lines
1.9 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Audit Log - PXE Server Manager{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="page-header">
|
|
<h2>Audit Log</h2>
|
|
<div class="header-actions">
|
|
<span class="badge badge-secondary badge-lg">{{ entries|length }} entries</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section-card">
|
|
<div class="section-title">Activity History</div>
|
|
{% if entries %}
|
|
<div class="table-container">
|
|
<table class="data-table">
|
|
<thead>
|
|
<tr>
|
|
<th style="width: 180px;">Timestamp</th>
|
|
<th style="width: 130px;">Source</th>
|
|
<th style="width: 180px;">Action</th>
|
|
<th>Details</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for entry in entries %}
|
|
<tr>
|
|
{% set parts = entry.split(' ', 1) %}
|
|
{% if parts|length == 2 %}
|
|
{% set meta = parts[1].split('] ', 1) %}
|
|
<td class="mono">{{ parts[0] }}</td>
|
|
{% if meta|length == 2 %}
|
|
<td class="mono">{{ meta[0].lstrip('[') }}</td>
|
|
{% set action_detail = meta[1].split(': ', 1) %}
|
|
{% if action_detail|length == 2 %}
|
|
<td><span class="badge badge-primary">{{ action_detail[0] }}</span></td>
|
|
<td>{{ action_detail[1] }}</td>
|
|
{% else %}
|
|
<td colspan="2">{{ meta[1] }}</td>
|
|
{% endif %}
|
|
{% else %}
|
|
<td colspan="3">{{ parts[1] }}</td>
|
|
{% endif %}
|
|
{% else %}
|
|
<td colspan="4">{{ entry }}</td>
|
|
{% endif %}
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-5">
|
|
<i class="bi bi-list-check" style="font-size: 2rem; opacity: 0.4;"></i>
|
|
<p class="mt-2 mb-1">No audit log entries yet.</p>
|
|
<p class="small mb-0">Actions like image imports, unattend edits, and backup operations will be logged here.</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock %}
|