kpi-dashboard / templates /admin /upload.html
Admin
Initial HF deploy
04477e7
Raw
History Blame
9.9 kB
{% extends "base.html" %}
{% block title %}Загрузка файлов{% endblock %}
{% block page_title %}Загрузка файлов{% endblock %}
{% block content %}
<h2 style="margin-bottom:20px;font-size:15px;font-weight:600;color:#fff;">Загрузка файлов</h2>
<div style="display: flex; gap: 16px;">
<div style="flex: 1;">
<div class="d-card" style="height: 100%;">
<div class="d-card-header">
<h5 style="margin: 0;"><i class="bi bi-file-earmark-excel" style="color: #16a34a; margin-right: 8px;"></i>Загрузить Excel (KPI)</h5>
</div>
<div class="d-card-body">
<div class="alert-apple info">
<strong>Формат файла:</strong> первый столбец — ФИО сотрудника, остальные столбцы — месяцы (Январь, Февраль, ...).
</div>
<form method="POST" enctype="multipart/form-data">
{{ excel_form.hidden_tag() }}
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Название KPI</label>
{{ excel_form.kpi_name(class="form-control form-control-sm", placeholder="Например: Объем продаж", style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;") }}
</div>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Excel файл</label>
{{ excel_form.file(class="form-control form-control-sm", style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;") }}
</div>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Описание (необязательно)</label>
{{ excel_form.description(class="form-control form-control-sm", rows=2, style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;") }}
</div>
<button type="submit" class="btn-apple" style="width: 100%; border-radius: 999px; background: #16a34a;">
<i class="bi bi-cloud-upload"></i> Загрузить
</button>
</form>
</div>
</div>
</div>
<div style="flex: 1;">
<div class="d-card" style="height: 100%;">
<div class="d-card-header">
<h5 style="margin: 0;"><i class="bi bi-file-pdf" style="color: #dc2626; margin-right: 8px;"></i>Загрузить PDF (обучение)</h5>
</div>
<div class="d-card-body">
<form method="POST" enctype="multipart/form-data">
{{ pdf_form.hidden_tag() }}
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Название обучения</label>
<input type="text" name="pdf_title" class="form-control form-control-sm" placeholder="Например: Охрана труда" style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;">
</div>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Сотрудник</label>
<select name="user_id" class="form-control form-control-sm" required style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;">
<option value="">— выберите сотрудника —</option>
{% for u in users %}
<option value="{{ u.id }}">{{ u.full_name }}</option>
{% endfor %}
</select>
</div>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">PDF файл</label>
<input type="file" name="pdf_file" class="form-control form-control-sm" accept=".pdf" required style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;">
</div>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 4px; font-weight: 500;">Описание</label>
<textarea name="pdf_description" class="form-control form-control-sm" rows="2" placeholder="Описание документа" style="background:rgba(6,11,40,0.4);border-color:rgba(255,255,255,0.1);color:#fff;"></textarea>
</div>
<button type="submit" class="btn-apple" style="width: 100%; border-radius: 999px; background: #dc2626;">
<i class="bi bi-cloud-upload"></i> Загрузить
</button>
</form>
</div>
</div>
</div>
</div>
<div class="d-card" style="margin-top: 20px;">
<div class="d-card-header" style="display: flex; justify-content: space-between; align-items: center;">
<h5 style="margin: 0;"><i class="bi bi-files me-2"></i>Загруженные файлы</h5>
<a href="{{ url_for('admin.kpi_list') }}" class="btn-apple-outline btn-apple-sm">Управление KPI</a>
</div>
<div class="d-card-body" style="padding: 0;">
{% if uploaded_files %}
<div class="table-responsive">
<table class="d-table-card">
<thead>
<tr>
<th style="padding-left: 16px;">Имя файла</th>
<th>KPI / Описание</th>
<th>Тип</th>
<th>Размер</th>
<th>Дата</th>
<th style="text-align: right; padding-right: 16px;">Действия</th>
</tr>
</thead>
<tbody>
{% for f in uploaded_files %}
<tr>
<td style="padding-left: 16px;">
{% if f.file_type == 'pdf' %}
<i class="bi bi-file-pdf-fill" style="color: #dc2626; margin-right: 4px;"></i>
{% else %}
<i class="bi bi-file-earmark-excel-fill" style="color: #01B574; margin-right: 4px;"></i>
{% endif %}
{{ f.original_name }}
</td>
<td>{{ f.kpi_name or f.description or '—' }}</td>
<td><span style="font-size:10px;font-weight:600;padding:2px 8px;border-radius:999px;{% if f.file_type == 'pdf' %}background:rgba(220,38,38,0.1);color:#dc2626;{% else %}background:rgba(22,163,74,0.1);color:#01B574;{% endif %}">{{ f.file_type }}</span></td>
<td>{% if f.file_size %}{{ (f.file_size / 1024)|round(1) }} KB{% else %}—{% endif %}</td>
<td>{{ f.upload_date.strftime('%d.%m.%Y %H:%M') }}</td>
<td style="text-align: right; padding-right: 16px;">
<a href="{{ url_for('api.download_file', filename=f.filename) }}" target="_blank" style="color:#fff;text-decoration:none;padding:4px;display:inline-flex;align-items:center;border-radius:6px;border:1px solid rgba(255,255,255,0.05);" title="Скачать">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M8 1v10M4 7l4 4 4-4M1 13v2h14v-2"/></svg>
</a>
<a href="#" onclick="openPdfViewer('{{ url_for('api.download_file', filename=f.filename) }}','{{ f.original_name }}');return false;" style="color:#fff;text-decoration:none;padding:4px;display:inline-flex;align-items:center;border-radius:6px;border:1px solid rgba(255,255,255,0.05);" title="Просмотреть">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M1 8s3-5.5 7-5.5S15 8 15 8s-3 5.5-7 5.5S1 8 1 8z"/><circle cx="8" cy="8" r="2.5"/></svg>
</a>
<a href="{{ url_for('admin.delete_file', file_id=f.id) }}" onclick="return confirm('Удалить файл {{ f.original_name }}?')" style="color:#dc2626;text-decoration:none;padding:4px;display:inline-flex;align-items:center;border-radius:6px;border:1px solid rgba(255,255,255,0.05);" title="Удалить">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M2 4h12M5 4V2.5A1.5 1.5 0 016.5 1h3A1.5 1.5 0 0111 2.5V4M3 4v9.5A1.5 1.5 0 004.5 15h7a1.5 1.5 0 001.5-1.5V4"/></svg>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div style="text-align: center; padding: 24px 0;">
<i class="bi bi-inbox" style="font-size: 2.5rem; color: #6c757d;"></i>
<p style="color: #6c757d; margin-top: 8px;">Файлы не загружены</p>
</div>
{% endif %}
</div>
</div>
{% endblock %}