jQuery(document).ready(function($) { // ======================================== // QUEUE PROCESSING SYSTEM // ======================================== let isProcessingQueue = false; let currentQueueId = null; let currentQueueType = null; // Check if we should start queue processing on page load checkForActiveQueues(); // Form submission handler - triggers queue processing $('#mxchat-url-form').on('submit', function(e) { //console.log('MxChat: Form submitted, queue will be created'); // Don't prevent default - let form submit normally // But schedule a check after redirect localStorage.setItem('mxchat_check_queue_after_submit', Date.now().toString()); }); // Check if we just submitted a form and need to start processing const justSubmitted = localStorage.getItem('mxchat_check_queue_after_submit'); if (justSubmitted) { const submitTime = parseInt(justSubmitted); const now = Date.now(); // If submitted within last 10 seconds, wait for queue to be created if (now - submitTime < 10000) { //console.log('MxChat: Form was just submitted, waiting for queue creation...'); localStorage.removeItem('mxchat_check_queue_after_submit'); // Show processing message if ($('.mxchat-processing-message').length === 0) { const message = $('
'); $('.mxchat-import-section').after(message); } // Check for queue multiple times with increasing delays setTimeout(function() { checkForActiveQueues(); }, 1000); setTimeout(function() { checkForActiveQueues(); }, 2000); setTimeout(function() { checkForActiveQueues(); }, 3000); setTimeout(function() { checkForActiveQueues(); }, 5000); } } function checkForActiveQueues() { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_get_status_updates', nonce: mxchatAdmin.status_nonce }, success: function(response) { //console.log('MxChat: Checking for active queues...', response); if (response.sitemap_queue_id && response.sitemap_status) { if (response.sitemap_status.status === 'processing') { //console.log('MxChat: Found active sitemap queue:', response.sitemap_queue_id); startQueueProcessing(response.sitemap_queue_id, 'sitemap'); } else if (response.sitemap_status.status === 'complete') { //console.log('MxChat: Sitemap queue already complete'); // ADD THIS LINE: $('.mxchat-processing-message').remove(); // Show completed status card (no auto-refresh) updateSitemapStatus(response.sitemap_status); } } if (response.pdf_queue_id && response.pdf_status) { if (response.pdf_status.status === 'processing') { //console.log('MxChat: Found active PDF queue:', response.pdf_queue_id); startQueueProcessing(response.pdf_queue_id, 'pdf'); } else if (response.pdf_status.status === 'complete') { //console.log('MxChat: PDF queue already complete'); // ADD THIS LINE: $('.mxchat-processing-message').remove(); // Show completed status card (no auto-refresh) updatePdfStatus(response.pdf_status); } } // ADD THIS: If no queues found at all, remove the message if (!response.sitemap_queue_id && !response.pdf_queue_id) { $('.mxchat-processing-message').remove(); } }, error: function(xhr, status, error) { console.error('MxChat: Error checking for active queues:', error); // ADD THIS: Remove message on error too $('.mxchat-processing-message').remove(); } }); } /** * Start processing a queue */ function startQueueProcessing(queueId, queueType) { if (isProcessingQueue) { //console.log('MxChat: Already processing a queue, skipping'); return; } isProcessingQueue = true; currentQueueId = queueId; currentQueueType = queueType; //console.log('MxChat: Starting queue processing:', queueId, queueType); // Remove any "waiting" messages $('.mxchat-processing-message').remove(); // Create or update status card createOrUpdateStatusCard(queueType); // Start the processing loop processNextQueueItem(); } /** * Process the next item in the queue */ function processNextQueueItem() { if (!isProcessingQueue) { //console.log('MxChat: Processing stopped'); return; } // Get next item from queue $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_get_next_queue_item', nonce: mxchatAdmin.queue_nonce, queue_id: currentQueueId }, success: function(response) { if (!response.success) { console.error('MxChat: Error getting next queue item:', response.data); // Check if queue is actually complete despite error verifyQueueCompletion(); return; } if (response.data.complete) { // Queue is complete! //console.log('MxChat: Queue processing complete!'); handleQueueComplete(); return; } // Process this item const item = response.data.item; //console.log('MxChat: Processing item:', item.type, item.id); processQueueItem(item); }, error: function(xhr, status, error) { console.error('MxChat: AJAX error getting next item:', error); // Network error - verify queue status before retrying setTimeout(function() { verifyQueueCompletion(); }, 2000); } }); } /** * Verify if queue is actually complete * Prevents infinite loops when last item fails */ function verifyQueueCompletion() { //console.log('MxChat: Verifying queue completion status...'); $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_get_queue_status', nonce: mxchatAdmin.queue_nonce, queue_id: currentQueueId }, success: function(response) { if (response.success) { const status = response.data; // If no pending or processing items, queue is done if (status.pending === 0 && status.processing === 0) { //console.log('MxChat: Queue verified as complete'); handleQueueComplete(); } else { // Still has items, try to continue //console.log('MxChat: Queue still has pending items, continuing...'); processNextQueueItem(); } } else { // Can't verify, assume complete to prevent infinite loop //console.log('MxChat: Could not verify queue status, assuming complete'); handleQueueComplete(); } }, error: function() { // Can't verify, assume complete to prevent infinite loop //console.log('MxChat: Network error verifying queue, assuming complete'); handleQueueComplete(); } }); } /** * Process a single queue item * Never stops the queue - always continues regardless of success/failure */ function processQueueItem(item) { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_process_queue_item', nonce: mxchatAdmin.queue_nonce, item_id: item.id, item_type: item.type, item_data: item.data, bot_id: item.bot_id }, success: function(response) { if (response.success) { // Item processed successfully //console.log('MxChat: Item processed successfully:', item.id); // Update progress updateQueueProgress(); // Small delay to prevent server overload, then process next setTimeout(function() { processNextQueueItem(); }, 500); // 500ms delay between items } else { // Item failed but we KEEP GOING console.warn('MxChat: Item processing failed (will continue):', item.type, item.id); console.warn('MxChat: Error details:', response.data); // Update progress to reflect the attempt updateQueueProgress(); // Continue to next item regardless setTimeout(function() { processNextQueueItem(); }, 500); } }, error: function(xhr, status, error) { // Network error - log it but KEEP GOING console.error('MxChat: AJAX/Network error processing item:', item.id, error); // Update progress updateQueueProgress(); // Wait a bit longer for network errors, then continue setTimeout(function() { processNextQueueItem(); }, 1000); } }); } /** * Update queue progress (fetches latest stats) */ function updateQueueProgress() { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_get_queue_status', nonce: mxchatAdmin.queue_nonce, queue_id: currentQueueId }, success: function(response) { if (response.success) { const status = response.data; // Update the appropriate status card if (currentQueueType === 'pdf') { updatePdfStatusFromQueue(status); } else { updateSitemapStatusFromQueue(status); } } } }); } /** * Handle queue completion * NO AUTO-REFRESH - Show completed card with errors until dismissed */ function handleQueueComplete() { isProcessingQueue = false; //console.log('MxChat: Queue processing completed - showing final results'); // Get final status with error details $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_get_queue_status', nonce: mxchatAdmin.queue_nonce, queue_id: currentQueueId }, success: function(response) { if (response.success) { const status = response.data; // Show completed status card (NO REFRESH) if (currentQueueType === 'pdf') { showCompletedPdfCard(status); } else { showCompletedSitemapCard(status); } // Mark the queue as complete on server markQueueAsComplete(currentQueueId); // Show notification based on results if (status.failed > 0) { showNotification('warning', `Processing completed: ${status.completed} succeeded, ${status.failed} failed. ` + `Review errors below and dismiss when ready.` ); } else { showNotification('success', `Processing completed successfully! All ${status.completed} items processed. ` + `Dismiss the status card when ready.` ); } // NO AUTO-REFRESH - User must manually dismiss } else { // Couldn't get final status, just show generic completion showNotification('success', 'Processing completed! Refresh page to see final results.'); } }, error: function() { // Error getting final status showNotification('success', 'Processing completed! Refresh page to see final results.'); } }); } /** * Show completed PDF card with full error details (NO RETRY BUTTON) */ function showCompletedPdfCard(status) { let $card = $('.mxchat-status-card:contains("PDF Processing")'); if ($card.length === 0) { return; } // Remove processing UI elements $card.find('.mxchat-stop-form').remove(); $card.find('.mxchat-status-warning').remove(); // Update header with completion badge $card.find('.mxchat-status-badge').remove(); if (status.failed > 0) { $card.find('.mxchat-status-header h4').after( '⚠️ Completed with ' + status.failed + ' failures - Refresh to view entries' ); } else { $card.find('.mxchat-status-header h4').after( '✓ Complete - Refresh to view entries' ); } // Add dismiss button addDismissButton($card); // Update progress bar to 100% $card.find('.mxchat-progress-fill').css('width', '100%'); // Update details with final stats let detailsHtml = 'Total Pages: ' + status.total + '
'; detailsHtml += '✓ Successfully Processed: ' + status.completed + '
'; if (status.failed > 0) { detailsHtml += '✗ Failed: ' + status.failed + '
'; } detailsHtml += '| Page | Error | Attempts |
|---|---|---|
| Page ' + pageNum + ' | '; detailsHtml += '' + (item.error_message || 'Unknown error') + ' | '; detailsHtml += '' + item.attempts + ' | '; detailsHtml += '
Total URLs: ' + status.total + '
'; detailsHtml += '✓ Successfully Processed: ' + status.completed + '
'; if (status.failed > 0) { detailsHtml += '✗ Failed: ' + status.failed + '
'; } detailsHtml += '| URL | Error | Attempts |
|---|---|---|
| ' + displayUrl + ' | '; detailsHtml += '' + (item.error_message || 'Unknown error') + ' | '; detailsHtml += '' + item.attempts + ' | '; detailsHtml += '
Initializing...
'; html += 'Progress: ' + (status.completed + status.failed) + ' of ' + status.total + ' pages (' + status.percentage + '%)
'; if (status.completed > 0) { detailsHtml += '✓ Processed successfully: ' + status.completed + '
'; } if (status.failed > 0) { detailsHtml += '✗ Failed pages: ' + status.failed + '
'; } detailsHtml += 'Status: Processing
'; $card.find('.mxchat-status-details').html(detailsHtml); } /** * Update sitemap status from queue data (DURING PROCESSING) */ function updateSitemapStatusFromQueue(status) { let $card = $('.mxchat-status-card:contains("Sitemap Processing")'); if ($card.length === 0) { return; } // Update progress bar $card.find('.mxchat-progress-fill').css('width', status.percentage + '%'); // Update details let detailsHtml = 'Progress: ' + (status.completed + status.failed) + ' of ' + status.total + ' URLs (' + status.percentage + '%)
'; if (status.completed > 0) { detailsHtml += '✓ Processed successfully: ' + status.completed + '
'; } if (status.failed > 0) { detailsHtml += '✗ Failed URLs: ' + status.failed + '
'; } detailsHtml += 'Status: Processing
'; $card.find('.mxchat-status-details').html(detailsHtml); } // ======================================== // STATUS UPDATES FOR COMPLETED QUEUES (FROM SERVER) // ======================================== /** * Dismiss completed status button handler */ $(document).on('click', '.mxchat-dismiss-button', function() { const $button = $(this); const $card = $button.closest('.mxchat-status-card'); let cardType = $card.data('card-type'); if (!cardType) { cardType = $card.find('h4').text().includes('PDF') ? 'pdf' : 'sitemap'; } $card.fadeOut(300, function() { $(this).remove(); }); $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'mxchat_clear_queue', nonce: mxchatAdmin.queue_nonce, queue_id: $card.data('queue-id') || '' }, success: function(response) { //console.log('MxChat: Queue cleared'); } }); }); /** * Update PDF status card (for already completed queues on page load) */ function updatePdfStatus(status) { let $pdfCard = $('.mxchat-status-card:contains("PDF Processing")'); if ($pdfCard.length === 0 && status) { createPdfStatusCard(status); $pdfCard = $('.mxchat-status-card:contains("PDF Processing")'); } if ($pdfCard.length > 0 && status.status === 'complete') { // Show as completed (same as showCompletedPdfCard but from server data) showCompletedPdfCard(status); } } /** * Update sitemap status card (for already completed queues on page load) */ function updateSitemapStatus(status) { let $sitemapCard = $('.mxchat-status-card:contains("Sitemap Processing")'); if ($sitemapCard.length === 0 && status) { createSitemapStatusCard(status); $sitemapCard = $('.mxchat-status-card:contains("Sitemap Processing")'); } if ($sitemapCard.length > 0 && status.status === 'complete') { // Show as completed (same as showCompletedSitemapCard but from server data) showCompletedSitemapCard(status); } } /** * Create PDF status card */ function createPdfStatusCard(status) { let html = 'Progress: ' + status.processed_pages + ' of ' + status.total_pages + ' pages
'; html += 'Progress: ' + status.processed_urls + ' of ' + status.total_urls + ' URLs
'; html += 'Total Updated: ' + response.data.updated_count + '
'; resultHtml += 'Tags Processed: ' + response.data.tags_processed + '
'; if (response.data.details && response.data.details.length > 0) { resultHtml += '' + response.data + '
').show(); } }, error: function() { $progress.hide(); $btn.prop('disabled', false); $result.removeClass('success').addClass('error'); $result.html('Please try again.
').show(); } }); }); function loadTagRoleMappings() { const $container = $('#mxchat-mappings-container'); $container.html('| Tag | Role Restriction | Posts with Tag | Actions |
|---|---|---|---|
| ' + mapping.tag_slug + ' | '; html += '' + mapping.role_label + ' | '; html += '' + mapping.post_count + ' | '; html += ''; html += ' |
Entry deleted successfully from Pinecone.