PluginProbe
Search Atlas SEO – OTTO AI SEO Automation for WordPress / 2.6.11
Search Atlas SEO – OTTO AI SEO Automation for WordPress v2.6.11
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.11, at views/js/metasync-import-external-data.js

196 lines 6.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) {
63 return;
64 }
65
66 var options = {
67 import_titles: $('#import-titles').is(':checked'),
68 import_descriptions: $('#import-descriptions').is(':checked'),
69 import_social_text: $('#import-social-text').is(':checked'),
70 import_social_images: $('#import-social-images').is(':checked'),
71 overwrite_existing: $('#overwrite-existing').is(':checked')
72 };
73
74 // Disable form elements
75 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #import-social-text, #import-social-images, #overwrite-existing')
76 .prop('disabled', true);
77
78 // Show progress
79 $('.metasync-progress-container').addClass('active');
80
81 // Start batch import
82 performBatchImport(currentImportData, options);
83 });
84
85 // Perform direct import (for non-SEO metadata types)
86 function performImport(btn, type, plugin, card) {
87 var resultDiv = card.find('.metasync-import-result');
88
89 btn.prop('disabled', true).text('Importing...');
90 resultDiv.removeClass('success error').hide();
91
92 $.ajax({
93 url: ajaxurl,
94 type: 'POST',
95 data: {
96 action: 'metasync_import_external_data',
97 nonce: importNonce,
98 type: type,
99 plugin: plugin
100 },
101 success: function (response) {
102 if (response.success) {
103 btn.addClass('success').text('\u2713 Imported');
104 resultDiv.addClass('success').text(response.data.message).slideDown();
105 } else {
106 btn.prop('disabled', false).text('Import ' + type.charAt(0).toUpperCase() + type.slice(1));
107 resultDiv.addClass('error').text(response.data.message || 'Import failed.').slideDown();
108 }
109 },
110 error: function () {
111 btn.prop('disabled', false).text('Retry Import');
112 resultDiv.addClass('error').text('Network error. Please try again.').slideDown();
113 }
114 });
115 }
116
117 // Perform batch import with progress tracking (for SEO metadata)
118 function performBatchImport(importData, options) {
119 var offset = 0;
120 var totalImported = 0;
121 var totalSkipped = 0;
122
123 function processBatch() {
124 $.ajax({
125 url: ajaxurl,
126 type: 'POST',
127 data: {
128 action: 'metasync_import_seo_metadata',
129 nonce: seoImportNonce,
130 plugin: importData.plugin,
131 import_titles: options.import_titles ? 1 : 0,
132 import_descriptions: options.import_descriptions ? 1 : 0,
133 import_social_text: options.import_social_text ? 1 : 0,
134 import_social_images: options.import_social_images ? 1 : 0,
135 overwrite_existing: options.overwrite_existing ? 1 : 0,
136 offset: offset
137 },
138 success: function (response) {
139 if (response.success && response.data) {
140 var data = response.data;
141 totalImported += data.imported || 0;
142 totalSkipped += data.skipped || 0;
143
144 // Update progress bar
145 var percent = data.progress_percent || 0;
146 $('.metasync-progress-fill').css('width', percent + '%');
147 $('.metasync-progress-text').text(percent + '%');
148 $('.metasync-progress-status').text(
149 'Processing... ' + (data.processed || 0) + ' of ' + (data.total || 0) + ' posts'
150 );
151
152 if (data.is_complete) {
153 // Import complete
154 $('.metasync-progress-status').empty()
155 .append($('<strong>').css('color', 'var(--dashboard-success)').text('\u2713 Import Complete!'))
156 .append(document.createTextNode(' Imported: ' + totalImported + ' posts | Skipped: ' + totalSkipped + ' posts'));
157
158 importData.btn.addClass('success').text('\u2713 Imported');
159
160 // Close modal after 2 seconds
161 setTimeout(function () {
162 $('#metasync-seo-options-modal .metasync-modal-close').click();
163 // Re-enable button for future imports
164 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #import-social-text, #import-social-images, #overwrite-existing')
165 .prop('disabled', false);
166 }, 2000);
167 } else {
168 // Continue with next batch
169 offset = data.processed || 0;
170 processBatch();
171 }
172 } else {
173 // Error occurred
174 var importErrMsg = (response.data && response.data.message ? response.data.message : 'Unknown error occurred');
175 var $importStatus = $('.metasync-progress-status').empty();
176 $importStatus.append($('<strong>').css('color', 'var(--dashboard-error)').text('\u2717 Import Failed'));
177 $importStatus[0].appendChild(document.createTextNode(' ' + importErrMsg));
178 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #import-social-text, #import-social-images, #overwrite-existing')
179 .prop('disabled', false);
180 }
181 },
182 error: function () {
183 $('.metasync-progress-status').empty()
184 .append($('<strong>').css('color', 'var(--dashboard-error)').text('\u2717 Network Error'))
185 .append(document.createTextNode(' Please try again'));
186 $('#modal-start-import, #modal-cancel, #import-titles, #import-descriptions, #import-social-text, #import-social-images, #overwrite-existing')
187 .prop('disabled', false);
188 }
189 });
190 }
191
192 // Start first batch
193 processBatch();
194 }
195 });
196