/** * WPBan Pro Admin JavaScript */ (function($) { 'use strict'; // Tab Navigation $(document).on('click', '.nav-tab', function(e) { e.preventDefault(); const target = $(this).attr('href'); $('.nav-tab').removeClass('nav-tab-active'); $(this).addClass('nav-tab-active'); $('.tab-content').removeClass('active'); $(target).addClass('active'); // Save active tab to localStorage localStorage.setItem('wpban_active_tab', target); }); // Restore active tab $(document).ready(function() { const activeTab = localStorage.getItem('wpban_active_tab'); if (activeTab && $(activeTab).length) { $('.nav-tab[href="' + activeTab + '"]').trigger('click'); } }); // Settings Form Handler $('#wpban-settings-form').on('submit', function(e) { e.preventDefault(); const $form = $(this); const $button = $('#wpban-save-settings'); const $spinner = $button.next('.spinner'); $button.prop('disabled', true); $spinner.addClass('is-active'); $.ajax({ url: wpban.ajax_url, type: 'POST', data: { action: 'wpban_save_settings', settings: $form.serialize(), _ajax_nonce: $('#wpban_nonce').val() }, success: function(response) { if (response.success) { showMessage('success', response.data.message); } else { showMessage('error', response.data || wpban.i18n.error); } }, error: function() { showMessage('error', wpban.i18n.error); }, complete: function() { $button.prop('disabled', false); $spinner.removeClass('is-active'); } }); }); // Apply Template window.wpbanApplyTemplate = function(templateId) { if (!confirm(wpban.i18n.confirm_template)) { return; } $.post(wpban.ajax_url, { action: 'wpban_apply_template', template: templateId, _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { showMessage('success', response.data.message); setTimeout(() => location.reload(), 1500); } else { showMessage('error', response.data || wpban.i18n.error); } }); }; // Copy Text to Clipboard window.wpbanCopyText = function(text) { navigator.clipboard.writeText(text).then(() => { showMessage('success', 'Copied to clipboard!'); }).catch(() => { // Fallback for older browsers const $temp = $(''); $('body').append($temp); $temp.val(text).select(); document.execCommand('copy'); $temp.remove(); showMessage('success', 'Copied to clipboard!'); }); }; // Crawler Selection window.wpbanSelectCrawlers = function(type, select) { if (type === 'all') { $('.wpban-crawler-item input').prop('checked', select); } else { $(`.wpban-crawler-item[data-type="${type}"] input`).prop('checked', select); } }; // Export Logs window.wpbanExportLogs = function() { window.location.href = wpban.ajax_url + '?action=wpban_export_logs&_ajax_nonce=' + wpban.nonce; }; // Clear Logs window.wpbanClearLogs = function() { if (!confirm(wpban.i18n.confirm_clear)) { return; } $.post(wpban.ajax_url, { action: 'wpban_clear_logs', _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { showMessage('success', response.data.message); setTimeout(() => location.reload(), 1500); } }); }; // Test Email window.wpbanTestEmail = function() { const $button = event.target; $button.disabled = true; $.post(wpban.ajax_url, { action: 'wpban_test_email', _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { showMessage('success', response.data.message); } else { showMessage('error', response.data || wpban.i18n.error); } }).always(function() { $button.disabled = false; }); }; // Export Settings window.wpbanExportSettings = function() { $.get(wpban.ajax_url, { action: 'wpban_export_settings', _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { const blob = new Blob([response.data], {type: 'application/json'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'wpban-settings-' + new Date().toISOString().split('T')[0] + '.json'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } }); }; // Optimize Database window.wpbanOptimizeDatabase = function() { const $button = event.target; $button.disabled = true; $.post(wpban.ajax_url, { action: 'wpban_optimize_database', _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { showMessage('success', 'Database optimized successfully!'); } }).always(function() { $button.disabled = false; }); }; // Clear Old Logs window.wpbanClearOldLogs = function() { if (!confirm('This will permanently delete all logs older than 30 days. Continue?')) { return; } $.post(wpban.ajax_url, { action: 'wpban_clear_old_logs', _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { showMessage('success', response.data.message); setTimeout(() => location.reload(), 1500); } }); }; // Live Search for Crawlers let searchTimeout; $(document).on('input', '#wpban-crawler-search', function() { const query = $(this).val().toLowerCase(); clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { $('.wpban-crawler-item').each(function() { const $item = $(this); const text = $item.text().toLowerCase(); $item.toggle(text.indexOf(query) > -1); }); }, 300); }); // Real-time Log Updates (optional) if ($('#wpban-logs-container').length) { // Auto-refresh logs every 30 seconds setInterval(function() { if (document.visibilityState === 'visible') { refreshLogs(); } }, 30000); } function refreshLogs() { const params = new URLSearchParams(window.location.search); $.get(wpban.ajax_url, { action: 'wpban_get_logs', page: params.get('paged') || 1, date_from: params.get('date_from'), date_to: params.get('date_to'), action_filter: params.get('action_filter'), ip_filter: params.get('ip_filter'), _ajax_nonce: wpban.nonce }, function(response) { if (response.success) { $('#wpban-logs-container tbody').html(response.data.html); } }); } // Show Message function showMessage(type, message) { const $message = $('