03019898b0
Добавлена офлайн/EndUser-подпись «ознакомлен и принял в работу» для документов отчётов и файловые вложения к задачам через Nextcloud. Co-authored-by: Cursor <cursoragent@cursor.com>
178 lines
13 KiB
HTML
178 lines
13 KiB
HTML
{% load i18n %}
|
|
<div class="page-content">
|
|
|
|
<div style="display:flex; align-items:flex-start; justify-content:space-between; gap:1rem; flex-wrap:wrap; margin-bottom:1.25rem;">
|
|
<div>
|
|
<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 can_manage_templates %}
|
|
<a href="/reports/templates/" hx-get="/reports/templates/" hx-target="#main-content" hx-push-url="/reports/templates/" hx-indicator="#loader"
|
|
class="btn btn-secondary">{% trans "Шаблоны оформления" %}</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% if reports_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;">{{ reports_message }}</div>
|
|
{% endif %}
|
|
{% if reports_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;">{{ reports_error }}</div>
|
|
{% endif %}
|
|
|
|
{% if report_rows or report_documents or can_create_report_document %}
|
|
<div style="background:var(--color-card); border-radius:0.75rem; border:1px solid var(--color-border); box-shadow:0 1px 2px rgb(0 0 0/0.05); overflow:hidden;">
|
|
<table style="width:100%; border-collapse:collapse; font-size:0.8125rem;">
|
|
<thead>
|
|
<tr style="background:var(--color-muted);">
|
|
<th style="padding:0.5rem 1.25rem; text-align:left; font-size:0.7rem; text-transform:uppercase; letter-spacing:0.04em; color:var(--color-muted-foreground);">{% trans "Название" %}</th>
|
|
<th style="padding:0.5rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; letter-spacing:0.04em; color:var(--color-muted-foreground);">{% trans "Отдел" %}</th>
|
|
<th style="padding:0.5rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; letter-spacing:0.04em; color:var(--color-muted-foreground);">{% trans "Период" %}</th>
|
|
<th style="padding:0.5rem 1rem; text-align:left; font-size:0.7rem; text-transform:uppercase; letter-spacing:0.04em; color:var(--color-muted-foreground);">{% trans "Статус" %}</th>
|
|
<th style="padding:0.5rem 1rem;"></th>
|
|
</tr>
|
|
</thead>
|
|
{% if report_rows %}
|
|
<tbody>
|
|
{% for row in report_rows %}
|
|
<tr class="tr-hover" style="border-top:1px solid var(--color-border);">
|
|
<td style="padding:0.75rem 1.25rem; vertical-align:middle;">
|
|
<a href="{{ row.path }}"
|
|
hx-get="{{ row.path }}" hx-target="#main-content" hx-push-url="{{ row.path }}" hx-indicator="#loader"
|
|
style="font-weight:600; color:var(--color-foreground); text-decoration:none;">{{ row.title }}</a>
|
|
<div style="font-size:0.75rem; color:var(--color-muted-foreground); margin-top:0.2rem; line-height:1.35; max-width:36rem;">{{ row.description }}</div>
|
|
</td>
|
|
<td style="padding:0.75rem 1rem; white-space:nowrap;">{{ row.department_label }}</td>
|
|
<td style="padding:0.75rem 1rem; white-space:nowrap;">{{ row.latest_month|default:"—" }}</td>
|
|
<td style="padding:0.75rem 1rem; white-space:nowrap;">
|
|
{% if row.status == 'published' %}
|
|
<span class="badge badge-success">{{ row.status_label }}</span>
|
|
{% else %}
|
|
<span class="badge badge-muted">{{ row.status_label }}</span>
|
|
{% endif %}
|
|
</td>
|
|
<td style="padding:0.75rem 1.25rem; text-align:right; white-space:nowrap;">
|
|
<a href="{{ row.path }}"
|
|
hx-get="{{ row.path }}" hx-target="#main-content" hx-push-url="{{ row.path }}" hx-indicator="#loader"
|
|
style="font-size:0.75rem; color:var(--color-primary); text-decoration:none;">{% trans "Открыть" %}</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
{% endif %}
|
|
|
|
<tbody>
|
|
<tr style="background:var(--color-muted); border-top:1px solid var(--color-border);">
|
|
<td colspan="5" style="padding:0.45rem 1.25rem; font-size:0.7rem; text-transform:uppercase; letter-spacing:0.04em; color:var(--color-muted-foreground); font-weight:600;">
|
|
{% trans "Документы отдела" %}
|
|
</td>
|
|
</tr>
|
|
{% for doc in report_documents %}
|
|
<tr class="tr-hover" style="border-top:1px solid var(--color-border);">
|
|
<td style="padding:0.65rem 1.25rem; vertical-align:middle;">
|
|
{% if onlyoffice_ready %}
|
|
<a href="/documents/edit/?report_doc={{ doc.pk }}"
|
|
style="font-weight:600; color:var(--color-foreground); text-decoration:none;">{{ doc.title }}</a>
|
|
{% else %}
|
|
<span style="font-weight:600;">{{ doc.title }}</span>
|
|
{% endif %}
|
|
<div style="font-size:0.75rem; color:var(--color-muted-foreground); margin-top:0.15rem;">
|
|
{{ doc.filename }}
|
|
{% if doc.kind == 'snapshot' %} · {% trans "снимок отчёта" %}{% endif %}
|
|
</div>
|
|
</td>
|
|
<td style="padding:0.65rem 1rem; white-space:nowrap;">{{ doc.department.name }}</td>
|
|
<td style="padding:0.65rem 1rem; white-space:nowrap; color:var(--color-muted-foreground);">{{ doc.updated_at|date:"d.m.Y H:i" }}</td>
|
|
<td style="padding:0.65rem 1rem; white-space:nowrap;">
|
|
{% if doc.is_published %}
|
|
<span class="badge badge-success">{% trans "Опубликован" %}</span>
|
|
{% else %}
|
|
<span class="badge badge-muted">{% trans "Черновик" %}</span>
|
|
{% endif %}
|
|
{% if doc.kep_signature %}
|
|
<span class="badge badge-success" style="margin-left:0.25rem;" title="{{ doc.kep_signature.cert_subject }}">{% trans "КЕП" %}</span>
|
|
{% endif %}
|
|
{% if doc.filename|slice:"-5:" == ".xlsx" %}
|
|
<span class="badge badge-muted" style="margin-left:0.25rem;">Excel</span>
|
|
{% else %}
|
|
<span class="badge badge-muted" style="margin-left:0.25rem;">Word</span>
|
|
{% endif %}
|
|
</td>
|
|
<td style="padding:0.65rem 1.25rem; text-align:right; white-space:nowrap;">
|
|
<a href="{% url 'report_document_download' doc.pk %}"
|
|
style="font-size:0.75rem; color:var(--color-muted-foreground); text-decoration:none;">{% trans "Скачать" %}</a>
|
|
<a href="{% url 'report_document_sign' doc.pk %}"
|
|
hx-get="{% url 'report_document_sign' doc.pk %}" hx-target="#main-content"
|
|
hx-push-url="{% url 'report_document_sign' doc.pk %}" hx-indicator="#loader"
|
|
style="font-size:0.75rem; color:var(--color-primary); text-decoration:none; margin-left:0.75rem;">{% trans "Подписать КЕП" %}</a>
|
|
{% if can_create_report_document %}
|
|
{% if doc.is_published %}
|
|
<form method="post" action="{% url 'report_document_unpublish' doc.pk %}" style="display:inline; margin-left:0.75rem;">
|
|
{% csrf_token %}
|
|
<button type="submit" class="nc-file-act" style="font-size:0.75rem;">{% trans "Снять" %}</button>
|
|
</form>
|
|
{% else %}
|
|
<form method="post" action="{% url 'report_document_publish' doc.pk %}" style="display:inline; margin-left:0.75rem;">
|
|
{% csrf_token %}
|
|
<button type="submit" class="nc-file-act" style="font-size:0.75rem; color:var(--color-primary);">{% trans "Опубликовать" %}</button>
|
|
</form>
|
|
{% endif %}
|
|
<form method="post" action="{% url 'report_document_delete' doc.pk %}" style="display:inline; margin-left:0.75rem;"
|
|
onsubmit="return confirm('{% trans "Удалить документ?" %}');">
|
|
{% csrf_token %}
|
|
<button type="submit" class="nc-file-act nc-file-act-danger">{% trans "Удалить" %}</button>
|
|
</form>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% empty %}
|
|
<tr>
|
|
<td colspan="5" style="padding:0.75rem 1.25rem; font-size:0.8125rem; color:var(--color-muted-foreground);">
|
|
{% trans "Пока нет файлов отдела." %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% if can_create_report_document %}
|
|
<tr style="border-top:1px solid var(--color-border);">
|
|
<td colspan="5" style="padding:0.65rem 1.25rem;">
|
|
<div style="display:flex; flex-wrap:wrap; gap:1rem; align-items:flex-end;">
|
|
<form method="post" action="{% url 'report_document_create' %}"
|
|
class="nc-mkdir" style="margin:0;">
|
|
{% csrf_token %}
|
|
<input type="text" name="title" required class="input" maxlength="200"
|
|
placeholder="{% trans 'Новый Word или Excel' %}"
|
|
style="max-width:18rem; font-size:0.8125rem;">
|
|
<select name="file_type" class="input" style="width:auto; max-width:8rem; font-size:0.8125rem;">
|
|
<option value="docx">{% trans "Word" %}</option>
|
|
<option value="xlsx">{% trans "Excel" %}</option>
|
|
</select>
|
|
<button type="submit" class="btn btn-secondary" style="font-size:0.8125rem;">{% trans "Создать" %}</button>
|
|
</form>
|
|
<form method="post" action="{% url 'report_document_upload' %}"
|
|
enctype="multipart/form-data"
|
|
class="nc-mkdir" style="margin:0;">
|
|
{% csrf_token %}
|
|
<input type="text" name="title" class="input" maxlength="200"
|
|
placeholder="{% trans 'Название (необязательно)' %}"
|
|
style="max-width:14rem; font-size:0.8125rem;">
|
|
<input type="file" name="file" required accept=".docx,.xlsx,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
style="font-size:0.8125rem; max-width:16rem;">
|
|
<button type="submit" class="btn btn-primary" style="font-size:0.8125rem;">{% trans "Загрузить" %}</button>
|
|
</form>
|
|
</div>
|
|
<div style="font-size:0.7rem; color:var(--color-muted-foreground); margin-top:0.4rem;">
|
|
{% trans "Новые файлы — черновики. Опубликуйте, чтобы сотрудники отдела их увидели." %}
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:2rem; text-align:center; color:var(--color-muted-foreground); font-size:0.875rem;">
|
|
{% trans "Нет доступных отчётов для вашей роли. Обратитесь к руководителю отдела или администратору." %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
</div>
|