163 lines
12 KiB
HTML
163 lines
12 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}Сотрудники · MIEM Employees{% endblock %}
|
||
{% block content %}
|
||
<section class="directory">
|
||
<div class="directory__header">
|
||
<div>
|
||
<h2 class="directory__title">Сотрудники</h2>
|
||
{% set range_start = page.offset + 1 if page.total else 0 %}
|
||
{% set range_end = [page.offset + page.employees|length, page.total]|min %}
|
||
<p class="directory__summary" role="status">Показаны {{ range_start }}–{{ range_end }} из {{ page.total }}</p>
|
||
</div>
|
||
<button class="button" type="button" data-columns-open aria-controls="columns-dialog" aria-expanded="false">Настроить колонки</button>
|
||
</div>
|
||
|
||
<form class="directory__filters" method="get" action="/admin/directory">
|
||
<fieldset class="directory__filter-group directory__filter-group--search">
|
||
<legend class="directory__filter-legend">Поиск</legend>
|
||
<label class="directory__field">ФИО или ссылка<input class="directory__input" name="q" value="{{ filters.q }}" placeholder="Например, Иванов или hse.ru"></label>
|
||
</fieldset>
|
||
<fieldset class="directory__filter-group">
|
||
<legend class="directory__filter-legend">Статус и данные</legend>
|
||
<label class="directory__field">Статус<select class="directory__input" name="status">
|
||
<option value="" {% if not filters.status %}selected{% endif %}>Все статусы</option>
|
||
<option value="active" {% if filters.status == "active" %}selected{% endif %}>Работает</option>
|
||
<option value="verification_required" {% if filters.status == "verification_required" %}selected{% endif %}>Требует проверки</option>
|
||
<option value="dismissed" {% if filters.status == "dismissed" %}selected{% endif %}>Уволен</option>
|
||
</select></label>
|
||
<label class="directory__field">Email<select class="directory__input" name="has_email">
|
||
<option value="" {% if not filters.has_email %}selected{% endif %}>Любой email</option>
|
||
<option value="true" {% if filters.has_email == "true" %}selected{% endif %}>Есть email</option>
|
||
<option value="false" {% if filters.has_email == "false" %}selected{% endif %}>Нет email</option>
|
||
</select></label>
|
||
<label class="directory__field">Учёная степень<select class="directory__input" name="has_academic_degree">
|
||
<option value="" {% if not filters.has_academic_degree %}selected{% endif %}>Любая учёная степень</option>
|
||
<option value="true" {% if filters.has_academic_degree == "true" %}selected{% endif %}>Есть учёная степень</option>
|
||
<option value="false" {% if filters.has_academic_degree == "false" %}selected{% endif %}>Нет учёной степени</option>
|
||
</select></label>
|
||
</fieldset>
|
||
<fieldset class="directory__filter-group">
|
||
<legend class="directory__filter-legend">Период обнаружения</legend>
|
||
<label class="directory__field">От<input class="directory__input" type="date" name="started_from" value="{{ filters.started_from }}"></label>
|
||
<label class="directory__field">До<input class="directory__input" type="date" name="started_to" value="{{ filters.started_to }}"></label>
|
||
</fieldset>
|
||
<fieldset class="directory__filter-group">
|
||
<legend class="directory__filter-legend">Сортировка и страница</legend>
|
||
<label class="directory__field">Сортировать по<select class="directory__input" name="sort">
|
||
{% for value, label in [("full_name", "ФИО"), ("status", "Статус"), ("hse_start_year", "Год начала"), ("first_seen_at", "Впервые найден"), ("last_seen_at", "Последний раз найден"), ("dismissed_at", "Дата увольнения")] %}
|
||
<option value="{{ value }}" {% if filters.sort == value %}selected{% endif %}>{{ label }}</option>
|
||
{% endfor %}
|
||
</select></label>
|
||
<label class="directory__field">Направление<select class="directory__input" name="direction">
|
||
<option value="asc" {% if filters.direction == "asc" %}selected{% endif %}>По возрастанию</option>
|
||
<option value="desc" {% if filters.direction == "desc" %}selected{% endif %}>По убыванию</option>
|
||
</select></label>
|
||
<label class="directory__field">Сотрудников на странице<select class="directory__input" name="limit">
|
||
{% for value in [25, 50, 100] %}
|
||
<option value="{{ value }}" {% if filters.limit == value %}selected{% endif %}>{{ value }}</option>
|
||
{% endfor %}
|
||
</select></label>
|
||
</fieldset>
|
||
<div class="directory__filter-actions">
|
||
<button class="button" type="submit">Применить фильтры</button>
|
||
<a class="button button--ghost" href="/admin/directory">Сбросить</a>
|
||
</div>
|
||
</form>
|
||
|
||
<details class="directory__help">
|
||
<summary>Что означают даты и статусы</summary>
|
||
<p>«Год начала» — начало работы в ВШЭ. «Впервые найден» и «Последний раз найден» — даты обнаружения сотрудника в списке источника, а не даты приёма и увольнения. «Требует проверки» означает, что профиль недоступен и увольнение ещё не подтверждено.</p>
|
||
</details>
|
||
|
||
<div class="directory__table-wrap">
|
||
<table class="directory-table" data-directory-table>
|
||
<thead>
|
||
<tr>
|
||
<th class="directory-table__head" data-column="full_name">ФИО</th>
|
||
<th class="directory-table__head" data-column="status">Статус</th>
|
||
<th class="directory-table__head" data-column="positions">Должности</th>
|
||
<th class="directory-table__head" data-column="hse_start_year">Год начала</th>
|
||
<th class="directory-table__head" data-column="email">Email</th>
|
||
<th class="directory-table__head" data-column="phone">Телефон</th>
|
||
<th class="directory-table__head" data-column="address">Адрес</th>
|
||
<th class="directory-table__head" data-column="academic_degree">Учёная степень</th>
|
||
<th class="directory-table__head" data-column="publications_count">Публикации</th>
|
||
<th class="directory-table__head" data-column="courses_count">Курсы</th>
|
||
<th class="directory-table__head" data-column="news_count">Новости</th>
|
||
<th class="directory-table__head" data-column="first_seen_at">Впервые найден</th>
|
||
<th class="directory-table__head" data-column="last_seen_at">Последний раз найден</th>
|
||
<th class="directory-table__head" data-column="dismissed_at">Дата увольнения</th>
|
||
<th class="directory-table__head" data-column="profile">Профиль</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for employee in page.employees %}
|
||
<tr class="directory-table__row">
|
||
<td class="directory-table__cell" data-column="full_name"><a class="admin__link" href="/admin/employees/{{ employee.id }}">{{ employee.full_name or "Без имени" }}</a></td>
|
||
<td class="directory-table__cell" data-column="status"><span class="badge {% if employee.status == "dismissed" %}badge--dismissed{% elif employee.status == "verification_required" %}badge--verification{% endif %}">{{ employee.status_display }}</span></td>
|
||
<td class="directory-table__cell" data-column="positions">{{ employee.positions_text }}</td>
|
||
<td class="directory-table__cell" data-column="hse_start_year">{{ employee.hse_start_year or "" }}</td>
|
||
<td class="directory-table__cell" data-column="email">{{ employee.email_text }}</td>
|
||
<td class="directory-table__cell" data-column="phone">{{ employee.phone_text }}</td>
|
||
<td class="directory-table__cell" data-column="address">{{ employee.address or "" }}</td>
|
||
<td class="directory-table__cell" data-column="academic_degree">{{ employee.academic_degree_text }}</td>
|
||
<td class="directory-table__cell" data-column="publications_count">{{ employee.publications_count }}</td>
|
||
<td class="directory-table__cell" data-column="courses_count">{{ employee.courses_count }}</td>
|
||
<td class="directory-table__cell" data-column="news_count">{{ employee.news_count }}</td>
|
||
<td class="directory-table__cell" data-column="first_seen_at">{{ employee.first_seen_display }}</td>
|
||
<td class="directory-table__cell" data-column="last_seen_at">{{ employee.last_seen_display }}</td>
|
||
<td class="directory-table__cell" data-column="dismissed_at">{{ employee.dismissed_display }}</td>
|
||
<td class="directory-table__cell" data-column="profile"><a class="admin__link" href="{{ employee.canonical_url }}" target="_blank" rel="noopener">Внешний профиль</a></td>
|
||
</tr>
|
||
{% else %}
|
||
<tr><td class="directory-table__empty" colspan="15">
|
||
<strong>Сотрудники не найдены</strong>
|
||
{% if filters.q or filters.status or filters.has_email or filters.has_academic_degree or filters.started_from or filters.started_to %}
|
||
<span>Попробуйте изменить запрос или сбросить фильтры.</span>
|
||
<a class="admin__link" href="/admin/directory">Сбросить фильтры</a>
|
||
{% else %}
|
||
<span>Запустите парсинг, чтобы загрузить сотрудников.</span>
|
||
{% endif %}
|
||
</td></tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="directory__pagination">
|
||
{% set prev_offset = filters.offset - filters.limit %}
|
||
{% set next_offset = filters.offset + filters.limit %}
|
||
{% if filters.offset > 0 %}
|
||
<a class="admin__link" href="{{ request.url.include_query_params(offset=prev_offset) }}">Назад</a>
|
||
{% endif %}
|
||
<span class="directory__page">Страница {{ page.page }}{% if page.pages %} из {{ page.pages }}{% endif %}</span>
|
||
{% if next_offset < page.total %}
|
||
<a class="admin__link" href="{{ request.url.include_query_params(offset=next_offset) }}">Вперед</a>
|
||
{% endif %}
|
||
</div>
|
||
</section>
|
||
|
||
<dialog class="columns-modal" id="columns-dialog" data-columns-modal aria-labelledby="columns-dialog-title">
|
||
<section class="columns-modal__panel">
|
||
<div class="columns-modal__header">
|
||
<h3 class="columns-modal__title" id="columns-dialog-title">Отображаемые колонки</h3>
|
||
<button class="button button--ghost" type="button" data-columns-close>Закрыть</button>
|
||
</div>
|
||
<div class="columns-modal__grid">
|
||
{% for key, label in [("full_name", "ФИО"), ("status", "Статус"), ("positions", "Должности"), ("hse_start_year", "Год начала"), ("email", "Email"), ("phone", "Телефон"), ("address", "Адрес"), ("academic_degree", "Учёная степень"), ("publications_count", "Публикации"), ("courses_count", "Курсы"), ("news_count", "Новости"), ("first_seen_at", "Впервые найден"), ("last_seen_at", "Последний раз найден"), ("dismissed_at", "Дата увольнения"), ("profile", "Профиль")] %}
|
||
<label class="columns-modal__option"><input class="columns-modal__checkbox" type="checkbox" value="{{ key }}" data-column-toggle> {{ label }}</label>
|
||
{% endfor %}
|
||
</div>
|
||
<fieldset class="columns-modal__presets">
|
||
<legend class="columns-modal__preset-label">Быстрый набор</legend>
|
||
<button class="button button--ghost button--compact" type="button" data-columns-preset="review">Проверка</button>
|
||
<button class="button button--ghost button--compact" type="button" data-columns-preset="contacts">Контакты</button>
|
||
<button class="button button--ghost button--compact" type="button" data-columns-preset="full">Все поля</button>
|
||
</fieldset>
|
||
</section>
|
||
</dialog>
|
||
{% endblock %}
|
||
{% block scripts %}
|
||
<script src="/static/admin.js"></script>
|
||
{% endblock %}
|