228 lines
7.1 KiB
JavaScript
228 lines
7.1 KiB
JavaScript
jQuery(document).ready(function($) {
|
|
try {
|
|
|
|
var plugin = $('.main-media-sync-page');
|
|
var files = plugin.find('.media-sync-list-files');
|
|
|
|
plugin.find('.js-import-selected').on('click', function (e) {
|
|
e.preventDefault();
|
|
|
|
var btn = $(this);
|
|
var form = files.find('form');
|
|
var isDebug = !!form.find('input[name="is_debug"]').val();
|
|
var dryRun = !!form.find('input[name="dry_run"]').prop('checked');
|
|
var filePostDate = form.find('input[name="file_post_date"]:checked').val();
|
|
var batchSize = parseInt(form.find('input[name="batch_size"]').val());
|
|
var selectedItems = form.find('.is-file.is-in-db-no input[type="checkbox"]:checked');
|
|
var items = selectedItems && selectedItems.length ? selectedItems.map(function (index, checkbox) {
|
|
return {
|
|
'file': $(checkbox).val(),
|
|
'row_id': $(checkbox).attr('data-row-id')
|
|
};
|
|
}).get() : [];
|
|
var total = items.length;
|
|
var batch;
|
|
var batchCount = 0;
|
|
var counter = 0;
|
|
|
|
function setActiveStatus(isActive) {
|
|
if(isActive) {
|
|
// Disable submit button while request is being executed
|
|
btn.prop('disabled', true);
|
|
|
|
// Activate loading icon
|
|
plugin.find('.import-spinner').addClass('is-active');
|
|
} else {
|
|
// Enable submit button
|
|
btn.prop('disabled', false);
|
|
|
|
// Deactivate loading icon
|
|
plugin.find('.import-spinner').removeClass('is-active');
|
|
}
|
|
}
|
|
|
|
function outputError(errorMessage = null, error = null, isItemError = false) {
|
|
console.error("[Media Sync] [Import] " + errorMessage, (error ? error : ''));
|
|
|
|
if(!isItemError) {
|
|
var errors = "[Media Sync] " + errorMessage + (error ? "\nE:\n" + error : '');
|
|
plugin.find('.js-media-sync-error-placeholder').removeClass('hidden').html(errors);
|
|
setActiveStatus(false);
|
|
}
|
|
}
|
|
|
|
if (total <= 0) {
|
|
outputError('No files selected.');
|
|
return false;
|
|
}
|
|
|
|
if (!(typeof batchSize === 'number' && batchSize > 0)) {
|
|
outputError('Batch Size needs to be positive number.');
|
|
return false;
|
|
}
|
|
|
|
// Reset stuff
|
|
plugin.find('.media-sync-progress').css('width', 0);
|
|
plugin.find('.notice-files-imported').removeClass('is-visible');
|
|
plugin.find('.js-media-sync-html-responses').html('');
|
|
plugin.find('.js-media-sync-error-placeholder').addClass('hidden').html('');
|
|
|
|
|
|
// Clear highlighted rows
|
|
files.find('.media-sync-list-file.highlight-success').removeClass('highlight-success');
|
|
files.find('.media-sync-list-file.highlight-error').removeClass('highlight-error');
|
|
|
|
// Clear file errors
|
|
files.find('.media-sync-file-error').remove();
|
|
|
|
// Show progress bar
|
|
plugin.find('.media-sync-progress-holder').addClass('is-visible');
|
|
|
|
|
|
function runAjax() {
|
|
// Take new batch
|
|
batch = items.splice(0, batchSize);
|
|
|
|
// Exit if there is nothing left in batch
|
|
if (!(batch.length > 0)) {
|
|
setActiveStatus(false);
|
|
return true;
|
|
}
|
|
|
|
batchCount++;
|
|
|
|
return $.ajax({
|
|
url: ajax_data.ajax_url + '?mediaSyncBatch=' + batchCount,
|
|
data: {
|
|
'action': 'media_sync_import_files',
|
|
'security': ajax_data.security,
|
|
'dry_run': dryRun,
|
|
'file_post_date': filePostDate,
|
|
'media_items': batch
|
|
},
|
|
dataType: isDebug ? 'html' : 'json',
|
|
method: 'POST'
|
|
}).done(function (data) {
|
|
try {
|
|
|
|
if(!data) {
|
|
outputError('No response received');
|
|
return false;
|
|
}
|
|
|
|
if (isDebug) {
|
|
plugin.find('.js-media-sync-html-responses').append(data);
|
|
} else {
|
|
|
|
var error = data.hasOwnProperty('error') && data.error ? data.error : null;
|
|
var errorMessage = data.hasOwnProperty('errorMessage') && data.errorMessage ? data.errorMessage : null;
|
|
|
|
if(error || errorMessage) {
|
|
outputError('[Backend error] ' + errorMessage, error);
|
|
return false;
|
|
}
|
|
|
|
if(!(data.hasOwnProperty('results') && data.results && data.results.length > 0)) {
|
|
setActiveStatus(false);
|
|
return false;
|
|
}
|
|
|
|
$.each(data.results, function (index, item) {
|
|
var itemError = item.hasOwnProperty('error') && item.error ? item.error : null;
|
|
var itemErrorMessage = item.hasOwnProperty('errorMessage') && item.errorMessage ? item.errorMessage : null;
|
|
|
|
if(itemError || itemErrorMessage) {
|
|
outputError('[Item error] ' + itemErrorMessage, itemError, true);
|
|
}
|
|
|
|
if (item.hasOwnProperty('row_id') && item.row_id) {
|
|
var statusClass = 'error';
|
|
|
|
if (item.inserted === true) {
|
|
counter++;
|
|
statusClass = 'success';
|
|
|
|
console.log("[Media Sync] [" + counter + "] " + (dryRun ? "DRY RUN: " : "Successfully imported: ") + item.row_id);
|
|
} else {
|
|
// If we didn't already output the error
|
|
if(!itemError && !itemErrorMessage) {
|
|
console.error("[Media Sync] Error importing: " + item.row_id);
|
|
}
|
|
}
|
|
|
|
try {
|
|
var fileRow = files.find('[id="' + item.row_id + '"]');
|
|
|
|
if(itemError || itemErrorMessage) {
|
|
var errors = (itemErrorMessage ? itemErrorMessage : '') + (itemError ? '\nE:\n' + itemError : '');
|
|
fileRow.find('.column-primary').append('<div class="error media-sync-file-error">' + errors + '</div>');
|
|
}
|
|
|
|
// Highlight imported or failed row
|
|
fileRow.addClass('highlight-' + statusClass);
|
|
} catch (highlightError) {
|
|
console.log('[Media Sync] Could not highlight imported row.', highlightError);
|
|
}
|
|
}
|
|
});
|
|
|
|
var animatedCounter = counter;
|
|
|
|
// Not really correct progress indicator, it's just animated
|
|
jQuery({Counter: animatedCounter}).animate({Counter: counter}, {
|
|
duration: 1000,
|
|
easing: 'linear',
|
|
step: function () {
|
|
// Update "imported" count
|
|
files.find('.js-media-sync-imported-count').html(Math.ceil(this.Counter));
|
|
},
|
|
complete: function () {
|
|
// Update "imported" count again (sometimes it doesn't set correct value above)
|
|
files.find('.js-media-sync-imported-count').html(counter);
|
|
}
|
|
});
|
|
|
|
|
|
// Update progress bar
|
|
plugin.find('.media-sync-progress').css('width', ((counter / total) * 100) + '%');
|
|
|
|
// If all items are imported successfully (last item)
|
|
if (counter === total) {
|
|
|
|
setActiveStatus(false);
|
|
|
|
// Show success message
|
|
plugin.find('.notice-files-imported').addClass('is-visible');
|
|
}
|
|
|
|
}
|
|
|
|
// Run again to go through all batches
|
|
// It's a recursive call to avoid stacking too many "pending" ajax calls,
|
|
// but async/await or Promise would be much better
|
|
runAjax();
|
|
|
|
} catch(e) {
|
|
outputError('Error processing results', e);
|
|
return false;
|
|
}
|
|
}).fail(function (jqXHR, textStatus, errorThrown) {
|
|
|
|
plugin.find('.js-media-sync-html-responses').append(jqXHR.responseText);
|
|
|
|
outputError('[AJAX error] ' + textStatus, errorThrown);
|
|
return false;
|
|
});
|
|
}
|
|
|
|
setActiveStatus(true);
|
|
|
|
// Run recursively (to avoid stacking too many "pending" ajax calls)
|
|
runAjax();
|
|
|
|
});
|
|
} catch (e) {
|
|
console.error('[Media Sync]', e);
|
|
alert("[Media Sync]\n" + e);
|
|
}
|
|
}); |