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

545 lines
15 KiB
JavaScript

'use strict';
// MainScreen as an option for delegate functions
class ShortPixelScreen extends ShortPixelScreenItemBase
{
isCustom = true;
isMedia = true;
type = 'custom';
folderTree = null;
currentSelectedPath = null;
stopSignal = false;
Init()
{
super.Init();
this.InitFolderSelector();
this.InitScanButtons();
this.InitFileScreenAction();
}
RenderItemView(e)
{
var data = e.detail;
if (data.custom)
{
var id = data.custom.id;
var element = document.getElementById('sp-msg-' + id);
element.outerHTML = data.custom.itemView;
var isOptimizable = data.custom.is_optimizable;
var isRestorable = data.custom.is_restorable;
var inputSelect = document.querySelector('.item-' + id + ' input[name="select[]"]');
if (null === inputSelect)
{
console.warn('Checkbox not found ' + id);
}
inputSelect.classList.remove('is-optimizable', 'is-restorable');
if (true === isOptimizable)
inputSelect.classList.add('is-optimizable');
if (true === isRestorable)
inputSelect.classList.add('is-restorable');
}
return false;
}
// Check if the processor needs to start when items are being added / folders refreshed
CheckProcessorStart()
{
// If automedia is active, see if something is to process.
if (this.processor.IsAutoMediaActive())
{
this.processor.SetInterval(-1);
this.processor.RunProcess();
}
}
RefreshFolder(id)
{
var data = {};
data.id = id;
data.type = 'folder';
data.screen_action = 'refreshFolder';
data.callback = 'shortpixel.folder.HandleFolderResult';
window.addEventListener('shortpixel.folder.HandleFolderResult', this.HandleFolderResult.bind(this), {'once':true});
// AjaxRequest should return result, which will go through Handleresponse, then LoaditemView.
this.processor.AjaxRequest(data);
}
StopMonitoringFolder(id)
{
if (confirm('Are you sure you want to stop optimizing this folder? '))
{
var data = {};
data.id = id;
data.type = 'folder';
data.screen_action = 'removeCustomFolder';
data.callback = 'shortpixel.folder.HandleFolderResult';
window.addEventListener('shortpixel.folder.HandleFolderResult', this.HandleFolderResult.bind(this), {'once':true});
this.processor.AjaxRequest(data);
}
}
HandleFolderResult(e)
{
var data = e.detail;
if (data.folder)
{
var folder_id = data.folder.id;
if (data.folder.message)
{
var el = document.querySelector('.shortpixel-other-media .item.item-' + folder_id + ' .status');
if (null !== el)
{
el.innerHTML = data.folder.message;
}
else {
console.error('Status Element not found for ' + folder_id);
}
}
if (data.folder.fileCount)
{
var el = document.querySelector('.shortpixel-other-media .item.item-' + folder_id + ' .files-number');
if (null !== el)
{
el.innerText = data.folder.fileCount;
}
else {
console.error('FileCount Element not found for ' + folder_id);
}
}
if (data.folder.action == 'remove')
{
if (true == data.folder.is_done)
{
var el = document.querySelector('.shortpixel-other-media .item.item-' + folder_id);
if ( null !== el)
{
el.remove();
}
else {
console.error('Row Element not found for ' + folder_id);
}
}
}
}
this.CheckProcessorStart();
}
InitScanButtons()
{
var scanButtons = document.querySelectorAll('.scan-button');
var self = this;
if (null !== scanButtons)
{
scanButtons.forEach(function (scanButton) {
scanButton.addEventListener('click', self.StartFolderScanEvent.bind(self));
});
}
var stopButton = document.querySelector('.scan-actions .stop-button');
if (null !== stopButton)
{
stopButton.addEventListener('click', this.StopScanEvent.bind(this));
}
}
InitFolderSelector()
{
var openModalButton = document.querySelector('.open-selectfolder-modal');
if (null !== openModalButton)
{
openModalButton.addEventListener('click', this.OpenFolderModal.bind(this));
}
var closeModalButtons = document.querySelectorAll('.shortpixel-modal input.select-folder-cancel, .sp-folder-picker-shade');
var self = this;
closeModalButtons.forEach(function (button, index)
{
button.addEventListener('click', self.CloseFolderModal.bind(self));
});
var addFolderButton = document.querySelector('.modal-folder-picker .select-folder')
if (null !== addFolderButton)
{
addFolderButton.addEventListener('click', this.AddNewFolderEvent.bind(this));
}
}
InitFileScreenAction()
{
var selectAll = document.querySelector('input[name="select-all"]');
if (null !== selectAll)
selectAll.addEventListener('change', this.SelectAllItemsEvent.bind(this));
var bulkAction = document.querySelector('button[name="doBulkAction"]');
if (null !== bulkAction)
bulkAction.addEventListener('click', this.BulkActionEvent.bind(this));
}
SelectAllItemsEvent(event)
{
var parent = event.target;
var inputs = document.querySelectorAll('input[name="select[]"]');
var toggle = (true === parent.checked) ? true : false;
for(var i = 0; i < inputs.length; i++)
{
inputs[i].checked = toggle;
}
}
BulkActionEvent(event)
{
event.preventDefault();
var target = event.target;
var items = document.querySelectorAll('input[name="select[]"]:checked');
var selectBox = document.querySelector('select[name="bulk-actions"]');
var selectedAction = selectBox.options[selectBox.selectedIndex];
selectBox.selectedIndex = 0; // Return to default
var action = selectedAction.value;
for (var i = 0; i < items.length; i++)
{
var item = items[i];
if (false == item.checked) // failsafe
{
continue;
}
var item_id = item.value;
if ('optimize' === action)
{
if (item.classList.contains('is-optimizable'))
{
this.Optimize(item_id);
}
}
else if ('restore' === action)
{
if (item.classList.contains('is-restorable'))
{
this.RestoreItem(item_id);
}
}
else if ('mark-completed' === action)
{
if (item.classList.contains('is-optimizable'))
{
this.MarkCompleted(item_id);
}
}
else {
}
item.checked = false;
}
var selectAll = document.querySelector('input[name="select-all"]');
selectAll.checked = false;
}
OpenFolderModal()
{
var shade = document.querySelector(".sp-folder-picker-shade");
// this.FadeIn(shade, 500);
this.Show(shade);
var picker = document.querySelector(".shortpixel-modal.modal-folder-picker");
picker.classList.remove('shortpixel-hide');
picker.style.display = 'block';
var picker = document.querySelector(".sp-folder-picker");
if (null === this.folderTree)
{
this.folderTree = new ShortPixelFolderTree(picker, this.processor);
picker.addEventListener('shortpixel-folder.selected', this.HandleFolderSelectedEvent.bind(this));
}
this.Show(picker);
}
HandleFolderSelectedEvent(event)
{
var data = event.detail;
var relpath = data.relpath;
var selectedField = document.querySelector('.sp-folder-picker-selected');
selectedField.textContent = relpath;
this.currentSelectedPath = relpath;
if (null !== this.currentSelectedPath)
{
var addFolderButton = document.querySelector('.modal-folder-picker .select-folder');
if (null !== addFolderButton)
{
addFolderButton.disabled = false;
}
}
}
CloseFolderModal()
{
var shade = document.querySelector(".sp-folder-picker-shade");
this.Hide(shade);
// @todo FadeOut function here
var picker = document.querySelector('.shortpixel-modal.modal-folder-picker');
this.Hide(picker);
}
AddNewFolderEvent(event)
{
var data = {};
data.relpath = this.currentSelectedPath;
data.type = 'folder';
data.screen_action = 'addCustomFolder';
data.callback = 'shortpixel.folder.AddNewDirectory';
// @todo this message logic should prob. become part of the folder selector js proper.
var messageEl = document.querySelector('.modal-folder-picker .folder-message');
if (null !== messageEl)
{
if ( false == messageEl.classList.contains('hidden'))
{
messageEl.classList.add('hidden');
}
}
window.addEventListener('shortpixel.folder.AddNewDirectory', this.UpdateFolderViewEvent.bind(this), {'once':true});
this.processor.AjaxRequest(data);
}
UpdateFolderViewEvent(event)
{
var data = event.detail;
// not for us.
if (false === data.folder)
return false;
if (data.folder.result && data.folder.result.itemView)
{
var element = document.querySelector('.list-overview .item');
var elementHeading = document.querySelector('.list-overview .heading');
if (null !== element)
{
element.insertAdjacentHTML('beforebegin', data.folder.result.itemView);
}
else if (null !== elementHeading) // In case list is empty.
{
elementHeading.insertAdjacentHTML('afterend', data.folder.result.itemView);
var noitems = document.querySelector('.list-overview .no-items');
if (null !== noitems)
noitems.remove();
}
this.CloseFolderModal();
this.CheckProcessorStart();
}
else if (data.folder.is_error == true && data.folder.message)
{
var messageEl = document.querySelector('.modal-folder-picker .folder-message');
if (null !== messageEl)
{
messageEl.textContent = data.folder.message;
messageEl.classList.remove('hidden');
}
}
}
StartFolderScanEvent(event)
{
var element = event.target;
this.stopSignal = false;
this.ToggleScanInterface(true);
var force = false;
if ('mode' in element.dataset)
{
var force = true;
}
var reportElement = document.querySelector('.scan-area .result-table');
while(reportElement.firstChild)
{
reportElement.firstChild.remove();
}
var args = [];
args.force = force;
if (true === force)
{
var data = {};
data.type = 'folder';
data.screen_action = 'resetScanFolderChecked';
data.callback = 'shortpixel.folder.ScanFolder';
window.addEventListener('shortpixel.folder.ScanFolder', this.ScanFolder.bind(this, args), {'once':true});
this.processor.AjaxRequest(data);
}
else {
this.ScanFolder(args);
}
}
ScanFolder(args)
{
if (true === this.stopSignal)
{
return false;
}
var data = {};
data.type = 'folder';
data.screen_action = 'scanNextFolder';
data.callback = 'shortpixel.folder.ScannedDirectoryEvent';
if (true === args.force)
{
data.force = args.force;
}
window.addEventListener('shortpixel.folder.ScannedDirectoryEvent', this.ScannedDirectoryEvent.bind(this, args), {'once':true});
this.processor.AjaxRequest(data);
}
ScannedDirectoryEvent(args, event)
{
var data = event.detail;
data = data.folder;
var reportElement = document.querySelector('.scan-area .result-table');
if ( null === reportElement)
{
console.error('Something wrong with reporting element');
return false;
}
if (data.is_done === true)
{
// @todo Probably emit some done status here
var div = document.createElement('div');
div.classList.add('message');
div.textContent = data.result.message;
this.ToggleScanInterface(false);
reportElement.appendChild(div);
}
else if (data.result)
{
var div = document.createElement('div');
var span_path = document.createElement('span');
var span_filecount = document.createElement('span');
var span_message = document.createElement('span');
span_path.textContent = data.result.path;
span_filecount.textContent = data.result.new_count;
span_message.textContent = data.result.message;
div.appendChild(span_path);
div.appendChild(span_filecount);
div.appendChild(span_message);
reportElement.appendChild(div);
var self = this;
setTimeout( function () { self.ScanFolder(args) }, 200);
}
}
StopScanEvent(event)
{
this.stopSignal = true;
var reportElement = document.querySelector('.scan-area .result-table');
if ( null === reportElement)
{
console.error('Something wrong with reporting element');
return false;
}
var div = document.createElement('div');
div.classList.add('message');
div.textContent = this.strings.stopActionMessage;
reportElement.appendChild(div);
this.ToggleScanInterface(false);
}
ToggleScanInterface(show)
{
if (typeof show === 'undefined')
{
var show = true;
}
var divs = document.querySelectorAll('.scan-actions > div');
divs.forEach(function(div){
if (div.classList.contains('action-scan') && true === show)
{
div.classList.add('not-visible');
}
else if (div.classList.contains('action-scan') && false === show) {
div.classList.remove('not-visible');
}
else if ( div.classList.contains('action-stop') && true === show)
{
div.classList.remove('not-visible');
}
else {
div.classList.add('not-visible');
}
});
var output = document.querySelector('.scan-area .output');
if (null !== output && true === show)
{
output.classList.remove('not-visible');
}
}
} // class