wp_back/wp-content/plugins/shortpixel-image-optimiser/res/js/shortpixel-settings.js

729 lines
19 KiB
JavaScript
Raw Normal View History

2024-05-20 15:37:46 +03:00
'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();
});