67 lines
3.3 KiB
HTML
67 lines
3.3 KiB
HTML
{# HTMX fragment: Detected Access logs by ip table #}
|
|
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;">
|
|
<span class="pagination-info">Page {{ pagination.page }}/{{ pagination.total_pages }} — {{ pagination.total }} total</span>
|
|
<div style="display: flex; gap: 8px;">
|
|
<button class="pagination-btn"
|
|
hx-get="{{ dashboard_path }}/htmx/access-logs?page={{ pagination.page - 1 }}&sort_by={{ sort_by }}&sort_order={{ sort_order }}&ip_filter={{ ip_filter }}"
|
|
hx-target="closest .htmx-container"
|
|
hx-swap="innerHTML"
|
|
{% if pagination.page <= 1 %}disabled{% endif %}>Prev</button>
|
|
<button class="pagination-btn"
|
|
hx-get="{{ dashboard_path }}/htmx/access-logs?page={{ pagination.page + 1 }}&sort_by={{ sort_by }}&sort_order={{ sort_order }}&ip_filter={{ ip_filter }}"
|
|
hx-target="closest .htmx-container"
|
|
hx-swap="innerHTML"
|
|
{% if pagination.page >= pagination.total_pages %}disabled{% endif %}>Next</button>
|
|
</div>
|
|
</div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Path</th>
|
|
<th>User-Agent</th>
|
|
<th class="sortable {% if sort_by == 'timestamp' %}{{ sort_order }}{% endif %}"
|
|
hx-get="{{ dashboard_path }}/htmx/access-logs?page=1&sort_by=timestamp&sort_order={% if sort_by == 'timestamp' and sort_order == 'desc' %}asc{% else %}desc{% endif %}&ip_filter={{ ip_filter }}"
|
|
hx-target="closest .htmx-container"
|
|
hx-swap="innerHTML">
|
|
Time
|
|
</th>
|
|
<th style="width: 100px;"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for log in items %}
|
|
<tr class="ip-row" data-ip="{{ log.ip | e }}">
|
|
<td class="rank">{{ loop.index + (pagination.page - 1) * pagination.page_size }}</td>
|
|
<td>
|
|
<div class="path-cell-container">
|
|
<span class="path-truncated">{{ log.path | e }}</span>
|
|
{% if log.path | length > 30 %}
|
|
<div class="path-tooltip">{{ log.path | e }}</div>
|
|
{% endif %}
|
|
</div>
|
|
</td>
|
|
<td>{{ (log.user_agent | default(''))[:50] | e }}</td>
|
|
<td>{{ log.timestamp | format_ts }}</td>
|
|
<td>
|
|
{% if log.id %}
|
|
<button class="view-btn" @click="viewRawRequest({{ log.id }})" title="View Request">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6zm5.2 0L19.2 12l-4.6-4.6L16 6l6 6-6 6z"/></svg>
|
|
<span class="view-btn-tooltip">View Request</span>
|
|
</button>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr class="ip-stats-row" style="display: none;">
|
|
<td colspan="5" class="ip-stats-cell">
|
|
<div class="ip-stats-dropdown">
|
|
<div class="loading">Loading stats...</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% else %}
|
|
<tr><td colspan="5" style="text-align: center;">No logs detected</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|