// // [START] Core file // (function($) { $.fn.wpAssetCleanUp = function() { let metaBoxContent = '#wpacu_meta_box_content'; return { cssJsManagerActions: function () { let cbSelector = '.input-unload-on-this-page', cbSelectorNotLocked = '.input-unload-on-this-page.wpacu-not-locked', cbSelectorMakeExceptionOnPage = '.wpacu_load_it_option_one.wpacu_load_exception', handle, handleFor, $targetedAssetRow; // live() is deprecated and if used and jQuery Migrate is disabled // it could break the website's front-end functionality $(document).on('click change', cbSelector, function (event) { handle = $(this).attr('data-handle'); handleFor = $(this).hasClass('wpacu_unload_rule_for_style') ? 'style' : 'script'; if ($(this).prop('checked')) { if (event.type === 'click' && (! $.fn.wpAssetCleanUp().triggerAlertWhenAnyUnloadRuleIsChosen(handle, handleFor))) { return false; } $.fn.wpAssetCleanUp().uncheckAllOtherBulkUnloadRules($(this), false); // skip Unload via RegEx as both can be used // Show load exceptions area (for exceptions like load it if the user is logged in) $.fn.wpAssetCleanUp().showHandleLoadExceptionArea(handleFor, handle); $(this).closest('tr').addClass('wpacu_not_load'); } else { $(this).closest('tr').removeClass('wpacu_not_load'); $targetedAssetRow = $(this).parents('.wpacu_asset_row'); $.fn.wpAssetCleanUp().hideHandleLoadExceptionArea($targetedAssetRow, handle, handleFor); } }); /* * [Start] Unload on this page */ // Check All $('.wpacu-area-check-all').on('click', function (e) { e.preventDefault(); let wpacuPluginTarget = $(this).attr('data-wpacu-plugin'); //console.log(wpacuPluginTarget); $('table.wpacu_list_by_location[data-wpacu-plugin="' + wpacuPluginTarget + '"]') .find(cbSelectorNotLocked) .prop('checked', true).closest('tr').addClass('wpacu_not_load'); }); // Uncheck All $('.wpacu-area-uncheck-all').on('click', function (e) { e.preventDefault(); let wpacuPluginTarget = $(this).attr('data-wpacu-plugin'); $('table.wpacu_list_by_location[data-wpacu-plugin="' + wpacuPluginTarget + '"]') .find(cbSelectorNotLocked) .prop('checked', false).closest('tr').removeClass('wpacu_not_load'); }); /* * [End] Unload on this page */ /* * [Start] Make exception, Load it on this page */ // Check All $('.wpacu-area-check-load-all').on('click change', function (e) { e.preventDefault(); let wpacuPluginTarget = $(this).attr('data-wpacu-plugin'); let $wpacuPluginList = $('table.wpacu_list_by_location[data-wpacu-plugin="' + wpacuPluginTarget + '"]'); $wpacuPluginList .find(cbSelectorMakeExceptionOnPage) .prop('checked', true).closest('tr.wpacu_is_bulk_unloaded').removeClass('wpacu_not_load'); $wpacuPluginList.find(cbSelectorNotLocked).prop('checked', false).trigger('change'); }); // Uncheck All $('.wpacu-area-uncheck-load-all').on('click change', function (e) { e.preventDefault(); let wpacuPluginTarget = $(this).attr('data-wpacu-plugin'); let $wpacuPluginList = $('table.wpacu_list_by_location[data-wpacu-plugin="' + wpacuPluginTarget + '"]'); $wpacuPluginList .find(cbSelectorMakeExceptionOnPage) .prop('checked', false).closest('tr.wpacu_is_bulk_unloaded').addClass('wpacu_not_load'); $wpacuPluginList.find(cbSelectorNotLocked).prop('checked', false).trigger('change'); }); /* * [End] Make exception, Load it on this page */ $(document).on('click', '.wpacu_keep_bulk_rule', function () { if ($(this).prop('checked')) { $(this).parents('li').next().removeClass('remove_rule'); } }); $(document).on('click', '.wpacu_remove_bulk_rule', function () { if ($(this).prop('checked')) { $(this).parents('li').addClass('remove_rule'); } }); // Unload on All Pages of post/page/custom post type / site-wide (everywhere) / based on taxonomy $(document).on('click change', '.wpacu_bulk_unload', function (event) { handle = $(this).attr('data-handle'); handleFor = $(this).attr('data-handle-for'); // 'style' or 'script' (e.g. 'contact-form-7' has the same name for both) $targetedAssetRow = $('[data-' + handleFor + '-handle-row="' + handle + '"]'); let $parentLi = $(this).parents('li'); /************************************************************** * STATE 1: The checkbox IS CHECKED (show multiple drop-down) * ************************************************************ */ if ($(this).prop('checked')) { if (event.type === 'click' && (! $.fn.wpAssetCleanUp().triggerAlertWhenAnyUnloadRuleIsChosen(handle, handleFor))) { return false; } if ($(this).hasClass('wpacu_global_unload') || $(this).hasClass('wpacu_post_type_unload')) { /* * Clicked: "Unload site-wide" (.wpacu_global_unload) or "Unload on all posts of the same [post_type]" (.wpacu_post_type_unload) */ $(this).parent('label').addClass('wpacu_input_load_checked'); $(this).closest('tr').addClass('wpacu_not_load'); } // Show load exceptions area if Unload everywhere or other bulk unload rule is chosen $.fn.wpAssetCleanUp().showHandleLoadExceptionArea(handleFor, handle); if ($(this).hasClass('wpacu_global_unload')) { // CSS/JS: Unload Site-Wide (Everywhere) was clicked $.fn.wpAssetCleanUp().uncheckAllOtherBulkUnloadRules($(this), true); // Obviously, "Unload on this page" should be unchecked as the rule overwrites it $('.input-unload-on-this-page[data-handle-for="' + handleFor + '"][data-handle="' + handle + '"]') .prop('checked', false); } else if ($(this).hasClass('wpacu_post_type_unload')) { // Unload on All Pages of "[post_type_here]" post type $.fn.wpAssetCleanUp().uncheckAllOtherBulkUnloadRules($(this), false); // Obviously, "Unload on this page" should be unchecked as the rule overwrites it $('.input-unload-on-this-page[data-handle-for="' + handleFor + '"][data-handle="' + handle + '"]') .prop('checked', false); } //wpAssetCleanUp.uncheckAllOtherBulkUnloadRules($(this)); //$(this).closest('tr').find('.wpacu_remove_site_wide_rule').prop('checked', true); } else { /*********************************************************************************** * STATE 2: The checkbox IS UNCHECKED / UNMARKED (the multiple drop-down is hidden) *********************************************************************************** */ if (!$(this).hasClass('wpacu_unload_it_regex_checkbox') && !$(this).hasClass('wpacu_unload_it_via_tax_checkbox')) { /* * Clicked: "Unload site-wide" or "Unload on all posts of the same [post_type]" */ $(this).parent('label').removeClass('wpacu_input_load_checked'); $(this).closest('tr').removeClass('wpacu_not_load'); } else if ($(this).hasClass('wpacu_unload_it_regex_checkbox')) { /* * "Unload via RegEx" is clicked */ $parentLi.find('label').removeClass('wpacu_unload_checked'); $parentLi.find('textarea') .blur() // lose focus .addClass('wpacu_disabled'); // Action taken if the input has no value if ($parentLi.find('textarea').val().trim() === '') { $parentLi.find('textarea') .prop('disabled', true).val(''); // unchecked with no value added to the input $parentLi.find('.wpacu_handle_unload_regex_input_wrap') .addClass('wpacu_hide'); // Hide the input area } } else if ($(this).hasClass('wpacu_unload_it_via_tax_checkbox')) { /* * "Unload via taxonomy" is clicked */ $parentLi.find('label').removeClass('wpacu_unload_checked'); /* $parentLi.find('select') .blur() // lose focus .addClass('wpacu_disabled'); */ //$parentLi.find('select').prop('disabled', true).val(''); // unchecked with no value added to the input $parentLi.find('.wpacu_handle_unload_via_tax_input_wrap').addClass('wpacu_hide'); // Hide the input area } // [wpacu_lite] // If it's NOT already unloaded (on page load) // All bulk unloads are unchecked // Then HIDE make exceptions area $.fn.wpAssetCleanUp().hideHandleLoadExceptionArea($targetedAssetRow, handle, handleFor); // [/wpacu_lite] } // No bulk rule already applied (red background) and none of the bulk unloads (except RegEx) checkboxes are checked if (!$targetedAssetRow.hasClass('wpacu_is_bulk_unloaded') && !$('.wpacu_bulk_unload:not(.wpacu_unload_it_regex_checkbox)').is(':checked')) { $(this).closest('tr').removeClass('wpacu_not_load'); } }); // Load it on this page $(document).on( 'click change', // when these actions are taken cbSelectorMakeExceptionOnPage + ',' + '.wpacu_load_it_option_post_type', // on these elements function () { // trigger the following function let handle = $(this).attr('data-handle'); if ($(this).prop('checked')) { $(this).parent('label').addClass('wpacu_global_unload_exception'); // Uncheck "Unload on this page" as it's not relevant anymore let asset_type = ''; if ($(this).hasClass('wpacu_style')) { asset_type = 'style'; } else if ($(this).hasClass('wpacu_script')) { asset_type = 'script'; } $('#' + asset_type + '_' + handle).prop('checked', false).trigger('change'); } else { $(this).parent('label').removeClass('wpacu_global_unload_exception'); } } ); // Handle Notes $(document).on('click', '.wpacu-add-handle-note', function (e) { e.preventDefault(); let wpacuHandle = $(this).attr('data-handle'), $wpacuNotesFieldArea, $wpacuNoteInput; if ($(this).hasClass('wpacu-for-script')) { $wpacuNotesFieldArea = $('.wpacu-handle-notes-field[data-script-handle="' + wpacuHandle + '"]'); } else if ($(this).hasClass('wpacu-for-style')) { $wpacuNotesFieldArea = $('.wpacu-handle-notes-field[data-style-handle="' + wpacuHandle + '"]'); } if ($wpacuNotesFieldArea.length < 1) { return; } $wpacuNoteInput = $wpacuNotesFieldArea.find(':input'); if ($wpacuNotesFieldArea.is(':hidden')) { // When "Add Note" is clicked, mark the textarea as visible and not disabled $wpacuNotesFieldArea.show(); $wpacuNoteInput.prop('disabled', false); } else { $wpacuNotesFieldArea.hide(); // Was the area hidden without any textarea value and the value was null on page load? // Mark it as disabled (save total sent inputs for PHP processing) // If there's ONLY space added (could be by mistake) to the textarea, ignore it as it's irrelevant if ($wpacuNoteInput.val().trim() === '' && $wpacuNoteInput.attr('data-wpacu-is-empty-on-page-load') === 'true') { $wpacuNoteInput.prop('disabled', true).val(''); } } }); // [Get external asset size] $(document).on('click', '.wpacu-external-file-size', function (e) { e.preventDefault(); let $wpacuCurrentTarget = $(this), $wpacuFileSizeArea, wpacuRemoteFile = $wpacuCurrentTarget.attr('data-src'); $wpacuCurrentTarget.hide(); $wpacuFileSizeArea = $wpacuCurrentTarget.next(); $wpacuFileSizeArea.show(); if (wpacuRemoteFile.includes('/?')) { // Dynamic CSS/JS $.get(wpacuRemoteFile, {}, function (output, textStatus, request) { if (textStatus !== 'success') { return 'N/A'; } $wpacuFileSizeArea.html($.fn.wpAssetCleanUp().wpacuBytesToSize(output.length)); }); } else { $.post(wpacu_object.ajax_url, { 'action': wpacu_object.plugin_prefix + '_get_external_file_size', 'wpacu_remote_file': wpacuRemoteFile, 'wpacu_nonce': wpacu_object.wpacu_ajax_check_remote_file_size_nonce }, function (size) { $wpacuFileSizeArea.html(size); }); } }); // [/Get external asset size] // Note: Starting from July 24, 2021, AJAX is used to save the state $(document).on('click', '.wpacu_handle_row_expand_contract', function (e) { e.preventDefault(); let wpacuAssetHandle = $(this).attr('data-wpacu-handle'), wpacuAssetHandleFor = $(this).attr('data-wpacu-handle-for'), wpacuNewAssetRowState; if ($(this).find('span').hasClass('dashicons-minus')) { /* * Already expanded when clicked (had minus sign) */ wpacuNewAssetRowState = 'contracted'; $(this).parents('td').attr('data-wpacu-row-status', wpacuNewAssetRowState) .find('.wpacu_handle_row_expanded_area').addClass('wpacu_hide'); $(this).find('span').removeClass('dashicons-minus').addClass('dashicons-plus'); } else if ($(this).find('span').hasClass('dashicons-plus')) { /* * Already contracted when clicked (had plus sign) */ wpacuNewAssetRowState = 'expanded'; $(this).parents('td').attr('data-wpacu-row-status', wpacuNewAssetRowState).find('.wpacu_handle_row_expanded_area').removeClass('wpacu_hide'); $(this).find('span').removeClass('dashicons-plus').addClass('dashicons-minus'); } $.fn.wpAssetCleanUp().wpacuAjaxUpdateKeepTheAssetRowState(wpacuNewAssetRowState, wpacuAssetHandle, wpacuAssetHandleFor, $(this)); }); $(document).on('click', '.wpacu_area_handles_row_expand_contract', function (e) { e.preventDefault(); let wpacuAreaName = $(this).attr('data-wpacu-area'), wpacuNewAreaAssetsRowState, wpacuAllAreaHandles = [], $areaWrap = $('table.wpacu_list_table[data-wpacu-area="'+ wpacuAreaName +'"]'); if ($(this).hasClass('wpacu-area-contract-all-assets')) { wpacuNewAreaAssetsRowState = 'contracted'; } else if ($(this).hasClass('wpacu-area-expand-all-assets')) { wpacuNewAreaAssetsRowState = 'expanded'; } // Get all plugin / area handles and wrap them in a list together with their type ("style" or "script") $areaWrap.find('tr.wpacu_asset_row').each(function(index, value) { var handleStyleAttr = $(this).attr('data-style-handle-row'); var handleScriptAttr = $(this).attr('data-script-handle-row'); if (typeof handleStyleAttr !== 'undefined' && handleStyleAttr !== false) { wpacuAllAreaHandles[index] = handleStyleAttr + '_style'; } else if (typeof handleScriptAttr !== 'undefined' && handleScriptAttr !== false) { wpacuAllAreaHandles[index] = handleScriptAttr + '_script'; } var $tdAssetRow = $(this).find('td[data-wpacu-row-status]'); if (wpacuNewAreaAssetsRowState === 'contracted') { $tdAssetRow.attr('data-wpacu-row-status', wpacuNewAreaAssetsRowState) .find('.wpacu_handle_row_expanded_area').addClass('wpacu_hide'); $tdAssetRow.find('a.wpacu_handle_row_expand_contract').find('span').removeClass('dashicons-minus').addClass('dashicons-plus'); } else if (wpacuNewAreaAssetsRowState === 'expanded') { $tdAssetRow.attr('data-wpacu-row-status', wpacuNewAreaAssetsRowState) .find('.wpacu_handle_row_expanded_area').removeClass('wpacu_hide'); $tdAssetRow.find('a.wpacu_handle_row_expand_contract').find('span').removeClass('dashicons-plus').addClass('dashicons-minus'); } }); $.fn.wpAssetCleanUp().wpacuAjaxUpdateAllAreaAssetsRowState(wpacuNewAreaAssetsRowState, wpacuAllAreaHandles, $areaWrap); }); }, triggerAlertWhenAnyUnloadRuleIsChosen: function (handle, handleFor) { // The moment the load exception area is shown, it means at least one unload rule was set // There are cases when the admin needs to be alerted // Dashicons if (handle === 'dashicons' && handleFor === 'style') { if ($('input[name="wpacu_ignore_child[styles][nf-display]').length > 0 && !confirm(wpacu_object.dashicons_unload_alert_ninja_forms)) { return false; } } if (handleFor === 'script') { // jQuery library if ((handle === 'jquery' || handle === 'jquery-core')) { if ($('#script_jquery_ignore_children').length > 0 && !confirm(wpacu_object.jquery_unload_alert)) { return false; } } // JavaScript Cookie (https://github.com/js-cookie/js-cookie) // Parent of: wc-cart-fragments, woocommerce if (handle === 'js-cookie') { if (!confirm(wpacu_object.woo_js_cookie_unload_alert)) { return false; } } // WooCommerce's "wc-cart-fragments" JS file if (handle === 'wc-cart-fragments') { if (!confirm(wpacu_object.woo_wc_cart_fragments_unload_alert)) { return false; } } // Other JS files if ((handle === 'backbone' || handle === 'underscore')) { if (!confirm(wpacu_object.sensitive_library_unload_alert)) { return false; } } } return true; }, showHandleLoadExceptionArea: function (handleFor, handle) { let $targetedLoadExceptionArea = $('div.wpacu_exception_options_area_wrap[data-' + handleFor + '-handle="' + handle + '"]'); $targetedLoadExceptionArea.parent('div').removeClass('wpacu_hide'); // Remove "disabled" attribute to any load exceptions checkboxes // Except the locked ones if the Lite version is used $targetedLoadExceptionArea.find('input[type="checkbox"]').not('.wpacu_lite_locked').prop('disabled', false); }, hideHandleLoadExceptionArea: function ($targetedAssetRow, handle, handleFor) { // If it's NOT already unloaded (on page load) // All bulk unloads are unchecked // Then HIDE make exceptions area if (!$targetedAssetRow.hasClass('wpacu_is_bulk_unloaded')) { if (!$targetedAssetRow.find('.wpacu_bulk_unload').is(':checked')) { let $targetedLoadExceptionArea = $('div.wpacu_exception_options_area_wrap[data-' + handleFor + '-handle="' + handle + '"]'); $targetedLoadExceptionArea.parent('div').addClass('wpacu_hide'); // Set "disabled" attribute any load exceptions checkboxes as they are irrelevant in this instance $targetedLoadExceptionArea.find('input[type="checkbox"]').prop('disabled', true); } } }, uncheckAllOtherBulkUnloadRules: function ($targetInput, includingUnloadViaRegEx) { let wpacuToFind = '.wpacu_bulk_unload'; if (includingUnloadViaRegEx === false) { wpacuToFind = '.wpacu_bulk_unload:not(.wpacu_unload_it_regex_checkbox)'; } $targetInput.closest('tr').find(wpacuToFind).not($targetInput) // all except the target one // uncheck it .prop('checked', false) // remove the "checked" style from the label .parent('label').removeClass('wpacu_input_load_checked') .removeClass('wpacu_unload_checked'); }, limitSubmittedFields: function () { let preloadTargetInput = '[data-wpacu-input="preload"]', wpacuListToCheck = []; // Edit post/page area (e.g. /wp-admin/post.php?post=[POST_ID_HERE]&action=edit) // OR edit taxonomy area (e.g. /wp-admin/term.php?taxonomy=category&tag_ID=63&post_type=post) if ($('body.wp-admin form#post').length > 0 || $('body.wp-admin form#edittag').length > 0) { if ($('#wpacu_unload_assets_area_loaded').length < 1) { return; // the CSS/JS area is not loaded on edit post/page area, thus no reason to continue } return true; // leave it always to true as the edit post/page/taxonomy form needs to always submit (might be edited later on) } if ($(preloadTargetInput).length > 0) { wpacuListToCheck.push(preloadTargetInput); } if (wpacuListToCheck.length > 0) { $(wpacuListToCheck.join()).each(function () { let $thisEl = $(this); if ( ! $thisEl.val() ) { $thisEl.prop('disabled', 'disabled'); setTimeout(function () { $thisEl.prop('disabled', false); }, 2000); // restore them in case the user pressed "Preview Changes" } }); } return true; }, wpacuParseContentsForDirectCall: function (contents, statusCode) { if (contents.lastIndexOf(wpacu_object.start_del_e) < 0 || contents.lastIndexOf(wpacu_object.end_del_e) < 0 || contents.lastIndexOf(wpacu_object.start_del_h) < 0 || contents.lastIndexOf(wpacu_object.end_del_h) < 0 ) { // Sometimes, 200 OK (success) is returned, but due to an issue with the page, the assets list is not retrieved // Do further checks if any of the markers are missing (even if there are no assets to manage, they should be printed) let wpacuOutputError = wpacu_object.ajax_direct_fetch_error_with_success_response; // Strip tags (Source: https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/) wpacuOutputError = wpacuOutputError.replace( /{wpacu_output}/, xhr.responseText.replace(/(<([^>]+)>)/ig, '') ); // htmlEntities() PHP equivalent: https://css-tricks.com/snippets/javascript/htmlentities-for-javascript/ try { wpacuOutputError = String(wpacuOutputError).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } catch (e) { console.log(e); } $(metaBoxContent).html(wpacuOutputError); return; } let wpacuListE = contents.substring( (contents.lastIndexOf(wpacu_object.start_del_e) + wpacu_object.start_del_e.length), contents.lastIndexOf(wpacu_object.end_del_e) ); /* * IMPORTANT NOTE: It looks like UglifyJS jas issues preserving comments that are after consecutive "var" */ let wpacuListH = contents.substring( (contents.lastIndexOf(wpacu_object.start_del_h) + wpacu_object.start_del_h.length), contents.lastIndexOf(wpacu_object.end_del_h) ); let dataGetLoadedAssets = { 'action' : wpacu_object.plugin_prefix + '_get_loaded_assets', 'wpacu_list_e' : wpacuListE, 'wpacu_list_h' : wpacuListH, 'post_id' : wpacu_object.post_id, 'page_url' : wpacu_object.page_url, 'tag_id' : wpacu_object.tag_id, 'wpacu_taxonomy' : wpacu_object.wpacu_taxonomy, 'force_manage_dash' : wpacu_object.force_manage_dash, 'is_for_singular' : false, // e.g. Post ID, Post Title 'wpacu_nonce' : wpacu_object.wpacu_ajax_get_loaded_assets_nonce, 'time_r' : new Date().getTime() }; if ($('#wpacu_manage_singular_page_assets').length > 0) { // e.g. /wp-admin/admin.php?page=wpassetcleanup_assets_manager dataGetLoadedAssets['is_for_singular'] = true; } $.post(wpacu_object.ajax_url, dataGetLoadedAssets, function (response) { if (!response) { return; } $(metaBoxContent).html(response); if (statusCode === 404) { $(metaBoxContent).prepend('

