121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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();
 | |
| });
 |