first commit
This commit is contained in:
@@ -0,0 +1,378 @@
|
||||
/* globals ajaxurl, wpml_groups_to_scan, wpml_active_plugins_themes */
|
||||
|
||||
var WPML_ST = WPML_ST || {};
|
||||
|
||||
jQuery(function($) {
|
||||
|
||||
'use strict';
|
||||
|
||||
WPML_ST.ThemePluginFilter = function(scanningSection){
|
||||
this.scanningSection = scanningSection;
|
||||
};
|
||||
|
||||
WPML_ST.ThemePluginFilter.prototype = {
|
||||
|
||||
attachEvents: function() {
|
||||
this.scanningSection.section.on( 'click', '.state-selector li', {instance: this}, function (event){
|
||||
event.preventDefault();
|
||||
event.data.instance.toggleItems( event.data.instance.scanningSection, $(this) );
|
||||
});
|
||||
|
||||
this.scanningSection.section.on( 'click', 'thead input:checkbox, tfoot input:checkbox', {instance: this}, function (event){
|
||||
event.data.instance.toggleCheckboxes( event.data.instance.scanningSection.section, $(this) );
|
||||
});
|
||||
|
||||
this.scanningSection.section.on( 'change', 'input:checkbox', {instance: this}, function(event) {
|
||||
var checked = event.data.instance.scanningSection.section.find( '.item input:checkbox:checked' );
|
||||
var disableScanButton = ! Boolean( checked.length );
|
||||
$(event.data.instance.scanningSection.scanButton).prop('disabled', disableScanButton );
|
||||
});
|
||||
|
||||
this.scanningSection.section.on( 'click', '.item input:checkbox', {instance: this}, function(event) {
|
||||
var check_all_items = event.data.instance.scanningSection.section.find( 'thead input:checkbox, tfoot input:checkbox' );
|
||||
var all_items = event.data.instance.scanningSection.section.find( '.item input:checkbox' );
|
||||
var all_items_checked = event.data.instance.scanningSection.section.find( '.item input:checkbox:checked' );
|
||||
|
||||
check_all_items.prop( 'checked', all_items.length === all_items_checked.length );
|
||||
});
|
||||
},
|
||||
|
||||
toggleItems: function (data, triggerElement) {
|
||||
var status = triggerElement.data('status') ? triggerElement.data('status') : '';
|
||||
|
||||
$(data.section).find('ul li').removeClass('active');
|
||||
triggerElement.addClass('active');
|
||||
data.section.data('active-selector', status);
|
||||
|
||||
if ('active' === status) {
|
||||
$(data.section).find('table tr.item').hide();
|
||||
$(data.section).find('table .active').show();
|
||||
} else if ('inactive' === status) {
|
||||
$(data.section).find('table tr.item').show();
|
||||
$(data.section).find('table .active').hide();
|
||||
} else if ('all' === status) {
|
||||
$(data.section).find('table tr.item').show();
|
||||
}
|
||||
},
|
||||
|
||||
toggleCheckboxes: function (e, trigger) {
|
||||
$(this.scanningSection.section).find('input:checkbox').prop('checked', trigger.prop('checked') );
|
||||
}
|
||||
};
|
||||
|
||||
WPML_ST.ScanningSections = function() {
|
||||
this.theme = {
|
||||
type: 'theme',
|
||||
section: $('.wpml_theme_localization'),
|
||||
scanButton: '#wpml_theme_localization_scan'
|
||||
};
|
||||
|
||||
this.plugin = {
|
||||
type: 'plugin',
|
||||
section: $('.wpml_plugin_localization'),
|
||||
scanButton: '#wpml_plugin_localization_scan'
|
||||
};
|
||||
};
|
||||
|
||||
WPML_ST.ScanningCounter = function() {
|
||||
this.filesChunkCount = 0;
|
||||
this.filesChunkCounter = 0;
|
||||
this.totalStrings = 0;
|
||||
this.scannedFiles = [];
|
||||
};
|
||||
|
||||
WPML_ST.ScanningCounter.prototype = {
|
||||
reset: function() {
|
||||
this.filesChunkCount = 0;
|
||||
this.filesChunkCounter = 0;
|
||||
this.totalStrings = 0;
|
||||
this.scannedFiles = [];
|
||||
}
|
||||
};
|
||||
|
||||
WPML_ST.StringsScanning = function(isFirstSection, counter) {
|
||||
this.numberOfFilesPerChunk = 50;
|
||||
this.scannedFiles = [];
|
||||
this.totalStrings = 0;
|
||||
this.filesChunkCount = 0;
|
||||
this.filesChunkCounter = 0;
|
||||
this.triggerElement = {};
|
||||
this.ajaxScanDirFiles = {};
|
||||
this.elements = {};
|
||||
this.scanSuccessfulMessage = '';
|
||||
this.filesProcessedMessage = '';
|
||||
this.spinner = '.wpml-scanning-progress .spinner';
|
||||
this.progressMsg = '.wpml-scanning-progress-msg';
|
||||
this.statsSection = '.wpml-scanning-results';
|
||||
this.scanningProgressDialog = '.wpml-scanning-progress';
|
||||
this.dialogCloseSelector = '.ui-dialog-titlebar-close';
|
||||
this.isFirstSection = isFirstSection;
|
||||
this.counter = counter;
|
||||
};
|
||||
|
||||
WPML_ST.StringsScanning.prototype = {
|
||||
init: function() {
|
||||
$( this.progressMsg ).hide();
|
||||
},
|
||||
|
||||
attachEvents: function( sectionData ) {
|
||||
sectionData.section.on( 'click', sectionData.scanButton, {instance: this}, function(event){
|
||||
var instance = event.data.instance;
|
||||
event.preventDefault();
|
||||
instance.triggerElement = $( this );
|
||||
instance.elements = sectionData;
|
||||
|
||||
instance.scan(sectionData);
|
||||
});
|
||||
},
|
||||
|
||||
scan: function( sectionData ) {
|
||||
var selectedItems = sectionData.section.find('table').find('input:checkbox:checked[data-component-name]');
|
||||
var itemsCount = 0;
|
||||
var that = this;
|
||||
var type = sectionData.type;
|
||||
|
||||
this.elements = sectionData;
|
||||
this.triggerElement.prop('disabled', true);
|
||||
|
||||
$( this.spinner ).addClass('is-active');
|
||||
$( this.progressMsg ).show();
|
||||
$( this.statsSection ).empty();
|
||||
$( this.scanningProgressDialog ).dialog({
|
||||
width: 350,
|
||||
maxHeight: 300,
|
||||
modal: true,
|
||||
open: function() {
|
||||
$(that.dialogCloseSelector).hide();
|
||||
},
|
||||
closeOnEscape: false
|
||||
});
|
||||
|
||||
if (selectedItems.length) {
|
||||
selectedItems.toArray().forEach(function(element) {
|
||||
this.ajaxScanDirFiles = {};
|
||||
|
||||
if ($('input[name="use_theme_plugin_domain"]').prop('checked')) {
|
||||
this.ajaxScanDirFiles.auto_text_domain = 1;
|
||||
}
|
||||
|
||||
type = sectionData.type;
|
||||
if ( -1 !== $( element ).data( 'component-name' ).search( 'mu-::-' ) ) {
|
||||
type = 'mu-plugin';
|
||||
}
|
||||
|
||||
this.ajaxScanDirFiles[ type ] = $(element).val();
|
||||
this.ajaxScanDirFiles.action = $( sectionData.section ).attr('data-scan_folder-action');
|
||||
this.ajaxScanDirFiles.nonce = $( sectionData.section ).attr('data-scan_folder-nonce');
|
||||
|
||||
this.scanDirAjax( sectionData.type, $(element).val() );
|
||||
itemsCount++;
|
||||
}, this);
|
||||
}
|
||||
},
|
||||
|
||||
scanDirAjax: function( section_type, section_value ) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: ajaxurl,
|
||||
section_type: section_type,
|
||||
section_value: section_value,
|
||||
instance: this,
|
||||
data: this.ajaxScanDirFiles,
|
||||
success: this.scanDirSuccess
|
||||
});
|
||||
},
|
||||
|
||||
updateHashAjax: function() {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: ajaxurl,
|
||||
data: {
|
||||
'action': $( this.elements.section ).attr('data-update_hash-action'),
|
||||
'nonce': $( this.elements.section ).attr('data-update_hash-nonce'),
|
||||
'files': this.counter.scannedFiles
|
||||
},
|
||||
success: $.proxy(this.refreshScreen, this)
|
||||
});
|
||||
},
|
||||
|
||||
scanFilesAjax: function(ajax_files_chunk, files_chunks, index) {
|
||||
|
||||
if ( index === files_chunks.length - 1 ) {
|
||||
ajax_files_chunk.scan_mo_files = 1;
|
||||
}
|
||||
|
||||
ajax_files_chunk.files = files_chunks[index];
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: ajaxurl,
|
||||
data: ajax_files_chunk,
|
||||
context: this,
|
||||
success: $.proxy(this.scanFilesSuccess, this)
|
||||
}).done(function() {
|
||||
this.scanFilesAjaxDone(files_chunks, ajax_files_chunk, index);
|
||||
});
|
||||
},
|
||||
|
||||
scanFilesAjaxDone: function(files_chunks, ajax_files_chunk, index) {
|
||||
if (index < files_chunks.length - 1) {
|
||||
this.scanFilesAjax(ajax_files_chunk, files_chunks, index + 1);
|
||||
}
|
||||
},
|
||||
|
||||
scanFilesSuccess: function( result ) {
|
||||
|
||||
var scanned_files_obj = result.data;
|
||||
|
||||
this.counter.scannedFiles = this.counter.scannedFiles.concat(scanned_files_obj.files_processed);
|
||||
this.counter.totalStrings = this.counter.totalStrings + scanned_files_obj.strings_found;
|
||||
this.scanSuccessfulMessage = scanned_files_obj.scan_successful_message;
|
||||
this.filesProcessedMessage = scanned_files_obj.files_processed_message;
|
||||
this.counter.filesChunkCounter++;
|
||||
|
||||
$(this.statsSection).html(this.renderStringsCounter());
|
||||
$(this.statsSection).show();
|
||||
|
||||
if ( this.counter.filesChunkCounter === this.counter.filesChunkCount ) {
|
||||
this.updateHashAjax();
|
||||
}
|
||||
},
|
||||
|
||||
scanDirSuccess: function( dirFilesResult ) {
|
||||
|
||||
var ajaxFilesChunk = {},
|
||||
dirFiles = dirFilesResult.data.files,
|
||||
filesChunks = [],
|
||||
index = 0;
|
||||
|
||||
ajaxFilesChunk.action = $( this.instance.elements.section ).attr('data-scan_files-action');
|
||||
ajaxFilesChunk.nonce = $( this.instance.elements.section ).attr('data-scan_files-nonce');
|
||||
ajaxFilesChunk[this.section_type] = this.section_value;
|
||||
|
||||
while ( 0 < dirFiles.length ) {
|
||||
filesChunks.push( dirFiles.splice(0, this.instance.numberOfFilesPerChunk) );
|
||||
}
|
||||
|
||||
this.instance.counter.filesChunkCount = this.instance.counter.filesChunkCount + filesChunks.length;
|
||||
|
||||
if ( filesChunks.length > 0 ) {
|
||||
this.instance.scanFilesAjax(ajaxFilesChunk, filesChunks, index);
|
||||
} else if ( this.instance.counter.filesChunkCounter === this.instance.counter.filesChunkCount ) {
|
||||
this.instance.restoreUI();
|
||||
$(this.instance.statsSection).html( dirFilesResult.data.no_files_message );
|
||||
$(this.instance.statsSection).show();
|
||||
}
|
||||
},
|
||||
|
||||
refreshScreen: function() {
|
||||
this.elements.section.load(location + ' #wpml-' + this.elements.type + '-content', $.proxy( this.afterScreenReload, this ) );
|
||||
},
|
||||
|
||||
afterScreenReload: function() {
|
||||
$(this.statsSection).html(this.renderScanningResults());
|
||||
$(this.statsSection).show();
|
||||
|
||||
var currentFilterSelector = this.elements.section.data( 'active-selector' );
|
||||
this.elements.section.find( 'ul [data-status="' + currentFilterSelector + '"]' ).trigger( 'click' );
|
||||
this.restoreUI();
|
||||
},
|
||||
|
||||
renderScanningResults: function() {
|
||||
var text = '';
|
||||
|
||||
text = text + this.scanSuccessfulMessage.replace('%s', this.counter.totalStrings) + '<br />';
|
||||
|
||||
|
||||
if ( this.filesProcessedMessage ) {
|
||||
text = text + this.filesProcessedMessage + '<br /><br />';
|
||||
|
||||
if ( this.counter.scannedFiles ) {
|
||||
$.each(this.counter.scannedFiles, function (index, element) {
|
||||
text = text + element + '<br />';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return text;
|
||||
},
|
||||
|
||||
renderStringsCounter: function () {
|
||||
return 'WPML' + this.scanSuccessfulMessage.replace('%s', this.counter.totalStrings).split('WPML')[1];
|
||||
},
|
||||
|
||||
restoreUI: function() {
|
||||
$(this.spinner).removeClass('is-active');
|
||||
this.triggerElement.prop('disabled', false);
|
||||
$( this.progressMsg ).hide();
|
||||
this.allowClosingDialog();
|
||||
|
||||
this.counter.reset();
|
||||
},
|
||||
|
||||
allowClosingDialog: function() {
|
||||
$(this.dialogCloseSelector).show();
|
||||
$(this.scanningProgressDialog).dialog('option', 'closeOnEscape', true);
|
||||
$(this.scanningProgressDialog).closest('.ui-dialog').focus();
|
||||
}
|
||||
};
|
||||
|
||||
WPML_ST.AutoScan = function( groups, scanningSections ) {
|
||||
this.groups = groups;
|
||||
this.scanningSections = scanningSections;
|
||||
};
|
||||
|
||||
WPML_ST.AutoScan.prototype = {
|
||||
init: function() {
|
||||
if ( this.shouldRunAutoScan() ) {
|
||||
for (var group in this.groups) {
|
||||
if (this.groups.hasOwnProperty(group)) {
|
||||
this.selectItems( this.scanningSections[group].scanButton, this.groups[group] );
|
||||
this.scan( this.scanningSections[group].scanButton );
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
selectItems: function( scanButton, group ) {
|
||||
group.forEach(function(item){
|
||||
$( 'input[value="' + item + '"]' ).prop( 'checked', true );
|
||||
});
|
||||
},
|
||||
|
||||
scan: function (scanButton) {
|
||||
$(scanButton).click();
|
||||
},
|
||||
|
||||
shouldRunAutoScan: function () {
|
||||
return '' !== this.groups[0] && (-1 !== location.href.search('action=scan_from_notice') || -1 !== location.href.search('action=scan_active_items'))
|
||||
}
|
||||
};
|
||||
|
||||
$(function () {
|
||||
var scanningSections = new WPML_ST.ScanningSections();
|
||||
var auto_scan_type = wpml_active_plugins_themes;
|
||||
var sections_count = 0;
|
||||
var counter = new WPML_ST.ScanningCounter();
|
||||
|
||||
if (-1 !== location.href.search('action=scan_from_notice')) {
|
||||
auto_scan_type = wpml_groups_to_scan;
|
||||
}
|
||||
|
||||
for (var section in scanningSections) {
|
||||
if (scanningSections.hasOwnProperty(section)) {
|
||||
var isFirstSection = 0 === sections_count;
|
||||
var scanSection = new WPML_ST.StringsScanning(isFirstSection, counter);
|
||||
var themePluginFilter = new WPML_ST.ThemePluginFilter(scanningSections[section]);
|
||||
|
||||
scanSection.init();
|
||||
scanSection.attachEvents(scanningSections[section]);
|
||||
themePluginFilter.attachEvents();
|
||||
}
|
||||
sections_count++;
|
||||
}
|
||||
|
||||
var autoScan = new WPML_ST.AutoScan( auto_scan_type, scanningSections );
|
||||
autoScan.init();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user