bibhamrokhanpin/wp-content/__plugins/wp-optimize/js/wpoadmin.js
2024-04-10 17:46:06 +05:45

2123 lines
64 KiB
JavaScript

jQuery(function ($) {
WP_Optimize = WP_Optimize();
if ('undefined' != typeof WP_Optimize_Cache) WP_Optimize_Cache = WP_Optimize_Cache();
if ('undefined' != typeof wp_optimize.minify) WP_Optimize_Minify = wp_optimize.minify.init();
});
(function($) {
/*
* Form errors store
*/
var errors = [];
$.fn.form_errors = function() {
return this;
}
$.fn.form_errors.add = function(type, message) {
if (false !== this.has_error((type))) return;
errors.push({type: type, message: message});
};
$.fn.form_errors.remove = function(type) {
var found_error = this.has_error(type);
if (found_error !== false) {
errors.splice(found_error, 1);
}
};
$.fn.form_errors.has_error = function(type) {
var has_error = false;
$.each(errors, function(index, error) {
console.log(index, error)
if (type == error.type) {
has_error = index;
}
}.bind(this));
return has_error;
};
$.fn.form_errors.has_errors = function() {
return errors.length > 0;
}
})(jQuery);
/**
* Main WP_Optimize - Function for sending communications.
*/
var WP_Optimize = function () {
var $ = jQuery;
var debug_level = 0;
var queue = new Updraft_Queue();
var send_command = wp_optimize.send_command;
var optimization_force = false;
var optimization_logged_warnings = false;
var force_single_table_optimization = false;
/*
* Enable select all checkbox for optimizations list.
*/
define_select_all_checkbox($('#select_all_optimizations'), $('#optimizations_list .optimization_checkbox'));
/**
* Either display normally, or grey-out, the scheduling options, depending on whether any schedule has been selected.
*
* @return {string}
*/
function enable_or_disable_schedule_options() {
if ($('#enable-schedule').length) {
var schedule_enabled = $('#enable-schedule').is(':checked');
if (schedule_enabled) {
$('#wp-optimize-auto-options').css('opacity', '1');
} else {
$('#wp-optimize-auto-options').css('opacity', '0.5')
}
}
}
enable_or_disable_schedule_options();
$('#enable-schedule').on('change', function () {
enable_or_disable_schedule_options();
});
// table sorter library.
// This calls the tablesorter library in order to sort the table information correctly.
// There is a fix below on line 172 to apply applyWidgets on load to avoid diplay hidden for tabs.
// add parser through the tablesorter addParser method
$.tablesorter.addParser({
// set a unique id
id: 'sizes',
is: function(s) {
// return false so this parser is not auto detected
return false;
},
format: function(cell_content, table, cell) {
var val = $(cell).data('raw_value');
if (!val) val = 0;
return parseInt(val);
},
// set type, either numeric or text
type: 'numeric'
});
/*
* Triggered when the database tabs are loaded.
*/
$(document).on('wpo_database_tabs_loaded', function() {
/*
* Setup table events and tablesorter
*/
var table_list_filter = $('#wpoptimize_table_list_filter'),
table_list = $('#wpoptimize_table_list'),
table_footer_line = $('#wpoptimize_table_list tbody:last'),
tables_not_found = $('#wpoptimize_table_list_tables_not_found');
table_list.tablesorter({
theme: 'default',
widgets: ['zebra', 'rows', 'filter'],
cssInfoBlock: "tablesorter-no-sort",
// This option is to specify with colums will be disabled for sorting
headers: {
2: {sorter: 'digit'},
3: {sorter: 'sizes'},
4: {sorter: 'sizes'},
// For Column Action
7: {sorter: false }
},
widgetOptions: {
// filter_anyMatch replaced! Instead use the filter_external option
// Set to use a jQuery selector (or jQuery object) pointing to the
// external filter (column specific or any match)
filter_external: table_list_filter,
// add a default type search to the second table column
filter_defaultFilter: { 2 : '~{query}' }
}
});
/*
* After tables filtered check if we need show table footer and No tables message.
*/
table_list.on('filterEnd', function() {
var search_value = $.trim(table_list_filter.val());
if ('' == search_value) {
table_footer_line.show();
} else {
table_footer_line.hide();
}
if (0 == $('#the-list tr:visible', table_list).length) {
tables_not_found.show();
} else {
tables_not_found.hide();
}
});
/*
* Setup force optimization checkboxes and associated events
*/
var optimization_force_checkbox = $('#innodb_force_optimize');
var optimization_row = optimization_force_checkbox.closest('tr');
var single_table_optimization_force = $('#innodb_force_optimize_single');
optimization_force_checkbox.on('change', function() {
$('button, input[type="checkbox"]', optimization_row).each(function() {
optimization_force = optimization_force_checkbox.is(':checked');
var btn = $(this);
if (btn.data('disabled')) {
if (optimization_force) {
btn.prop('disabled', false);
} else {
btn.prop('disabled', true);
}
}
});
});
// Handle force optimization checkbox on table list tab.
single_table_optimization_force.on('change', function() {
force_single_table_optimization = $(this).is(':checked');
update_single_table_optimization_buttons(force_single_table_optimization);
});
// Set initial value
force_single_table_optimization = single_table_optimization_force.is(':checked');
optimization_force = optimization_force_checkbox.is(':checked');
// Update single table optimization buttons state on load.
update_single_table_optimization_buttons(force_single_table_optimization);
});
/**
* Temporarily show a dashboard notice, and then remove it. The HTML will be prepended to the .wrap.wp-optimize-wrap element.
*
* @param {String} html_contents HTML to display.
* @param {String} where CSS selector of where to prepend the HTML to.
* @param {Number} [delay=15] The number of seconds to wait before removing the message.
*
* @return {string}
*/
function temporarily_display_notice(html_contents, where, delay) {
where = ('undefined' === typeof where) ? '#wp-optimize-wrap' : where;
delay = ('undefined' === typeof delay) ? 15 : delay;
$(html_contents).hide().prependTo(where).slideDown('fast').delay(delay * 1000).slideUp('fast', function () {
$(this).remove();
});
}
/**
* Send a request to disable or enable comments or trackbacks
*
* @param {string} type - either "comments" or "trackbacks"
* @param {boolean} enable - whether to enable, or, to disable
*
* @return {string}
*/
function enable_or_disable_feature(type, enable) {
var data = {
type: type,
enable: enable ? 1 : 0
};
$('#' + type + '_spinner').show();
send_command('enable_or_disable_feature', data, function (resp) {
$('#' + type + '_spinner').hide();
if (resp && resp.hasOwnProperty('output')) {
for (var i = 0, len = resp.output.length; i < len; i++) {
var new_html = '<div class="updated"><p>' + resp.output[i] + '</p></div>';
temporarily_display_notice(new_html, '#' + type + '_notice');
}
}
if (resp && resp.hasOwnProperty('messages')) {
$('#' + type + '_actionmsg').html(resp.messages.join(' - '));
}
});
}
$('#wp-optimize-disable-enable-trackbacks-enable').on('click', function () {
enable_or_disable_feature('trackbacks', true);
});
$('#wp-optimize-disable-enable-trackbacks-disable').on('click', function () {
enable_or_disable_feature('trackbacks', false);
});
$('#wp-optimize-disable-enable-comments-enable').on('click', function () {
enable_or_disable_feature('comments', true);
});
$('#wp-optimize-disable-enable-comments-disable').on('click', function () {
enable_or_disable_feature('comments', false);
});
// Main menu
$('.wpo-pages-menu').on('click', 'a', function(e) {
e.preventDefault();
if (!$(this).is('.active')) {
$('.wpo-pages-menu a.active').removeClass('active');
$('.wpo-page.active').removeClass('active');
$(this).addClass('active');
$('.wpo-page[data-whichpage="' + $(this).data('menuslug') + '"]').addClass('active');
window.scroll(0, 0);
// Trigger a global event when changing page
$('#wp-optimize-wrap').trigger('page-change', { page: $(this).data('menuslug') });
}
// Close the menu on mobile
$('#wp-optimize-nav-page-menu').trigger('click');
});
$('#wp-optimize-wrap').on('page-change', function(e, params) {
// When changing the page, trigger a click, in case the page was loaded somewhere else.
if ('WP-Optimize' == params.page && $('#wp-optimize-nav-tab-WP-Optimize-optimize').is('.nav-tab-active')) {
$('#wp-optimize-nav-tab-WP-Optimize-optimize').trigger('click');
}
// Trigger the global tab change events when changing page
var active_tab = $('.wpo-page[data-whichpage='+params.page+']').find('.nav-tab-wrapper .nav-tab-active');
$('#wp-optimize-wrap').trigger('tab-change', { page: params.page, tab: active_tab.data('tab') });
$('#wp-optimize-wrap').trigger('tab-change/'+params.page+'/'+active_tab.data('tab'), { content: $('#' + active_tab.attr('id') + '-contents')});
});
// set a time out, as needs to be done once the rest is loaded
setTimeout(function() {
// Trigger page-change event on load
$('#wp-optimize-wrap').trigger('page-change', { page: $('.wpo-pages-menu a.active').data('menuslug') });
}, 500);
// Tabs menu
$('.nav-tab-wrapper .nav-tab').on('click', function (e) {
e.preventDefault();
var clicked_tab_id = $(this).attr('id'),
container = $(this).closest('.nav-tab-wrapper');
if (!clicked_tab_id) { return; }
toggle_mobile_menu(false);
// Mobile menu TABS toggle
if ($(this).is('[role="toggle-menu"]')) {
toggle_mobile_menu(true);
return;
}
container.find('.nav-tab:not(#wp-optimize-nav-tab-' + clicked_tab_id + ')').removeClass('nav-tab-active');
$(this).addClass('nav-tab-active');
$(this).closest('.wpo-page').find('.wp-optimize-nav-tab-contents').hide();
$('#' + clicked_tab_id + '-contents').show();
// Trigger global events on tab change
$('#wp-optimize-wrap').trigger('tab-change', { page: $(this).data('page'), tab: $(this).data('tab') });
$('#wp-optimize-wrap').trigger('tab-change/'+$(this).data('page')+'/'+$(this).data('tab'), { content: $('#' + clicked_tab_id + '-contents')});
});
// Mobile menu toggle
$('#wp-optimize-nav-page-menu').on('click', function(e) {
e.preventDefault();
$(this).toggleClass('opened');
});
/*
* Setup a simple cross-pages/tabs navigation.
*
* Basic example: <button class="js--wpo-goto" data-page="wpo_minify" data-tab="status">Go to the minify page, status tab</button>
*/
$('#wp-optimize-wrap').on('click', '.js--wpo-goto', function(e) {
e.preventDefault();
// get the page and tab
var page = $(this).data('page');
var tab = $(this).data('tab');
if (page) {
// Trigger a page change
$('.wpo-pages-menu a[data-menuslug="' + page + '"]').trigger('click');
}
if (tab) {
// Change tab change
$('.wpo-page.active .nav-tab-wrapper a[data-tab="' + tab + '"]').trigger('click');
}
});
/**
* Toggle Mobile menu
*
* @param {bool} open
*
* @return {void}
*/
function toggle_mobile_menu(open) {
if (open) {
$('#wp-optimize-wrap').addClass('wpo-mobile-menu-opened');
} else {
$('#wp-optimize-wrap').removeClass('wpo-mobile-menu-opened');
}
}
var database_tabs_loaded = false;
// When showing the tables tab
$('#wp-optimize-wrap').on('tab-change/WP-Optimize/tables', function(e) {
get_database_tabs();
});
// When showing the tables tab
$('#wp-optimize-wrap').on('tab-change/WP-Optimize/optimize', function(event, data) {
get_database_tabs();
});
// When showing the settings tab
$('#wp-optimize-wrap').on('tab-change/wpo_settings/settings', function(event, data) {
// If the innodb_force_optimize--container is present, fetch the required data.
// We load the database tabs together, as they need the same processing.
if (data.content.find('.innodb_force_optimize--container').length) get_database_tabs();
});
/**
* Get the data for the database tabs. We get them at the same time, as they both need the same time consuming requests.
*/
function get_database_tabs() {
if (database_tabs_loaded) return;
var container = $('.wpo-page[data-whichpage=WP-Optimize]');
var shade = container.find('.wpo_shade');
shade.removeClass('hidden');
send_command('get_database_tabs', {}, function(response) {
// Set the satus to true, to prevent loading again.
database_tabs_loaded = true;
// Updtate the optimizations tab
if (response.hasOwnProperty('optimizations')) {
container.find('.wp-optimize-optimizations-table-placeholder').replaceWith(response.optimizations);
}
// Updtate the optimizations tables list
update_tables_list(response);
$(document).trigger('wpo_database_tabs_loaded');
}).always(function() {
shade.addClass('hidden');
});
}
/**
* Gathers the settings from the settings tab and return in selected format.
*
* @param {string} output_format optional param 'object' or 'string'.
*
* @return (string) - serialized settings.
*/
function gather_settings(output_format) {
var form_data = '',
output_format = ('undefined' === typeof output_format) ? 'string' : output_format,
$form_elements = $("#wp-optimize-database-settings form input[name!='action'], #wp-optimize-database-settings form select, #wp-optimize-database-settings form textarea, #wp-optimize-general-settings form input[name!='action'], #wp-optimize-general-settings form textarea, #wp-optimize-general-settings form select, #wp-optimize-nav-tab-contents-optimize input[type='checkbox'], .wp-optimize-nav-tab-contents input[name^='enable-auto-backup-']");
if ('object' == output_format) {
form_data = $form_elements.serializeJSON({useIntKeysAsArrayIndex: true});
} else {
// Excluding the unnecessary 'action' input avoids triggering a very mis-conceived mod_security rule seen on one user's site.
form_data = $form_elements.serialize();
// Include unchecked checkboxes. user filter to only include unchecked boxes.
$.each($('#wp-optimize-database-settings form input[type=checkbox], #wp-optimize-general-settings form input[type=checkbox], .wp-optimize-nav-tab-contents input[name^="enable-auto-backup-"]')
.filter(function (idx) {
return $(this).prop('checked') == false
}),
function (idx, el) {
// Attach matched element names to the form_data with chosen value.
var empty_val = '0';
form_data += '&' + $(el).attr('name') + '=' + empty_val;
}
);
}
return form_data;
}
/**
* Runs after all queued commands done and sends optimizations_done command
*
* @return {string}
*/
function process_done() {
send_command('optimizations_done', {}, function () {});
// Reset the warning flag
optimization_logged_warnings = false;
}
/**
* Proceses the queue
*
* @return void
*/
function process_queue() {
if (!queue.get_lock()) {
if (debug_level > 0) {
console.log("WP-Optimize: process_queue(): queue is currently locked - exiting");
}
return;
}
if (debug_level > 0) {
console.log("WP-Optimize: process_queue(): got queue lock");
}
var id = queue.peek();
var blog_id = 0;
var sites_container = $("#wpo_all_sites");
var active_site = sites_container.data('active_site');
// Check to see if an object has been returned.
if (typeof id == 'object') {
data = id;
id = id.optimization_id;
blog_id = data.blog_id;
if ("undefined" == typeof active_site) {
sites_container.data('active_site', blog_id);
do_site_ui_update(blog_id, 0);
} else if (active_site != blog_id) {
var prev_blog_id = active_site;
sites_container.data('active_site', blog_id);
do_site_ui_update(blog_id, prev_blog_id);
}
} else {
data = {};
}
if ('undefined' === typeof id) {
if (debug_level > 0) console.log("WP-Optimize: process_queue(): queue is apparently empty - exiting");
queue.unlock();
var prev_blog_id = sites_container.data('active_site');
do_site_ui_update(0, prev_blog_id);
process_done();
return;
}
if (debug_level > 0) console.log("WP-Optimize: process_queue(): processing item: " + id);
queue.dequeue();
$(document).trigger(['do_optimization_', id, '_start'].join(''));
if ('optimizetables' === id) {
// Display the table name being optimized
$('#optimization_info_' + id).html(wpoptimize.optimizing_table + ' ' + data.optimization_table);
// Set extra options for the request
var timeout = parseInt(wpoptimize.table_optimization_timeout) ? parseInt(wpoptimize.table_optimization_timeout) : 120000;
var request_options = {
timeout: timeout,
error: function(error, type) {
optimization_logged_warnings = true;
if ('timeout' === type) {
console.warn('The request to optimize the table ' + data.optimization_table + ' timed out after ' + (timeout / 1000) + ' seconds');
} else {
console.warn('There was an error when running the optimization "' + id + '".', type, error, data);
}
if (queue.is_empty()) {
var blog_id = sites_container.data('active_site');
do_site_ui_update(blog_id, 0);
$('#optimization_spinner_' + id).hide();
$('#optimization_checkbox_' + id).show();
$('.optimization_button_' + id).prop('disabled', false);
$('#optimization_info_' + id).html(wpoptimize.optimization_complete + ' ' + wpoptimize.with_warnings);
}
setTimeout(function () {
queue.unlock(); process_queue();
}, 500);
}
}
} else {
var request_options = {};
}
send_command('do_optimization', { optimization_id: id, data: data }, function (response) {
$('#optimization_spinner_' + id).hide();
$('#optimization_checkbox_' + id).show();
$('.optimization_button_' + id).prop('disabled', false);
$(document).trigger(['do_optimization_', id, '_done'].join(''), response);
if (response) {
var total_output = '';
for (var i = 0, len = response.errors.length; i < len; i++) {
total_output += '<span class="error">' + response.errors[i] + '</span><br>';
}
for (var i = 0, len = response.messages.length; i < len; i++) {
total_output += response.errors[i] + '<br>';
}
for (var i = 0, len = response.result.output.length; i < len; i++) {
total_output += response.result.output[i] + '<br>';
}
$('#optimization_info_' + id).html(total_output);
if (response.hasOwnProperty('status_box_contents')) {
$('#wp_optimize_status_box').css('opacity', '1').find('.inside').html(response.status_box_contents);
}
if (response.hasOwnProperty('table_list')) {
$('#wpoptimize_table_list tbody').html($(response.table_list).find('tbody').html());
}
if (response.hasOwnProperty('total_size')) {
$('#optimize_current_db_size').html(response.total_size);
}
// Status check if optimizing tables.
if (id == 'optimizetables' && data.optimization_table) {
if (queue.is_empty()) {
$('#optimization_spinner_' + id).hide();
$('#optimization_checkbox_' + id).show();
$('.optimization_button_' + id).prop('disabled', false);
$('#optimization_info_' + id).html(wpoptimize.optimization_complete + (optimization_logged_warnings ? (' ' + wpoptimize.with_warnings) : ''));
} else {
$('#optimization_checkbox_' + id).hide();
$('#optimization_spinner_' + id).show();
$('.optimization_button_' + id).prop('disabled', true);
}
}
// check if we need update unapproved comments count.
if (response.result.meta && response.result.meta.hasOwnProperty('awaiting_mod')) {
var awaiting_mod = response.result.meta.awaiting_mod;
if (awaiting_mod > 0) {
$('#adminmenu .awaiting-mod .pending-count').remove(awaiting_mod);
} else {
// if there is no unapproved comments then remove bullet.
$('#adminmenu .awaiting-mod').remove();
}
}
}
setTimeout(function () {
queue.unlock(); process_queue();
}, 500);
}, true, request_options);
}
/**
* Update UI of sites list based on which site is currently being optimizated
*
* @param {Number} blog_id - current site id being optimized
* @param {Number} prev_blog_id - previous site id
*
* @return void
*/
function do_site_ui_update(blog_id, prev_blog_id) {
if (0 != prev_blog_id) {
$("#site-" + prev_blog_id).show();
$("#optimization_spinner_site-" + prev_blog_id).hide();
}
$("#site-" + blog_id).hide();
$("#optimization_spinner_site-" + blog_id).show();
}
/**
* Runs a specified optimization, displaying the progress and results in the optimization's row
*
* @param {string} id - The optimization ID
*
* @return void
*/
function do_optimization(id) {
var $optimization_row = $('#wp-optimize-nav-tab-contents-optimize .wp-optimize-settings-' + id);
if (!$optimization_row) {
console.log("do_optimization: row corresponding to this optimization (" + id + ") not found");
}
// check if there any additional inputs checkboxes.
var additional_data = {},
additional_data_length = 0;
$('input[type="checkbox"]', $('#optimization_info_' + id)).each(function() {
var checkbox = $(this);
if (checkbox.is(':checked')) {
additional_data[checkbox.attr('name')] = checkbox.val();
additional_data_length++;
}
});
// don't run optimization if optimization active.
if (true == $('.optimization_button_' + id).prop('disabled')) return;
var no_queue_actions_added = false;
// Check if it is DB optimize.
if ('optimizetables' == id) {
var optimization_tables = $('#wpoptimize_table_list #the-list tr'),
filter_by_blog_id = $('#wpo_sitelist_moreoptions').length > 0 && $('#wpo_sitelist_moreoptions').is(':visible'),
selected_sites = [];
// Get list of selected sites.
if (filter_by_blog_id) {
selected_sites = $('#wpo_sitelist_moreoptions input[type="checkbox"]:checked').map(function() {
return parseInt($(this).val());
}).get();
}
no_queue_actions_added = true;
// Check if there are any tables to be optimized.
$(optimization_tables).each(function (index) {
// Get information from each td.
var $table_information = $(this).find('td');
// Get table type information.
var table_type = $(this).data('type');
var table = $(this).data('tablename');
var optimizable = $(this).data('optimizable');
var blog_id = $(this).data('blog_id') ? parseInt($(this).data('blog_id')) : 1;
var in_selected_sites = true;
// Check if table is in the list of selected sites (multisite mode).
if (filter_by_blog_id && -1 == selected_sites.indexOf(blog_id)) {
in_selected_sites = false;
}
// Make sure the table isnt blank.
if ('' != table && in_selected_sites) {
// Check if table is optimizable or optimization forced by user.
if (1 == parseInt(optimizable) || optimization_force) {
var data = {
optimization_id: id,
blog_id: blog_id,
optimization_table: table,
optimization_table_type: table_type,
optimization_force: optimization_force
};
queue.enqueue(data);
no_queue_actions_added = false;
}
}
});
} else if (additional_data_length > 0) {
// check if additional data passed for optimization.
data = {
optimization_id: id
};
for (var i in additional_data) {
if (!additional_data.hasOwnProperty(i)) continue;
data[i] = additional_data[i];
}
queue.enqueue(data);
} else {
queue.enqueue(id);
}
// if new actions was not added in tasks queue then we don't process queue.
if (no_queue_actions_added) return;
$('#optimization_checkbox_' + id).hide();
$('#optimization_spinner_' + id).show();
$('.optimization_button_' + id).prop('disabled', true);
$('#optimization_info_' + id).html('...');
process_queue();
}
/**
* Run action and save selected sites list options.
*
* @param {function} action - action to do after save.
*
* @return void
*/
function save_sites_list_and_do_action(action) {
// if multisite mode then save sites list before action.
if ($('#wpo_settings_sites_list').length) {
// save wpo-sites settings.
send_command('save_site_settings', {'wpo-sites': get_selected_sites_list()}, function () {
// do action.
if (action) action();
});
} else {
// do action.
if (action) action();
}
}
/**
* Returns list of selected sites list.
*
* @return {Array}
*/
function get_selected_sites_list() {
var wpo_sites = [];
$('#wpo_settings_sites_list input[type="checkbox"]').each(function () {
var checkbox = $(this);
if (checkbox.is(':checked')) {
wpo_sites.push(checkbox.attr('value'));
}
});
return wpo_sites;
}
/*
* Run single optimization click.
*/
$('#wp-optimize-nav-tab-WP-Optimize-optimize-contents').on('click', 'button.wp-optimize-settings-optimization-run-button', function () {
var optimization_id = $(this).closest('.wp-optimize-settings').data('optimization_id');
if (!optimization_id) {
console.log("Optimization ID corresponding to pressed button not found");
return;
}
// if run button disabled then don't run this optimization.
if (true == $('.optimization_button_' + optimization_id).prop('disabled')) return;
// disable run button before save sites list.
$('.optimization_button_' + optimization_id).prop('disabled', true);
save_sites_list_and_do_action(function() {
$('.optimization_button_' + optimization_id).prop('disabled', false);
do_optimization(optimization_id);
});
});
/*
* Run all optimizations click.
*/
$('#wp-optimize-nav-tab-WP-Optimize-optimize-contents').on('click', '#wp-optimize', function (e) {
var run_btn = $(this);
e.preventDefault();
// disable run button to avoid double click.
run_btn.prop('disabled', true);
save_sites_list_and_do_action(function() {
run_btn.prop('disabled', false);
run_optimizations();
});
});
/**
* Sent command to run selected optimizations and auto backup if selected
*
* @return void
*/
function run_optimizations() {
var auto_backup = false;
if ($('#enable-auto-backup').is(":checked")) {
auto_backup = true;
}
// Save the click option.
save_auto_backup_options();
// Only run the backup if tick box is checked.
if (auto_backup == true) {
take_a_backup_with_updraftplus(run_optimization);
} else {
// Run optimizations.
run_optimization();
}
}
/**
* Take a backup with UpdraftPlus if possible.
*
* @param {Function} callback
* @param {String} file_entities
*
* @return void
*/
function take_a_backup_with_updraftplus(callback, file_entities) {
// Set default for file_entities to empty string
if ('undefined' == typeof file_entities) file_entities = '';
var exclude_files = file_entities ? 0 : 1;
if (typeof updraft_backupnow_inpage_go === 'function') {
updraft_backupnow_inpage_go(function () {
// Close the backup dialogue.
$('#updraft-backupnow-inpage-modal').dialog('close');
if (callback) callback();
}, file_entities, 'autobackup', 0, exclude_files, 0, wpoptimize.automatic_backup_before_optimizations);
} else {
if (callback) callback();
}
}
/**
* Save all auto backup options.
*
* @return void
*/
function save_auto_backup_options() {
var options = gather_settings('object');
options['auto_backup'] = $('#enable-auto-backup').is(":checked");
send_command('save_auto_backup_option', options);
}
// Show/hide sites list for multi-site settings.
var wpo_settings_sites_list = $('#wpo_settings_sites_list'),
wpo_settings_sites_list_ul = wpo_settings_sites_list.find('ul').first(),
wpo_settings_sites_list_items = $('input[type="checkbox"]', wpo_settings_sites_list_ul),
wpo_settings_all_sites_checkbox = wpo_settings_sites_list.find('#wpo_all_sites'),
wpo_sitelist_show_moreoptions_link = $('#wpo_sitelist_show_moreoptions'),
wpo_sitelist_moreoptions_div = $('#wpo_sitelist_moreoptions'),
wpo_settings_sites_list_cron = $('#wpo_settings_sites_list_cron'),
wpo_settings_sites_list_cron_ul = wpo_settings_sites_list_cron.find('ul').first(),
wpo_settings_sites_list_cron_items = $('input[type="checkbox"]', wpo_settings_sites_list_cron_ul),
wpo_settings_all_sites_cron_checkbox = wpo_settings_sites_list_cron.find('#wpo_all_sites_cron'),
wpo_sitelist_show_moreoptions_cron_link = $('#wpo_sitelist_show_moreoptions_cron'),
wpo_sitelist_moreoptions_cron_div = $('#wpo_sitelist_moreoptions_cron');
// sites list for manual run.
define_moreoptions_settings(
wpo_sitelist_show_moreoptions_link,
wpo_sitelist_moreoptions_div,
wpo_settings_all_sites_checkbox,
wpo_settings_sites_list_items
);
var sites_list_clicked_count = 0;
$([wpo_settings_all_sites_checkbox, wpo_settings_sites_list_items]).each(function() {
$(this).on('change', function() {
sites_list_clicked_count++;
setTimeout(function() {
sites_list_clicked_count--;
if (sites_list_clicked_count == 0) update_optimizations_info();
}, 1000);
});
});
// sites list for cron run.
define_moreoptions_settings(
wpo_sitelist_show_moreoptions_cron_link,
wpo_sitelist_moreoptions_cron_div,
wpo_settings_all_sites_cron_checkbox,
wpo_settings_sites_list_cron_items
);
/**
* Attach event handlers for more options list showed by clicking on show_moreoptions_link.
*
* @param show_moreoptions_link
* @param more_options_div
* @param all_items_checkbox
* @param items_list
*
* @return boolean
*/
function define_moreoptions_settings(show_moreoptions_link, more_options_div, all_items_checkbox, items_list) {
// toggle show options on click.
show_moreoptions_link.on('click', function () {
if (!more_options_div.hasClass('wpo_always_visible')) more_options_div.toggleClass('wpo_hidden');
return false;
});
// if "all items" checked/unchecked then check/uncheck items in the list.
define_select_all_checkbox(all_items_checkbox, items_list);
}
/**
* Defines "select all" check box, where all_items_checkbox is a select all check box jQuery object
* and items_list is a list of checkboxes assigned with all_items_checkbox.
*
* @param {Object} all_items_checkbox
* @param {Object} items_list
*
* @return void
*/
function define_select_all_checkbox(all_items_checkbox, items_list) {
// if "all items" checked/unchecked then check/uncheck items in the list.
all_items_checkbox.on('change', function () {
if (all_items_checkbox.is(':checked')) {
items_list.prop('checked', true);
} else {
items_list.prop('checked', false);
}
update_wpo_all_items_checkbox_state(all_items_checkbox, items_list);
});
items_list.on('change', function () {
update_wpo_all_items_checkbox_state(all_items_checkbox, items_list);
});
update_wpo_all_items_checkbox_state(all_items_checkbox, items_list);
}
/**
* Update state of "all items" checkbox depends on state all items in the list.
*
* @param all_items_checkbox
* @param all_items
*
* @return void
*/
function update_wpo_all_items_checkbox_state(all_items_checkbox, all_items) {
var all_items_count = 0, checked_items_count = 0;
all_items.each(function () {
if ($(this).is(':checked')) {
checked_items_count++;
}
all_items_count++;
});
// update label text if need.
if (all_items_checkbox.next().is('label') && all_items_checkbox.next().data('label')) {
var label = all_items_checkbox.next(),
label_mask = label.data('label');
if (all_items_count == checked_items_count) {
label.text(label_mask);
} else {
label.text(label_mask.replace('all', [checked_items_count, ' of ', all_items_count].join('')));
}
}
if (all_items_count == checked_items_count) {
all_items_checkbox.prop('checked', true);
} else {
all_items_checkbox.prop('checked', false);
}
}
/**
* Running the optimizations for the selected options
*
* @return {[type]} optimizations
*/
function run_optimization() {
$optimizations = $('#optimizations_list .optimization_checkbox:checked');
$optimizations.sort(function (a, b) {
// Convert to IDs.
a = $(a).closest('.wp-optimize-settings').data('optimization_run_sort_order');
b = $(b).closest('.wp-optimize-settings').data('optimization_run_sort_order');
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
return 0;
}
});
var optimization_options = {};
$optimizations.each(function (index) {
var optimization_id = $(this).closest('.wp-optimize-settings').data('optimization_id');
if (!optimization_id) {
console.log("Optimization ID corresponding to pressed button not found");
return;
}
// An empty object - in future, options may be implemented.
optimization_options[optimization_id] = { active: 1 };
do_optimization(optimization_id);
});
send_command('save_manual_run_optimization_options', optimization_options);
}
/**
* Uptate the tables list
*
* @param {object} response
*/
function update_tables_list(response) {
if (response.hasOwnProperty('table_list')) {
var resort = true,
// add a callback, as desired
callback = function(table) {
$('#wpoptimize_table_list tbody').css('opacity', '1');
};
// update body with new content.
$("#wpoptimize_table_list tbody").remove();
$("#wpoptimize_table_list thead").after(response.table_list);
$("#wpoptimize_table_list").trigger("updateAll", [resort, callback]);
}
if (response.hasOwnProperty('total_size')) {
$('#optimize_current_db_size').html(response.total_size);
}
if (response.hasOwnProperty('show_innodb_force_optimize')) {
$('.innodb_force_optimize--container').toggleClass('hidden', !response.show_innodb_force_optimize);
}
change_actions_column_visibility();
update_single_table_optimization_buttons(force_single_table_optimization);
}
$('#wp_optimize_table_list_refresh').on('click', function (e) {
e.preventDefault();
var shade = $(this).closest('.wpo-tab-postbox').find('.wpo_shade');
shade.removeClass('hidden');
$('#wpoptimize_table_list tbody').css('opacity', '0.5');
send_command('get_table_list', {refresh_plugin_json: true}, update_tables_list).always(function() {
shade.addClass('hidden');
});
});
$('#database_settings_form, #settings_form').on('click', '.wpo-save-settings', function (e) {
e.preventDefault();
var form = $(this).closest('form');
var spinner = form.find('.wpo-saving-settings');
var form_data = gather_settings();
form.trigger('wpo-saving-form-data');
if (form.form_errors.has_errors()) return;
spinner.show();
// when optimizations list in the document - send information about selected optimizations.
if ($('#optimizations_list').length) {
$('#optimizations_list .optimization_checkbox:checked').each(function() {
var optimization_id = $(this).closest('.wp-optimize-settings').data('optimization_id');
if (optimization_id) {
form_data += '&optimization-options['+optimization_id+'][active]=1';
}
});
}
if ($('#purge_cache_permissions').length) {
if (!$('#purge_cache_permissions').val()) {
form_data += '&purge_cache_permissions[]';
}
}
send_command('save_settings', form_data, function (resp) {
spinner.closest('div').find('.save-done').show().delay(5000).fadeOut();
if (resp && resp.hasOwnProperty('save_results') && resp.save_results && resp.save_results.hasOwnProperty('errors')) {
for (var i = 0, len = resp.save_results.errors.length; i < len; i++) {
var new_html = '<div class="error">' + resp.errors[i] + '</div>';
temporarily_display_notice(new_html, '#wp-optimize-settings-save-results');
}
}
if (resp && resp.hasOwnProperty('status_box_contents')) {
$(resp.status_box_contents).each(function(index, el) {
if ($(el).is('#wp_optimize_status_box')) {
$('#wp_optimize_status_box').replaceWith($(el));
}
});
}
if (resp && resp.hasOwnProperty('optimizations_table')) {
$('#optimizations_list').replaceWith(resp.optimizations_table);
}
// Need to refresh the page if enable-admin-menu tick state has changed.
if (resp.save_results.refresh) {
location.reload();
}
}).always(function() {
spinner.hide();
});
});
/*
* Handle Wipe Settings click.
*/
$('#settings_form').on('click', '.wpo-wipe-settings', function() {
var spinner = $(this).parent().find('.wpo_spinner');
spinner.show();
send_command('wipe_settings', {}, function() {
spinner.next().removeClass('display-none').delay(5000).fadeOut();
alert(wpoptimize.settings_have_been_deleted_successfully);
location.replace(wpoptimize.settings_page_url);
}).always(function() {
spinner.hide();
});
});
$('#wp-optimize-wrap').on('click', '#wp_optimize_status_box_refresh', function (e) {
e.preventDefault();
$('#wp_optimize_status_box').css('opacity', '0.5');
send_command('get_status_box_contents', null, function (resp) {
$('#wp_optimize_status_box').css('opacity', '1');
$(resp).each(function(index, el) {
if ($(el).is('#wp_optimize_status_box')) {
$('#wp_optimize_status_box').replaceWith($(el));
}
});
});
});
/**
* Run single table optimization. Handle click on Optimize button.
*
* @param {Object} btn jQuery object clicked Optimize button
*
* @return {void}
*/
function run_single_table_optimization(btn) {
var spinner = btn.next(),
action_done_icon = spinner.next(),
table_name = btn.data('table'),
table_type = btn.data('type'),
data = {
optimization_id: 'optimizetables',
optimization_table: table_name,
optimization_table_type: table_type
};
btn.hide();
// if checked force button then send force value.
if (force_single_table_optimization) {
data['optimization_force'] = true;
}
spinner.removeClass('visibility-hidden');
send_command('do_optimization', { optimization_id: 'optimizetables', data: data }, function (response) {
if (response.result.meta.error) {
btn.closest('tr').html('<td colspan="8" class="no-table"><p>' + response.result.meta.message + '</p></td>');
setTimeout(function() {
$('#wp_optimize_table_list_refresh').trigger('click');
}, 2000);
} else {
if (response.result.meta.tableinfo) {
var row = btn.closest('tr'),
meta = response.result.meta,
tableinfo = meta.tableinfo;
update_single_table_information(row, tableinfo);
// update total overhead.
$('#wpoptimize_table_list > tbody:last th:eq(6)').html(['<span style="color:', meta.overhead > 0 ? '#0000FF' : '#004600', '">', meta.overhead_formatted,'</span>'].join(''));
}
}
btn.prop('disabled', false);
spinner.addClass('visibility-hidden');
action_done_icon.show().removeClass('visibility-hidden').delay(2500).fadeOut('fast', function() {
btn.show();
});
});
}
/**
* Update information about single table in the database tables list.
*
* @param {Object} row jQuery object for TR html tag.
* @param {Object} tableinfo
*
* @return {void}
*/
function update_single_table_information(row, tableinfo) {
// update table information in row.
$('td:eq(2)', row).text(tableinfo.rows);
$('td:eq(3)', row).text(tableinfo.data_size);
$('td:eq(4)', row).text(tableinfo.index_size);
$('td:eq(5)', row).text(tableinfo.type);
if (tableinfo.is_optimizable) {
$('td:eq(6)', row).html(['<span style="color:', tableinfo.overhead > 0 ? '#0000FF' : '#004600', '">', tableinfo.overhead,'</span>'].join(''));
} else {
$('td:eq(6)', row).html('<span color="#0000FF">-</span>');
}
}
/**
* Update single table optimization buttons state depends on force_optimization value.
*
* @param {boolean} force_optimization See if we need to force optimization
*
* @return {void}
*/
function update_single_table_optimization_buttons(force_optimization) {
$('.run-single-table-optimization').each(function() {
var btn = $(this);
if (btn.data('disabled')) {
if (force_optimization) {
btn.prop('disabled', false);
} else {
btn.prop('disabled', true);
}
}
});
}
/**
* Returns true if single site mode or multisite and at least one site selected;
*
* @return {boolean}
*/
function is_sites_selected() {
return (0 == wpo_settings_sites_list.length || 0 != $('input[type="checkbox"]:checked', wpo_settings_sites_list).length);
}
/**
* Update optimizations info texts.
*
* @param {Object} response object returned by command get_optimizations_info.
*
* @return {void}
*/
function update_optimizations_info_view(response) {
var i, dom_id, info;
// @codingStandardsIgnoreLine
if (!response) return;
for (i in response) {
if (!response.hasOwnProperty(i)) continue;
dom_id = ['#wp-optimize-settings-', response[i].dom_id].join('');
info = response[i].info ? response[i].info.join('<br>') : '';
$(dom_id + ' .wp-optimize-settings-optimization-info').html(info);
}
}
var get_optimizations_info_cache = {};
/**
* Send command for get optimizations info and update view.
*
* @return {void}
*/
function update_optimizations_info() {
var cache_key = ['', get_selected_sites_list().join('_')].join('');
// if information saved in cache show it.
if (get_optimizations_info_cache.hasOwnProperty(cache_key)) {
update_optimizations_info_view(get_optimizations_info_cache[cache_key]);
} else {
// else send command update cache and update view.
send_command('get_optimizations_info', {'wpo-sites':get_selected_sites_list()}, function(response) {
// @codingStandardsIgnoreLine
if (!response) return;
get_optimizations_info_cache[cache_key] = response;
update_optimizations_info_view(response);
});
}
}
/*
* Check if settings file selected for import.
*/
$('#wpo_import_settings_btn').on('click', function(e) {
var file_input = $('#wpo_import_settings_file'),
filename = file_input.val(),
wpo_import_file_file = file_input[0].files[0],
wpo_import_file_reader = new FileReader();
$('#wpo_import_settings_btn').prop('disabled', true);
if (!/\.json$/.test(filename)) {
e.preventDefault();
$('#wpo_import_settings_btn').prop('disabled', false);
$('#wpo_import_error_message').text(wpoptimize.please_select_settings_file).slideDown();
return false;
}
wpo_import_file_reader.onload = function() {
import_settings(this.result);
};
wpo_import_file_reader.readAsText(wpo_import_file_file);
return false;
});
/**
* Send import settings command.
*
* @param {string} settings encoded settings in json string.
*
* @return {void}
*/
function import_settings(settings) {
var loader = $('#wpo_import_spinner'),
success_message = $('#wpo_import_success_message'),
error_message = $('#wpo_import_error_message');
loader.show();
send_command('import_settings', {'settings': settings}, function(response) {
loader.hide();
if (response && response.errors && response.errors.length) {
error_message.text(response.errors.join('<br>'));
error_message.slideDown();
} else if (response && response.messages && response.messages.length) {
success_message.text(response.messages.join('<br>'));
success_message.slideDown();
setTimeout(function() {
window.location.reload();
}, 500);
}
$('#wpo_import_settings_btn').prop('disabled', false);
});
}
/*
* Hide file validation message on change file field value.
*/
$('#wpo_import_settings_file').on('change', function() {
$('#wpo_import_error_message').slideUp();
});
/*
* Save settings to hidden form field, used for export.
*/
$('#wpo_export_settings_btn').on('click', function(e) {
wpo_download_json_file(gather_settings('object'));
return false;
});
/**
* Force download json file with posted data.
*
* @param {Object} data data to put in a file.
* @param {string} filename
*
* @return {void}
*/
function wpo_download_json_file(data ,filename) {
// Attach this data to an anchor on page
var link = document.body.appendChild(document.createElement('a')),
date = new Date(),
year = date.getFullYear(),
month = date.getMonth() < 10 ? ['0', date.getMonth()].join('') : date.getMonth(),
day = date.getDay() < 10 ? ['0', date.getDay()].join('') : date.getDay();
filename = filename ? filename : ['wpo-settings-',year,'-',month,'-',day,'.json'].join('');
link.setAttribute('download', filename);
link.setAttribute('style', "display:none;");
link.setAttribute('href', 'data:text/json' + ';charset=UTF-8,' + encodeURIComponent(JSON.stringify(data)));
link.click();
}
/**
* Make ajax request to get optimization info.
*
* @param {Object} optimization_info_container - jquery object obtimization info container.
* @param {string} optimization_id - optimization id.
* @param {Object} params - custom params posted to optimization get info.
*
* @return void
*/
var optimization_get_info = function(optimization_info_container, optimization_id, params) {
return send_command('get_optimization_info', {optimization_id: optimization_id, data: params}, function(resp) {
var meta = (resp && resp.result && resp.result.meta) ? resp.result.meta : {},
message = (resp && resp.result && resp.result.output) ? resp.result.output.join('<br>') : '...';
// trigger event about optimization get info in process.
$(document).trigger(['optimization_get_info_', optimization_id].join(''), [message, meta]);
// update status message in optimizations list.
optimization_info_container.html(message);
if (!meta.finished) {
setTimeout(function() {
var xhr = optimization_get_info(optimization_info_container, optimization_id, meta);
$(document).trigger(['optimization_get_info_xhr_', optimization_id].join(''), [xhr, meta]);
}, 1);
} else {
// trigger event about optimization get info action done.
$(document).trigger(['optimization_get_info_', optimization_id, '_done'].join(''), resp);
}
});
};
/*
* Handle ajax information for optimizations.
*
* @return void
*/
jQuery(function() {
$('.wp-optimize-optimization-info-ajax').each(function () {
var optimization_info = $(this),
optimization_info_container = optimization_info.parent(),
optimization_id = optimization_info.data('id');
// trigger event about optimization get info action started.
$(document).trigger(['optimization_get_info_', optimization_id, '_start'].join(''));
optimization_get_info(optimization_info_container, optimization_id, {support_ajax_get_info: true});
});
});
// attach event handlers after database tables template loaded.
// Handle single optimization click.
$('#wpoptimize_table_list').on('click', '.run-single-table-optimization', function () {
var take_backup_checkbox = $('#enable-auto-backup-1'),
button = $(this);
// check if backup checkbox is checked for db tables
if (take_backup_checkbox.is(':checked')) {
take_a_backup_with_updraftplus(
function () {
run_single_table_optimization(button);
}
);
} else {
run_single_table_optimization(button);
}
});
// Handle repair table click
$('#wpoptimize_table_list').on('click', '.run-single-table-repair', function () {
var btn = $(this),
spinner = btn.next(),
action_done_icon = spinner.next(),
table_name = btn.data('table'),
data = {
optimization_id: 'repairtables',
optimization_table: table_name
};
spinner.removeClass('visibility-hidden');
send_command('do_optimization', {optimization_id: 'repairtables', data: data}, function (response) {
if (response.result.meta.success) {
var row = btn.closest('tr'),
tableinfo = response.result.meta.tableinfo;
btn.prop('disabled', false);
spinner.addClass('visibility-hidden');
action_done_icon.show().removeClass('visibility-hidden');
update_single_table_information(row, tableinfo);
// keep visible results from previous operation for one second and show optimize button if possible.
setTimeout(function () {
var parent_td = btn.closest('td'),
btn_wrap = btn.closest('.wpo_button_wrap');
// remove Repair button and show Optimize button.
btn_wrap.fadeOut('fast', function () {
btn_wrap.closest('.wpo_button_wrap').remove();
// if table type is supported for optimization then show OPTIMIZE button.
if (tableinfo.is_type_supported) {
$('.wpo_button_wrap', parent_td).removeClass('wpo_hidden');
}
});
change_actions_column_visibility();
}, 1000);
} else {
btn.prop('disabled', false);
spinner.addClass('visibility-hidden');
alert(wpoptimize.table_was_not_repaired.replace('%s', table_name));
}
});
});
// Handle convert table click
$('#wpoptimize_table_list').on('click', '.toinnodb', function () {
convert_single_db_table($(this));
});
var table_to_remove_btn;
// Handle delete table click
$('#wpoptimize_table_list').on('click', '.run-single-table-delete', function () {
table_to_remove_btn = $(this);
var take_backup_checkbox = $('#enable-auto-backup-1');
if ('' == wpoptimize.user_always_ignores_table_delete_warning || '1' !== wpoptimize.user_always_ignores_table_delete_warning) {
wp_optimize.modal.open({
className: 'wpo-confirm',
events: {
'click .wpo-modal--bg': 'close',
'click .delete-table': 'deleteTable',
'change #confirm_deletion_without_backup': 'changeConfirm',
'change #confirm_table_deletion': 'changeConfirm'
},
content: function() {
var content_template = wp.template('wpo-table-delete');
// Get the plugins list
var plugins_list = table_to_remove_btn.closest('tr').find('.table-plugins').html();
return content_template({
no_backup: !take_backup_checkbox.is(':checked'),
plugins_list: plugins_list,
table_name: table_to_remove_btn.data('table')
});
},
changeConfirm: function() {
var enable_button = true;
var backup_input = this.$('#confirm_deletion_without_backup');
var confirm_input = this.$('#confirm_table_deletion');
if (backup_input.length && !backup_input.is(':checked')) {
enable_button = false;
}
if (!confirm_input.is(':checked')) {
enable_button = false;
}
this.$('.delete-table').prop('disabled', !enable_button);
},
deleteTable: function() {
// check if user ignore table warning
var ignores_table_detele_warning_checkbox = this.$('#ignores_table_delete_warning');
if (ignores_table_detele_warning_checkbox.is(':checked')) {
send_command('user_ignores_table_delete_warning', {}, function(response) {
if (response.success) {
wpoptimize.user_always_ignores_table_delete_warning = '1';
}
});
}
// check if backup checkbox is checked for db tables
if (take_backup_checkbox.is(':checked')) {
take_a_backup_with_updraftplus(remove_single_db_table);
} else {
remove_single_db_table();
}
this.close();
}
});
} else {
// check if backup checkbox is checked for db tables
if (take_backup_checkbox.is(':checked')) {
take_a_backup_with_updraftplus(remove_single_db_table);
} else {
remove_single_db_table();
}
}
});
/**
* Send ajax command to convert single table to InnoDB.
*
* @param {Object} btn jQuery object of clicked "Convert to InnoDB" button.
*
* @return void
*/
function convert_single_db_table(table_to_convert_btn) {
var spinner = table_to_convert_btn.next(),
action_done_icon = spinner.next(),
table_name = table_to_convert_btn.data('table'),
data = {
optimization_id: 'orphanedtables',
optimization_table: table_name,
optimization_action: 'toinnodb'
};
spinner.removeClass('visibility-hidden');
send_command('do_optimization', { optimization_id: 'orphanedtables', data: data }, function (response) {
if (response.result.meta.error) {
table_to_convert_btn.closest('tr').html('<td colspan="8" class="no-table"><p>' + response.result.meta.message + '</p></td>');
setTimeout(function() {
$('#wp_optimize_table_list_refresh').trigger('click');
}, 2000);
return;
}
if (response.result.meta.success) {
var row = table_to_convert_btn.closest('tr');
action_done_icon.show().removeClass('visibility-hidden');
// remove convert to Innodb button.
row.find(".toinnodb").remove();
setTimeout(function() {
action_done_icon.fadeOut('slow', function() {
row.find("[data-colname='Type']").text("InnoDB");
});
}, 500);
} else {
var message = wpoptimize.table_was_not_converted.replace('%s', table_name);
if (response.result.meta.message) {
message += '(' + response.result.meta.message + ')';
}
alert(message);
}
}).always(function() {
table_to_convert_btn.prop('disabled', false);
spinner.addClass('visibility-hidden');
});
}
/**
* Send ajax commant to remove single database table.
*
* @param {Object} btn jQuery object of clicked "Remove" button.
*
* @return void
*/
function remove_single_db_table() {
var spinner = table_to_remove_btn.next(),
action_done_icon = spinner.next(),
table_name = table_to_remove_btn.data('table'),
data = {
optimization_id: 'orphanedtables',
optimization_table: table_name
};
spinner.removeClass('visibility-hidden');
send_command('do_optimization', { optimization_id: 'orphanedtables', data: data }, function (response) {
if (response.result.meta.success) {
var row = table_to_remove_btn.closest('tr');
action_done_icon.show().removeClass('visibility-hidden');
// remove row for deleted table.
setTimeout(function() {
row.fadeOut('slow', function() {
row.remove();
change_actions_column_visibility();
});
}, 500);
} else {
var message = wpoptimize.table_was_not_deleted.replace('%s', table_name);
if (response.result.meta.message) {
message += '(' + response.result.meta.message + ')';
}
alert(message);
}
}).always(function() {
table_to_remove_btn.prop('disabled', false);
spinner.addClass('visibility-hidden');
});
}
change_actions_column_visibility();
/**
* Show or hide actions column if need.
*
* @return void
*/
function change_actions_column_visibility() {
var table = $('#wpoptimize_table_list'),
hideLastColumn = true;
// check if any button exists in the actions column.
$('tr', table).each(function() {
var row = $(this);
if ($('button', row).length > 0) {
hideLastColumn = false;
return false;
}
});
// hide or show last column
$('tr', table).each(function() {
var row = $(this);
if (hideLastColumn) {
$('td:last, th:last', row).hide();
} else {
$('td:last, th:last', row).show();
}
});
}
/*
* Validate general settings (loggers).
*/
$('#wp-optimize-general-settings').on('wpo-saving-form-data', function() {
var valid = true;
var $form = $(this);
$('.wpo_logger_addition_option, .wpo_logger_type').each(function() {
if (!validate_field($(this), true)) {
valid = false;
$(this).addClass('wpo_error_field');
} else {
$(this).removeClass('wpo_error_field');
}
});
if (!valid) {
$form.form_errors.add('missing-fields', '');
$('#wp-optimize-settings-save-results')
.show()
.addClass('wpo_alert_notice')
.text(wpoptimize.fill_all_settings_fields)
.delay(5000)
.fadeOut(3000, function() {
$(this).removeClass('wpo_alert_notice');
});
} else {
$form.form_errors.remove('missing-fields');
$('#wp-optimize-logger-settings .save_settings_reminder').slideUp();
}
});
/**
* Validate import field with data-validate attribute.
*
* @param {object} field jquery element
* @param {boolean} required
*
* @return {boolean}
*/
function validate_field(field, required) {
var value = field.val(),
validate = field.data('validate');
if (!validate && required) {
return ('' != $.trim(value));
}
if (validate && !required && '' == $.trim(value)) {
return true;
}
var valid = true;
switch (validate) {
case 'email':
var regex = /\S+@\S+\.\S+/,
emails = value.split(","),
email = '';
for (var i = 0; i < emails.length; i++) {
email = $.trim(emails[i]);
if ('' == email || !regex.test(email)) {
valid = false;
}
}
break;
case 'url':
// https://gist.github.com/dperini/729294
// @codingStandardsIgnoreLine
var regex = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i;
valid = regex.test(value);
break;
}
return valid;
}
/**
* Send check_overdue_crons command and output warning if need.
*/
setTimeout(function() {
send_command('check_overdue_crons', null, function (resp) {
if (resp && resp.hasOwnProperty('m')) {
$('#wpo_settings_warnings').append(resp.m);
}
});
}, 11000);
/**
* Hide introduction notice
*/
$('.wpo-introduction-notice .notice-dismiss, .wpo-introduction-notice .close').on('click', function(e) {
$('.wpo-introduction-notice').remove();
send_command('dismiss_install_or_update_notice', null, function (resp) {
if (resp && resp.hasOwnProperty('error')) {
// there was an error.
console.log('There was an error dismissing the install or update notice (dismiss_install_or_update_notice)', resp);
}
});
});
return {
send_command: send_command,
optimization_get_info: optimization_get_info,
take_a_backup_with_updraftplus: take_a_backup_with_updraftplus,
save_auto_backup_options: save_auto_backup_options
}
}; // END function WP_Optimize()
jQuery(function ($) {
/**
* Show additional options section if optimization enabled
*
* @param {string} checkbox Logger settings jQuery checkbox object.
*
* @return {void}
*/
function show_hide_additional_logger_options($checkbox) {
var additional_section_id = ['#', $checkbox.data('additional')].join('');
if ($checkbox.is(':checked')) {
$(additional_section_id).show();
} else {
$(additional_section_id).hide();
}
}
// Add events handler for each logger.
$('.wp-optimize-logging-settings').each(function () {
var $checkbox = $(this);
show_hide_additional_logger_options($checkbox);
$checkbox.on('change', function () {
show_hide_additional_logger_options($checkbox);
});
});
var add_logging_btn = $('#wpo_add_logger_link');
/**
* Handle add logging destination click.
*/
add_logging_btn.on('click', function(e) {
e.preventDefault();
$('#wp-optimize-logger-settings .save_settings_reminder').after(get_add_logging_form_html());
filter_select_destinations($('.wpo_logger_type').first());
});
/**
* Handle logging destination select change.
*/
$('#wp-optimize-general-settings').on('change', '.wpo_logger_type', function() {
var select = $(this),
logger_id = select.val(),
options_container = select.parent().find('.wpo_additional_logger_options');
options_container.html(get_logging_additional_options_html(logger_id));
if (select.val()) {
show_logging_save_settings_reminder();
}
});
/**
* Show save settings reminder for logging settings.
*
* @return {void}
*/
function show_logging_save_settings_reminder() {
var reminder = $('#wp-optimize-logger-settings .save_settings_reminder');
if (!reminder.is(':visible')) {
reminder.slideDown('normal');
}
}
/**
* Handle edit logger click.
*/
$('.wpo_logging_actions_row .dashicons-edit').on('click', function() {
var link = $(this),
container = link.closest('.wpo_logging_row');
$('.wpo_additional_logger_options', container).removeClass('wpo_hidden');
$('.wpo_logging_options_row', container).text('');
$('.wpo_logging_status_row', container).text('');
link.hide();
return false;
});
$('#wp-optimize-logger-settings').on('change', '.wpo_logger_addition_option', function() {
show_logging_save_settings_reminder();
});
/**
* Handle change of active/inactive status and update hidden field value.
*/
$('.wpo_logger_active_checkbox').on('change', function() {
var checkbox = $(this),
hidden_input = checkbox.closest('label').find('input[type="hidden"]');
hidden_input.val(checkbox.is(':checked') ? '1' : '0');
});
/**
* Handle delete logger destination click.
*/
$('#wp-optimize-general-settings').on('click', '.wpo_delete_logger', function() {
if (!confirm(wpoptimize.are_you_sure_you_want_to_remove_logging_destination)) {
return false;
}
var btn = $(this);
btn.closest('.wpo_logging_row, .wpo_add_logger_form').remove();
filter_all_select_destinations();
if (0 == $('#wp-optimize-logging-options .wpo_logging_row').length) {
$('#wp-optimize-logging-options').hide();
}
show_logging_save_settings_reminder();
return false;
});
/**
* Filter all selects with logger destinations, called after some destination deleted.
*
* @return {void}
*/
function filter_all_select_destinations() {
$('.wpo_logger_type').each(function() {
filter_select_destinations($(this));
});
}
/**
* Filter certain select options depending on currently selected values.
*
* @param {object} select
*
* @return {void}
*/
function filter_select_destinations(select) {
var i,
destination,
current_destinations = get_current_destinations();
for (i in current_destinations) {
destination = current_destinations[i];
if (wpoptimize.loggers_classes_info[destination].allow_multiple) {
$('option[value="'+destination+'"]', select).show();
} else {
$('option[value="'+destination+'"]', select).hide();
}
}
}
/**
* Returns currently selected loggers destinations.
*
* @return {Array}
*/
function get_current_destinations() {
var destinations = [];
$('.wpo_logging_row, .wpo_logger_type').each(function() {
var destination = $(this).is('select') ? $(this).val() : $(this).data('id');
if (destination) destinations.push(destination);
});
return destinations;
}
/**
* Return add logging form.
*
* @return {string}
*/
function get_add_logging_form_html() {
var i,
select_options = [
'<option value="">Select destination</option>'
];
for (i in wpoptimize.loggers_classes_info) {
if (!wpoptimize.loggers_classes_info.hasOwnProperty(i)) continue;
if (!wpoptimize.loggers_classes_info[i].available) continue;
select_options.push(['<option value="',i,'">',wpoptimize.loggers_classes_info[i].description,'</option>'].join(''));
}
return [
'<div class="wpo_add_logger_form">',
'<select class="wpo_logger_type" name="wpo-logger-type[]">',
select_options.join(''),
'<select>',
'<a href="#" class="wpo_delete_logger dashicons dashicons-no-alt"></a>',
'<div class="wpo_additional_logger_options"></div>',
'</div>'
].join('');
}
/**
* Returns logging options html.
*
* @param {string} logger_id
*
* @return {string}
*/
function get_logging_additional_options_html(logger_id) {
if (!wpoptimize.loggers_classes_info[logger_id].options) return '';
var i,
options = wpoptimize.loggers_classes_info[logger_id].options,
options_list = [],
placeholder = '',
validate = '';
for (i in options) {
if (!options.hasOwnProperty(i)) continue;
if (Array.isArray(options[i])) {
placeholder = $.trim(options[i][0]);
validate = $.trim(options[i][1]);
} else {
placeholder = $.trim(options[i]);
validate = '';
}
options_list.push([
'<input class="wpo_logger_addition_option" type="text" name="wpo-logger-options[',i,'][]" value="" ',
'placeholder="',placeholder,'" ',('' !== validate ? 'data-validate="'+validate+'"' : ''), '/>'
].join(''));
}
// Add hidden field for active/inactive value.
options_list.push('<input type="hidden" name="wpo-logger-options[active][]" value="1" />');
return options_list.join('');
}
/**
* Layout - Adds `is-scrolled` class to the body element when scrolled.
*/
var is_scrolled = false;
$(window).on('scroll', function(e) {
window.requestAnimationFrame(function() {
var threshold = $('.wpo-main-header').length ? $('.wpo-main-header')[0].offsetTop : 0;
if ((window.pageYOffset > threshold - 20) != is_scrolled) {
is_scrolled = !is_scrolled;
$('body').toggleClass('is-scrolled', is_scrolled);
}
});
});
// Opens the video preview / info popup
$('.wpo-info__trigger').on('click', function(e) {
e.preventDefault();
var $container = $(this).closest('.wpo-info');
$container.toggleClass('opened');
});
// Embed videos when clicking the vimeo links
$('.wpo-video-preview a').on('click', function(e) {
var video_url = $(this).data('embed');
if (video_url) {
e.preventDefault();
var $iframe = $('<iframe width="356" height="200" allowfullscreen webkitallowfullscreen mozallowfullscreen>').attr('src', video_url);
$iframe.insertAfter($(this));
$(this).remove();
$iframe.focus();
}
});
});