kpi-dashboard / templates /admin /users.html
Admin
Initial HF deploy
04477e7
Raw
History Blame
8.44 kB
{% 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 %}