PluginProbe
Search Atlas SEO – OTTO AI SEO Automation for WordPress / 2.6.3
Search Atlas SEO – OTTO AI SEO Automation for WordPress v2.6.3
2.7.1 2.7.2 2.7.0 2.6.26 2.6.25 2.6.24 2.6.23 2.6.22 2.6.21 2.6.20 2.6.19 2.6.18 2.6.17 2.6.16 2.6.15 2.6.14 2.6.13 2.6.12 2.6.11 2.6.10 2.6.9 2.6.8 2.6.7 2.6.6 2.6.5 All 141 releases
metasync / views / js / metasync-import-external-data.js

metasync-import-external-data.js in Search Atlas SEO – OTTO AI SEO Automation for WordPress 2.6.3, at views/js/metasync-import-external-data.js

191 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* global metasyncImportData, jQuery, ajaxurl */
2 /**
3 * MetaSync Import External Data
4 *
5 * Extracted for Phase 5, #887.
6 * Handles importing external plugin data (redirections, SEO metadata)
7 * with batch progress tracking for SEO metadata imports.
8 *
9 * Localized object: metasyncImportData
10 * - importNonce (string) Nonce for metasync_import_external_data
11 * - seoImportNonce (string) Nonce for metasync_import_seo_metadata
12 *
13 * @since Phase 5
14 */
15 jQuery(document).ready(function ($) {
16 var importNonce = metasyncImportData.importNonce;
17 var seoImportNonce = metasyncImportData.seoImportNonce;
18 var currentImportData = null;
19
20 // Handle import button clicks
21 $('.metasync-import-btn').on('click', function () {
22 var btn = $(this);
23 var type = btn.data('type');
24 var plugin = btn.data('plugin');
25 var card = btn.closest('.metasync-plugin-card');
26
27 // Special handling for SEO metadata - show options modal
28 if (type === 'seo_metadata') {
29 currentImportData = {
30 btn: btn,
31 type: type,
32 plugin: plugin,
33 card: card
34 };
35 $('#metasync-seo-options-modal').addClass('active');
36 return;
37 }
38
39 // For other import types, proceed directly
40 performImport(btn, type, plugin, card);
41 });
42
43 // Modal close handlers
44 $('.metasync-modal-close, #modal-cancel').on('click', function () {
45 $('#metasync-seo-options-modal').removeClass('active');
46 $('.metasync-progress-container').removeClass('active');
47 $('.metasync-progress-fill').css('width', '0%');
48 $('.metasync-progress-text').text('0%');
49 $('.metasync-progress-status').text('');
50 currentImportData = null;
51 });
52
53 // Click outside modal to close
54 $('.metasync-modal-overlay').on('click', function (e) {
55 if (e.target === this) {
56 $(this).find('.metasync-modal-close').click();
57 }
58 });
59
60 // Start Import button in modal
61 $('#modal-start-import').on('click', function () {
62 if (!currentImportData) return;
63
64 var options = {
65 import_titles: $('#import-titles').is(':checked'),
66 import_descriptions: $('#import-descriptions').is(':checked'),
67 overwrite_existing: $('#overwrite-existing').is(':checked')
68 };
69
70 // Disable form elements
71 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #overwrite-existing')
72 .prop('disabled', true);
73
74 // Show progress
75 $('.metasync-progress-container').addClass('active');
76
77 // Start batch import
78 performBatchImport(currentImportData, options);
79 });
80
81 // Perform direct import (for non-SEO metadata types)
82 function performImport(btn, type, plugin, card) {
83 var resultDiv = card.find('.metasync-import-result');
84
85 btn.prop('disabled', true).text('Importing...');
86 resultDiv.removeClass('success error').hide();
87
88 $.ajax({
89 url: ajaxurl,
90 type: 'POST',
91 data: {
92 action: 'metasync_import_external_data',
93 nonce: importNonce,
94 type: type,
95 plugin: plugin
96 },
97 success: function (response) {
98 if (response.success) {
99 btn.addClass('success').text('\u2713 Imported');
100 resultDiv.addClass('success').html(response.data.message).slideDown();
101 } else {
102 btn.prop('disabled', false).text('Import ' + type.charAt(0).toUpperCase() + type.slice(1));
103 resultDiv.addClass('error').html(response.data.message || 'Import failed.').slideDown();
104 }
105 },
106 error: function () {
107 btn.prop('disabled', false).text('Retry Import');
108 resultDiv.addClass('error').html('Network error. Please try again.').slideDown();
109 }
110 });
111 }
112
113 // Perform batch import with progress tracking (for SEO metadata)
114 function performBatchImport(importData, options) {
115 var offset = 0;
116 var totalImported = 0;
117 var totalSkipped = 0;
118
119 function processBatch() {
120 $.ajax({
121 url: ajaxurl,
122 type: 'POST',
123 data: {
124 action: 'metasync_import_seo_metadata',
125 nonce: seoImportNonce,
126 plugin: importData.plugin,
127 import_titles: options.import_titles ? 1 : 0,
128 import_descriptions: options.import_descriptions ? 1 : 0,
129 overwrite_existing: options.overwrite_existing ? 1 : 0,
130 offset: offset
131 },
132 success: function (response) {
133 if (response.success && response.data) {
134 var data = response.data;
135 totalImported += data.imported || 0;
136 totalSkipped += data.skipped || 0;
137
138 // Update progress bar
139 var percent = data.progress_percent || 0;
140 $('.metasync-progress-fill').css('width', percent + '%');
141 $('.metasync-progress-text').text(percent + '%');
142 $('.metasync-progress-status').text(
143 'Processing... ' + (data.processed || 0) + ' of ' + (data.total || 0) + ' posts'
144 );
145
146 if (data.is_complete) {
147 // Import complete
148 $('.metasync-progress-status').html(
149 '<strong style="color: var(--dashboard-success);">\u2713 Import Complete!</strong><br>' +
150 'Imported: ' + totalImported + ' posts | Skipped: ' + totalSkipped + ' posts'
151 );
152
153 importData.btn.addClass('success').text('\u2713 Imported');
154
155 // Close modal after 2 seconds
156 setTimeout(function () {
157 $('#metasync-seo-options-modal .metasync-modal-close').click();
158 // Re-enable button for future imports
159 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #overwrite-existing')
160 .prop('disabled', false);
161 }, 2000);
162 } else {
163 // Continue with next batch
164 offset = data.processed || 0;
165 processBatch();
166 }
167 } else {
168 // Error occurred
169 $('.metasync-progress-status').html(
170 '<strong style="color: var(--dashboard-error);">\u2717 Import Failed</strong><br>' +
171 (response.data && response.data.message ? response.data.message : 'Unknown error occurred')
172 );
173 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #overwrite-existing')
174 .prop('disabled', false);
175 }
176 },
177 error: function () {
178 $('.metasync-progress-status').html(
179 '<strong style="color: var(--dashboard-error);">\u2717 Network Error</strong><br>Please try again'
180 );
181 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #overwrite-existing')
182 .prop('disabled', false);
183 }
184 });
185 }
186
187 // Start first batch
188 processBatch();
189 }
190 });
191