File size: 8,438 Bytes
04477e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{% extends "base.html" %}
{% block title %}Пользователи{% endblock %}
{% block page_title %}Пользователи{% endblock %}

{% block content %}
<div class="d-card" style="border-radius:20px;background:rgba(6,11,40,0.6);backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,0.05);overflow:hidden;">
    <div style="display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid rgba(255,255,255,0.05);gap:12px;">
        <span style="font-size:14px;font-weight:600;color:#fff;flex-shrink:0;">Управление пользователями</span>
        <div style="display:flex;gap:8px;align-items:center;flex:1;justify-content:flex-end;">
            <input type="text" id="userSearch" class="form-control form-control-sm" placeholder="Поиск..." style="max-width:200px;font-size:11px;border-radius:12px;background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;">
            <a href="{{ url_for('admin.create_user') }}" class="btn-apple" style="border-radius:12px;flex-shrink:0;">
                <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="margin-right:4px;"><path d="M12 5v14M5 12h14"/></svg>
                Создать
            </a>
        </div>
    </div>
    <div style="overflow-x:auto;">
        <table style="width:100%;border-collapse:collapse;font-size:12px;">
            <thead>
                <tr>
                    <th style="padding:8px 16px;text-align:left;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">ФИО</th>
                    <th style="padding:8px;text-align:left;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">Логин</th>
                    <th style="padding:8px;text-align:left;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">Роль</th>
                    <th style="padding:8px;text-align:left;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">Наставник</th>
                    <th style="padding:8px;text-align:left;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">Статус</th>
                    <th style="padding:8px 16px;text-align:right;font-size:10px;font-weight:700;text-transform:uppercase;color:#A0A5B5;background:rgba(255,255,255,0.02);border-bottom:1px solid rgba(255,255,255,0.04);">Действия</th>
                </tr>
            </thead>
            <tbody>
                {% for u in users %}
                <tr>
                    <td style="padding:8px 16px;border-bottom:1px solid rgba(255,255,255,0.03);">
                        <div style="display:flex;align-items:center;gap:8px;">
                            <span style="width:28px;height:28px;border-radius:8px;background:#0075FF;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:12px;flex-shrink:0;">{{ u.full_name[:1] }}</span>
                            <span style="font-weight:500;color:#fff;">{{ u.full_name }}</span>
                        </div>
                    </td>
                    <td style="padding:8px;border-bottom:1px solid rgba(255,255,255,0.03);color:#fff;">{{ u.username }}</td>
                    <td style="padding:8px;border-bottom:1px solid rgba(255,255,255,0.03);">
                        <span style="display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:500;background:rgba(0,117,255,0.12);color:#0075FF;">
                            {{ {'admin':'Админ','junior_expert':'Младший эксперт','sm':'Руководитель','senior_expert':'Старший эксперт','employee':'Эксперт','guest':'Гость'}.get(u.role, u.role) }}
                        </span>
                    </td>
                    <td style="padding:8px;border-bottom:1px solid rgba(255,255,255,0.03);color:#fff;">{{ u.senior_expert.full_name if u.senior_expert else '—' }}</td>
                    <td style="padding:8px;border-bottom:1px solid rgba(255,255,255,0.03);">
                        {% if u.is_active %}
                        <span style="display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:500;background:rgba(1,181,116,0.1);color:#01B574;">Активен</span>
                        {% else %}
                        <span style="display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:500;background:rgba(239,68,68,0.1);color:#ef4444;">Деактивирован</span>
                        {% endif %}
                    </td>
                    <td style="padding:8px 16px;border-bottom:1px solid rgba(255,255,255,0.03);text-align:right;">
                        <div style="display:inline-flex;gap:4px;">
                            <a href="{{ url_for('admin.edit_user', user_id=u.id) }}" class="btn-outline-apple" style="padding:4px 8px;font-size:11px;border-radius:8px;" title="Редактировать">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
                            </a>
                            <a href="{{ url_for('admin.reset_password', user_id=u.id) }}" class="btn-outline-apple" style="padding:4px 8px;font-size:11px;color:#d97706;border-color:#d97706;border-radius:8px;" title="Сбросить пароль"
                               onclick="return confirm('Сбросить пароль для {{ u.full_name }} на kpi123?')">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0110 0v4"/></svg>
                            </a>
                            <a href="{{ url_for('admin.toggle_user', user_id=u.id) }}" class="btn-outline-apple" style="padding:4px 8px;font-size:11px;border-radius:8px;{% if u.is_active %}color:#dc2626;border-color:#dc2626;{% else %}color:#16a34a;border-color:#16a34a;{% endif %}" title="{% if u.is_active %}Деактивировать{% else %}Активировать{% endif %}">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">{% if u.is_active %}<path d="M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2"/><circle cx="12" cy="7" r="4"/><path d="M1 1l22 22"/>{% else %}<path d="M16 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="8.5" cy="7" r="4"/><line x1="20" y1="8" x2="20" y2="14"/><line x1="23" y1="11" x2="17" y2="11"/>{% endif %}</svg>
                            </a>
                            <a href="{{ url_for('main.employee', user_id=u.id) }}" class="btn-outline-apple" style="padding:4px 8px;font-size:11px;color:#0891b2;border-color:#0891b2;border-radius:8px;" title="Профиль KPI">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg>
                            </a>
                        </div>
                    </td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
    var search = document.getElementById('userSearch');
    if (search) {
        search.addEventListener('input', function() {
            var q = this.value.toLowerCase().trim();
            document.querySelectorAll('tbody tr').forEach(function(row) {
                var text = row.textContent.toLowerCase();
                row.style.display = text.includes(q) ? '' : 'none';
            });
        });
    }
});
</script>
{% endblock %}