{"version":3,"sources":["webpack:///./src/js/modules/legacy/lodgingDetail.js","webpack:///./src/js/components/dropdown.js"],"names":["Module","this","dom","dropdown","el","querySelector","tabs","querySelectorAll","panels","Dropdown","forEach","tab","addEventListener","handleSelectTab","bind","keydownEventListener","keyupEventListener","on","handleSelectOption","e","keyCode","END","preventDefault","length","focus","HOME","LEFT","target","previousElementSibling","RIGHT","nextElementSibling","RETURN","SPACE","setAttribute","id","panel","getAttribute","removeAttribute","value","update","setTimeout","window","dispatchEvent","Event","Component","options","style","dataset","search","searchTimeout","buildDropdown","document","handleClickOutside","handleOptionSelect","trigger","handleTriggerClick","handleTriggerKeydown","parentNode","hideDropdownList","list","childNodes","item","selectItem","event","callback","createEvent","initEvent","wrapper","contains","innerHTML","getPlaceholder","option","isDevice","showDropdownList","key","which","activeItem","stopPropagation","nextElement","focusItem","focusLast","focusFirst","findItemToFocus","character","String","fromCharCode","trim","items","clearTimeout","find","textContent","innerText","toLowerCase","startsWith","element","defocusItem","scrollHeight","clientHeight","scrollBottom","scrollTop","elementBottom","offsetTop","offsetHeight","firstItem","classList","add","open","duration","close","remove","placeholder","selectedOptionLabel","listId","uuidv4","createElement","insertBefore","appendChild","label","map","text","join","nextSibling","parent","removeChild","destroy","setupDefaults","addListeners"],"mappings":"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","file":"40.219e4dae2458c40ac2f7.js","sourcesContent":["import { Component } from '@verndale/core';\nimport Dropdown from '../../components/dropdown';\n\nimport { keyCode } from '../../helpers';\n\nclass Module extends Component {\n setupDefaults() {\n this.dom = {\n dropdown: this.el.querySelector('.lodging-detail__dropdown'),\n tabs: [...this.el.querySelectorAll('.lodging-detail__tabs button')],\n panels: [...this.el.querySelectorAll('.lodging-detail__section')]\n };\n\n this.dropdown = new Dropdown(this.dom.dropdown);\n }\n\n addListeners() {\n this.dom.tabs.forEach(tab => {\n tab.addEventListener('click', this.handleSelectTab.bind(this));\n tab.addEventListener('keydown', this.keydownEventListener.bind(this));\n tab.addEventListener('keyup', this.keyupEventListener.bind(this));\n });\n\n this.dropdown.on('option', this.handleSelectOption.bind(this));\n }\n\n keydownEventListener(e) {\n const key = e.keyCode;\n\n switch (key) {\n case keyCode.END:\n e.preventDefault();\n this.dom.tabs[this.dom.tabs.length - 1].focus();\n break;\n case keyCode.HOME:\n e.preventDefault();\n this.dom.tabs[0].focus();\n break;\n }\n }\n\n // Handle keyup on tabs\n keyupEventListener(e) {\n const key = e.keyCode;\n\n switch (key) {\n case keyCode.LEFT:\n if (e.target.previousElementSibling) {\n e.target.previousElementSibling.focus();\n } else {\n this.dom.tabs[this.dom.tabs.length - 1].focus();\n }\n break;\n case keyCode.RIGHT:\n if (e.target.nextElementSibling) {\n e.target.nextElementSibling.focus();\n } else {\n this.dom.tabs[0].focus();\n }\n break;\n case keyCode.RETURN:\n case keyCode.SPACE:\n this.handleSelectTab(e);\n break;\n }\n }\n\n handleSelectTab(e) {\n e.preventDefault();\n\n this.dom.tabs.forEach(tab =>\n tab.setAttribute('aria-selected', tab.id === e.target.id)\n );\n this.dom.panels.forEach(panel => {\n if (panel.id === e.target.getAttribute('aria-controls')) {\n panel.removeAttribute('hidden');\n } else {\n panel.setAttribute('hidden', 'hidden');\n }\n });\n\n this.dom.dropdown.value = e.target.getAttribute('aria-controls');\n this.dropdown.update();\n\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n });\n }\n\n handleSelectOption(e) {\n e.preventDefault();\n\n this.dom.tabs.forEach(tab =>\n tab.setAttribute(\n 'aria-selected',\n tab.getAttribute('aria-controls') === e.target.value\n )\n );\n this.dom.panels.forEach(panel => {\n if (panel.id === e.target.value) {\n panel.removeAttribute('hidden');\n } else {\n panel.setAttribute('hidden', 'hidden');\n }\n });\n\n setTimeout(() => {\n window.dispatchEvent(new Event('resize'));\n });\n }\n}\n\nexport default Module;\n","import { Component } from '@verndale/core';\nimport { isDevice, open, close } from '../helpers';\nimport { v4 as uuidv4 } from 'uuid';\n\nclass Module extends Component {\n setupDefaults() {\n this.options = [...this.el];\n this.style = this.el.dataset.style;\n this.search = '';\n this.searchTimeout = null;\n\n this.buildDropdown();\n }\n\n addListeners() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n this.el.addEventListener('change', this.handleOptionSelect.bind(this));\n this.dom.trigger.addEventListener(\n 'click',\n this.handleTriggerClick.bind(this)\n );\n this.dom.trigger.addEventListener(\n 'keydown',\n this.handleTriggerKeydown.bind(this)\n );\n this.dom.trigger.parentNode.addEventListener(\n 'blur',\n this.hideDropdownList.bind(this)\n );\n this.dom.list.childNodes.forEach(item => {\n item.addEventListener('click', () => this.selectItem(item));\n });\n }\n\n on(event, callback) {\n this.el.addEventListener(event, callback);\n }\n\n setValue(value) {\n let event;\n\n if (typeof Event === 'function') {\n event = new Event('change');\n } else {\n event = document.createEvent('Event');\n event.initEvent('change', true, true);\n }\n\n this.el.value = value;\n this.el.dispatchEvent(event);\n }\n\n getValue() {\n return this.el.value;\n }\n\n handleClickOutside(e) {\n if (this.dom.wrapper !== e.target && !this.dom.wrapper.contains(e.target)) {\n this.hideDropdownList();\n }\n }\n\n handleOptionSelect() {\n let event;\n\n if (typeof Event === 'function') {\n event = new Event('option');\n } else {\n event = document.createEvent('Event');\n event.initEvent('option', true, true);\n }\n\n this.dom.trigger.innerHTML = this.getPlaceholder(this.el.value);\n\n this.options.forEach(option => {\n if (option.value === this.el.value) {\n option.setAttribute('aria-selected', true);\n } else {\n option.setAttribute('aria-selected', false);\n }\n });\n\n this.dom.list.childNodes.forEach(item => {\n if (item.dataset.value === this.el.value) {\n item.setAttribute('aria-selected', true);\n } else {\n item.setAttribute('aria-selected', false);\n }\n });\n\n this.el.dispatchEvent(event);\n }\n\n handleTriggerClick() {\n if (isDevice()) {\n return;\n }\n\n if (!this.dom.trigger.getAttribute('aria-expanded')) {\n this.showDropdownList();\n } else {\n this.hideDropdownList();\n }\n }\n\n handleTriggerKeydown(e) {\n if (isDevice()) return;\n\n const key = e.which || e.keyCode;\n\n switch (key) {\n case 13: // ENTER\n if (this.dom.trigger.getAttribute('aria-expanded')) {\n if (this.activeItem) {\n e.preventDefault();\n e.stopPropagation();\n this.selectItem(this.activeItem);\n }\n }\n break;\n case 38: // UP\n e.preventDefault();\n if (this.dom.trigger.getAttribute('aria-expanded') !== 'true') {\n this.showDropdownList();\n }\n\n if (this.activeItem) {\n const nextElement = this.activeItem.previousElementSibling;\n\n if (nextElement) {\n this.focusItem(nextElement);\n } else {\n this.focusLast();\n }\n } else {\n this.focusLast();\n }\n\n break;\n case 40: // DOWN\n e.preventDefault();\n if (this.dom.trigger.getAttribute('aria-expanded') !== 'true') {\n this.showDropdownList();\n }\n\n if (this.activeItem) {\n const nextElement = this.activeItem.nextElementSibling;\n\n if (nextElement) {\n this.focusItem(nextElement);\n } else {\n this.focusFirst();\n }\n } else {\n this.focusFirst();\n }\n\n break;\n case 36:\n e.preventDefault();\n this.focusFirst();\n break;\n case 35:\n e.preventDefault();\n this.focusLast();\n break;\n default:\n this.findItemToFocus(key);\n break;\n }\n }\n\n findItemToFocus(key) {\n const character = String.fromCharCode(key).trim();\n const items = this.dom.list.querySelectorAll('[role=\"option\"]');\n\n if (!character) return;\n\n if (!this.dom.trigger.getAttribute('aria-expanded')) {\n this.showDropdownList();\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.search += character;\n\n [...items].find(option => {\n const label = option.textContent || option.innerText || '';\n\n if (label.trim().toLowerCase().startsWith(this.search.toLowerCase())) {\n this.focusItem(option);\n return true;\n }\n });\n\n this.searchTimeout = setTimeout(() => {\n this.search = '';\n }, 500);\n }\n\n selectItem(item) {\n this.el.value = item.dataset.value;\n this.handleOptionSelect();\n this.hideDropdownList();\n }\n\n defocusItem(element) {\n if (!element) return;\n element.removeAttribute('aria-selected');\n }\n\n focusItem(element) {\n this.defocusItem(this.activeItem);\n element.setAttribute('aria-selected', 'true');\n this.activeItem = element;\n\n if (this.dom.list.scrollHeight > this.dom.list.clientHeight) {\n const scrollBottom = this.dom.list.clientHeight + this.dom.list.scrollTop;\n const elementBottom = element.offsetTop + element.offsetHeight;\n if (elementBottom > scrollBottom) {\n this.dom.list.scrollTop = elementBottom - this.dom.list.clientHeight;\n } else if (element.offsetTop < this.dom.list.scrollTop) {\n this.dom.list.scrollTop = element.offsetTop;\n }\n }\n }\n\n focusFirst() {\n const firstItem = this.dom.list.querySelector('[role=\"option\"]');\n if (firstItem) {\n this.focusItem(firstItem);\n }\n }\n\n focusLast() {\n const items = this.dom.list.querySelectorAll('[role=\"option\"]');\n\n if (items.length) {\n this.focusItem(items[items.length - 1]);\n }\n }\n\n showDropdownList() {\n this.dom.trigger.setAttribute('aria-expanded', true);\n this.dom.wrapper.classList.add('open');\n open({ element: this.dom.list, duration: 0.6 });\n }\n\n hideDropdownList() {\n close({\n element: this.dom.list,\n duration: 0.6\n });\n this.dom.trigger.removeAttribute('aria-expanded');\n this.dom.wrapper.classList.remove('open');\n this.defocusItem(this.activeItem);\n this.activeItem = null;\n }\n\n getPlaceholder(value) {\n const placeholder = this.el.getAttribute('placeholder');\n const selectedOptionLabel = this.options.find(\n option => option.value === value\n ).innerHTML;\n\n if (placeholder) {\n return `${\n selectedOptionLabel\n ? `<span>${placeholder}:</span>`\n : `<span>${placeholder}</span>`\n } ${selectedOptionLabel}<svg><use xlink:href=\"#chevron-right\" /></svg>`;\n }\n\n return `${selectedOptionLabel}<svg><use xlink:href=\"#chevron-right\" /></svg>`;\n }\n\n buildDropdown() {\n const listId = uuidv4();\n this.dom.wrapper = document.createElement('div');\n this.el.setAttribute('aria-hidden', true);\n this.el.setAttribute('tabindex', '-1');\n this.el.parentNode.insertBefore(this.dom.wrapper, this.el);\n this.dom.wrapper.classList.add('dropdown');\n\n if (this.style) {\n this.dom.wrapper.classList.add(`dropdown--${this.style}`);\n }\n\n if (isDevice()) {\n this.dom.wrapper.classList.add('dropdown--native');\n }\n this.dom.wrapper.appendChild(this.el);\n\n this.dom.trigger = document.createElement('button');\n this.dom.trigger.classList.add('dropdown__trigger');\n this.dom.trigger.setAttribute('type', 'button');\n this.dom.trigger.setAttribute('role', 'combobox');\n this.dom.trigger.setAttribute('aria-haspopup', 'listbox');\n this.dom.trigger.setAttribute('aria-controls', `${listId}`);\n\n // Get label\n const label = document.querySelector(`label[for=\"${this.el.id}\"]`);\n\n if (label) {\n this.dom.trigger.setAttribute('aria-label', label.textContent);\n }\n\n this.dom.trigger.innerHTML = this.getPlaceholder(this.el.value);\n\n this.dom.wrapper.appendChild(this.dom.trigger);\n\n this.dom.list = document.createElement('ul');\n this.dom.list.id = listId;\n this.dom.list.classList.add('dropdown__list');\n this.dom.list.setAttribute('role', 'listbox');\n this.dom.list.setAttribute(\n 'aria-label',\n this.el.getAttribute('aria-label')\n );\n this.dom.list.innerHTML = this.options\n .map(\n option =>\n `<li class=\"dropdown__list__option\" role=\"option\" data-value=\"${\n option.value\n }\" aria-selected=\"${option.value === this.el.value}\">${option.text}\n <span clasS=\"dropdown__list__option-decorator\">\n <span></span>\n </span>\n </li>`\n )\n .join('');\n this.el.parentNode.insertBefore(this.dom.list, this.el.nextSibling);\n this.dom.wrapper.appendChild(this.dom.list);\n }\n\n destroy() {\n const parent = this.el.parentNode;\n parent.removeChild(this.el);\n parent.parentNode.insertBefore(this.el, parent);\n parent.parentNode.removeChild(parent);\n }\n\n update() {\n this.destroy();\n this.setupDefaults();\n this.addListeners();\n }\n}\n\nexport default Module;\n"],"sourceRoot":""}