Spade
Mini Shell
| Directory:~$ /home/lmsyaran/public_html/joomla5/media/com_scheduler/js/ |
| [Home] [System Details] [Kill Me] |
import JoomlaDialog from 'joomla.dialog';
/**
* @copyright (C) 2021 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
/**
* Helper to create an element
*
* @param {String} nodeName
* @param {String} text
* @param {Array} classList
* @returns {HTMLElement}
*/
const createEl = (nodeName, text = '', classList = []) => {
const el = document.createElement(nodeName);
el.textContent = text;
if (classList && classList.length) {
el.classList.add(...classList);
}
return el;
};
/**
* Trigger the task through a GET request
*
* @param {String} url
* @param {HTMLElement} resultContainer
*/
const runTheTask = (url, resultContainer) => {
const statusHolder =
resultContainer.querySelector('.scheduler-status');
const progressBar =
resultContainer.querySelector('.progress-bar');
const complete = success => {
progressBar.style.width = '100%';
progressBar.classList.add(success ? 'bg-success' :
'bg-danger');
setTimeout(() =>
progressBar.classList.remove('progress-bar-animated'), 500);
};
progressBar.style.width = '15%';
fetch(url, {
headers: {
'X-CSRF-Token': Joomla.getOptions('csrf.token',
'')
}
}).then(response => {
if (!response.ok) {
throw new
Error(Joomla.Text._('JLIB_JS_AJAX_ERROR_OTHER').replace('%s',
response.status).replace('%d', response.status));
}
return response.json();
}).then(output => {
if (!output.data) {
// The request was successful but the response is empty in some
reason
throw new
Error(Joomla.Text._('JLIB_JS_AJAX_ERROR_NO_CONTENT'));
}
statusHolder.textContent =
Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_COMPLETED');
if (output.data.duration > 0) {
resultContainer.appendChild(createEl('div',
Joomla.Text._('COM_SCHEDULER_TEST_RUN_DURATION').replace('%s',
output.data.duration.toFixed(2))));
}
if (output.data.output) {
resultContainer.appendChild(createEl('div',
Joomla.Text._('COM_SCHEDULER_TEST_RUN_OUTPUT').replace('%s',
'').replace('<br>', '')));
resultContainer.appendChild(createEl('pre',
output.data.output, ['bg-body', 'p-2']));
}
complete(true);
}).catch(error => {
complete(false);
statusHolder.textContent =
Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_TERMINATED');
resultContainer.appendChild(createEl('div', error.message,
['text-danger']));
});
};
// Listen on click over a task button to run a task
document.addEventListener('click', event => {
const button =
event.target.closest('button[data-scheduler-run]');
if (!button) return;
event.preventDefault();
// Get the task info from the button
const {
id,
title,
url
} = button.dataset;
// Prepare the initial popup content, by following template:
// <div class="p-3">
// <h4>Task: Task title</h4>
// <div class="mb-2 scheduler-status">Status: Task
Status</div>
// <div class="progress mb-2"><div
class="progress-bar progress-bar-striped
bg-success"></div></div>
// </div>
const content = (() => {
const body = createEl('div', '',
['p-3']);
const progress = createEl('div', '',
['progress', 'mb-2']);
const progressBar = createEl('div', '',
['progress-bar', 'progress-bar-striped',
'progress-bar-animated']);
body.appendChild(createEl('h4',
Joomla.Text._('COM_SCHEDULER_TEST_RUN_TASK').replace('%s',
title)));
body.appendChild(createEl('div',
Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_STARTED'),
['mb-2', 'scheduler-status']));
progress.appendChild(progressBar);
body.appendChild(progress);
progressBar.style.width = '0%';
return body;
})();
// Create dialog instance
const dialog = new JoomlaDialog({
popupType: 'inline',
textHeader:
Joomla.Text._('COM_SCHEDULER_TEST_RUN_TITLE').replace('%d',
id),
textClose: Joomla.Text._('JCLOSE'),
popupContent: content,
width: '800px',
height: 'fit-content'
});
// Run the task when dialog is ready
dialog.addEventListener('joomla-dialog:open', () => {
runTheTask(url, content);
});
// Reload the page when dialog is closed
dialog.addEventListener('joomla-dialog:close', () => {
window.location.reload();
});
dialog.show();
});