first commit
This commit is contained in:
79
media/com_scheduler/js/admin-view-run-test-task.js
Normal file
79
media/com_scheduler/js/admin-view-run-test-task.js
Normal file
@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
/**
|
||||
* Provides the manual-run functionality for tasks over the com_scheduler administrator backend.
|
||||
*
|
||||
* @package Joomla.Components
|
||||
* @subpackage Scheduler.Tasks
|
||||
*
|
||||
* @since 4.1.0
|
||||
*/
|
||||
if (!window.Joomla) {
|
||||
throw new Error('Joomla API was not properly initialised');
|
||||
}
|
||||
const initRunner = () => {
|
||||
const paths = Joomla.getOptions('system.paths');
|
||||
const token = Joomla.getOptions('com_scheduler.test-task.token');
|
||||
const uri = `${paths ? `${paths.base}/index.php` : window.location.pathname}?option=com_ajax&format=json&plugin=RunSchedulerTest&group=system&id=%d${token ? `&${token}=1` : ''}`;
|
||||
const modal = document.getElementById('scheduler-test-modal');
|
||||
|
||||
// Task output template
|
||||
const template = `
|
||||
<h4 class="scheduler-headline">${Joomla.Text._('COM_SCHEDULER_TEST_RUN_TASK')}</h4>
|
||||
<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_STARTED')}</div>
|
||||
<div class="mt-3 text-center"><span class="fa fa-spinner fa-spin fa-lg"></span></div>
|
||||
`;
|
||||
const sanitiseTaskOutput = text => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br>$2');
|
||||
|
||||
// Trigger the task through a GET request, populate the modal with output on completion.
|
||||
const triggerTaskAndShowOutput = e => {
|
||||
const button = e.relatedTarget;
|
||||
const id = parseInt(button.dataset.id, 10);
|
||||
const {
|
||||
title
|
||||
} = button.dataset;
|
||||
modal.querySelector('.modal-title').innerHTML = Joomla.Text._('COM_SCHEDULER_TEST_RUN_TITLE').replace('%d', id.toString());
|
||||
modal.querySelector('.modal-body > div').innerHTML = template.replace('%s', title);
|
||||
Joomla.request({
|
||||
url: uri.replace('%d', id.toString()),
|
||||
onSuccess: (data, xhr) => {
|
||||
[].slice.call(modal.querySelectorAll('.modal-body > div > div')).forEach(el => {
|
||||
el.parentNode.removeChild(el);
|
||||
});
|
||||
const output = JSON.parse(data);
|
||||
if (output && output.success && output.data) {
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_COMPLETED')}</div>`;
|
||||
if (output.data.duration > 0) {
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_DURATION').replace('%s', output.data.duration.toFixed(2))}</div>`;
|
||||
}
|
||||
if (output.data.output) {
|
||||
const result = Joomla.sanitizeHtml(output.data.output, null, sanitiseTaskOutput);
|
||||
|
||||
// Can use an indication for non-0 exit codes
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_OUTPUT').replace('%s', result)}</div>`;
|
||||
}
|
||||
} else {
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_TERMINATED')}</div>`;
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_OUTPUT').replace('%s', Joomla.Text._('JLIB_JS_AJAX_ERROR_OTHER').replace('%s', xhr.status))}</div>`;
|
||||
}
|
||||
},
|
||||
onError: xhr => {
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_STATUS_TERMINATED')}</div>`;
|
||||
const msg = Joomla.ajaxErrorsMessages(xhr);
|
||||
modal.querySelector('.modal-body > div').innerHTML += `<div>${Joomla.Text._('COM_SCHEDULER_TEST_RUN_OUTPUT').replace('%s', msg.error)}</div>`;
|
||||
}
|
||||
});
|
||||
};
|
||||
const reloadOnClose = () => {
|
||||
window.location.href = `${paths ? `${paths.base}/index.php` : window.location.pathname}?option=com_scheduler&view=tasks`;
|
||||
};
|
||||
if (modal) {
|
||||
modal.addEventListener('show.bs.modal', triggerTaskAndShowOutput);
|
||||
modal.addEventListener('hidden.bs.modal', reloadOnClose);
|
||||
}
|
||||
document.removeEventListener('DOMContentLoaded', initRunner);
|
||||
};
|
||||
document.addEventListener('DOMContentLoaded', initRunner);
|
||||
Reference in New Issue
Block a user