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
+93 -1
View File
@@ -769,6 +769,31 @@ body[data-page=settings] .page-head{align-items:flex-end}
}
.student-card__sparks{position:absolute;top:15px;right:16px;width:104px;color:#E1ECFB;pointer-events:none}
.student-card__name{margin:0 0 8px;font-size:20px;font-weight:750;line-height:1.25;letter-spacing:-.1px;color:var(--sc-text);overflow-wrap:break-word}
.student-card__name[hidden]{display:none}
.student-card__media[hidden]{display:none}
.student-card__lastname,.student-card__firstname{display:inline;overflow-wrap:break-word}
.student-card__lastname:empty,.student-card__firstname:empty{display:none}
.student-card__text[hidden]{display:none}
.student-card__meta{display:flex;flex-direction:column;gap:10px;margin-top:14px}
.student-card__meta:empty{display:none}
.student-card__meta-val{font-size:14px;line-height:1.5;color:var(--sc-text-secondary);overflow-wrap:break-word;white-space:pre-wrap}
.student-card__meta-files{display:flex;flex-wrap:wrap;gap:6px}
.student-card__meta-files a{
display:inline-flex;
align-items:center;
max-width:100%;
padding:5px 11px;
border-radius:999px;
background:var(--sc-primary-soft);
color:#245FB4;
font-size:13px;
font-weight:600;
text-decoration:none;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.student-card__meta-files a:hover{background:#D7E8FF}
.student-card__text{margin:0;font-size:15px;line-height:1.6;color:var(--sc-text-secondary);white-space:pre-wrap;overflow-wrap:break-word}
.student-card__text:empty{display:none}
.student-card__smiley{position:absolute;right:24px;bottom:var(--sc-smiley-bottom);width:var(--sc-smiley-size);height:var(--sc-smiley-size);pointer-events:none}
@@ -797,12 +822,79 @@ body[data-page=settings] .page-head{align-items:flex-end}
}
.student-card__badge--time{background:rgba(23,59,120,.94)}
.student-card__badge--tool{background:var(--sc-primary);box-shadow:0 4px 12px rgba(52,120,246,.28)}
.student-card__badge--tool[hidden]{display:none}
.student-card__badge[hidden]{display:none}
.student-card__badge > span{overflow:hidden;text-overflow:ellipsis}
.student-card__icon{display:block;flex:none}
.student-card__icon--badge{width:17px;height:17px}
.student-card__icon--ps{width:19px;height:19px}
.student-card :focus-visible{outline:2px solid var(--sc-primary);outline-offset:2px;border-radius:6px}
/* --- Настройка полей карточки отчёта (журнал) --- */
.report-fields{
position:fixed;
right:24px;
bottom:24px;
z-index:120;
display:none;
flex-direction:column;
align-items:flex-end;
gap:10px;
}
body.report-card-open .report-fields{display:flex}
.report-fields__btn{
display:inline-flex;
align-items:center;
gap:9px;
background:var(--card);
color:var(--text);
border:1px solid var(--border);
border-radius:999px;
padding:11px 18px;
font-size:.85rem;
font-weight:600;
font-family:inherit;
cursor:pointer;
box-shadow:0 8px 24px rgba(0,0,0,.16);
white-space:nowrap;
-webkit-tap-highlight-color:transparent;
}
.report-fields__btn:hover{border-color:var(--accent);color:var(--accent)}
.report-fields__btn svg{width:17px;height:17px;display:block;flex:none}
.report-fields__panel{
display:none;
width:min(280px,calc(100vw - 32px));
background:var(--card);
border:1px solid var(--border);
border-radius:14px;
box-shadow:0 18px 40px rgba(0,0,0,.2);
padding:14px 16px;
overflow:hidden;
}
.report-fields:hover .report-fields__panel,
.report-fields.open .report-fields__panel{display:block}
.report-fields__head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.report-fields__title{font-size:.82rem;font-weight:700}
.report-fields__actions{display:flex;gap:10px}
.report-fields__link{background:none;border:none;color:var(--accent);cursor:pointer;font-size:.78rem;font-weight:600;padding:0;font-family:inherit}
.report-fields__link:hover{text-decoration:underline}
.report-fields__list{display:flex;flex-direction:column;gap:2px;max-height:min(56vh,420px);overflow:auto}
.report-fields__item{
display:flex;
align-items:center;
gap:10px;
padding:7px 8px;
border-radius:8px;
cursor:pointer;
font-size:.85rem;
user-select:none;
}
.report-fields__item:hover{background:var(--bg)}
.report-fields__item input{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;flex:none;margin:0}
.report-fields__item span{overflow:hidden;text-overflow:ellipsis}
@media(max-width:640px){
.report-fields{right:16px;bottom:16px}
.report-fields__btn{padding:10px 14px}
}
.journal-card .foot .edit svg,.journal-card .foot .del svg,.card .edit svg,.card .del svg{width:16px;height:16px;display:block}
@media(max-width:420px){
.report-overlay{padding:16px 12px}