// Zoraxy WAF — config panel function loadConfig() { $.get('./api/config', function (data) { $('#waf-enabled').prop('checked', data.enabled); $('#enabled-label').text(data.enabled ? 'WAF Enabled' : 'WAF Disabled'); $('#node-url').val(data.node_url); $('#return-port').val(data.return_port); $('#timeout-ms').val(data.timeout_ms); }); } function loadStats() { $.get('./api/stats', function (data) { $('#circuit-state').text(data.circuit).attr('class', 'stat-value ' + (data.circuit === 'open' ? 'warn' : data.circuit === 'closed' ? 'ok' : 'warn')); $('#waf-status').text(data.enabled ? 'Active' : 'Disabled').attr('class', 'stat-value ' + (data.enabled ? 'ok' : 'off')); $('#stat-total').text(data.total || 0); $('#stat-allowed').text(data.allowed || 0); $('#stat-blocked').text(data.blocked || 0); $('#stat-bypassed').text(data.bypassed || 0); }); } function saveConfig() { $('#save-status').text('Saving...'); $.cjax({ url: './api/config/save', type: 'POST', data: { enabled: $('#waf-enabled').is(':checked'), node_url: $('#node-url').val().trim(), return_port: $('#return-port').val(), timeout_ms: $('#timeout-ms').val() }, success: function () { $('#save-status').text('Saved ✓'); loadConfig(); loadStats(); setTimeout(function () { $('#save-status').text(''); }, 2000); }, error: function () { $('#save-status').css('color', '#d63031').text('Save failed'); } }); } $('#waf-enabled').on('change', function () { $('#enabled-label').text(this.checked ? 'WAF Enabled' : 'WAF Disabled'); }); $('#save-btn').on('click', saveConfig); $(document).ready(function () { loadConfig(); loadStats(); setInterval(loadStats, 10000); // refresh stats every 10s });