Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/joomla5/media/com_scheduler/js/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/joomla5/media/com_scheduler/js/admin-view-run-test-task.js

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();
});