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 %}