document.addEventListener('DOMContentLoaded', () => { const monitorList = document.getElementById('monitor-list'); const addForm = document.getElementById('add-monitor-form'); const serviceStatus = document.getElementById('service-status'); let isFetching = false; const fetchMonitors = async (action = 'list') => { if (isFetching) return; isFetching = true; try { const response = await fetch(`api/monitor.php?action=${action}`); const result = await response.json(); if (result.success) { renderMonitors(result.data); updateSummary(result.data); updateServiceStatus(result.worker_active); } } catch (error) { console.error('Error fetching monitors:', error); } finally { isFetching = false; } }; const updateServiceStatus = (active) => { if (!serviceStatus) return; const text = serviceStatus.querySelector('.status-text'); if (active) { serviceStatus.classList.remove('border-danger'); serviceStatus.classList.add('border-cyan'); text.innerText = 'Online'; text.className = 'status-text text-success'; } else { serviceStatus.classList.remove('border-cyan'); serviceStatus.classList.add('border-danger'); text.innerText = 'Offline (Restarting...)'; text.className = 'status-text text-danger'; } }; const updateSummary = (monitors) => { const total = monitors.length; const online = monitors.filter(m => m.last_status >= 200 && m.last_status < 400).length; const offline = total - online; const onlineEl = document.getElementById('summary-online'); const offlineEl = document.getElementById('summary-offline'); const totalEl = document.getElementById('summary-total'); if (onlineEl) onlineEl.innerText = online; if (offlineEl) offlineEl.innerText = offline; if (totalEl) totalEl.innerText = total; }; const renderMonitors = (monitors) => { if (monitors.length === 0) { monitorList.innerHTML = '
${m.url}