feat(groups): ZIP-архив группы с выбором категорий и режима фото
Форма архива файлов группы на /groups.html получила галочки выгрузки: - «Работы (файлы проектов)» — включена по умолчанию - «Фото записи» — выключена по умолчанию - режим фото «Последние» / «Все», по умолчанию «Последние»; радиокнопки блокируются, когда «Фото записи» выключена Дефолты периода: дата «с» пустая, дата «по» — сегодня. GET /api/groups/:id/export/files принимает include_files, include_photos и photos_mode: - latest — только entries.photo_path, то главное обработанное фото записи - all — плюс вся галерея записи из entry_photos - 400, если обе категории выключены Запросы к БД для отключённых категорий не выполняются; в data.json и в аудит добавлены options и раздельные счётчики works/photos. В аудите добавлена метка export.group_files. Проверено на стенде: группа с многофото-записями даёт 4 фото в режиме «последние» и 6 в режиме «все» (совпадает с БД: 4 главных + 2 галереи), категории комбинируются независимо. api.smoketest.js 57/57, diff.selftest.js 16/16.
This commit is contained in:
@@ -71,6 +71,66 @@
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<div class="modal-overlay" id="groupFilesModal">
|
||||
<div class="edit-modal" style="max-width:440px">
|
||||
<h3 id="groupFilesTitle">Архив файлов группы</h3>
|
||||
<form id="groupFilesForm" class="settings-stack" style="gap:14px">
|
||||
<div class="settings-row">
|
||||
<div class="settings-field" style="flex:1">
|
||||
<label>Группа <span style="color:#ef4444">*</span></label>
|
||||
<select id="groupFilesGroup" class="settings-input" required></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-row">
|
||||
<div class="settings-field" style="flex:1">
|
||||
<label>Дата с</label>
|
||||
<input type="date" id="groupFilesFrom" class="settings-input">
|
||||
</div>
|
||||
<div class="settings-field" style="flex:1">
|
||||
<label>Дата по</label>
|
||||
<input type="date" id="groupFilesTo" class="settings-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-row">
|
||||
<div class="settings-field" style="flex:1">
|
||||
<div class="hint" style="font-size:.78rem;color:var(--muted);margin:0">Файлы всех учеников группы за период. По умолчанию — с самого начала и по сегодня.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-field full">
|
||||
<label style="display:flex;align-items:center;gap:8px;cursor:pointer">
|
||||
<input type="checkbox" id="groupFilesIncludeWorks" checked>
|
||||
Работы (файлы проектов)
|
||||
</label>
|
||||
</div>
|
||||
<div class="settings-field full">
|
||||
<label style="display:flex;align-items:center;gap:8px;cursor:pointer">
|
||||
<input type="checkbox" id="groupFilesIncludePhotos">
|
||||
Фото записи
|
||||
</label>
|
||||
</div>
|
||||
<div class="settings-field full">
|
||||
<label>Какие фото выгружать</label>
|
||||
<div style="display:flex;gap:16px;flex-wrap:wrap">
|
||||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400">
|
||||
<input type="radio" name="groupFilesMode" value="latest" checked>
|
||||
Последние
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400">
|
||||
<input type="radio" name="groupFilesMode" value="all">
|
||||
Все
|
||||
</label>
|
||||
</div>
|
||||
<span class="hint" style="font-size:.78rem">Последние — только главное обработанное фото каждой записи. Все — главное фото плюс вся галерея записи.</span>
|
||||
</div>
|
||||
<div class="card-foot" style="justify-content:flex-end;gap:8px">
|
||||
<button type="button" class="btn-primary ghost" id="closeGroupFilesBtn">Отмена</button>
|
||||
<button type="submit" class="btn-primary" id="downloadGroupFilesBtn">Скачать ZIP</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="vendor/lucide.min.js"></script>
|
||||
<script src="admin.js"></script>
|
||||
<script src="vendor/jszip.min.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user