feat(journal): настраиваемые поля карточки отчёта по ученику

Добавлен плавающий виджет «Поля карточки» в журнале: набор видимых
полей карточки отчёта по ученику (фото, фамилия, имя, группа, модуль,
тема, дата, файлы) задаётся пользователем и сохраняется в localStorage.
Имя теперь рендерится двумя спанами, чтобы скрывать частично; добавлен
блок мета-информации с датой и чипами файлов — картинки открываются в
лайтбоксе, играбельное видео воспроизводится в #videoModal через
?play=1, остальное скачивается. Каталог полей вынесен в
REPORT_CARD_FIELDS как единственный источник правды, без дублирования
в HTML.

Также добавлена документация HTTP API (API.md, 45 разделов): адреса и
транспорт, аутентификация сессиями и API-ключами, лимиты частоты,
дата/время/часовой пояс, матрица соответствия и полный индекс
эндпоинтов с ссылками на строки server.js.
This commit is contained in:
dev
2026-10-05 13:15:38 +03:00
parent 5667198c9b
commit 3836fc82ef
4 changed files with 2976 additions and 11 deletions
+20 -2
View File
@@ -265,7 +265,7 @@
<div class="modal-overlay report-overlay" id="reportCardModal">
<article class="student-card" aria-labelledby="reportCardName">
<div class="student-card__media">
<div class="student-card__media" id="reportCardMedia">
<img class="student-card__photo" id="reportCardPhoto" alt="" decoding="async">
<div class="student-card__nophoto" id="reportCardNoPhoto" hidden>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
@@ -283,8 +283,9 @@
<path d="M104 6l3 6M104 26l3-6"/>
</g>
</svg>
<h2 class="student-card__name" id="reportCardName"></h2>
<h2 class="student-card__name" id="reportCardName"><span class="student-card__lastname" id="reportCardLastName"></span> <span class="student-card__firstname" id="reportCardFirstName"></span></h2>
<p class="student-card__text" id="reportCardText"></p>
<div class="student-card__meta" id="reportCardMeta"></div>
<svg class="student-card__smiley" viewBox="0 0 72 72"
fill="none" stroke="#FFB71B" stroke-width="2.6"
stroke-linecap="round" stroke-linejoin="round"
@@ -326,6 +327,23 @@
</article>
</div>
<div class="report-fields" id="reportFields">
<button type="button" class="report-fields__btn" id="reportFieldsBtn" title="Поля карточки отчёта" aria-expanded="false" aria-haspopup="true">
<i data-lucide="sliders-horizontal"></i>
<span class="report-fields__btn-text">Поля карточки</span>
</button>
<div class="report-fields__panel" id="reportFieldsPanel" role="dialog" aria-label="Поля карточки отчёта">
<div class="report-fields__head">
<span class="report-fields__title">Поля карточки отчёта</span>
<div class="report-fields__actions">
<button type="button" class="report-fields__link" id="reportFieldsAll">Все</button>
<button type="button" class="report-fields__link" id="reportFieldsNone">Скрыть</button>
</div>
</div>
<div class="report-fields__list" id="reportFieldsList"></div>
</div>
</div>
<div class="toast" id="toast"></div>
<script src="vendor/lucide.min.js"></script>
<script src="js/datetime.js"></script>