feat(groups): расширенный экспорт фото — галерея и оригиналы
This commit is contained in:
+10
-6
@@ -111,17 +111,21 @@
|
||||
</div>
|
||||
<div class="settings-field full">
|
||||
<label>Какие фото выгружать</label>
|
||||
<div style="display:flex;gap:16px;flex-wrap:wrap">
|
||||
<div style="display:flex;flex-direction:column;gap:8px">
|
||||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400">
|
||||
<input type="radio" name="groupFilesMode" value="latest" checked>
|
||||
Последние
|
||||
<input type="checkbox" id="groupFilesMainPhoto" checked>
|
||||
Главное фото каждой записи
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400">
|
||||
<input type="radio" name="groupFilesMode" value="all">
|
||||
Все
|
||||
<input type="checkbox" id="groupFilesGallery">
|
||||
Вся галерея записи
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400">
|
||||
<input type="checkbox" id="groupFilesOriginals">
|
||||
Оригиналы фото (до обработки)
|
||||
</label>
|
||||
</div>
|
||||
<span class="hint" style="font-size:.78rem">Последние — только главное обработанное фото каждой записи. Все — главное фото плюс вся галерея записи.</span>
|
||||
<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>
|
||||
|
||||
+25
-7
@@ -306,8 +306,9 @@ function openGroupFilesModal(groupId, groupName) {
|
||||
document.getElementById('groupFilesTo').value = todayISOLocal();
|
||||
document.getElementById('groupFilesIncludeWorks').checked = true;
|
||||
document.getElementById('groupFilesIncludePhotos').checked = false;
|
||||
const latest = document.querySelector('input[name="groupFilesMode"][value="latest"]');
|
||||
if (latest) latest.checked = true;
|
||||
document.getElementById('groupFilesMainPhoto').checked = true;
|
||||
document.getElementById('groupFilesGallery').checked = false;
|
||||
document.getElementById('groupFilesOriginals').checked = false;
|
||||
onGroupFilesPhotosToggle();
|
||||
document.getElementById('groupFilesModal').classList.add('open');
|
||||
}
|
||||
@@ -321,14 +322,27 @@ function todayISOLocal() {
|
||||
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
||||
}
|
||||
|
||||
const GROUP_FILES_PHOTO_BOXES = ['groupFilesMainPhoto', 'groupFilesGallery', 'groupFilesOriginals'];
|
||||
|
||||
function onGroupFilesPhotosToggle() {
|
||||
const on = document.getElementById('groupFilesIncludePhotos').checked;
|
||||
document.querySelectorAll('input[name="groupFilesMode"]').forEach(el => { el.disabled = !on; });
|
||||
GROUP_FILES_PHOTO_BOXES.forEach(id => {
|
||||
const el = document.getElementById(id);
|
||||
if (el) el.disabled = !on;
|
||||
});
|
||||
}
|
||||
|
||||
function groupFilesMode() {
|
||||
const checked = document.querySelector('input[name="groupFilesMode"]:checked');
|
||||
return checked && checked.value === 'all' ? 'all' : 'latest';
|
||||
function groupFilesPhotosOptions() {
|
||||
const main = document.getElementById('groupFilesMainPhoto').checked;
|
||||
const gallery = document.getElementById('groupFilesGallery').checked;
|
||||
const originals = document.getElementById('groupFilesOriginals').checked;
|
||||
return {
|
||||
main,
|
||||
gallery,
|
||||
originals,
|
||||
mode: gallery ? 'all' : 'latest',
|
||||
any: main || gallery || originals,
|
||||
};
|
||||
}
|
||||
|
||||
async function downloadGroupFiles() {
|
||||
@@ -337,8 +351,10 @@ async function downloadGroupFiles() {
|
||||
const dateTo = document.getElementById('groupFilesTo').value;
|
||||
const includeWorks = document.getElementById('groupFilesIncludeWorks').checked;
|
||||
const includePhotos = document.getElementById('groupFilesIncludePhotos').checked;
|
||||
const photoOpts = groupFilesPhotosOptions();
|
||||
if (!groupId) { alert('Выберите группу'); return; }
|
||||
if (!includeWorks && !includePhotos) { alert('Выберите хотя бы одну категорию: работы или фото записи'); return; }
|
||||
if (includePhotos && !photoOpts.any) { alert('Выберите, какие фото выгружать: главное фото, галерея или оригиналы'); return; }
|
||||
if (dateFrom && dateTo && dateFrom > dateTo) { alert('Дата «С» позже даты «По»'); return; }
|
||||
const btn = document.getElementById('downloadGroupFilesBtn');
|
||||
btn.disabled = true;
|
||||
@@ -349,7 +365,9 @@ async function downloadGroupFiles() {
|
||||
if (dateTo) q.set('date_to', dateTo);
|
||||
q.set('include_files', includeWorks ? '1' : '0');
|
||||
q.set('include_photos', includePhotos ? '1' : '0');
|
||||
q.set('photos_mode', groupFilesMode());
|
||||
q.set('include_main', photoOpts.main ? '1' : '0');
|
||||
q.set('photos_mode', photoOpts.mode);
|
||||
q.set('include_originals', photoOpts.originals ? '1' : '0');
|
||||
const res = await fetch(`${API}/api/groups/${groupId}/export/files?${q}`, { headers: hdr() });
|
||||
if (!res.ok) {
|
||||
let msg = 'Не удалось сформировать архив';
|
||||
|
||||
Reference in New Issue
Block a user