/* global define */ ;(function(define){'use strict';define(function(require,exports,module){ /** * Dependencies */ var GaiaDialogProto = require('gaia-dialog').prototype; var component = require('gaia-component'); /** * Exports */ module.exports = component.register('gaia-dialog-select', { created: function() { this.setupShadowRoot(); this.els = { dialog: this.shadowRoot.querySelector('gaia-dialog'), submit: this.shadowRoot.querySelector('.submit'), cancel: this.shadowRoot.querySelector('.cancel'), list: this.shadowRoot.querySelector('ul') }; this.multiple = this.hasAttribute('multiple'); this.els.list.addEventListener('click', this.onListClick.bind(this)); this.els.submit.addEventListener('click', this.close.bind(this)); this.els.cancel.addEventListener('click', this.close.bind(this)); setTimeout(() => this.makeAccessible()); }, makeAccessible() { this.els.list.setAttribute('role', 'listbox'); if (this.multiple) { this.els.list.setAttribute('aria-multiselectable', true); } [].forEach.call(this.options, option => { option.setAttribute('role', 'option'); option.setAttribute('tabindex', '0'); }); }, open: function(e) { return GaiaDialogProto.show.call(this) .then(() => this.els.dialog.open(e)); }, close: function() { return this.els.dialog.close() .then(GaiaDialogProto.hide.bind(this)); }, onListClick: function(e) { var el = e.target.closest('li'); var selected = el.getAttribute('aria-selected') === 'true'; if (this.multiple) { this.onChangeMultiple(el, selected); } else { this.onChange(el, selected); } }, onChange: function(el, selected) { this.clearSelected(); if (!selected) { el.setAttribute('aria-selected', !selected); } this.fireChange(); this.close(); }, onChangeMultiple: function(el, selected) { el.setAttribute('aria-selected', !selected); this.fireChange(); }, clearSelected: function() { [].forEach.call(this.selectedOptions, function(option) { option.removeAttribute('aria-selected'); }); }, fireChange: function() { var e = new CustomEvent('change', { detail: { value: this.valueString }}); this.dispatchEvent(e); }, attrs: { multiple: { get: function() { return !!this._multiple; }, set: function(value) { value = value === '' ? true : value; if (value === this._multiple) { return; } if (!value) { this._multiple = false; this.removeAttribute('multiple'); this.els.list.removeAttribute('aria-multiselectable'); } else { this._multiple = true; this.setAttribute('multiple', ''); this.els.list.setAttribute('aria-multiselectable', true); } } }, options: { get: function() { return this.querySelectorAll('li'); } }, selectedOptions: { get: function() { return this.querySelectorAll('li[aria-selected="true"]'); } }, selected: { get: function() { return this.selectedOptions[0]; } }, value: { get: function() { var selected = this.selectedOptions[0]; return selected && selected.getAttribute('value'); } }, valueString: { get: function() { var selected = this.selected; return selected && selected.textContent; } }, length: { get: function() { return this.options.length; } } }, template: `
` }); });})(typeof define=='function'&&define.amd?define :(function(n,w){'use strict';return typeof module=='object'?function(c){ c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){ return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-dialog-select',this));