/* 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', '.header input:checkbox, .footer input:checkbox', {instance: this}, function (event){ event.data.instance.toggleCheckboxes( event.data.instance.scanningSection.section ); }); 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 ); }); }, 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() { var all_checkboxes = $( this.scanningSection.section ).find( '.item input:checkbox' ); if ( 'checked' === all_checkboxes.attr( 'checked' ) ) { all_checkboxes.removeAttr( 'checked' ); } else { all_checkboxes.attr( 'checked', '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'); var itemsCount = 0; var that = this; 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 ($('input[name="use_theme_plugin_domain"]').prop('checked')) { this.ajaxScanDirFiles.auto_text_domain = 1; } if (selectedItems.length) { selectedItems.toArray().forEach(function(element) { this.ajaxScanDirFiles[sectionData.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) + '
'; if ( this.filesProcessedMessage ) { text = text + this.filesProcessedMessage + '

'; if ( this.counter.scannedFiles ) { $.each(this.counter.scannedFiles, function (index, element) { text = text + element + '
'; }); } } return text; }, renderStringsCounter: function() { var text = ''; text = text + this.scanSuccessfulMessage.replace('%s', this.counter.totalStrings) + '
'; text = text.split('!')[1]; text = text.split('.')[0]; return text; }, 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 + '"]' ).attr( 'checked', 'checked' ); }); }, 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')) } }; $(document).ready(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(); }); });