|
{% extends "admin/base.html" %}
|
|
|
|
{% block title %}Управление пользователями{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="admin-header">
|
|
<h1><i class="fas fa-users"></i> Управление пользователями</h1>
|
|
<div class="admin-actions">
|
|
<form class="search-form" method="get" action="{{ url_for('admin_bp.manage_users') }}">
|
|
<div class="input-group">
|
|
<input type="text" class="form-control" name="search" placeholder="Поиск..."
|
|
value="{{ search_query }}">
|
|
<button class="btn btn-outline-secondary" type="submit">
|
|
<i class="fas fa-search"></i>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Имя</th>
|
|
<th>Email</th>
|
|
<th>Дата регистрации</th>
|
|
<th>Статус</th>
|
|
<th>Действия</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for user in users.items %}
|
|
<tr>
|
|
<td>{{ user.id }}</td>
|
|
<td>{{ user.username }}</td>
|
|
<td>{{ user.email }}</td>
|
|
<td>{{ user.created_at|datetimeformat }}</td>
|
|
<td>
|
|
{% if user.is_admin %}
|
|
<span class="badge bg-danger">Админ</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary">Пользователь</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
<div class="btn-group">
|
|
<button class="btn btn-sm btn-{{ 'danger' if user.is_admin else 'success' }} toggle-admin"
|
|
data-user-id="{{ user.id }}">
|
|
{{ 'Убрать админа' if user.is_admin else 'Сделать админом' }}
|
|
</button>
|
|
{% if user.id != current_user.id %}
|
|
<button class="btn btn-sm btn-outline-danger delete-user"
|
|
data-user-id="{{ user.id }}">
|
|
<i class="fas fa-trash"></i>
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
|
|
<nav aria-label="Page navigation">
|
|
<ul class="pagination justify-content-center">
|
|
{% if users.has_prev %}
|
|
<li class="page-item">
|
|
<a class="page-link" href="{{ url_for('admin_bp.manage_users', page=users.prev_num, search=search_query) }}">
|
|
«
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% for page_num in users.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=3) %}
|
|
{% if page_num %}
|
|
<li class="page-item {% if page_num == users.page %}active{% endif %}">
|
|
<a class="page-link" href="{{ url_for('admin_bp.manage_users', page=page_num, search=search_query) }}">
|
|
{{ page_num }}
|
|
</a>
|
|
</li>
|
|
{% else %}
|
|
<li class="page-item disabled"><span class="page-link">...</span></li>
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
{% if users.has_next %}
|
|
<li class="page-item">
|
|
<a class="page-link" href="{{ url_for('admin_bp.manage_users', page=users.next_num, search=search_query) }}">
|
|
»
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
{{ super() }}
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
|
function getCookie(name) {
|
|
const cookieValue = document.cookie
|
|
.split('; ')
|
|
.find(row => row.startsWith(name + '='))
|
|
?.split('=')[1];
|
|
return cookieValue ? decodeURIComponent(cookieValue) : null;
|
|
}
|
|
|
|
|
|
document.querySelectorAll('.toggle-admin').forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
const userId = this.dataset.userId;
|
|
fetch(`/admin/toggle_admin/${userId}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-CSRFToken': getCookie('csrf_token')
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.status === 'success') {
|
|
location.reload();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
document.querySelectorAll('.delete-user').forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
if (!confirm('Вы уверены, что хотите удалить этого пользователя?')) return;
|
|
|
|
const userId = this.dataset.userId;
|
|
fetch(`/admin/delete_user/${userId}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-CSRFToken': getCookie('csrf_token')
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.status === 'success') {
|
|
location.reload();
|
|
} else {
|
|
alert(data.message || 'Ошибка при удалении');
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
{% endblock %} |