/** * Модуль вкладки "Срезы": список снапшотов по диапазону дат, создание, инспекция и генерация отчетов. */ // 1. Вспомогательные функции форматирования дат function formatDateDDMMYYYY(d) { const day = String(d.getDate()).padStart(2, '0'); const month = String(d.getMonth() + 1).padStart(2, '0'); const year = d.getFullYear(); return `${day}.${month}.${year}`; } function formatDateToISO(d) { const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } function isoToBackendFormat(isoStr) { if (!isoStr) return ''; if (isoStr.includes('.')) return isoStr; const [y, m, d] = isoStr.split('-'); return `${d}.${m}.${y}`; } // 2. Автозаполнение полей создания среза текущими датой и временем function initManualSnapshotInputs() { const now = new Date(); const dateInput = document.getElementById('manual-snapshot-date'); const timeInput = document.getElementById('manual-snapshot-time'); if (dateInput) { dateInput.value = formatDateDDMMYYYY(now); } if (timeInput) { const hh = String(now.getHours()).padStart(2, '0'); const mm = String(now.getMinutes()).padStart(2, '0'); timeInput.value = `${hh}:${mm}`; } } // 3. Быстрые пресеты периода window.setSnapshotDatePreset = function(preset) { const today = new Date(); const fromInput = document.getElementById('snapshots-date-from'); const toInput = document.getElementById('snapshots-date-to'); if (!fromInput || !toInput) return; if (preset === 'today') { const str = formatDateToISO(today); fromInput.value = str; toInput.value = str; } else if (preset === 'yesterday') { const y = new Date(); y.setDate(today.getDate() - 1); const str = formatDateToISO(y); fromInput.value = str; toInput.value = str; } else if (preset === 'days3') { const start = new Date(); start.setDate(today.getDate() - 2); fromInput.value = formatDateToISO(start); toInput.value = formatDateToISO(today); } else if (preset === 'days7') { const start = new Date(); start.setDate(today.getDate() - 6); fromInput.value = formatDateToISO(start); toInput.value = formatDateToISO(today); } loadSnapshotsView(); }; // 4. Загрузка списка срезов с группировкой и сортировкой async function loadSnapshotsView() { // Гарантированно заполняем поля даты и времени создания среза initManualSnapshotInputs(); const listContainer = document.getElementById('snapshots-list'); const countBadge = document.getElementById('snapshots-count-badge'); const fromInput = document.getElementById('snapshots-date-from'); const toInput = document.getElementById('snapshots-date-to'); if (!listContainer) return; const todayIso = formatDateToISO(new Date()); if (fromInput && !fromInput.value) fromInput.value = todayIso; if (toInput && !toInput.value) toInput.value = todayIso; const dateFrom = fromInput ? isoToBackendFormat(fromInput.value) : isoToBackendFormat(todayIso); const dateTo = toInput ? isoToBackendFormat(toInput.value) : dateFrom; listContainer.innerHTML = `
За выбранный период срезы не найдены