[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/plg_installer_packageinstaller/js/ -> packageinstaller.js (source)

   1  /**
   2   * @copyright   (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
   3   * @license     GNU General Public License version 2 or later; see LICENSE.txt
   4   */
   5  Joomla = window.Joomla || {};
   6  
   7  (Joomla => {
   8  
   9    document.addEventListener('DOMContentLoaded', () => {
  10      Joomla.submitbuttonpackage = () => {
  11        const form = document.getElementById('adminForm'); // do field validation
  12  
  13        if (form.install_package.value === '') {
  14          Joomla.renderMessages({
  15            warning: [Joomla.Text._('PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE')]
  16          });
  17        } else if (form.install_package.files[0].size > form.max_upload_size.value) {
  18          Joomla.renderMessages({
  19            warning: [Joomla.Text._('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG')]
  20          });
  21        } else {
  22          const loading = document.getElementById('loading');
  23  
  24          if (loading) {
  25            loading.classList.remove('hidden');
  26          }
  27  
  28          form.installtype.value = 'upload';
  29          form.submit();
  30        }
  31      };
  32  
  33      if (typeof FormData === 'undefined') {
  34        document.querySelector('#legacy-uploader').classList.remove('hidden');
  35        document.querySelector('#uploader-wrapper').classList.add('hidden');
  36        return;
  37      }
  38  
  39      let uploading = false;
  40      const dragZone = document.querySelector('#dragarea');
  41      const fileInput = document.querySelector('#install_package');
  42      const fileSizeMax = document.querySelector('#max_upload_size').value;
  43      const button = document.querySelector('#select-file-button');
  44      const returnUrl = document.querySelector('#installer-return').value;
  45      const progress = document.getElementById('upload-progress');
  46      const progressBar = progress.querySelector('.progress-bar');
  47      const percentage = progress.querySelector('.uploading-number');
  48      let uploadUrl = 'index.php?option=com_installer&task=install.ajax_upload';
  49  
  50      function showError(res) {
  51        dragZone.setAttribute('data-state', 'pending');
  52  
  53        let message = Joomla.Text._('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN');
  54  
  55        if (res == null) {
  56          message = Joomla.Text._('PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY');
  57        } else if (typeof res === 'string') {
  58          // Let's remove unnecessary HTML
  59          message = res.replace(/(<([^>]+)>|\s+)/g, ' ');
  60        } else if (res.message) {
  61          ({
  62            message
  63          } = res);
  64        }
  65  
  66        Joomla.renderMessages({
  67          error: [message]
  68        });
  69      }
  70  
  71      if (returnUrl) {
  72        uploadUrl += `&return=$returnUrl}`;
  73      }
  74  
  75      button.addEventListener('click', () => {
  76        fileInput.click();
  77      });
  78      fileInput.addEventListener('change', () => {
  79        if (uploading) {
  80          return;
  81        }
  82  
  83        Joomla.submitbuttonpackage();
  84      });
  85      dragZone.addEventListener('dragenter', event => {
  86        event.preventDefault();
  87        event.stopPropagation();
  88        dragZone.classList.add('hover');
  89        return false;
  90      }); // Notify user when file is over the drop area
  91  
  92      dragZone.addEventListener('dragover', event => {
  93        event.preventDefault();
  94        event.stopPropagation();
  95        dragZone.classList.add('hover');
  96        return false;
  97      });
  98      dragZone.addEventListener('dragleave', event => {
  99        event.preventDefault();
 100        event.stopPropagation();
 101        dragZone.classList.remove('hover');
 102        return false;
 103      });
 104      dragZone.addEventListener('drop', event => {
 105        event.preventDefault();
 106        event.stopPropagation();
 107  
 108        if (uploading) {
 109          return;
 110        }
 111  
 112        dragZone.classList.remove('hover');
 113        const files = event.target.files || event.dataTransfer.files;
 114  
 115        if (!files.length) {
 116          return;
 117        }
 118  
 119        const file = files[0];
 120        const data = new FormData();
 121  
 122        if (!file.type) {
 123          Joomla.renderMessages({
 124            error: [Joomla.Text._('PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE')]
 125          });
 126          return;
 127        }
 128  
 129        if (file.size > fileSizeMax) {
 130          Joomla.renderMessages({
 131            warning: [Joomla.Text._('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG')]
 132          });
 133          return;
 134        }
 135  
 136        data.append('install_package', file);
 137        data.append('installtype', 'upload');
 138        dragZone.setAttribute('data-state', 'uploading');
 139        progressBar.setAttribute('aria-valuenow', 0);
 140        uploading = true;
 141        progressBar.style.width = 0;
 142        percentage.textContent = '0'; // Upload progress
 143  
 144        const progressCallback = evt => {
 145          if (evt.lengthComputable) {
 146            const percentComplete = evt.loaded / evt.total;
 147            const number = Math.round(percentComplete * 100);
 148            progressBar.style.width = `$number}%`;
 149            progressBar.setAttribute('aria-valuenow', number);
 150            percentage.textContent = `$number}`;
 151  
 152            if (number === 100) {
 153              dragZone.setAttribute('data-state', 'installing');
 154            }
 155          }
 156        };
 157  
 158        Joomla.request({
 159          url: uploadUrl,
 160          method: 'POST',
 161          perform: true,
 162          data,
 163          onBefore: xhr => {
 164            xhr.upload.addEventListener('progress', progressCallback);
 165          },
 166          onSuccess: response => {
 167            if (!response) {
 168              showError(response);
 169              return;
 170            }
 171  
 172            let res;
 173  
 174            try {
 175              res = JSON.parse(response);
 176            } catch (e) {
 177              showError(e);
 178              return;
 179            }
 180  
 181            if (!res.success && !res.data) {
 182              showError(res);
 183              return;
 184            } // Always redirect that can show message queue from session
 185  
 186  
 187            if (res.data.redirect) {
 188              window.location.href = res.data.redirect;
 189            } else {
 190              window.location.href = 'index.php?option=com_installer&view=install';
 191            }
 192          },
 193          onError: error => {
 194            uploading = false;
 195  
 196            if (error.status === 200) {
 197              const res = error.responseText || error.responseJSON;
 198              showError(res);
 199            } else {
 200              showError(error.statusText);
 201            }
 202          }
 203        });
 204      });
 205      document.getElementById('installbutton_package').addEventListener('click', event => {
 206        event.preventDefault();
 207        Joomla.submitbuttonpackage();
 208      });
 209    });
 210  })(Joomla);


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer