File: /datos/www/expodubai/wp-content/plugins/wp-smushit/_src/js/modules/bulk-restore.js
/* global WP_Smush */
/* global ajaxurl */
/**
* Bulk restore JavaScript code.
*
* @since 3.2.2
*/
( function() {
'use strict';
/**
* Bulk restore modal.
*
* @since 3.2.2
*/
WP_Smush.restore = {
modal: document.getElementById( 'smush-restore-images-dialog' ),
contentContainer: document.getElementById(
'smush-bulk-restore-content'
),
settings: {
slide: 'start', // start, progress or finish.
success: 0,
errors: [],
},
items: [], // total items, 1 item = 1 step.
success: [], // successful items restored.
errors: [], // failed items.
currentStep: 0,
totalSteps: 0,
/**
* Init module.
*/
init() {
if ( ! this.modal ) {
return;
}
this.settings = {
slide: 'start',
success: 0,
errors: [],
};
this.resetModalWidth();
this.renderTemplate();
// Show the modal.
window.SUI.openModal(
'smush-restore-images-dialog',
'wpbody-content',
undefined,
false
);
},
/**
* Update the template, register new listeners.
*/
renderTemplate() {
const template = WP_Smush.onboarding.template(
'smush-bulk-restore'
);
const content = template( this.settings );
if ( content ) {
this.contentContainer.innerHTML = content;
}
this.bindSubmit();
},
/**
* Reset modal width.
*
* @since 3.6.0
*/
resetModalWidth() {
this.modal.style.maxWidth = '460px';
this.modal.querySelector( '.sui-box' ).style.maxWidth = '460px';
},
/**
* Catch "Finish setup wizard" button click.
*/
bindSubmit() {
const confirmButton = this.modal.querySelector(
'button[id="smush-bulk-restore-button"]'
);
const self = this;
if ( confirmButton ) {
confirmButton.addEventListener( 'click', function( e ) {
e.preventDefault();
self.resetModalWidth();
self.settings = { slide: 'progress' };
self.errors = [];
self.renderTemplate();
self.initScan();
} );
}
},
/**
* Cancel the bulk restore.
*/
cancel() {
if (
'start' === this.settings.slide ||
'finish' === this.settings.slide
) {
// Hide the modal.
window.SUI.closeModal();
} else {
this.updateProgressBar( true );
window.location.reload();
}
},
/**
* Update progress bar during directory smush.
*
* @param {boolean} cancel Cancel status.
*/
updateProgressBar( cancel = false ) {
let progress = 0;
if ( 0 < this.currentStep ) {
progress = Math.min(
Math.round( ( this.currentStep * 100 ) / this.totalSteps ),
99
);
}
if ( progress > 100 ) {
progress = 100;
}
// Update progress bar
this.modal.querySelector( '.sui-progress-text span' ).innerHTML =
progress + '%';
this.modal.querySelector( '.sui-progress-bar span' ).style.width =
progress + '%';
const statusDiv = this.modal.querySelector(
'.sui-progress-state-text'
);
if ( progress >= 90 ) {
statusDiv.innerHTML = 'Finalizing...';
} else if ( cancel ) {
statusDiv.innerHTML = 'Cancelling...';
} else {
statusDiv.innerHTML =
this.currentStep +
'/' +
this.totalSteps +
' ' +
'images restored';
}
},
/**
* First step in bulk restore - get the bulk attachment count.
*/
initScan() {
const self = this;
const _nonce = document.getElementById( '_wpnonce' );
const xhr = new XMLHttpRequest();
xhr.open( 'POST', ajaxurl + '?action=get_image_count', true );
xhr.setRequestHeader(
'Content-type',
'application/x-www-form-urlencoded'
);
xhr.onload = () => {
if ( 200 === xhr.status ) {
const res = JSON.parse( xhr.response );
if ( 'undefined' !== typeof res.data.items ) {
self.items = res.data.items;
self.totalSteps = res.data.items.length;
self.step();
}
} else {
window.console.log(
'Request failed. Returned status of ' + xhr.status
);
}
};
xhr.send( '_ajax_nonce=' + _nonce.value );
},
/**
* Execute a scan step recursively
*/
step() {
const self = this;
const _nonce = document.getElementById( '_wpnonce' );
if ( 0 < this.items.length ) {
const item = this.items.pop();
const xhr = new XMLHttpRequest();
xhr.open( 'POST', ajaxurl + '?action=restore_step', true );
xhr.setRequestHeader(
'Content-type',
'application/x-www-form-urlencoded'
);
xhr.onload = () => {
this.currentStep++;
if ( 200 === xhr.status ) {
const res = JSON.parse( xhr.response );
if (
'undefined' !== typeof res.data.success &&
res.data.success
) {
self.success.push( item );
} else {
self.errors.push( {
id: item,
src: res.data.src,
thumb: res.data.thumb,
link: res.data.link,
} );
}
}
self.updateProgressBar();
self.step();
};
xhr.send( 'item=' + item + '&_ajax_nonce=' + _nonce.value );
} else {
// Finish.
this.settings = {
slide: 'finish',
success: this.success.length,
errors: this.errors,
total: this.totalSteps,
};
self.renderTemplate();
if ( 0 < this.errors.length ) {
this.modal.style.maxWidth = '660px';
this.modal.querySelector( '.sui-box' ).style.maxWidth =
'660px';
}
}
},
};
/**
* Template function (underscores based).
*
* @type {Function}
*/
WP_Smush.restore.template = _.memoize( ( id ) => {
let compiled;
const options = {
evaluate: /<#([\s\S]+?)#>/g,
interpolate: /{{{([\s\S]+?)}}}/g,
escape: /{{([^}]+?)}}(?!})/g,
variable: 'data',
};
return ( data ) => {
_.templateSettings = options;
compiled =
compiled ||
_.template( document.getElementById( id ).innerHTML );
return compiled( data );
};
} );
} )();