Spaces:
Paused
Paused
| {% 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 %} | |