document.addEventListener('DOMContentLoaded', function() { const filterIp = document.getElementById('filter_ip'); const filterStatus = document.getElementById('filter_status'); const filterMethod = document.getElementById('filter_method'); const filterThreats = document.getElementById('filter_threats'); const filterHideStats = document.getElementById('filter_hide_stats'); const resetBtn = document.getElementById('reset_filters'); const logsTable = document.getElementById('logs_table'); if (!logsTable) return; // Exit if no logs const allRows = Array.from(document.querySelectorAll('.log-row')); // Filter function function applyFilters() { const ipValue = filterIp.value.toLowerCase(); const statusValue = filterStatus.value; const methodValue = filterMethod.value; const showThreats = filterThreats.checked; const hideStats = filterHideStats.checked; let visibleCount = 0; let threatCount = 0; let count2xx = 0, count4xx = 0, count5xx = 0; const uniqueIps = new Set(); allRows.forEach(row => { const ip = row.dataset.ip; const status = row.dataset.status; const method = row.dataset.method; const hasThreat = row.dataset.threats === '1'; const url = row.querySelector('td:nth-child(4)').textContent.trim(); let show = true; // IP filter if (ipValue && !ip.includes(ipValue)) { show = false; } // Status filter if (statusValue) { const statusStart = statusValue; if (!status.startsWith(statusStart)) { show = false; } } // Method filter if (methodValue && method !== methodValue) { show = false; } // Threats filter if (!showThreats && hasThreat) { show = false; } // Hide /stats filter if (hideStats && url.includes('/stats')) { show = false; } row.style.display = show ? '' : 'none'; if (show) { visibleCount++; if (hasThreat) threatCount++; if (status.startsWith('2')) count2xx++; if (status.startsWith('4')) count4xx++; if (status.startsWith('5')) count5xx++; uniqueIps.add(ip); } }); // Update stats document.getElementById('stat_total').textContent = visibleCount; document.getElementById('stat_threats').textContent = threatCount; document.getElementById('stat_2xx').textContent = count2xx; document.getElementById('stat_4xx').textContent = count4xx; document.getElementById('stat_5xx').textContent = count5xx; document.getElementById('stat_ips').textContent = uniqueIps.size; } // Event listeners filterIp.addEventListener('input', applyFilters); filterStatus.addEventListener('change', applyFilters); filterMethod.addEventListener('change', applyFilters); filterThreats.addEventListener('change', applyFilters); filterHideStats.addEventListener('change', applyFilters); // Reset button resetBtn.addEventListener('click', function() { filterIp.value = ''; filterStatus.value = ''; filterMethod.value = ''; filterThreats.checked = true; filterHideStats.checked = true; applyFilters(); }); applyFilters(); });