/* schedule.js — filters, pagination, table render, CSV export */ const PAGE_SIZE = 100; let currentOffset = 0; let currentTotal = 0; // ── init ────────────────────────────────────────────────────────────────────── document.addEventListener("DOMContentLoaded", () => { // Default date range: last 7 days const today = new Date(); const week = new Date(today); week.setDate(today.getDate() - 7); document.getElementById("f-date-from").value = fmtDate(week); document.getElementById("f-date-to").value = fmtDate(today); loadData(); }); // ── filter helpers ──────────────────────────────────────────────────────────── function getFilters() { return { date_from: document.getElementById("f-date-from").value || "", date_to: document.getElementById("f-date-to").value || "", airport: document.getElementById("f-airport").value, direction: document.getElementById("f-direction").value, flight_number: document.getElementById("f-flight").value.trim(), time_from: document.getElementById("f-time-from").value || "", time_to: document.getElementById("f-time-to").value || "", }; } function buildQuery(extra = {}) { const f = { ...getFilters(), limit: PAGE_SIZE, offset: currentOffset, ...extra }; return Object.entries(f) .filter(([, v]) => v !== "" && v !== "all") .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join("&"); } function applyFilters() { currentOffset = 0; loadData(); } function resetFilters() { document.getElementById("f-date-from").value = ""; document.getElementById("f-date-to").value = ""; document.getElementById("f-airport").value = "all"; document.getElementById("f-direction").value = "all"; document.getElementById("f-flight").value = ""; document.getElementById("f-time-from").value = ""; document.getElementById("f-time-to").value = ""; currentOffset = 0; loadData(); } // ── pagination ──────────────────────────────────────────────────────────────── function prevPage() { if (currentOffset <= 0) return; currentOffset = Math.max(0, currentOffset - PAGE_SIZE); loadData(); } function nextPage() { if (currentOffset + PAGE_SIZE >= currentTotal) return; currentOffset += PAGE_SIZE; loadData(); } function updatePagination() { const page = Math.floor(currentOffset / PAGE_SIZE) + 1; const pages = Math.max(1, Math.ceil(currentTotal / PAGE_SIZE)); document.getElementById("page-info").textContent = `Стр. ${page} / ${pages}`; document.getElementById("total-info").textContent = `Всего: ${currentTotal.toLocaleString("ru")}`; document.getElementById("btn-prev").disabled = currentOffset <= 0; document.getElementById("btn-next").disabled = currentOffset + PAGE_SIZE >= currentTotal; } // ── data load ───────────────────────────────────────────────────────────────── async function loadData() { setLoading(true); try { const resp = await fetch(`/api/schedule/data?${buildQuery()}`); if (!resp.ok) throw new Error(`HTTP ${resp.status}`); const data = await resp.json(); currentTotal = data.total || 0; renderTable(data.flights || []); renderCards(data.flights || []); updatePagination(); document.getElementById("last-updated").textContent = "Обновлено: " + new Date().toLocaleTimeString("ru"); } catch (e) { showError(e.message); } finally { setLoading(false); } } // ── render table ────────────────────────────────────────────────────────────── function renderTable(flights) { const tbody = document.getElementById("table-body"); if (!flights.length) { tbody.innerHTML = `