/** * WP Domain Mapping admin JavaScript */ jQuery(document).ready(function($) { // Helper function for showing notices function showNotice(selector, message, type) { $(selector) .removeClass('notice-success notice-error notice-warning notice-info') .addClass('notice-' + type) .html('
' + message + '
') .show() .delay(5000) .fadeOut(); } // Domain form validation $('#edit-domain-form').on('submit', function(e) { var domain = $('#domain').val().trim(); var blogId = $('#blog_id').val().trim(); if (!domain) { e.preventDefault(); showNotice('#edit-domain-status', wpDomainMapping.messages.domainRequired, 'error'); $('#domain').focus(); return false; } if (!blogId) { e.preventDefault(); showNotice('#edit-domain-status', wpDomainMapping.messages.siteRequired, 'error'); $('#blog_id').focus(); return false; } // Basic domain format validation var domainPattern = /^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\.[a-zA-Z]{2,}$/; if (!domainPattern.test(domain)) { e.preventDefault(); showNotice('#edit-domain-status', 'Please enter a valid domain format (e.g., example.com)', 'error'); $('#domain').focus(); return false; } }); // Check all domains functionality $('#select-all').on('change', function() { $('.domain-checkbox').prop('checked', this.checked); }); // Update select all when individual checkboxes change $('.domain-checkbox').on('change', function() { if (!this.checked) { $('#select-all').prop('checked', false); } else if ($('.domain-checkbox:checked').length === $('.domain-checkbox').length) { $('#select-all').prop('checked', true); } }); // Handle domain edit/add form submission via AJAX $('#edit-domain-form').on('submit', function(e) { e.preventDefault(); var formData = $(this).serializeArray(); formData.push({name: 'action', value: 'dm_handle_actions'}); formData.push({name: 'action_type', value: 'save'}); formData.push({name: 'nonce', value: wpDomainMapping.nonce}); $('#edit-domain-status').html('' + wpDomainMapping.messages.saving + '
').show(); $.ajax({ url: wpDomainMapping.ajaxUrl, type: 'POST', data: formData, success: function(response) { if (response.success) { showNotice('#edit-domain-status', response.data, 'success'); setTimeout(function() { // Redirect to domains page without edit parameter var url = new URL(window.location); url.searchParams.delete('edit_domain'); window.location.href = url.toString(); }, 1500); } else { showNotice('#edit-domain-status', response.data || wpDomainMapping.messages.error, 'error'); } }, error: function() { showNotice('#edit-domain-status', wpDomainMapping.messages.error, 'error'); } }); }); // Handle bulk domain actions $('#domain-list-form').on('submit', function(e) { e.preventDefault(); var selectedDomains = []; $('.domain-checkbox:checked').each(function() { selectedDomains.push($(this).val()); }); if (selectedDomains.length === 0) { showNotice('#domain-status', wpDomainMapping.messages.noSelection, 'error'); return; } var action = $('#bulk-action-selector-top').val(); if (action === '-1') { showNotice('#domain-status', 'Please select an action.', 'error'); return; } if (action === 'delete' && !confirm('Are you sure you want to delete the selected domains? This action cannot be undone.')) { return; } $('#domain-status').html('' + wpDomainMapping.messages.processing + '
').show(); $.ajax({ url: wpDomainMapping.ajaxUrl, type: 'POST', data: { action: 'dm_handle_actions', action_type: action, domains: selectedDomains, nonce: wpDomainMapping.nonce }, success: function(response) { if (response.success) { showNotice('#domain-status', response.data, 'success'); setTimeout(function() { location.reload(); }, 1500); } else { showNotice('#domain-status', response.data || wpDomainMapping.messages.error, 'error'); } }, error: function() { showNotice('#domain-status', wpDomainMapping.messages.error, 'error'); } }); }); // Single domain delete functionality $('.domain-delete-button').on('click', function(e) { e.preventDefault(); if (!confirm('Are you sure you want to delete this domain? This action cannot be undone.')) { return; } var domain = $(this).data('domain'); var $row = $(this).closest('tr'); $.ajax({ url: wpDomainMapping.ajaxUrl, type: 'POST', data: { action: 'dm_handle_actions', action_type: 'delete', domain: domain, nonce: wpDomainMapping.nonce }, success: function(response) { if (response.success) { $row.fadeOut(function() { $(this).remove(); }); showNotice('#domain-status', response.data, 'success'); } else { showNotice('#domain-status', response.data || wpDomainMapping.messages.error, 'error'); } }, error: function() { showNotice('#domain-status', wpDomainMapping.messages.error, 'error'); } }); }); // Tab switching functionality (for admin settings page) $('.domain-mapping-tab').on('click', function() { var tab = $(this).data('tab'); // Update active tab $('.domain-mapping-tab').removeClass('active'); $(this).addClass('active'); // Show corresponding content $('.domain-mapping-section').hide(); $('.domain-mapping-section[data-section="' + tab + '"]').show(); // Update URL without reloading if (history.pushState) { var url = new URL(window.location); url.searchParams.set('tab', tab); window.history.pushState({}, '', url); } }); // Auto-fill server IP if detected if ($('#ipaddress').length && !$('#ipaddress').val()) { // This would be populated server-side, but we can enhance it client-side if needed } // Domain input formatting - remove protocols and trailing slashes $('#domain').on('blur', function() { var domain = $(this).val().trim(); // Remove http:// or https:// domain = domain.replace(/^https?:\/\//, ''); // Remove trailing slash domain = domain.replace(/\/$/, ''); // Convert to lowercase domain = domain.toLowerCase(); $(this).val(domain); }); // Copy to clipboard functionality for DNS instructions $('.copy-to-clipboard').on('click', function(e) { e.preventDefault(); var text = $(this).data('text') || $(this).prev('code').text(); // Create temporary input var tempInput = $(''); $('body').append(tempInput); tempInput.val(text).select(); try { document.execCommand('copy'); var $btn = $(this); var originalText = $btn.text(); $btn.text('Copied!').addClass('copied'); setTimeout(function() { $btn.text(originalText).removeClass('copied'); }, 2000); } catch (err) { console.log('Copy failed'); } tempInput.remove(); }); // Form validation enhancement $('form').on('submit', function() { var $submitBtn = $(this).find('input[type="submit"], button[type="submit"]'); var originalText = $submitBtn.val() || $submitBtn.text(); // Disable submit button to prevent double submission $submitBtn.prop('disabled', true); // Re-enable after a delay setTimeout(function() { $submitBtn.prop('disabled', false); }, 3000); }); // Enhanced table row highlighting $('.wp-list-table tbody tr').hover( function() { $(this).addClass('hover'); }, function() { $(this).removeClass('hover'); } ); // Auto-hide notices after delay $('.notice.is-dismissible').delay(8000).fadeOut(); // Confirmation for destructive actions $('a[href*="action=delete"], .delete a').on('click', function(e) { if (!confirm('Are you sure you want to delete this item? This action cannot be undone.')) { e.preventDefault(); return false; } }); // Enhanced search functionality $('#domain-filter-form input[type="text"]').on('keypress', function(e) { if (e.which === 13) { // Enter key $(this).closest('form').submit(); } }); // Tooltips for status indicators if ($.fn.tooltip) { $('.dashicons[title]').tooltip(); } // Progress indicator for long-running operations function showProgress(message) { var $progress = $('' + message + '
' + ' ' + '' + response.data.message + '
Status | ' + 'Details | ' + '
---|---|
' + item.status.toUpperCase() + ' | ' + '' + item.message + ' | ' + '
' + (response.data || 'Import failed.') + '
' + 'An error occurred during import.' + '