/** * HAProxy Logs Management with Security Alerts * Fixed pagination */ document.addEventListener('DOMContentLoaded', function() { let currentPage = 1; let perPage = 50; let totalLogs = parseInt(document.getElementById('total_count').textContent); let allLoadedLogs = []; let excludePhrases = []; const logsContainer = document.getElementById('logs_container'); const searchFilter = document.getElementById('search_filter'); const excludeFilter = document.getElementById('exclude_filter'); const excludeBtn = document.getElementById('exclude_btn'); const perPageSelect = document.getElementById('logs_per_page'); const refreshBtn = document.getElementById('refresh_logs_btn'); const prevBtn = document.getElementById('prev_btn'); const nextBtn = document.getElementById('next_btn'); const loadAllBtn = document.getElementById('load_all_btn'); const clearFilterBtn = document.getElementById('clear_filter_btn'); const loadedSpan = document.getElementById('loaded_count'); const matchSpan = document.getElementById('match_count'); const currentPageSpan = document.getElementById('current_page'); const totalPagesSpan = document.getElementById('total_pages'); // Event Listeners searchFilter.addEventListener('keyup', debounce(function() { console.log('[Logs] Search changed'); currentPage = 1; loadLogsWithPage(); }, 300)); excludeBtn.addEventListener('click', function() { const phrase = excludeFilter.value.trim(); if (phrase) { if (!excludePhrases.includes(phrase)) { excludePhrases.push(phrase); updateExcludeUI(); currentPage = 1; loadLogsWithPage(); } excludeFilter.value = ''; } }); excludeFilter.addEventListener('keypress', function(e) { if (e.key === 'Enter') excludeBtn.click(); }); clearFilterBtn.addEventListener('click', function() { console.log('[Logs] Clear filters'); searchFilter.value = ''; excludePhrases = []; excludeFilter.value = ''; updateExcludeUI(); currentPage = 1; loadLogsWithPage(); }); perPageSelect.addEventListener('change', function() { console.log(`[Logs] Per page changed to ${this.value}`); perPage = parseInt(this.value); currentPage = 1; loadLogsWithPage(); }); refreshBtn.addEventListener('click', function() { console.log('[Logs] Refresh clicked'); searchFilter.value = ''; excludePhrases = []; excludeFilter.value = ''; updateExcludeUI(); currentPage = 1; loadLogsWithPage(); }); prevBtn.addEventListener('click', function() { if (currentPage > 1) { console.log(`[Logs] Prev button: page ${currentPage} -> ${currentPage - 1}`); currentPage--; loadLogsWithPage(); } }); nextBtn.addEventListener('click', function() { const totalPages = parseInt(document.getElementById('total_pages').textContent); if (currentPage < totalPages) { console.log(`[Logs] Next button: page ${currentPage} -> ${currentPage + 1}`); currentPage++; loadLogsWithPage(); } }); loadAllBtn.addEventListener('click', function() { console.log('[Logs] Load all clicked'); perPage = totalLogs > 500 ? 500 : totalLogs; currentPage = 1; perPageSelect.value = perPage; loadLogsWithPage(); }); /** * Debounce function */ function debounce(func, wait) { let timeout; return function() { clearTimeout(timeout); timeout = setTimeout(func, wait); }; } /** * Load logs with pagination from API */ function loadLogsWithPage() { console.log(`[Logs] loadLogsWithPage: page=${currentPage}, per_page=${perPage}, search="${searchFilter.value.trim()}", exclude=${excludePhrases.length}`); logsContainer.innerHTML = '
${escapeHtml(entry.requested_url)}
${escapeHtml(entry.status_code)}