Spaces:
Running
Running
File size: 5,382 Bytes
33e88a3 701ca94 33e88a3 5ad2462 33e88a3 dd379cc 71250fd cfa1a18 71250fd 33e88a3 bac9817 33e88a3 922f58c 33e88a3 cfa1a18 71250fd 33e88a3 71250fd 33e88a3 290cc34 cfa1a18 a644974 cfa1a18 a644974 290cc34 33e88a3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | {% extends "base.html" %}
{% block title %}Admin Dashboard - QuantVAT{% endblock %}
{% block extra_css %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}">
{% endblock %}
{% block content %}
<div class="container wide">
<div class="admin-header">
<h1 class="admin-title">
<svg class="icon-inline" viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
Admin Panel
</h1>
</div>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-label">Total Users</div>
<div class="stat-value">{{ user_count }}</div>
</div>
<div class="stat-card">
<div class="stat-label">Lifetime Scans</div>
<div class="stat-value" style="color: var(--accent-green);">{{ active_tasks }}</div>
</div>
<div class="stat-card">
<div class="stat-label">Report Views</div>
<div class="stat-value" style="color: var(--accent-blue);">{{ report_views }}</div>
</div>
<div class="stat-card">
<div class="stat-label">System Storage</div>
<div class="stat-value" style="color: var(--accent-purple);">{{ storage_usage }}<small style="font-size: 0.9rem;">MB</small></div>
</div>
</div>
<div class="table-card">
<div class="table-header">
<div class="header-title">
<svg class="icon-inline" viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>
<span>LIVE ACTIVITY</span>
</div>
</div>
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>User ID</th>
<th>Status</th>
<th>Progress</th>
<th>Current Action</th>
</tr>
</thead>
<tbody>
{% for uid, data in progress.items() %}
<tr>
<td style="font-family: 'JetBrains Mono'; color: var(--accent-blue);">{{ uid[:8] }}</td>
<td><span class="status-badge {{'status-active' if data.status == 'active' else 'status-idle'}}">{{ data.status }}</span></td>
<td><div class="progress-track"><div class="progress-fill" style="width: {{ data.percent }}%"></div></div></td>
<td style="color: var(--text-dim);">{{ data.text }}</td>
</tr>
{% else %}
<tr><td colspan="4" style="text-align:center; padding: 40px; color: var(--text-dim);">No sessions found in memory</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="table-card" style="margin-top: 25px;">
<div class="table-header error-header">
<div class="header-title">
<svg class="icon-inline" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span>ERROR LOGS ({{ error_logs|length }})</span>
</div>
<div style="display: flex; gap: 8px;">
<a href="{{ url_for('main.download_error_logs') }}" class="btn-icon-text btn-download">
<svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
<span>CSV</span>
</a>
<form method="POST" action="{{ url_for('main.clear_admin_error_logs') }}" onsubmit="return confirm('Clear all error logs? This cannot be undone.');">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="btn-icon-text btn-clear">
<svg viewBox="0 0 24 24"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
<span>Clear</span>
</button>
</form>
</div>
</div>
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>Time</th>
<th>Source</th>
<th>User</th>
<th>Message</th>
</tr>
</thead>
<tbody>
{% for entry in error_logs %}
<tr>
<td class="error-time">{{ entry.timestamp }}</td>
<td class="error-source">{{ entry.source }}</td>
<td style="font-family: 'JetBrains Mono'; color: var(--text-dim);">{{ (entry.uid or "—")[:8] }}</td>
<td class="error-message">{{ entry.message }}</td>
</tr>
{% else %}
<tr><td colspan="4" style="text-align:center; padding: 40px; color: var(--text-dim);">No errors logged 🎉</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %} |