8db8f59d2f
Выдача/отзыв права на отчёты по всем отделам конкретному сотруднику из портала управления группами. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
97 lines
6.7 KiB
HTML
97 lines
6.7 KiB
HTML
{% load i18n %}
|
|
<div class="page-content">
|
|
|
|
<div style="margin-bottom:1.5rem;">
|
|
<h1 style="font-size:1.25rem; font-weight:500; color:var(--color-foreground);">{% trans "Группы пользователей" %}</h1>
|
|
<p style="font-size:0.875rem; color:var(--color-muted-foreground); margin-top:0.25rem;">{% trans "Роли портала и сводная таблица доступа к разделам" %}</p>
|
|
</div>
|
|
|
|
{% if ug_message %}
|
|
<div style="margin-bottom:1rem; padding:0.65rem 0.9rem; border-radius:0.5rem; background:color-mix(in srgb, #16a34a 12%, var(--color-card)); border:1px solid color-mix(in srgb, #16a34a 30%, var(--color-border)); font-size:0.8125rem;">{{ ug_message }}</div>
|
|
{% endif %}
|
|
{% if ug_error %}
|
|
<div style="margin-bottom:1rem; padding:0.65rem 0.9rem; border-radius:0.5rem; background:color-mix(in srgb, #dc2626 12%, var(--color-card)); border:1px solid color-mix(in srgb, #dc2626 30%, var(--color-border)); font-size:0.8125rem;">{{ ug_error }}</div>
|
|
{% endif %}
|
|
|
|
<div style="background:var(--color-card); border-radius:0.75rem; border:1px solid var(--color-border); overflow:hidden;">
|
|
<table style="width:100%; border-collapse:collapse; font-size:0.8125rem;">
|
|
<thead>
|
|
<tr style="background:var(--color-muted);">
|
|
<th style="padding:0.625rem 1.25rem; text-align:left; font-size:0.7rem; text-transform:uppercase; color:var(--color-muted-foreground);">{% trans "Группа" %}</th>
|
|
<th style="padding:0.625rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; color:var(--color-muted-foreground);">{% trans "Описание" %}</th>
|
|
<th style="padding:0.625rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; color:var(--color-muted-foreground);">{% trans "Разделов" %}</th>
|
|
<th style="padding:0.625rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; color:var(--color-muted-foreground);">{% trans "Статус" %}</th>
|
|
<th style="padding:0.625rem 1rem;"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for g in groups %}
|
|
<tr class="tr-hover" style="border-bottom:1px solid var(--color-border);">
|
|
<td style="padding:0.75rem 1.25rem; font-weight:500; color:var(--color-foreground);">{{ g.name }}</td>
|
|
<td style="padding:0.75rem 1rem; color:var(--color-muted-foreground);">{{ g.profile_description|default:"—" }}</td>
|
|
<td style="padding:0.75rem 1rem;">{{ g.access_count }}</td>
|
|
<td style="padding:0.75rem 1rem;">
|
|
{% if g.profile_active %}<span class="badge badge-success">{% trans "Активна" %}</span>
|
|
{% else %}<span class="badge badge-muted">{% trans "Выкл." %}</span>{% endif %}
|
|
</td>
|
|
<td style="padding:0.75rem 1rem; text-align:right;">
|
|
<a href="{% url 'user_group_access' g.id %}"
|
|
hx-get="{% url 'user_group_access' g.id %}"
|
|
hx-target="#main-content" hx-push-url="{% url 'user_group_access' g.id %}"
|
|
hx-indicator="#loader"
|
|
class="btn btn-secondary" style="font-size:0.75rem; text-decoration:none; border:1px solid var(--color-border);">
|
|
{% trans "Сводная таблица доступа" %}
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
{% empty %}
|
|
<tr><td colspan="5" style="padding:2rem; text-align:center; color:var(--color-muted-foreground);">{% trans "Групп нет" %}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div style="margin-top:1.5rem; background:var(--color-card); border-radius:0.75rem; border:1px solid var(--color-border); padding:1.25rem;">
|
|
<h2 style="font-size:0.9375rem; font-weight:500; margin:0 0 0.35rem;">{% trans "Отчёты всех отделов — отдельным сотрудникам" %}</h2>
|
|
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin:0 0 1rem;">
|
|
{% trans "Не трогает группу: право только у выбранного человека. Он увидит опубликованные отчёты всех отделов." %}
|
|
</p>
|
|
<form method="post" action="{% url 'user_group_individual_reports_grant' %}"
|
|
style="display:flex; gap:0.5rem; flex-wrap:wrap; align-items:center; margin:0 0 1rem;">
|
|
{% csrf_token %}
|
|
<select name="employee_id" required class="input" style="min-width:18rem;">
|
|
<option value="">{% trans "Выберите сотрудника…" %}</option>
|
|
{% for emp in employee_choices %}
|
|
<option value="{{ emp.id }}">{{ emp.last_name }} {{ emp.first_name }} ({{ emp.username }})</option>
|
|
{% endfor %}
|
|
</select>
|
|
<button type="submit" class="btn btn-primary">{% trans "Выдать доступ" %}</button>
|
|
</form>
|
|
{% if individual_report_viewers %}
|
|
<table style="width:100%; border-collapse:collapse; font-size:0.8125rem;">
|
|
<thead>
|
|
<tr style="background:var(--color-muted);">
|
|
<th style="padding:0.5rem 0.75rem; text-align:left; font-size:0.7rem; text-transform:uppercase; color:var(--color-muted-foreground);">{% trans "Сотрудник" %}</th>
|
|
<th style="padding:0.5rem 0.75rem;"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for emp in individual_report_viewers %}
|
|
<tr style="border-top:1px solid var(--color-border);">
|
|
<td style="padding:0.6rem 0.75rem;">{{ emp.last_name }} {{ emp.first_name }} <span style="color:var(--color-muted-foreground);">({{ emp.username }})</span></td>
|
|
<td style="padding:0.6rem 0.75rem; text-align:right;">
|
|
<form method="post" action="{% url 'user_group_individual_reports_revoke' emp.id %}" style="margin:0;">
|
|
{% csrf_token %}
|
|
<button type="submit" class="btn btn-secondary" style="font-size:0.75rem;">{% trans "Снять" %}</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin:0;">{% trans "Пока никому персонально не выдано." %}</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|