Files
evo-sync/web/templates/admin/user_detail.html
mguschin 1d268a6b58 feat: add Отчество field to admin user detail page
- Add middle_name input to the edit form (3-column name grid)
- Save middle_name in the edit handler
- Show role selector for admin role (previously system-only)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 17:21:51 +03:00

181 lines
8.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "base.html" %}
{% block title %}{{ target.first_name }} {{ target.last_name }} — Админ — Мои Товары{% endblock %}
{% block page_title %}Пользователь{% endblock %}
{% block content %}
<ol class="breadcrumb">
<li><a href="/admin/users">Пользователи</a></li>
<li>{{ target.first_name }} {{ target.last_name }}</li>
</ol>
{% if request.query_params.get('success') == 'reset_sent' %}
<div class="alert alert-gr"><span><i class="bi bi-check-circle"></i></span><div>Ссылка для сброса пароля отправлена.</div></div>
{% elif request.query_params.get('success') == 'invite_sent' %}
<div class="alert alert-gr"><span><i class="bi bi-check-circle"></i></span><div>Приглашение отправлено.</div></div>
{% elif request.query_params.get('success') == 'saved' %}
<div class="alert alert-gr"><span><i class="bi bi-check-circle"></i></span><div>Данные сохранены.</div></div>
{% endif %}
<!-- User header -->
<div style="display:flex;align-items:center;gap:14px;margin-bottom:24px;">
<div class="avatar" style="width:48px;height:48px;font-size:16px;">
{{ target.first_name[0] if target.first_name else '?' }}{{ target.last_name[0] if target.last_name else '' }}
</div>
<div>
<div style="font-size:18px;font-weight:800;letter-spacing:-0.02em;">{{ target.first_name }} {{ target.last_name }}</div>
<div class="mono" style="font-size:12px;color:#9EA8BE;">{{ target.email }}</div>
</div>
</div>
<div class="g2" style="align-items:start;">
<!-- Left column -->
<div style="display:flex;flex-direction:column;gap:14px;">
<!-- Profile -->
<div class="card">
<div class="card-hd"><div><div class="card-title">Профиль</div></div></div>
<div class="conn-detail">
<div class="conn-row"><span class="conn-k">ID</span><span class="conn-v">{{ target.id }}</span></div>
<div class="conn-row">
<span class="conn-k">Email</span>
<span class="conn-v" style="display:flex;align-items:center;gap:6px;">
{{ target.email }}
{% if target.is_email_confirmed %}
<span class="tag tag-gr" style="font-size:10px;padding:1px 6px;">подтверждён</span>
{% else %}
<span class="tag tag-yl" style="font-size:10px;padding:1px 6px;">не подтверждён</span>
{% endif %}
</span>
</div>
<div class="conn-row"><span class="conn-k">Телефон</span><span class="conn-v">{{ target.phone or '—' }}</span></div>
<div class="conn-row">
<span class="conn-k">Роль</span>
<span class="conn-v" style="font-family:inherit;">
{% if target.role == 'system' %}<span class="tag tag-rd" style="font-size:10.5px;">Системный</span>
{% elif target.role == 'admin' %}<span class="tag tag-or" style="font-size:10.5px;">Администратор</span>
{% else %}<span class="tag tag-dim" style="font-size:10.5px;">Пользователь</span>
{% endif %}
</span>
</div>
<div class="conn-row">
<span class="conn-k">Статус</span>
<span class="conn-v" style="font-family:inherit;">
{% if target.status == 'active' %}<span class="tag tag-gr"><span class="dot g"></span>Активен</span>
{% elif target.status == 'pending' %}<span class="tag tag-yl"><span class="dot y pulse"></span>Ожидает</span>
{% else %}<span class="tag tag-rd"><span class="dot r"></span>Заблокирован</span>
{% endif %}
</span>
</div>
<div class="conn-row"><span class="conn-k">Регистрация</span><span class="conn-v">{{ target.created_at | datefmt }}</span></div>
{% if target.evotor_user_id %}
<div class="conn-row"><span class="conn-k">Эвотор ID</span><span class="conn-v">{{ target.evotor_user_id }}</span></div>
{% endif %}
{% if target.invite_token %}
<div class="conn-row"><span class="conn-k">Приглашение до</span><span class="conn-v">{{ target.invite_expires | datefmt }}</span></div>
{% endif %}
</div>
</div>
{% if target.evotor_meta %}
<div class="card">
<div class="card-hd"><div><div class="card-title">Данные Эвотор</div></div></div>
<pre>{{ target.evotor_meta | tojson(indent=2) }}</pre>
</div>
{% endif %}
</div>
<!-- Right column -->
<div style="display:flex;flex-direction:column;gap:14px;">
<!-- Actions -->
<div class="card">
<div class="card-title" style="margin-bottom:14px;">Действия</div>
<div style="display:flex;flex-direction:column;gap:8px;">
{% if target.status != 'active' %}
<form method="post" action="/admin/users/{{ target.id }}/activate">
<button type="submit" class="btn btn-primary w-100">
<i class="bi bi-check-circle"></i> Активировать
</button>
</form>
{% endif %}
{% if target.status != 'suspended' %}
<form method="post" action="/admin/users/{{ target.id }}/suspend">
<button type="submit" class="btn btn-danger w-100">
<i class="bi bi-slash-circle"></i> Заблокировать
</button>
</form>
{% endif %}
<form method="post" action="/admin/users/{{ target.id }}/reset-password">
<button type="submit" class="btn btn-outline w-100">
<i class="bi bi-key"></i> Сбросить пароль
</button>
</form>
<form method="post" action="/admin/users/{{ target.id }}/send-invite">
<button type="submit" class="btn btn-outline w-100">
<i class="bi bi-envelope"></i> Отправить приглашение
</button>
</form>
<form method="post" action="/admin/users/{{ target.id }}/view-as">
<button type="submit" class="btn btn-outline w-100">
<i class="bi bi-eye"></i> Просмотр от имени пользователя
</button>
</form>
{% if user.role == 'system' and target.id != user.id %}
<form method="post" action="/admin/users/{{ target.id }}/delete"
onsubmit="return confirm('Удалить пользователя {{ target.email }}? Это действие необратимо.')">
<button type="submit" class="btn btn-danger btn-sm w-100">
<i class="bi bi-trash"></i> Удалить
</button>
</form>
{% endif %}
</div>
</div>
<!-- Edit -->
<div class="card">
<div class="card-title" style="margin-bottom:14px;">Редактировать</div>
<form method="post" action="/admin/users/{{ target.id }}/edit">
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;">
<div class="form-row">
<label class="form-lbl" for="first_name">Имя</label>
<input class="inp" type="text" id="first_name" name="first_name" value="{{ target.first_name }}" required>
</div>
<div class="form-row">
<label class="form-lbl" for="last_name">Фамилия</label>
<input class="inp" type="text" id="last_name" name="last_name" value="{{ target.last_name }}" required>
</div>
<div class="form-row">
<label class="form-lbl" for="middle_name">Отчество</label>
<input class="inp" type="text" id="middle_name" name="middle_name" value="{{ target.middle_name or '' }}">
</div>
</div>
<div class="form-row">
<label class="form-lbl" for="email">Email</label>
<input class="inp" type="email" id="email" name="email" value="{{ target.email }}">
</div>
<div class="form-row">
<label class="form-lbl" for="phone">Телефон</label>
<input class="inp" type="tel" id="phone" name="phone" value="{{ target.phone }}">
</div>
{% if user.role in ('system', 'admin') %}
<div class="form-row">
<label class="form-lbl" for="role">Роль</label>
<select class="inp" id="role" name="role">
<option value="user" {% if target.role == 'user' %}selected{% endif %}>Пользователь</option>
<option value="admin" {% if target.role == 'admin' %}selected{% endif %}>Администратор</option>
<option value="system" {% if target.role == 'system' %}selected{% endif %}>Системный</option>
</select>
</div>
{% endif %}
<button type="submit" class="btn btn-primary btn-sm">
<i class="bi bi-save"></i> Сохранить
</button>
</form>
</div>
</div>
</div>
{% endblock %}