' + wpacu_object.server_returned_404_not_found + '


'); } if ($('#wpacu_dash_assets_manager_form').length > 0) { $('#submit').show(); } setTimeout(function () { $.fn.wpAssetCleanUp().cssJsManagerActions(); $('.wpacu_asset_row, .wpacu-page-options .wpacu-assets-collapsible-content').removeClass('wpacu_loading'); // hide loading spinner after post is updated $('#wpacu-assets-reloading').remove(); $.fn.wpAssetCleanUp().wpacuCheckSourcesFor404Errors(); }, 200); }); }, wpacuAjaxGetAssetsArea: function (forceFetch) { // Do not make any AJAX call unless force fetch is enabled if (!forceFetch && !$('#wpacu_ajax_fetch_assets_list_dashboard_view').length) { return false; } // Was "Do not load Asset CleanUp Pro on this page (this will disable any functionality of the plugin)" ticked? // Do not load any list! Instead, make an AJAX call to load the restricted area mentioning that the restriction took effect let pageOptionNoPluginLoadTarget = '#wpacu_page_options_no_wpacu_load'; if ($(pageOptionNoPluginLoadTarget).length > 0 && $(pageOptionNoPluginLoadTarget).prop('checked')) { let dataLoadPageRestrictedArea = { 'action' : wpacu_object.plugin_prefix + '_load_page_restricted_area', 'post_id' : wpacu_object.post_id, 'wpacu_nonce' : wpacu_object.wpacu_ajax_load_page_restricted_area_nonce, 'time_r' : new Date().getTime() }; $.post(wpacu_object.ajax_url, dataLoadPageRestrictedArea, function (response) { if (!response) { return false; } $(metaBoxContent).html(response); $('.wpacu_asset_row, .wpacu-page-options .wpacu-assets-collapsible-content').removeClass('wpacu_loading'); // hide loading spinner after post is updated $('#wpacu-assets-reloading').remove(); }); return; } let dataDirect = {}; if (wpacu_object.dom_get_type === 'direct') { dataDirect[wpacu_object.plugin_prefix + '_load'] = 1; dataDirect[wpacu_object.plugin_prefix + '_time_r'] = new Date().getTime(); $.ajax({ method: 'GET', url: wpacu_object.page_url, data: dataDirect, cache: false, complete: function (xhr, textStatus) { if (xhr.statusText === 'error') { // Make exception for 404 errors as there could be plugin used such as "404page – your smart custom 404 error page" if (xhr.status === 404) { $.fn.wpAssetCleanUp().wpacuParseContentsForDirectCall(xhr.responseText, xhr.status, $); return; } // Strip any tags (Source: https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/) let errorTextOutput = xhr.responseText.replace(/(<([^>]+)>)/ig, ''); // htmlEntities() PHP equivalent: https://css-tricks.com/snippets/javascript/htmlentities-for-javascript/ try { errorTextOutput = String(errorTextOutput).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } catch (e) { console.log(e); } let wpacuOutputError = wpacu_object.ajax_direct_fetch_error; wpacuOutputError = wpacuOutputError.replace(/{wpacu_output}/, errorTextOutput); wpacuOutputError = wpacuOutputError.replace(/{wpacu_status_code_error}/, xhr.status); $(metaBoxContent).html(wpacuOutputError); } } }).done(function (contents, _textStatus, jqXHR) { // "Step 1" (Fetch the assets from the home page) is now completed $('#wpacu-fetch-list-step-1-wrap').addClass('wpacu-completed'); $('#wpacu-fetch-list-step-1-status').html($('#wpacu-list-step-completed-status').html()); // "Step 2" is in progress, mark it as such $('#wpacu-fetch-list-step-2-status').html($('#wpacu-list-step-default-status').html()); $.fn.wpAssetCleanUp().wpacuParseContentsForDirectCall(contents); }); } else if (wpacu_object.dom_get_type === 'wp_remote_post') { let dataGetLoadedAssets = { 'action': wpacu_object.plugin_prefix + '_get_loaded_assets', 'post_id': wpacu_object.post_id, 'page_url': wpacu_object.page_url, 'tag_id': wpacu_object.tag_id, 'wpacu_taxonomy': wpacu_object.wpacu_taxonomy, 'force_manage_dash': wpacu_object.force_manage_dash, 'wpacu_nonce': wpacu_object.wpacu_ajax_get_loaded_assets_nonce, 'time_r': new Date().getTime() }; $.post(wpacu_object.ajax_url, dataGetLoadedAssets, function (response) { if (!response) { return false; } $(metaBoxContent).html(response); if ($('#wpacu_dash_assets_manager_form').length > 0) { $('#submit').show(); } setTimeout(function () { $.fn.wpAssetCleanUp().cssJsManagerActions(); setTimeout(function () { $.fn.wpAssetCleanUp().wpacuCheckSourcesFor404Errors(); }, 100); }, 200); }); } }, wpacuParseResultsForHarcodedAssets: function (contents) { if (contents.lastIndexOf(wpacu_object.start_del_h) < 0 || contents.lastIndexOf(wpacu_object.end_del_h) < 0) { // error in fetching the list } // IMPORTANT NOTE: It looks like UglifyJS has issues preserving comments that are after consecutive "var" let wpacuListH = contents.substring( (contents.lastIndexOf(wpacu_object.start_del_h) + wpacu_object.start_del_h.length), contents.lastIndexOf(wpacu_object.end_del_h) ); let wpacuSettings = $('#wpacu-assets-collapsible-wrap-hardcoded-list').attr('data-wpacu-settings-frontend'); let dataGetLoadedHardcodedAssets = { 'action' : wpacu_object.plugin_prefix + '_print_loaded_hardcoded_assets', 'wpacu_list_h' : wpacuListH, 'wpacu_settings' : wpacuSettings, // includes $data values as well (with rules) to pass to the hardcoded list 'time_r' : new Date().getTime(), 'wpacu_nonce' : wpacu_object.wpacu_print_loaded_hardcoded_assets_nonce }; if ($.fn.wpAssetCleanUpFrontendCssJsManagerArea().getParameterByName('wpacu_ignore_no_load_option') !== null) { dataGetLoadedHardcodedAssets['wpacu_ignore_no_load_option'] = 1; } $.post(wpacu_object.ajax_url, dataGetLoadedHardcodedAssets, function (response) { let $mainJQuerySelector = '#wpacu-assets-collapsible-wrap-hardcoded-list'; if (!response) { return; } if (response.includes('The security nonce is not valid')) { $($mainJQuerySelector).find('> .wpacu-assets-collapsible-content').html(response); return; } let responseJson = JSON.parse(response); $($mainJQuerySelector).find('> .wpacu-assets-collapsible-content').html(responseJson.output); $($mainJQuerySelector).find('a.wpacu-assets-collapsible') .append(' ➝ Total: ' + parseInt(responseJson.total_hardcoded_assets)); }); }, wpacuCheckSourcesFor404Errors: function() { // Trigger on page load (front-end view) let $targetSources = $('[data-wpacu-external-source]'); if ($targetSources.length < 1) { return; } let totalExternalSources = $targetSources.length, checkUrlsToPass = ''; $targetSources.each(function(wpacuIndex) { let $targetSource = $(this), sourceUrl = $targetSource.attr('data-wpacu-external-source'); checkUrlsToPass += sourceUrl + '-at-wpacu-at-'; if (wpacuIndex === totalExternalSources - 1) { $.post(wpacu_object.ajax_url, { 'action' : wpacu_object.plugin_prefix + '_check_external_urls_for_status_code', 'wpacu_check_urls' : checkUrlsToPass, 'wpacu_nonce' : wpacu_object.wpacu_ajax_check_external_urls_nonce }, function(response) { let urlsList = $.parseJSON(response); $.each(urlsList, function(index, sourceToHi) { $('[data-wpacu-external-source="'+ sourceToHi +'"]') .css({'color': '#cc0000'}) .parent('div') .find('[data-wpacu-external-source-status]') .html('* ' + wpacu_object.source_load_error_msg + ''); }); }); } }); }, wpacuBytesToSize: function(bytes) { /** * Inspired from: https://web.archive.org/web/20120507054320/http://codeaid.net/javascript/convert-size-in-bytes-to-human-readable-format-(javascript) * Bytes to KB */ if (bytes === 0) { return 'N/A'; } return (bytes / 1024).toFixed(4) + ' KB'; }, wpacuAjaxUpdateKeepTheGroupsState: function(newState, btnIdClicked) { // Don't use resources and perform the AJAX call if the same "state" button is clicked let dataCurrentState = $('#wpacu-assets-groups-change-state-area').attr('data-wpacu-groups-current-state'); if (dataCurrentState == newState) { $('#' + btnIdClicked).prop('disabled', false); // Don't leave the button disabled return; } let dataUpdateSetting = { 'action' : wpacu_object.plugin_prefix + '_update_settings', 'wpacu_nonce' : wpacu_object.wpacu_update_specific_settings_nonce, 'wpacu_update_keep_the_groups' : 'yes', 'wpacu_keep_the_groups_state' : newState, // "expanded" or "contracted" 'time_r' : new Date().getTime() // avoid any caching }; try { $.post(wpacu_object.ajax_url, dataUpdateSetting, function (response) { if (response == 'done') { $('#wpacu-assets-groups-change-state-area').attr('data-wpacu-groups-current-state', newState); } $('#' + btnIdClicked).prop('disabled', false); }); } catch (e) { $('#'+ btnIdClicked).prop('disabled', false); // Any problems with the AJAX call? Don't keep the button disabled } }, wpacuAjaxUpdateKeepTheAssetRowState: function(newState, handle, handleFor, $currentElement) { let dataUpdateSetting = { 'action' : wpacu_object.plugin_prefix + '_update_asset_row_state', 'wpacu_update_asset_row_state' : 'yes', 'wpacu_asset_row_state' : newState, // "expanded" or "contracted" 'wpacu_handle' : handle, 'wpacu_handle_for' : handleFor, 'time_r' : new Date().getTime(), // avoid any caching 'wpacu_nonce' : wpacu_object.wpacu_update_asset_row_state_nonce }; $currentElement.addClass('wpacu_hide'); $.post(wpacu_object.ajax_url, dataUpdateSetting, function (response) { $currentElement.removeClass('wpacu_hide'); console.log(response); }); }, // This triggers when all the assets from a plugin are expanded or contracted wpacuAjaxUpdateAllAreaAssetsRowState: function(newState, handles, $areaWrap) { let dataUpdateSetting = { 'action' : wpacu_object.plugin_prefix + '_area_update_assets_row_state', 'wpacu_area_update_assets_row_state' : 'yes', 'wpacu_area_assets_row_state' : newState, // "expanded" or "contracted" 'wpacu_area_handles' : handles, 'time_r' : new Date().getTime(), // avoid any caching 'wpacu_nonce' : wpacu_object.wpacu_area_update_assets_row_state_nonce }; $areaWrap.find('.wpacu_handle_row_expand_contract').addClass('wpacu_hide'); $.post(wpacu_object.ajax_url, dataUpdateSetting, function (response) { $areaWrap.find('.wpacu_handle_row_expand_contract').removeClass('wpacu_hide'); console.log(response); }); }, wpacuTriggerAdjustTextAreaHeightAllTextareas: function() { // We use the "data-wpacu-adapt-height" attribute as a marker let wpacuTextAreas = [].slice.call(document.querySelectorAll('textarea[data-wpacu-adapt-height="1"]')); // Iterate through all the textareas on the page wpacuTextAreas.forEach(function(el) { // we need box-sizing: border-box, if the textarea has padding el.style.boxSizing = el.style.mozBoxSizing = 'border-box'; // we don't need any scrollbars, do we? :) el.style.overflowY = 'hidden'; // the minimum height initiated through the "rows" attribute let minHeight = el.scrollHeight; el.addEventListener('input', function() { $.fn.wpAssetCleanUp().wpacuAdjustTextareaHeight(el, minHeight); }); // we have to readjust when window size changes (e.g. orientation change) window.addEventListener('resize', function() { $.fn.wpAssetCleanUp().wpacuAdjustTextareaHeight(el, minHeight); }); // we adjust height to the initial content $.fn.wpAssetCleanUp().wpacuAdjustTextareaHeight(el, minHeight); }); }, wpacuAdjustTextareaHeight: function(el, minHeight) { /* Source: http://bdadam.com/blog/automatically-adapting-the-height-textarea.html */ // compute the height difference which is caused by border and outline let outerHeight = parseInt(window.getComputedStyle(el).height, 10); let diff = outerHeight - el.clientHeight; // set the height to 0 in case of it has to be shrunk el.style.height = 0; // set the correct height // el.scrollHeight is the full height of the content, not just the visible part el.style.height = Math.max(minHeight, el.scrollHeight + diff) + 'px'; } } } })(jQuery); jQuery(document).ready(function($) { /* * [START] "Settings" (menu) */ $.fn.wpAssetCleanUpSettingsArea = function() { return { actions: function () { /* * Settings: A link is clicked that should trigger a vertical menu link from the plugin */ $(document).on('click', 'a[data-wpacu-vertical-link-target]', function (e) { e.preventDefault(); $.fn.wpAssetCleanUpSettingsArea().tabOpenSettingsArea(e, $(this).attr('data-wpacu-vertical-link-target')); }); /* * A vertical tab is clicked */ $(document).on('click', 'a[data-wpacu-settings-tab-key]', function (e) { e.preventDefault(); $.fn.wpAssetCleanUpSettingsArea().tabOpenSettingsArea(e, $(this).attr('data-wpacu-settings-tab-key')); }); $(document).on('click', 'input[type="checkbox"]#wpacu_disable_rss_feed', function () { if ($(this).is(':checked')) { $('#wpacu_remove_main_feed_link, #wpacu_remove_comment_feed_link').prop('checked', true); } else { $('#wpacu_remove_main_feed_link, #wpacu_remove_comment_feed_link').prop('checked', false); } }); /* * Settings: Sub-tab within tab clicked */ $(document).on('click', 'input[name="wpacu_sub_tab_area"]', function () { if ($(this).prop('checked')) { $('#wpacu-selected-sub-tab-area').val($(this).val()); } }); /* [Start] Minify/Combine CSS/JS status circles */ $(document).on('click', '#wpacu_minify_css_enable, #wpacu_combine_loaded_css_enable, #wpacu_minify_js_enable, #wpacu_combine_loaded_js_enable, #wpacu_cdn_rewrite_enable, #wpacu_enable_test_mode', function () { if ($(this).prop('checked')) { $('[data-linked-to="' + $(this).attr('id') + '"]').find('.wpacu-circle-status').addClass('wpacu-on').removeClass('wpacu-off'); } else { $('[data-linked-to="' + $(this).attr('id') + '"]').find('.wpacu-circle-status').addClass('wpacu-off').removeClass('wpacu-on'); } }); /* [End] Minify/Combine CSS/JS status circles */ /* [Start] Inline Stylesheet (.css) Files Smaller Than (x) KB */ $(document).on('click', '#wpacu_inline_css_files_below_size_checkbox', function () { // The checkbox is not 'checked' and it was clicked if ($(this).is(':checked')) { $('#wpacu_inline_css_files_enable').prop('checked', true).trigger('tick'); } else { if ($('#wpacu_inline_css_files_list').val() === '') { $('#wpacu_inline_css_files_enable').prop('checked', false).trigger('tick'); } } }); /* [End] Inline Stylesheet (.css) Files Smaller Than (x) KB */ /* [Start] Inline JavaScript (.js) Files Smaller Than (x) KB */ $(document).on('click', '#wpacu_inline_js_files_below_size_checkbox', function () { // The checkbox is not 'checked' and it was clicked if ($(this).is(':checked')) { if (!confirm(wpacu_object.inline_auto_js_files_confirm_msg)) { return false; } $('#wpacu_inline_js_files_enable').prop('checked', true).trigger('tick'); } else { if ($('#wpacu_inline_js_files_list').val() === '') { $('#wpacu_inline_js_files_enable').prop('checked', false).trigger('tick'); } } }); /* [End] Inline JavaScript (.js) Files Smaller Than (x) KB */ // "Manage in the Dashboard?" Clicked $(document).on('click', '#wpacu_dashboard', function() { if ($(this).prop('checked')) { $('#wpacu-settings-assets-retrieval-mode').show(); //$('#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info').css({'opacity':1}); } else { $('#wpacu-settings-assets-retrieval-mode').hide(); //$('#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info').css({'opacity':0.4}); } }); // "Manage in the Dashboard?" radio selection $(document).on('change', '.wpacu-dom-get-type-selection', function() { if ($(this).is(':checked')) { $('.wpacu-dom-get-type-info').hide(); $('#'+ $(this).attr('data-target')).fadeIn('fast'); } }); // "Manage in the Front-end?" Clicked $(document).on('click', '#wpacu_frontend', function() { if ($(this).prop('checked')) { $('#wpacu-settings-frontend-exceptions').show(); } else { $('#wpacu-settings-frontend-exceptions').hide(); } }); // Google Fonts: Load Optimizer (render-blocking or asynchronous) $(document).on('change', '.google_fonts_combine_type', function() { $('.wpacu_google_fonts_combine_type_area').hide(); if ($(this).val() === 'async') { $('#wpacu_google_fonts_combine_type_async_info_area').fadeIn(); } else if ($(this).val() === 'async_preload') { $('#wpacu_google_fonts_combine_type_async_preload_info_area').fadeIn(); } else { $('#wpacu_google_fonts_combine_type_rb_info_area').fadeIn(); } }); if ( $('#wpacu-allow-manage-assets-to-select-list-area').length > 0 && ( ! $('#wpacu-allow-manage-assets-to-select-list-area').hasClass('wpacu_hide') ) ) { setTimeout(function() { jQuery('#wpacu-allow-manage-assets-to-select-list').chosen(); }, 200); } $('#wpacu-allow-manage-assets-to-select').on('click change', function() { if ($(this).val() === 'chosen') { $('#wpacu-allow-manage-assets-to-select-list-area').removeClass('wpacu_hide'); setTimeout(function() { jQuery('#wpacu-allow-manage-assets-to-select-list').chosen(); }, 200); } else { $('#wpacu-allow-manage-assets-to-select-list-area').addClass('wpacu_hide'); } }); $('#wpacu_assets_list_layout').on('click change', function() { if ($(this).val() === 'by-location') { $('#wpacu-assets-list-by-location-selected').fadeIn('fast'); } else { $('#wpacu-assets-list-by-location-selected').fadeOut('fast'); } }); $('#wpacu_disable_jquery_migrate').on('click', function() { // It was checked and the user unchecked it if (! $(this).is(':checked')) { return true; } // It was unchecked and the user checked it, needs confirmation // Otherwise, it would be reversed as not checked if ($(this).is(':checked') && confirm(wpacu_object.jquery_migration_disable_confirm_msg)) { return true; } else { // Not confirmed? $(this).prop('checked', false); return false; } }); $('#wpacu_disable_comment_reply').on('click', function() { // It was checked and the user unchecked it if (! $(this).is(':checked')) { return true; } // It was unchecked and the user checked it, needs confirmation // Otherwise, it would be reversed as not checked if ($(this).is(':checked') && confirm(wpacu_object.comment_reply_disable_confirm_msg)) { return true; } else { // Not confirmed? $(this).prop('checked', false); return false; } }); // "Settings" - When an option is enabled/disabled $('[data-target-opacity]').on('click change tick', function() { if ($(this).prop('checked')) { $('#'+ $(this).attr('data-target-opacity')).css({'opacity':1}); } else { $('#'+ $(this).attr('data-target-opacity')).css({'opacity':0.4}); } }); $('#wpacu-show-assets-meta-box-checkbox').on('click change', function() { if ($(this).prop('checked')) { $('#wpacu-show-assets-enabled-area').show(); $('#wpacu-show-assets-disabled-area').hide(); } else { $('#wpacu-show-assets-enabled-area').hide(); $('#wpacu-show-assets-disabled-area').show(); } }); // "Combine JS Files" - "Select a combination method:" $(document).on('change', '.wpacu-combine-loaded-js-level', function() { if ($(this).is(':checked')) { $('.wpacu_combine_loaded_js_level_area').removeClass('wpacu_active'); $('#'+ $(this).attr('data-target')).addClass('wpacu_active'); } }); // Submit button (Dashboard) is clicked let $settingSubmitBtn = $('#wpacu-update-button-area input[type="submit"]'); // Show the loading spinner $(document).on('submit', '#wpacu-settings-form, .wpacu_settings_form', function() { $settingSubmitBtn.attr('disabled', true); $('#wpacu-updating-settings').addClass('wpacu-show').removeClass('wpacu-hide'); }); // Once the form is submitted, disable the submit button to prevent any double submission // Settings & Homepage Buttons $(document).on('submit', 'form#wpacu-settings-form, form#wpacu_dash_assets_manager_form', function() { $settingSubmitBtn.attr('disabled', true); $('#wpacu-updating-settings').show(); return true; }); }, tabOpenSettingsArea: function(evt, settingName) { /* * Only relevant in the "Settings" area */ evt.preventDefault(); let i, wpacuVerticalTabContent, wpacuVerticalTabLinks; wpacuVerticalTabContent = document.getElementsByClassName("wpacu-settings-tab-content"); for (i = 0; i < wpacuVerticalTabContent.length; i++) { wpacuVerticalTabContent[i].style.display = "none"; } wpacuVerticalTabLinks = document.getElementsByClassName("wpacu-settings-tab-link"); for (i = 0; i < wpacuVerticalTabLinks.length; i++) { wpacuVerticalTabLinks[i].className = wpacuVerticalTabLinks[i].className.replace(" active", ""); } document.getElementById(settingName).style.display = "table-cell"; $('a[href="#'+ settingName +'"]').addClass('active'); $('#wpacu-selected-tab-area').val(settingName); }, } } $.fn.wpAssetCleanUpSettingsArea().actions(); /* * [END] "Settings" (menu) */ /* * [START] "Tools" (menu) */ $.fn.wpAssetCleanUpToolsArea = function() { return { actions: function () { /* * "Tools" -> "Reset" */ let wpacuResetDdSelector = '#wpacu-reset-drop-down', $wpacuOptionSelected, wpacuMsgToShow; $(wpacuResetDdSelector).on('change keyup keydown mouseup mousedown click', function() { if ($(this).val() === '') { $('#wpacu-warning-read').removeClass('wpacu-visible'); $('#wpacu-reset-submit-btn').attr('disabled', 'disabled') .removeClass('button-primary') .addClass('button-secondary'); } else { if ($(this).val() === 'reset_everything') { $('#wpacu-license-data-remove-area, #wpacu-cache-assets-remove-area').addClass('wpacu-visible'); } else { $('#wpacu-license-data-remove-area, #wpacu-cache-assets-remove-area').removeClass('wpacu-visible'); } $('#wpacu-warning-read').addClass('wpacu-visible'); $('#wpacu-reset-submit-btn').removeAttr('disabled') .removeClass('button-secondary') .addClass('button-primary'); } $('.wpacu-tools-area .wpacu-warning').hide(); $wpacuOptionSelected = $(this).find('option:selected'); $('#'+ $wpacuOptionSelected.attr('data-id')).show(); }); $('#wpacu-reset-submit-btn').on('click', function() { if ($(wpacuResetDdSelector).val() === 'reset_settings') { wpacuMsgToShow = wpacu_object.reset_settings_confirm_msg; } else if ($(wpacuResetDdSelector).val() === 'reset_critical_css') { wpacuMsgToShow = wpacu_object.reset_critical_css_confirm_msg; } else if ($(wpacuResetDdSelector).val() === 'reset_everything_except_settings') { wpacuMsgToShow = wpacu_object.reset_everything_except_settings_confirm_msg; } else if ($(wpacuResetDdSelector).val() === 'reset_everything') { wpacuMsgToShow = wpacu_object.reset_everything_confirm_msg; } if (! confirm(wpacuMsgToShow)) { return false; } $('#wpacu-action-confirmed').val('yes'); setTimeout(function() { if ($('#wpacu-action-confirmed').val() === 'yes') { $('#wpacu-tools-form').trigger('submit'); } }, 1000); }); /* * "Tools" -> "Import" */ $(document).on('submit', '#wpacu-import-form', function() { if (! confirm(wpacu_object.import_confirm_msg)) { return false; } $(this).find('button').addClass('wpacu-importing').prop('disabled', true); }); } } } $.fn.wpAssetCleanUpToolsArea().actions(); /* * [END] "Tools" (menu) */ /* * [START] Front-end CSS/JS Manager */ $.fn.wpAssetCleanUpFrontendCssJsManagerArea = function() { return { getParameterByName: function(name, url = window.location.href) { // Source: https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript name = name.replace(/[\[\]]/g, '\\$&'); var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, ' ')); }, actions: function () { // "Update" button is clicked within front-end view let $updateBtnFrontEnd = $('#wpacu-update-front-settings-area .wpacu_update_btn'); // Show the loading spinner $(document).on('submit', '#wpacu-frontend-form', function() { $updateBtnFrontEnd.attr('disabled', true).addClass('wpacu_submitting'); $('#wpacu-updating-front-settings').show(); return true; }); // Asset Front-end Edit (if setting is enabled) if ($('#wpacu_wrap_assets').length > 0) { setTimeout(function () { $.fn.wpAssetCleanUp().cssJsManagerActions(); }, 200); } // The code below is for the pages loaded in the front-end view // Fetch hardcoded assets if ($('#wpacu-assets-collapsible-wrap-hardcoded-list').length > 0) { let dataFetchHardcodedList = {}; dataFetchHardcodedList[wpacu_object.plugin_prefix + '_load'] = 1; dataFetchHardcodedList[wpacu_object.plugin_prefix + '_time_r'] = new Date().getTime(); dataFetchHardcodedList['wpacu_just_hardcoded'] = 1; if ($.fn.wpAssetCleanUpFrontendCssJsManagerArea().getParameterByName('wpacu_ignore_no_load_option') !== null) { dataFetchHardcodedList['wpacu_ignore_no_load_option'] = 1; } $.ajax({ method: 'GET', url: wpacu_object.page_url, data: dataFetchHardcodedList, cache: false, complete: function (xhr, textStatus) { if (xhr.statusText === 'error') { $.fn.wpAssetCleanUp().wpacuParseResultsForHarcodedAssets(xhr.responseText); } } }).done(function (contents) { $.fn.wpAssetCleanUp().wpacuParseResultsForHarcodedAssets(contents); }); } } } } $.fn.wpAssetCleanUpFrontendCssJsManagerArea().actions(); /* * [END] Front-end CSS/JS Manager */ /* * [START] Dashboard CSS/JS Manager */ $.fn.wpAssetCleanUpDashboardCssJsManagerArea = function() { return { actions: function () { // Option #1: Fetch the assets automatically and show the list (Default) is chosen // Or "Homepage" from "CSS & JavaScript Load Manager" is loaded if (wpacu_object.list_show_status === 'default' || wpacu_object.list_show_status === '' || wpacu_object.override_assets_list_load) { $.fn.wpAssetCleanUp().wpacuAjaxGetAssetsArea(false); } // Option #2: Fetch the assets on button click // This takes effect only when edit post/page is used - e.g. /wp-admin/post.php?post=[post_id_here]&action=edit if (wpacu_object.list_show_status === 'fetch_on_click') { $(document).on('click', '#wpacu_ajax_fetch_on_click_btn', function(e) { e.preventDefault(); $(this).hide(); // Hide the button $('#wpacu_fetching_assets_list_wrap').show(); // Show the loading information $.fn.wpAssetCleanUp().wpacuAjaxGetAssetsArea(true); // Fetch the assets list }); } // Better compatibility with WordPress 5.0 as edit post/page is not refreshed after update // Asset CleanUp meta box's content is refreshed to show the latest changes as if the page was refreshed // This takes effect only when edit post/page is used and Gutenberg editor is used - e.g. /wp-admin/post.php?post=[post_id_here]&action=edit $(document).on('click', '.wp-admin.post-php .edit-post-header__settings button.is-primary', function () { let $thisUpdateBtn = $(this); // Wait until triggering it around half a second after the "Update" button is clicked setTimeout(function() { let wpacuIntervalUpdateAction = function () { // If it's in the updating status, don't do anything if ($thisUpdateBtn.attr('aria-disabled') === 'true' || $('#editor').hasClass('is-validating')) { return; } // If the button "Fetch CSS & JavaScript Management List" is there, stop here as the list shouldn't be loaded // since the admin didn't use the button in the first place if ($('#wpacu_ajax_fetch_on_click_btn').length > 0) { return; } // Updating status is over. Reload the CSS/JS manager which would show the new list // (e.g. a site-wide rule could be applied, and it needs to show the removing "radio input" option) if ($('.edit-post-header__settings .is-saving').length === 0) { let wpacuMetaBoxContentTarget = '#wpacu_meta_box_content'; if ($(wpacuMetaBoxContentTarget).length > 0) { $('#wpacu-assets-reloading').remove(); let wpacuAppendToPostWhileUpdating = '' + wpacu_object.reload_icon + wpacu_object.reload_msg + ''; $('.wp-admin.post-php .edit-post-header__settings').prepend(wpacuAppendToPostWhileUpdating); $('.wpacu_asset_row, .wpacu-page-options .wpacu-assets-collapsible-content').addClass('wpacu_loading'); // show loading spinner once "Update" is clicked $.fn.wpAssetCleanUp().wpacuAjaxGetAssetsArea(true); $.fn.wpAssetCleanUpClearCache().wpacuAjaxClearCache(); // Finally, after the list is fetched and the caching is cleared, // do not keep checking any "saving" status as all the needed actions have been taken clearInterval(wpacuUpdateIntervalId); } } }; let wpacuUpdateIntervalId = setInterval(wpacuIntervalUpdateAction, 900); }, 500); }); return $.fn.wpAssetCleanUp().limitSubmittedFields(); } } } $.fn.wpAssetCleanUpDashboardCssJsManagerArea().actions(); /* * [END] Dashboard CSS/JS Manager */ /* * [START] Common CSS/JS Manager (Dashboard & Front-end) */ $.fn.wpAssetCleanUpCommonCssJsManagerArea = function() { return { actions: function () { // Mark specific inputs as disabled if they are not needed to further reduce the total PHP inputs // if "max_input_vars" from php.ini is not set high enough $(document).on('submit', 'form#wpacu-frontend-form, form#wpacu_dash_assets_manager_form, body.wp-admin form#post, body.wp-admin #edittag', function() { return $.fn.wpAssetCleanUp().limitSubmittedFields(); }); // Source (updated) $(document).on('click', '.wpacu-filter-handle', function(event) { alert($(this).attr('data-wpacu-filter-handle-message')); event.preventDefault(); }); // "Contract All Groups" $(document).on('click', '#wpacu-assets-contract-all', function() { $(this).prop('disabled', true); // avoid multiple clicks and AJAX calls $.fn.wpAssetCleanUp().wpacuAjaxUpdateKeepTheGroupsState('contracted', $(this).attr('id')); }); // "Expand All Groups" $(document).on('click', '#wpacu-assets-expand-all', function() { $(this).prop('disabled', true); // avoid multiple clicks and AJAX calls $.fn.wpAssetCleanUp().wpacuAjaxUpdateKeepTheGroupsState('expanded', $(this).attr('id')); }); } } } $.fn.wpAssetCleanUpCommonCssJsManagerArea().actions(); /* * [END] Common CSS/JS Manager (Dashboard & Front-end) */ $.fn.wpAssetCleanUpClearCache = function() { return { init: function() { // Do not trigger other plugins' cache again if already cleared (save resources) let triggeredClearCacheIncludingOtherPluginsClearing = false; // The assets of a page just had rules applied (e.g. assets were unloaded) if (wpacu_object.clear_cache_on_page_load !== '') { $.fn.wpAssetCleanUpClearCache().wpacuAjaxClearCache(); triggeredClearCacheIncludingOtherPluginsClearing = true; } if (wpacu_object.clear_other_caches !== '' && ! triggeredClearCacheIncludingOtherPluginsClearing) { setTimeout(function () { $.fn.wpAssetCleanUpClearCache().wpacuClearAutoptimizeCache(); // Autoptimize (if active) $.fn.wpAssetCleanUpClearCache().wpacuClearCacheEnablerCache(); // Cache Enabler (if active) }, 150); } }, afterSubmit: function () { try { let httpRefererFieldTargetName = 'input[type="hidden"][name="_wp_http_referer"]', wpacuHttpRefererFieldVal; if ($(httpRefererFieldTargetName).length > 0) { wpacuHttpRefererFieldVal = $(httpRefererFieldTargetName).val(); // Edit Taxonomy page (after submit) if (wpacuHttpRefererFieldVal.includes('term.php?taxonomy=') && wpacuHttpRefererFieldVal.includes('message=')) { $.fn.wpAssetCleanUpClearCache().wpacuAjaxClearCache(); } // Edit (Post/Page/Custom Post type) page (after submit) if (wpacuHttpRefererFieldVal.includes('post.php?post=') && wpacuHttpRefererFieldVal.includes('message=')) { $.fn.wpAssetCleanUpClearCache().wpacuAjaxClearCache(); } } } catch (e) { console.log(e); } }, wpacuAjaxClearCache: function() { /** * Called after a post/page is saved (WordPress AJAX call) */ if (typeof wpacu_object.wpacu_ajax_preload_url_nonce === 'undefined') { return; } // Is the post status a "draft" one? Do not do any cache clearing and preloading as it's useless let $wpacuHiddenPostStatusEl = '#hidden_post_status'; if ($($wpacuHiddenPostStatusEl).length > 0 && $($wpacuHiddenPostStatusEl).val() === 'draft') { return; } $.get(wpacu_object.ajax_url, { 'action' : wpacu_object.plugin_prefix + '_clear_cache', 'time_r' : new Date().getTime(), 'wpacu_nonce' : wpacu_object.wpacu_ajax_clear_cache_nonce }, function (response) { setTimeout(function() { $.fn.wpAssetCleanUpClearCache().wpacuClearAutoptimizeCache(); // Autoptimize (if active) // "Cache Enabler" (if active) cache was already cleared in classes/Update::ajaxClearCache() during the AJAX call if (wpacu_object.is_frontend_view) { // Preload (for the guest) // The preload for the admin is not needed as the user is managing the CSS/JS in the front-end view and the page has been already visited $.post(wpacu_object.ajax_url, { 'action': wpacu_object.plugin_prefix + '_preload', 'page_url': wpacu_object.page_url, 'wpacu_nonce': wpacu_object.wpacu_ajax_preload_url_nonce, 'time_r': new Date().getTime() }); } else { // Preload (for the admin) $.get(wpacu_object.page_url, { 'wpacu_preload': 1, 'wpacu_no_frontend_show': 1, 'time_r': new Date().getTime() }, function () { // Then, preload (for the guest) $.post(wpacu_object.ajax_url, { 'action': wpacu_object.plugin_prefix + '_preload', 'page_url': wpacu_object.page_url, 'wpacu_nonce': wpacu_object.wpacu_ajax_preload_url_nonce, 'time_r': new Date().getTime() }); }); } }, 150); }); }, wpacuClearAutoptimizeCache: function() { if (typeof wpacu_object.autoptimize_not_active !== 'undefined') { return; // Autoptimize is not activated, thus do not continue } if (wpacu_object.clear_autoptimize_cache == 'false') { console.log(wpacu_object.plugin_title + ': Autoptimize cache clearing is deactivated via "WPACU_DO_NOT_ALSO_CLEAR_AUTOPTIMIZE_CACHE" constant.'); return; } let wpacuAutoptimizeClickEl = '#wp-admin-bar-autoptimize-default li'; // Autoptimize elements & variables: make sure they are all initialized if ($(wpacuAutoptimizeClickEl).length > 0 && typeof autoptimize_ajax_object.ajaxurl !== 'undefined' && typeof autoptimize_ajax_object.nonce !== 'undefined') { $.ajax({ type : 'GET', url : autoptimize_ajax_object.ajaxurl, data : {'action' : 'autoptimize_delete_cache', 'nonce' : autoptimize_ajax_object.nonce}, dataType : 'json', cache : false, timeout : 9000, success : function( cleared ) {}, error : function( jqXHR, textStatus ) {} }); } }, wpacuClearCacheEnablerCache: function() { if (typeof wpacu_object.cache_enabler_not_active !== 'undefined') { return; // Autoptimize is not activated, thus do not continue } if (wpacu_object.clear_cache_enabler_cache == 'false') { console.log(wpacu_object.plugin_title + ': "Cache Enabler" cache clearing is deactivated via "WPACU_DO_NOT_ALSO_CLEAR_CACHE_ENABLER_CACHE" constant.'); return; } let sendParams = { 'action' : wpacu_object.plugin_prefix + '_cache_enabler_clear_cache', 'time_r' : new Date().getTime(), // avoid any caching 'wpacu_nonce' : wpacu_object.wpacu_ajax_clear_cache_enabler_cache_nonce }; $.get(wpacu_object.ajax_url, sendParams, function (response) {}); } } } $.fn.wpAssetCleanUpClearCache().init(); $.fn.wpAssetCleanUp().wpacuTriggerAdjustTextAreaHeightAllTextareas(); /* * [START] Bulk Changes */ $.fn.wpAssetCleanUpBulkChangesArea = function() { return { actions: function() { // Items are marked for removal from the unload list // from either "Everywhere" or "Post Type" $(document).on('click', '.wpacu_bulk_rule_checkbox, .wpacu_remove_preload', function() { let $wpacuBulkChangeRow = $(this).parents('.wpacu_bulk_change_row'); if ($(this).prop('checked')) { $wpacuBulkChangeRow.addClass('wpacu_selected'); } else { $wpacuBulkChangeRow.removeClass('wpacu_selected'); } }); $(document).on('change', '#wpacu_post_type_select', function() { $('#wpacu_post_type_form').trigger('submit'); }); } } } $.fn.wpAssetCleanUpBulkChangesArea().actions(); /* * [END] Bulk Changes */ }); (function($){ $(window).on('load', function() { $.fn.wpAssetCleanUp().wpacuCheckSourcesFor404Errors(); }); })(jQuery); // // [END] Core file //