[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/com_finder/js/ -> indexer.js (source)

   1  /**
   2   * @copyright  (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
   3   * @license    GNU General Public License version 2 or later; see LICENSE.txt
   4   */
   5  // eslint-disable no-alert
   6  ((Joomla, document) => {
   7  
   8    if (!Joomla) {
   9      throw new Error('core.js was not properly initialised');
  10    }
  11  
  12    Joomla.finderIndexer = () => {
  13      let getRequest;
  14      let totalItems = null;
  15      let offset = null;
  16      let progress = null;
  17      let optimized = false;
  18      const path = 'index.php?option=com_finder&tmpl=component&format=json';
  19      const token = `&$document.getElementById('finder-indexer-token').getAttribute('name')}=1`;
  20  
  21      const removeElement = id => {
  22        const element = document.getElementById(id);
  23  
  24        if (element) {
  25          return element.parentNode.removeChild(element);
  26        }
  27  
  28        return null;
  29      };
  30  
  31      const updateProgress = (header, message) => {
  32        progress = offset / totalItems * 100;
  33        const progressBar = document.getElementById('progress-bar');
  34        const progressHeader = document.getElementById('finder-progress-header');
  35        const progressMessage = document.getElementById('finder-progress-message');
  36  
  37        if (progressHeader) {
  38          progressHeader.innerText = header;
  39        }
  40  
  41        if (progressMessage) {
  42          progressMessage.innerHTML = Joomla.sanitizeHtml(message);
  43        }
  44  
  45        if (progressBar) {
  46          if (progress < 100) {
  47            progressBar.style.width = `$progress}%`;
  48            progressBar.setAttribute('aria-valuenow', progress);
  49          } else {
  50            progressBar.classList.remove('bar-success');
  51            progressBar.classList.add('bar-warning');
  52            progressBar.setAttribute('aria-valuemin', 100);
  53            progressBar.setAttribute('aria-valuemax', 200);
  54            progressBar.style.width = `$progress}%`;
  55            progressBar.setAttribute('aria-valuenow', progress);
  56          } // Auto close the window
  57  
  58  
  59          if (message === Joomla.Text._('COM_FINDER_INDEXER_MESSAGE_COMPLETE')) {
  60            removeElement('progress');
  61            window.parent.Joomla.Modal.getCurrent().close();
  62          }
  63        }
  64      };
  65  
  66      const handleResponse = (json, resp) => {
  67        const progressHeader = document.getElementById('finder-progress-header');
  68        const progressMessage = document.getElementById('finder-progress-message');
  69  
  70        try {
  71          if (json === null) {
  72            throw new Error(resp);
  73          }
  74  
  75          if (json.error) {
  76            throw new Error(json);
  77          }
  78  
  79          if (json.start) {
  80            // eslint-disable-next-line prefer-destructuring
  81            totalItems = json.totalItems;
  82  
  83            if (document.getElementById('finder-debug-data')) {
  84              const debuglist = document.getElementById('finder-debug-data');
  85              Object.entries(json.pluginState).forEach(context => {
  86                let item = `<dt class="col-sm-3">$context[0]}</dt>`;
  87                item += `<dd id="finder-$context[0].replace(/\s+/g, '-').toLowerCase()}" class="col-sm-9"></dd>`;
  88                debuglist.insertAdjacentHTML('beforeend', Joomla.sanitizeHtml(item, {
  89                  dd: ['class', 'id'],
  90                  dt: ['class']
  91                }));
  92              });
  93            }
  94          }
  95  
  96          offset += json.batchOffset;
  97          updateProgress(json.header, json.message);
  98  
  99          if (document.getElementById('finder-debug-data')) {
 100            Object.entries(json.pluginState).forEach(context => {
 101              document.getElementById(`finder-$context[0].replace(/\s+/g, '-').toLowerCase()}`).innerHTML = Joomla.sanitizeHtml(`$json.pluginState[context[0]].offset} of $json.pluginState[context[0]].total}`);
 102            });
 103          }
 104  
 105          if (offset < totalItems) {
 106            getRequest('indexer.batch');
 107          } else if (!optimized) {
 108            optimized = true;
 109            getRequest('indexer.optimize');
 110          }
 111        } catch (error) {
 112          removeElement('progress');
 113  
 114          try {
 115            if (json.error) {
 116              if (progressHeader) {
 117                progressHeader.innerText = json.header;
 118                progressHeader.classList.add('finder-error');
 119              }
 120  
 121              if (progressMessage) {
 122                progressMessage.innerHTML = Joomla.sanitizeHtml(json.message);
 123                progressMessage.classList.add('finder-error');
 124              }
 125            }
 126          } catch (ignore) {
 127            if (error === '') {
 128              // eslint-disable-next-line no-ex-assign
 129              error = Joomla.Text._('COM_FINDER_NO_ERROR_RETURNED');
 130            }
 131  
 132            if (progressHeader) {
 133              progressHeader.innerText = Joomla.Text._('COM_FINDER_AN_ERROR_HAS_OCCURRED');
 134              progressHeader.classList.add('finder-error');
 135            }
 136  
 137            if (progressMessage) {
 138              progressMessage.innerHTML = Joomla.sanitizeHtml(error);
 139              progressMessage.classList.add('finder-error');
 140            }
 141          }
 142        }
 143  
 144        return true;
 145      };
 146  
 147      const handleFailure = xhr => {
 148        const progressHeader = document.getElementById('finder-progress-header');
 149        const progressMessage = document.getElementById('finder-progress-message');
 150        let data = typeof xhr === 'object' && xhr.responseText ? xhr.responseText : null;
 151        data = data ? JSON.parse(data) : null;
 152        removeElement('progress');
 153        const header = data ? data.header : Joomla.Text._('COM_FINDER_AN_ERROR_HAS_OCCURRED');
 154        const message = data ? data.message : `$Joomla.Text._('COM_FINDER_MESSAGE_RETURNED')}<br>$data}`;
 155  
 156        if (progressHeader) {
 157          progressHeader.innerText = header;
 158          progressHeader.classList.add('finder-error');
 159        }
 160  
 161        if (progressMessage) {
 162          progressMessage.innerHTML = Joomla.sanitizeHtml(message);
 163          progressMessage.classList.add('finder-error');
 164        }
 165      };
 166  
 167      getRequest = task => {
 168        Joomla.request({
 169          url: `$path}&task=$task}$token}`,
 170          method: 'GET',
 171          data: '',
 172          perform: true,
 173          headers: {
 174            'Content-Type': 'application/x-www-form-urlencoded'
 175          },
 176          onSuccess: response => {
 177            handleResponse(JSON.parse(response));
 178          },
 179          onError: xhr => {
 180            handleFailure(xhr);
 181          }
 182        });
 183      };
 184  
 185      const initialize = () => {
 186        offset = 0;
 187        progress = 0;
 188        getRequest('indexer.start');
 189      };
 190  
 191      initialize();
 192    };
 193  })(Joomla, document); // @todo use directly the Joomla.finderIndexer() instead of the Indexer()!!!
 194  
 195  
 196  document.addEventListener('DOMContentLoaded', () => {
 197    window.Indexer = Joomla.finderIndexer();
 198  });


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