wp_back/wp-content/plugins/shortpixel-image-optimiser/res/js/shortpixel-settings.js
2024-05-20 15:37:46 +03:00

729 lines
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict'
// New Class for Settings Section.
var ShortPixelSettings = function()
{
this.Init = function()
{
this.InitActions();
this.SaveOnKey();
}
this.InitActions = function()
{
var toggles = document.querySelectorAll('[data-toggle]');
var self = this;
toggles.forEach(function (toggle, index)
{
toggle.addEventListener('change', self.DoToggleAction.bind(self));
var evInit = new CustomEvent('change', {detail : { init: true }} );
toggle.dispatchEvent(evInit);
});
// Modals
var modals = document.querySelectorAll('[data-action="open-modal"]');
modals.forEach(function (modal, index)
{
modal.addEventListener('click', self.OpenModal.bind(self));
});
// Events for the New Exclusion dialog
var newExclusionInputs = document.querySelectorAll('.new-exclusion select, .new-exclusion input, .new-exclusion button, input[name="removeExclusion"], button[name="cancelEditExclusion"]');
newExclusionInputs.forEach(function (input)
{
switch (input.name)
{
case 'addExclusion':
case 'removeExclusion':
case 'cancelEditExclusion':
case 'updateExclusion':
var eventType = 'click';
break;
default:
var eventType = 'change';
break;
}
input.addEventListener(eventType, self.NewExclusionUpdateEvent.bind(self));
});
var exclusionItems = document.querySelectorAll('.exclude-list li');
exclusionItems.forEach(function (input) {
if (false == input.classList.contains('no-exclusion-item'))
{
input.addEventListener('click', self.NewExclusionShowInterfaceEvent.bind(self));
}
});
var addNewExclusionButton = document.querySelector('.new-exclusion-button');
if (addNewExclusionButton !== null)
{
addNewExclusionButton.addEventListener('click', this.NewExclusionShowInterfaceEvent.bind(this));
}
}
this.DoToggleAction = function(event)
{
event.preventDefault();
var checkbox = event.target;
var target = document.getElementById(checkbox.getAttribute('data-toggle'));
if (typeof checkbox.dataset.toggleReverse !== 'undefined')
{
var checked = ! checkbox.checked;
}
else {
var checked = checkbox.checked;
}
if (target === null)
{
console.error('Target element ID not found', checkbox);
return false;
}
if (checked)
{
// target.classList.add('is-visible');
this.ShowElement(target);
}
else
{
this.HideElement(target);
// target.classList.remove('is-visible');
}
}
this.ShowElement = function (elem) {
// Get the natural height of the element
var getHeight = function () {
elem.style.display = 'block'; // Make it visible
var height = elem.scrollHeight + 'px'; // Get it's height
elem.style.display = ''; // Hide it again
return height;
};
var height = getHeight(); // Get the natural height
elem.classList.add('is-visible'); // Make the element visible
elem.style.height = height; // Update the max-height
// Once the transition is complete, remove the inline max-height so the content can scale responsively
window.setTimeout(function () {
elem.style.height = '';
}, 350);
};
// Hide an element
this.HideElement = function (elem) {
// Give the element a height to change from
elem.style.height = elem.scrollHeight + 'px';
// Set the height back to 0
window.setTimeout(function () {
elem.style.height = '0';
}, 1);
// When the transition is complete, hide it
window.setTimeout(function () {
elem.classList.remove('is-visible');
}, 350);
};
this.OpenModal = function(elem)
{
var target = elem.target;
var targetElem = document.getElementById(target.dataset.target);
if (! targetElem)
return;
var shade = document.getElementById('spioSettingsModalShade');
var modal = document.getElementById('spioSettingsModal');
shade.style.display = 'block';
modal.classList.remove('spio-hide');
var body = modal.querySelector('.spio-modal-body');
body.innerHTML = ('afterbegin', targetElem.innerHTML); //.cloneNode()
body.style.background = '#fff';
shade.addEventListener('click', this.CloseModal.bind(this), {'once': true} );
modal.querySelector('.spio-close-help-button').addEventListener('click', this.CloseModal.bind(this), {'once': true});
if (body.querySelector('[data-action="ajaxrequest"]') !== null)
{
body.querySelector('[data-action="ajaxrequest"]').addEventListener('click', this.SendModal.bind(this));
}
}
this.CloseModal = function(elem)
{
var shade = document.getElementById('spioSettingsModalShade');
var modal = document.getElementById('spioSettingsModal');
shade.style.display = 'none';
modal.classList.add('spio-hide');
}
this.SendModal = function(elem)
{
var modal = document.getElementById('spioSettingsModal');
var body = modal.querySelector('.spio-modal-body');
var inputs = body.querySelectorAll('input');
var data = {};
var validated = true;
for (var i = 0; i < inputs.length; i++)
{
data[inputs[i].name] = inputs[i].value;
if (typeof inputs[i].dataset.required !== 'undefined')
{
if (inputs[i].value !== inputs[i].dataset.required)
{
inputs[i].style.border = '1px solid #ff0000';
validated = false;
return false;
}
}
}
if (! validated)
return false;
data.callback = 'shortpixelSettings.receiveModal'
data.type = 'settings';
window.addEventListener('shortpixelSettings.receiveModal', this.ReceiveModal.bind(this), {'once': true} );
window.ShortPixelProcessor.AjaxRequest(data);
}
this.ReceiveModal = function(elem)
{
if (typeof elem.detail.settings.results !== 'undefined')
{
var modal = document.getElementById('spioSettingsModal');
var body = modal.querySelector('.spio-modal-body');
body.innerHTML = elem.detail.settings.results;
}
if (typeof elem.detail.settings.redirect !== 'undefined')
{
window.location.href = elem.detail.settings.redirect;
}
}
this.SaveOnKey = function()
{
var saveForm = document.getElementById('wp_shortpixel_options');
if (saveForm === null)
return false; // no form no save.
window.addEventListener('keydown', function(event) {
if (! (event.key == 's' || event.key == 'S') || ! event.ctrlKey)
{
return true;
}
document.getElementById('wp_shortpixel_options').submit();
event.preventDefault();
return false;
});
}
this.NewExclusionShowInterfaceEvent = function (event)
{
this.ResetExclusionInputs();
event.preventDefault();
var element = document.querySelector('.new-exclusion');
element.classList.remove('not-visible', 'hidden');
var cancelButton = document.querySelector('.new-exclusion .button-actions button[name="cancelEditExclusion"]');
cancelButton.classList.remove('not-visible', 'hidden');
var updateButton = document.querySelector('.new-exclusion .button-actions button[name="updateExclusion"]');
if (event.target.name == 'addNewExclusion')
{
var mode = 'new';
var id = 'new';
var title = document.querySelector('.new-exclusion h3.new-title');
var button = document.querySelector('.new-exclusion .button-actions button[name="addExclusion"]');
}
else {
var mode = 'edit';
if (event.target.id)
{
var id = event.target.id;
var parent = event.target;
}
else {
var id = event.target.parentElement.id;
var parent = event.target.parentElement;
}
var title = document.querySelector('.new-exclusion h3.edit-title');
var button = document.querySelector('.new-exclusion .button-actions button[name="removeExclusion"]');
var input = document.querySelector('.new-exclusion input[name="edit-exclusion"]')
updateButton.classList.remove('not-visible', 'hidden');
input.value = id;
var dataElement = parent.querySelector('input').value;
var data = JSON.parse(dataElement);
this.ReadWriteExclusionForm(data)
}
title.classList.remove('not-visible', 'hidden');
button.classList.remove('not-visible', 'hidden');
}
this.HideExclusionInterface = function()
{
var element = document.querySelector('.new-exclusion');
element.classList.add('not-visible');
}
// EXCLUSIONS
this.NewExclusionUpdateEvent = function(event)
{
var target = event.target;
var inputName = event.target.name;
switch(inputName)
{
case 'exclusion-type':
this.NewExclusionUpdateType(target);
break;
case 'apply-select':
this.NewExclusionUpdateThumbType(target);
break;
case 'addExclusion':
this.NewExclusionButtonAdd(target);
break;
case 'exclusion-exactsize':
this.NewExclusionToggleSizeOption(target);
break;
case 'removeExclusion':
this.RemoveExclusion(target);
break;
case 'cancelEditExclusion':
this.HideExclusionInterface();
break;
case 'updateExclusion':
this.UpdateExclusion();
break;
}
}
this.NewExclusionUpdateType = function(element)
{
var value = element.value;
var selected = element.options[element.selectedIndex];
var example = selected.dataset.example;
if ( typeof example == 'undefined')
{
example = '';
}
var valueOption = document.querySelector('.new-exclusion .value-option');
var sizeOption = document.querySelector('.new-exclusion .size-option');
var regexOption = document.querySelector('.regex-option');
var switchExactOption = document.querySelector('.exact-option');
if (value == 'size')
{
valueOption.classList.add('not-visible');
sizeOption.classList.remove('not-visible');
switchExactOption.classList.remove('not-visible');
regexOption.classList.add('not-visible');
}
else {
valueOption.classList.remove('not-visible');
sizeOption.classList.add('not-visible');
switchExactOption.classList.add('not-visible');
regexOption.classList.remove('not-visible');
}
var valueInput = document.querySelector('input[name="exclusion-value"]');
if (null !== valueInput)
{
valueInput.placeholder = example;
}
}
this.NewExclusionUpdateThumbType = function(element)
{
var value = element.value;
var thumbSelect = document.querySelector('select[name="thumbnail-select"]');
if (value == 'selected-thumbs')
{
thumbSelect.classList.remove('not-visible');
}
else {
thumbSelect.classList.add('not-visible');
}
}
this.ReadWriteExclusionForm = function(setting)
{
// compile all inputs to a json encoded string to add to UX
if (null === setting || typeof setting === 'undefined')
{
var setting = {
'type' : '',
'value' : '',
'apply' : '',
};
var mode = 'read';
}
else {
var mode = 'write';
}
var strings = {};
var typeOption = document.querySelector('.new-exclusion select[name="exclusion-type"]');
var valueOption = document.querySelector('.new-exclusion input[name="exclusion-value"]');
var applyOption = document.querySelector('.new-exclusion select[name="apply-select"]');
var regexOption = document.querySelector('.new-exclusion input[name="exclusion-regex"]');
if ('read' === mode)
{
setting.type = typeOption.value;
setting.value = valueOption.value;
setting.apply = applyOption.value;
strings.type = typeOption.options[typeOption.selectedIndex].innerText;
strings.apply = applyOption.options[applyOption.selectedIndex].innerText;
}
else {
if (setting.type.indexOf('regex') != -1)
{
typeOption.value = setting.type.replace('regex-', '');
}
else {
typeOption.value = setting.type;
}
valueOption.value = setting.value;
applyOption.value = setting.apply;
}
// When selected thumbnails option is selected, add the thumbnails to the list.
if ('selected-thumbs' == applyOption.value)
{
var thumbOption = document.querySelector('.new-exclusion select[name="thumbnail-select"]');
var thumblist = [];
if ('read' === mode)
{
for(var i =0; i < thumbOption.selectedOptions.length; i++)
{
thumblist.push(thumbOption.selectedOptions[i].value);
}
setting.thumblist = thumblist;
}
else if ('write' === mode){
for (var i = 0; i < thumbOption.options.length; i++)
{
if (setting.thumblist.indexOf(thumbOption[i].value) != -1)
{
thumbOption[i].selected = true;
}
}
this.NewExclusionUpdateThumbType(applyOption);
}
}
// Check for regular expression active on certain types
if ('read' === mode && true === regexOption.checked && (typeOption.value == 'name' || typeOption.value == 'path'))
{
setting.type = 'regex-' + setting.type;
}
else if ('write' === mode)
{
if (setting.type.indexOf('regex') != -1)
{
regexOption.checked = true;
}
}
// Options for size setting
if ('size' === setting.type)
{
var exactOption = document.querySelector('.new-exclusion input[name="exclusion-exactsize"]');
var width = document.querySelector('.new-exclusion input[name="exclusion-width"]');
var height = document.querySelector('.new-exclusion input[name="exclusion-height"]');
var minwidth = document.querySelector('.new-exclusion input[name="exclusion-minwidth"]');
var maxwidth = document.querySelector('.new-exclusion input[name="exclusion-maxwidth"]');
var minheight = document.querySelector('.new-exclusion input[name="exclusion-minheight"]');
var maxheight = document.querySelector('.new-exclusion input[name="exclusion-maxheight"]');
if ('read' === mode)
{
if (true === exactOption.checked)
{
setting.value = width.value + 'x' + height.value;
}
else {
setting.value = minwidth.value + '-' + maxwidth.value + 'x' + minheight.value + '-' + maxheight.value;
}
}
else if ('write' === mode)
{
var value = setting.value;
var split = value.split(/(x|×|X)/);
if (value.indexOf('-') === -1)
{
exactOption.checked = true;
width.value = split[0]; // in this split 1 is the X symbol
height.value = split[2];
}
else {
var widths = split[0].split('-'); // split the split for widths
var heights = split[2].split('-');
minwidth.value = widths[0];
maxwidth.value = widths[1];
minheight.value = heights[0];
maxheight.value = heights[1];
}
this.NewExclusionUpdateType(typeOption)
this.NewExclusionToggleSizeOption(exactOption);
}
}
if ('read' === mode)
{
return [setting, strings];
}
}
this.NewExclusionButtonAdd = function(element)
{
var result = this.ReadWriteExclusionForm(null);
var setting = result[0];
var strings = result[1];
var listElement = document.querySelector('.exclude-list');
var newElement = document.createElement('li');
var inputElement = document.createElement('input');
var newIndexInput = document.getElementById('new-exclusion-index');
var newIndex = parseInt(newIndexInput.value) + 1;
newIndexInput.value = newIndex;
newElement.id = 'exclude-' + newIndex;
newElement.addEventListener('click', this.NewExclusionShowInterfaceEvent.bind(this));
inputElement.type = 'hidden';
inputElement.name = 'exclusions[]';
inputElement.value = JSON.stringify(setting);
newElement.appendChild(inputElement);
var spans = [strings.type, setting.value, strings.apply];
for (var i = 0; i < spans.length; i++)
{
var spanElement = document.createElement('span');
spanElement.textContent = spans[i];
newElement.appendChild(spanElement);
}
listElement.appendChild(newElement);
var noItemsItem = document.querySelector('.exclude-list .no-exclusion-item');
if (noItemsItem !== null)
{
noItemsItem.classList.add('not-visible');
}
this.ResetExclusionInputs();
this.HideExclusionInterface();
this.ShowExclusionSaveWarning();
}
this.NewExclusionToggleSizeOption = function(target)
{
var sizeOptionRange = document.querySelector('.new-exclusion .size-option-range');
var sizeOptionExact = document.querySelector('.new-exclusion .size-option-exact');
if (true === target.checked)
{
sizeOptionRange.classList.add('not-visible');
sizeOptionExact.classList.remove('not-visible');
}
else {
sizeOptionRange.classList.remove('not-visible');
sizeOptionExact.classList.add('not-visible');
}
}
this.ResetExclusionInputs = function()
{
var typeOption = document.querySelector('.new-exclusion select[name="exclusion-type"]');
var valueOption = document.querySelector('.new-exclusion input[name="exclusion-value"]');
var applyOption = document.querySelector('.new-exclusion select[name="apply-select"]');
var inputs = document.querySelectorAll('.new-exclusion input, .new-exclusion select');
for (var i = 0; i < inputs.length; i++)
{
var input = inputs[i];
if (input.tagName == 'SELECT')
{
input.selectedIndex = 0;
}
else if (input.type == 'checkbox')
{
input.checked = false;
}
else {
input.value = '';
}
}
var ev = new CustomEvent('change');
typeOption.dispatchEvent(ev);
applyOption.dispatchEvent(ev);
// reset title and buttons.
var titles = document.querySelectorAll('.new-exclusion h3');
var buttons = document.querySelectorAll('.new-exclusion .button-actions button');
for(var i = 0; i < titles.length; i++)
{
titles[i].classList.add('not-visible', 'hidden');
}
for (var i = 0; i < buttons.length; i++)
{
buttons[i].classList.add('not-visible', 'hidden');
}
var exactOption = document.querySelector('.new-exclusion input[name="exclusion-exactsize"]');
exactOption.checked = false
}
this.UpdateExclusion = function()
{
var id = document.querySelector('.new-exclusion input[name="edit-exclusion"]');
var result = this.ReadWriteExclusionForm();
var setting = result[0];
var strings = result[1];
if (id)
{
var element = document.querySelector('.exclude-list #' +id.value + ' input');
var liElement = document.querySelector('.exclude-list #' +id.value);
var removeChildren = [];
if (null !== element)
{
element.value = JSON.stringify(setting);
// Can't directly remove children, because it messes with the collection index.
Array.from(liElement.children).forEach ( function (child, index){
if (child.tagName == 'SPAN')
{
removeChildren.push(child)
}
});
for(var i = 0; i < removeChildren.length; i++ )
{
removeChildren[i].remove();
}
var spans = [strings.type, setting.value, strings.apply];
for (var j = 0; j < spans.length; j++)
{
var spanElement = document.createElement('span');
spanElement.textContent = spans[j];
liElement.appendChild(spanElement);
}
}
}
this.HideExclusionInterface();
this.ShowExclusionSaveWarning();
}
this.ShowExclusionSaveWarning = function()
{
var reminder = document.querySelector('.exclusion-save-reminder');
if (reminder)
{
reminder.classList.remove('hidden');
}
}
this.RemoveExclusion = function()
{
var id = document.querySelector('.new-exclusion input[name="edit-exclusion"]');
if (id)
{
var element = document.querySelector('.exclude-list #' +id.value);
if (null !== element)
{
element.remove();
}
}
this.HideExclusionInterface();
this.ShowExclusionSaveWarning();
}
this.Init();
} // SPSettings
document.addEventListener("DOMContentLoaded", function(){
var s = new ShortPixelSettings();
});