From 9fbd696c846dd4a031cf277d56d10f779b820684 Mon Sep 17 00:00:00 2001 From: dev Date: Sun, 4 Oct 2026 13:37:57 +0300 Subject: [PATCH] =?UTF-8?q?feat(export):=20=D0=BE=D1=82=D1=87=D1=91=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BE=20=D0=B7=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8F?= =?UTF-8?q?=D1=85=20=D0=B2=20ZIP-=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B5=D0=B7=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В архив экспорта студента (GET /api/export/student, кнопка «Профиль» на /students.html) добавлена секция «Отчёты о занятиях»: тема, дата, время, группа и текст конспекта преподавателя. Секция рендерится между «Занятия» и «О себе», попадает в навигацию и футер, появляется только если есть хотя бы один отчёт. Отчёты привязаны к группе (в lesson_reports нет student_id), поэтому выбираются по группам резидента: текущая группа плюс все группы, где у него есть записи. Фильтры филиалов (branchWhere) и период из date_from/date_to соблюдаются, как и в остальной выборке. Ограничение 60 последних отчётов, при усечении в подзаголовке секции есть соответствующая пометка. Новый флаг include_reports (по умолчанию включён) + чекбокс в модалке экспорта. Даты lesson_date/lesson_time форматируются как чистые DATE/TIME строки, без new Date(), чтобы не сдвинуть день; учёт настройки time_format сделан через appHour12. Заодно в отчёте и в сообщениях эндпоинта «ученик» заменён на «резидент». Co-Authored-By: Cline --- public/js/students.js | 3 ++ public/students.html | 6 +++ server.js | 44 +++++++++++++-- student-report.js | 122 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 156 insertions(+), 19 deletions(-) diff --git a/public/js/students.js b/public/js/students.js index 82a2c3a..75898ea 100644 --- a/public/js/students.js +++ b/public/js/students.js @@ -144,6 +144,7 @@ function openExportModal(name) { document.getElementById('exportForm').reset(); document.getElementById('exportDateFrom').value = ''; document.getElementById('expEntries').checked = true; + document.getElementById('expReports').checked = true; document.getElementById('expPhotos').checked = true; document.getElementById('expCaptions').checked = true; document.getElementById('expFiles').checked = true; @@ -168,6 +169,7 @@ async function exportStudent(name, opts) { if (opts.dateFrom) q.set('date_from', opts.dateFrom); if (opts.dateTo) q.set('date_to', opts.dateTo); q.set('include_entries', opts.entries ? '1' : '0'); + q.set('include_reports', opts.reports === false ? '0' : '1'); q.set('include_photos', opts.photos ? '1' : '0'); q.set('include_captions', opts.captions ? '1' : '0'); q.set('include_files', opts.files ? '1' : '0'); @@ -192,6 +194,7 @@ async function submitExport() { const captionsEl = document.getElementById('expCaptions'); const opts = { entries: document.getElementById('expEntries').checked, + reports: document.getElementById('expReports').checked, photos: document.getElementById('expPhotos').checked, files: document.getElementById('expFiles').checked, captions: captionsEl.checked && !captionsEl.disabled, diff --git a/public/students.html b/public/students.html index 2f9c1e2..4d062ac 100644 --- a/public/students.html +++ b/public/students.html @@ -73,6 +73,12 @@ Записи занятий (текст) +
+ +