/** * Snippet validation before publish/update */ (function($) { 'use strict'; let validationInProgress = false; let validationPassed = false; /** * Validate snippet code via AJAX */ function validateSnippetCode(callback) { const postId = $('#post_ID').val(); // Get snippet code from CodeMirror if available, otherwise from textarea let snippetCode = $('#post_content').val(); if (wp && wp.codeEditor && wp.codeEditor.instances && wp.codeEditor.instances.post_content) { const editor = wp.codeEditor.instances.post_content; if (editor && editor.codemirror) { snippetCode = editor.codemirror.getValue(); } } const snippetType = $('#wbcr_inp_snippet_type').val(); // Show validation indicator const $publishButton = $('#publish'); const originalText = $publishButton.val(); const originalClasses = $publishButton.attr('class'); $publishButton.val(wbcrInpValidation.validatingText).prop('disabled', true); $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'wbcr_inp_ajax_validate_snippet', post_id: postId, snippet_code: snippetCode, snippet_type: snippetType, nonce: wbcrInpValidation.nonce }, success: function(response) { // Restore button state $publishButton.prop('disabled', false); $publishButton.val(originalText); if (originalClasses) { $publishButton.attr('class', originalClasses); } if (response.success) { callback(true); } else { showValidationError(response.data.message); callback(false); } }, error: function(xhr) { // Restore button state $publishButton.prop('disabled', false); $publishButton.val(originalText); if (originalClasses) { $publishButton.attr('class', originalClasses); } let errorMessage = wbcrInpValidation.errorText; if (xhr.responseJSON && xhr.responseJSON.data && xhr.responseJSON.data.message) { errorMessage = xhr.responseJSON.data.message; } showValidationError(errorMessage); callback(false); } }); } /** * Show validation error message */ function showValidationError(message) { // Remove any existing error notices $('.winp-validation-error').remove(); // Create error notice const $notice = $('
', { class: 'notice notice-error is-dismissible winp-validation-error', html: '

' + wbcrInpValidation.errorTitle + '
' + message + '

' }); // Add dismiss button functionality $notice.append(''); // Insert after page title or at the top of the form if ($('#wpbody-content .wrap h1').length) { $notice.insertAfter('#wpbody-content .wrap h1'); } else { $('#post').prepend($notice); } // Scroll to the error $('html, body').animate({ scrollTop: $notice.offset().top - 100 }, 500); // Handle dismiss button $notice.on('click', '.notice-dismiss', function() { $notice.fadeOut(300, function() { $(this).remove(); }); }); } /** * Intercept form submission */ function interceptFormSubmission() { $('#post').on('submit', function(e) { const $form = $(this); const snippetType = $('#wbcr_inp_snippet_type').val(); const snippetScope = $('input[name="wbcr_inp_snippet_scope"]:checked').val(); // Only validate PHP and Universal snippets with evrywhere or auto scope const needsValidation = (snippetType === 'php' || snippetType === 'universal') && (snippetScope === 'evrywhere' || snippetScope === 'auto'); if (!needsValidation) { return true; // Allow form submission } // If validation already passed, allow submission if (validationPassed) { validationPassed = false; // Reset for next time return true; } // If validation in progress, prevent submission if (validationInProgress) { e.preventDefault(); return false; } // Prevent form submission and validate e.preventDefault(); validationInProgress = true; validateSnippetCode(function(isValid) { validationInProgress = false; if (isValid) { validationPassed = true; // Remove any error notices $('.winp-validation-error').remove(); // Submit the form $form.off('submit').submit(); } // If not valid, error is already shown, just stop here }); return false; }); } /** * Initialize validation on document ready */ $(document).ready(function() { // Check if we're on the right page const postType = $('#post_type').val(); // Only initialize on snippet edit pages if (typeof wbcrInpValidation !== 'undefined' && postType === wbcrInpValidation.postType) { interceptFormSubmission(); } else { console.warn('Snippet Validation: Not initializing - wrong page type or config not loaded'); } }); })(jQuery);