120 lines
4.1 KiB
Django/Jinja
120 lines
4.1 KiB
Django/Jinja
{% extends "base.html.jinja" %}
|
|
|
|
{% block title %}Logs{% endblock title %}
|
|
|
|
{% block content %}
|
|
<h1>Activity Logs</h1>
|
|
|
|
<!-- Include flash messages template -->
|
|
{% include "partials/flash_messages.html.jinja" %}
|
|
|
|
<form method="get" class="mb-3">
|
|
<div class="row g-2">
|
|
<div class="col-md-3">
|
|
<label for="category" class="form-label">Category:</label>
|
|
<select name="category" id="category" class="form-select">
|
|
<option value="">All</option>
|
|
{% for cat in categories %}
|
|
<option value="{{ cat }}" {% if category==cat %}selected{% endif %}>{{ cat }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
|
|
<div class="col-md-3">
|
|
<label for="start_date" class="form-label">Start Date:</label>
|
|
<input type="date" name="start_date" id="start_date" value="{{ start_date }}" class="form-control">
|
|
</div>
|
|
|
|
<div class="col-md-3">
|
|
<label for="end_date" class="form-label">End Date:</label>
|
|
<input type="date" name="end_date" id="end_date" value="{{ end_date }}" class="form-control">
|
|
</div>
|
|
|
|
<div class="col-md-3">
|
|
<label for="search_term" class="form-label">Search:</label>
|
|
<input type="text" name="search_term" id="search_term" value="{{ search_term }}" class="form-control">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mt-3">
|
|
<button type="submit" class="btn btn-primary">Filter</button>
|
|
<a href="{{ url_for('logger.download_logs', category=category, start_date=start_date, end_date=end_date, search_term=search_term) }}"
|
|
class="btn btn-secondary">Download CSV</a>
|
|
</div>
|
|
</form>
|
|
|
|
<ul class="list-group">
|
|
{% for log in logs %}
|
|
<li class="list-group-item log-item" data-log-id="{{ log.id }}">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div class="ms-2 me-auto">
|
|
<div class="fw-bold">{{ log.timestamp }}</div>
|
|
{{ log.action }} - {{ log.description }}
|
|
</div>
|
|
<span class="badge bg-primary rounded-pill">{{ log.category }}</span>
|
|
</div>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
|
|
{% if pagination %}
|
|
<nav aria-label="Page navigation" class="mt-4">
|
|
<ul class="pagination justify-content-center">
|
|
{% if pagination.has_prev %}
|
|
<li class="page-item">
|
|
<a class="page-link"
|
|
href="{{ url_for('logger.list_logs', page=pagination.prev_num, category=category, start_date=start_date, end_date=end_date, search_term=search_term) }}">Previous</a>
|
|
</li>
|
|
{% else %}
|
|
<li class="page-item disabled">
|
|
<span class="page-link">Previous</span>
|
|
</li>
|
|
{% endif %}
|
|
|
|
<li class="page-item disabled">
|
|
<span class="page-link">Page {{ pagination.page }} of {{ pagination.pages }}</span>
|
|
</li>
|
|
|
|
{% if pagination.has_next %}
|
|
<li class="page-item">
|
|
<a class="page-link"
|
|
href="{{ url_for('logger.list_logs', page=pagination.next_num, category=category, start_date=start_date, end_date=end_date, search_term=search_term) }}">Next</a>
|
|
</li>
|
|
{% else %}
|
|
<li class="page-item disabled">
|
|
<span class="page-link">Next</span>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
{% endif %}
|
|
|
|
<!-- Modal for log details -->
|
|
<div class="modal fade" id="logDetailModal" tabindex="-1" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg modal-dialog-scrollable">
|
|
<div class="modal-content" id="log-detail-content">
|
|
<!-- Log details will be loaded here via AJAX -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock content %}
|
|
|
|
{% block scripts %}
|
|
{{ super() }}
|
|
<script src="{{ url_for('static', filename='js/modal-handler.js') }}"></script>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
// Use the reusable ModalHandler for log details
|
|
const logModal = new ModalHandler('logDetailModal', 'log-detail-content');
|
|
|
|
// Set up click handlers for log items with custom URL construction
|
|
document.querySelectorAll('.log-item').forEach(item => {
|
|
item.addEventListener('click', function () {
|
|
const logId = this.getAttribute('data-log-id');
|
|
const url = `/logs/${logId}/detail`;
|
|
logModal.loadAndShow(url, 'Error loading log details.');
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
{% endblock scripts %} |