{"version":3,"sources":["webpack:///./src/client/default/js/components/dropdownComponent.js","webpack:///./src/client/default/js/base/baseComponent.js"],"names":["DropdownComponent","element","timeout","trap","handleEscapeTrigger","bindEvents","this","CUSTOM_MESSAGES","DROPDOWN_EVENTS","show","close","panel","trigger","closeDropdownTrigger","$el","closest","parentElement","classList","contains","CLASSES","open","animate","active","$container","querySelector","SELECTORS","HTMLElement","container","content","parentClasses","panelClasses","parent","$panel","add","setTimeout","innerHTML","$trigger","setModalTrap","EMIT","opening","e","console","error","target","focusTrap","clickOutsideDeactivates","activate","remove","deactivate","anyFocus","match","$on","preventDefault","clearTimeout","closeTimeout","openTimeout","inputInside","querySelectorAll","forEach","el","checkIfFocus","document","addEventListener","key","closeDropdown","length","click","$options","handle","bindHover","bindClick","form","activeElement","localName","BaseComponent","_componentElement","setAttribute","_checkMessages","compOptions","options","dataset","Object","keys","filter","entry","includes","optionValue","cleanEntry","cleanOptionKey","JSON","parse","replace","convertType","deepFreeze","getAttribute","events","cb","elements","Bean","on","stopPropagation","one","off","fire","message","_loading","LOADER_EVENTS","body","icon","hide","option","optionReturn","str","charAt","toLocaleLowerCase","slice","BaseGiaComponent"],"mappings":"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","file":"js/component-dropdownComponent-js.chunks.js","sourcesContent":["import { match } from '../utilities/resolutionHandler';\nimport BaseComponent from '../base/baseComponent';\nimport * as focusTrap from 'focus-trap';\n\nexport default class DropdownComponent extends BaseComponent {\n  get Messages() {\n    return {\n      [this.CUSTOM_MESSAGES.DROPDOWN_EVENTS.show]: this.close\n    };\n  }\n\n  get SELECTORS() {\n    return {\n      panel: '.js-dropdown-panel',\n      trigger: '.js-dropdown-trigger',\n      closeDropdownTrigger: '.js-close-dropdown'\n    };\n  }\n\n  get PARENT() {\n    return this.$el.closest('.js-dropdown-container');\n  }\n\n  get IS_OPEN() {\n    return this.$el.parentElement.classList.contains(this.CLASSES.open);\n  }\n\n  constructor(element) {\n    super(element);\n\n    this.timeout = null;\n    this.trap = null;\n    this.handleEscapeTrigger();\n\n    this.bindEvents();\n  }\n\n  get CLASSES() {\n    return {\n      open: 'open',\n      animate: 'animate',\n      active: 'active'\n    };\n  }\n\n  /**\n   * @return {HTMLElement | undefined}\n   */\n  get $panel() {\n    if (this.panel) return this.panel;\n    const panel = this.$container.querySelector(this.SELECTORS.panel);\n    if (panel instanceof HTMLElement) {\n      this.panel = panel;\n      return panel;\n    }\n    return undefined;\n  }\n\n  /**\n   * @return {HTMLElement | undefined}\n   */\n  get $container() {\n    if (this.container) return this.container;\n    const container = this.$el.parentElement;\n    if (container instanceof HTMLElement) {\n      this.container = container;\n      return container;\n    }\n    return undefined;\n  }\n\n  /**\n   * @return {HTMLElement | undefined}\n   */\n  get $trigger() {\n    if (this.trigger) return this.trigger;\n    const trigger = this.$el;\n    if (trigger instanceof HTMLElement) {\n      this.trigger = trigger;\n      return trigger;\n    }\n    return undefined;\n  }\n\n  /**\n   *\n   * @param {String} [content] - Panel content\n   * @param {Array} [parentClasses = []] - Parent element classes\n   * @param {Array} [panelClasses = []] - Panel classes\n   */\n  open(content, parentClasses = [], panelClasses = []) {\n    try {\n      const parent = this.$container;\n      const panel = this.$panel;\n\n      parent.classList.add(this.CLASSES.open);\n\n      this.timeout = setTimeout(() => {\n        if (content) {\n          panel.innerHTML = content;\n        }\n\n        if (parentClasses) {\n          this.parentClasses = parentClasses;\n          parent.classList.add(...parentClasses);\n        }\n\n        if (panelClasses) {\n          this.panelClasses = panelClasses;\n          panel.classList.add(...panelClasses);\n        }\n\n        this.$trigger.classList.add(this.CLASSES.active);\n        parent.classList.add(this.CLASSES.animate);\n        this.setModalTrap(panel);\n        this.EMIT(this.CUSTOM_MESSAGES.DROPDOWN_EVENTS.opening, this.$el);\n      }, 100);\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  setModalTrap(target) {\n    setTimeout(() => {\n      // let targetElement = target.parentElement.querySelector(this.SELECTORS.dropdown);\n      // target.setAttribute('aria-labelledby', target.getAttribute('data-id'));\n      // target.setAttribute('aria-modal', true);\n      this.trap = focusTrap.createFocusTrap(target, { clickOutsideDeactivates: true });\n      this.trap.activate();\n    }, 200);\n  }\n\n  close() {\n    try {\n      const parent = this.$container;\n      const panel = this.$panel;\n      parent.classList.remove(this.CLASSES.animate);\n\n      if (this.parentClasses) parent.classList.remove(...this.parentClasses);\n      if (this.panelClasses) panel.classList.remove(...this.panelClasses);\n\n      this.timeout = setTimeout(() => {\n        parent.classList.remove(this.CLASSES.open);\n        this.$trigger.classList.remove(this.CLASSES.active);\n        if (this.trap) this.trap.deactivate();\n      }, 100);\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  bindHover() {\n    var anyFocus = false;\n    if (match(null, 'md')) {\n      this.$on(\n        'mouseenter.dropdown',\n        (e) => {\n          e.preventDefault();\n          clearTimeout(this.timeout);\n          clearTimeout(this.closeTimeout);\n          clearTimeout(this.openTimeout);\n          this.openTimeout = setTimeout(() => {\n            this.open();\n          }, 100);\n        },\n        this.$container\n      );\n\n      this.$on(\n        'mouseleave.dropdown',\n        (e) => {\n          const parent = this.$container;\n          const inputInside = parent.querySelectorAll(this.SELECTORS.inputInside);\n          [...inputInside].forEach((el) => {\n            if (this.checkIfFocus(el)) {\n              anyFocus = true;\n            }\n          });\n\n          if (!anyFocus) {\n            e.preventDefault();\n            clearTimeout(this.timeout);\n            clearTimeout(this.openTimeout);\n            this.closeTimeout = setTimeout(() => {\n              this.close();\n            }, 100);\n          } else {\n            anyFocus = false;\n          }\n        },\n        this.$container\n      );\n    }\n  }\n\n  handleEscapeTrigger() {\n    document.addEventListener('keydown', ({ key }) => {\n      if (key === 'Escape') {\n        this.close();\n      }\n    });\n  }\n\n  bindClick() {\n    this.$on(\n      'click.dropdown',\n      (e) => {\n        if (e) {\n          e.preventDefault();\n        }\n\n        clearTimeout(this.timeout);\n        const isOpen = this.$el.parentElement.classList.contains(this.CLASSES.open);\n        if (isOpen) {\n          this.close();\n        } else {\n          this.open();\n        }\n      },\n      this.$trigger\n    );\n\n    let closeDropdown = [...this.$container.querySelectorAll(this.SELECTORS.closeDropdownTrigger)];\n\n    if (closeDropdown.length > 0) {\n      closeDropdown.forEach((trigger) => {\n        trigger.addEventListener('click', (e) => {\n          if (e) {\n            e.preventDefault();\n          }\n          if (this.$trigger) {\n            this.$trigger.click();\n          }\n        });\n      });\n    }\n  }\n\n  bindEvents() {\n    if (this.$options.handle === 'hover') {\n      this.bindHover();\n    }\n    if (this.$options.handle === 'click') {\n      this.bindClick();\n    }\n    if (this.$options.handle === 'all' || !this.$options.handle) {\n      this.bindClick();\n      this.bindHover();\n    }\n  }\n\n  checkIfFocus(el) {\n    return el.form === (document.activeElement.form || null) && document.activeElement.localName === 'input';\n  }\n}\n","/* eslint-disable new-cap */\n/* eslint-disable valid-jsdoc */\n/* eslint-disable no-underscore-dangle */\n\nimport Bean from 'bean';\nimport deepFreeze from '../utilities/freeze';\nimport BaseGiaComponent from './baseGiaComponent';\n\nexport default class BaseComponent extends BaseGiaComponent {\n  /**\n   * @returns {HTMLElement}\n   */\n  get $el() {\n    return /** @type {HTMLElement} */ (this._componentElement);\n  }\n\n  get $options() {\n    const compOptions = {};\n    const options = { ...this.$el.dataset };\n    const optionsEntires = Object.keys(options).filter((entry) => entry.includes('option'));\n    optionsEntires.forEach((entry) => {\n      const cleanEntry = BaseComponent.cleanOptionKey(entry);\n      let optionValue;\n      if (options[entry].includes('{') && options[entry].includes('}')) {\n        optionValue = JSON.parse(options[entry].replace(/'/g, '\"'));\n      } else {\n        optionValue = BaseComponent.convertType(options[entry]);\n      }\n      compOptions[cleanEntry] = optionValue;\n    });\n    return deepFreeze(compOptions);\n  }\n\n  get COMPONENT_NAME() {\n    return this.$el.getAttribute('data-component');\n  }\n\n  /**\n   *\n   * constructor\n   *\n   * @param {Element} element\n   */\n  constructor(element) {\n    super(element);\n    this._componentElement = element;\n    this._componentElement.setAttribute('data-component-init', 'true');\n    this._checkMessages();\n  }\n\n  static convertType(option) {\n    let optionReturn;\n    switch (option) {\n      case 'false':\n        optionReturn = false;\n        break;\n      case 'true':\n        optionReturn = true;\n        break;\n      case 'null':\n        optionReturn = null;\n        break;\n      default:\n        optionReturn = option;\n        break;\n    }\n\n    return optionReturn;\n  }\n\n  static cleanOptionKey(key) {\n    const str = key.replace('option', '');\n    return `${str.charAt(0).toLocaleLowerCase()}${str.slice(1)}`;\n  }\n\n  /**\n   *\n   * $on\n   *\n   * @param {String} events\n   * @param {Function} cb\n   * @param {Element} [element = this.$el]\n   * @param {Array|String|Element} [elements = null]\n   */\n  $on(events, cb, element = this.$el, elements = null) {\n    if (!element || !events || !cb) return;\n    if (!elements) {\n      Bean.on(element, events, (e) => {\n        if (e) e.stopPropagation();\n        cb(e);\n      });\n    } else {\n      Bean.on(element, events, elements, (e) => {\n        if (e) e.stopPropagation();\n        cb(e);\n      });\n    }\n  }\n\n  /**\n   *\n   * $one\n   *\n   * @param {String} events\n   * @param {Function} cb\n   * @param {Element} [element = this.$el]\n   */\n  $one(events, cb, element = this.$el) {\n    Bean.one(element, events, cb);\n  }\n\n  /**\n   *\n   * $off\n   *\n   * @param {String} events\n   * @param {Element} [element = this.$el]\n   */\n  $off(events, element = this.$el) {\n    Bean.off(element, events);\n  }\n\n  /**\n   *\n   * $fire\n   *\n   * @param {String} events\n   * @param {Element} [element = this.$el]\n   */\n  $fire(events, element = this.$el) {\n    Bean.fire(element, events);\n  }\n\n  /**\n   *\n   * Activate loader\n   *\n   * @param {HTMLElement} [container]\n   * @param {String} [message]\n   */\n  loading(container, message) {\n    this._loading = true;\n    this.EMIT(this.CUSTOM_MESSAGES.LOADER_EVENTS.show, {\n      container: container || document.body,\n      message: message ?? null\n    });\n  }\n\n  /**\n   *\n   * Deactivate loader\n   *\n   * @param {HTMLElement} [container]\n   * @param {String} [message]\n   * @param {Boolean} [error=false]\n   * @param {String} [icon]\n   */\n  endLoading(container, message, error = false, icon) {\n    this._loading = false;\n    setTimeout(() => {\n      if (!this._loading) {\n        this.EMIT(this.CUSTOM_MESSAGES.LOADER_EVENTS.hide, {\n          container: container || document.body,\n          message,\n          error,\n          icon\n        });\n      }\n    }, 400);\n  }\n}\n"],"sourceRoot":""}