UNPKG

@datadobi/multiselect-combo-box

Version:

A fork of the multiselect combo box web component compatible with the Vaadin Web Components by gatanaso

125 lines (108 loc) 3.02 kB
import './multiselect-combo-box-dropdown.js'; import { html, PolymerElement } from '@polymer/polymer/polymer-element.js'; import { ComboBoxDataProviderMixin } from '@vaadin/combo-box/src/vaadin-combo-box-data-provider-mixin.js'; import { ComboBoxMixin } from '@vaadin/combo-box/src/vaadin-combo-box-mixin.js'; import { ComboBoxPlaceholder } from '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js'; import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js'; /** * An element used internally by `<multiselect-combo-box>`. Not intended to be used separately. * * @extends HTMLElement * @mixes ComboBoxDataProviderMixin * @mixes ComboBoxMixin * @mixes ThemableMixin * @private */ class MultiselectComboBoxInternal extends ComboBoxDataProviderMixin(ComboBoxMixin(ThemableMixin(PolymerElement))) { static get is() { return 'multiselect-combo-box-internal'; } static get template() { return html` <style> :host([opened]) { pointer-events: auto; } </style> <slot></slot> <multiselect-combo-box-dropdown id="dropdown" opened="[[opened]]" position-target="[[_target]]" renderer="[[renderer]]" _focused-index="[[_focusedIndex]]" _item-id-path="[[itemIdPath]]" _item-label-path="[[itemLabelPath]]" loading="[[loading]]" theme="[[theme]]" ></multiselect-combo-box-dropdown> `; } static get properties() { return { _target: { type: Object } }; } /** * Reference to the clear button element. * @protected * @return {!HTMLElement} */ get clearElement() { return this.querySelector('[part="clear-button"]'); } /** * @protected * @override */ _getItemElements() { return Array.from(this.$.dropdown._scroller.querySelectorAll('multiselect-combo-box-item')); } /** @protected */ ready() { super.ready(); this._target = this; this._toggleElement = this.querySelector('.toggle-button'); } /** @protected */ _isClearButton(event) { return ( super._isClearButton(event) || (event.type === 'input' && !event.isTrusted) || // fake input event dispatched by clear button event.composedPath()[0].getAttribute('part') === 'clear-button' ); } /** * @param {!Event} event * @protected */ _onChange(event) { super._onChange(event); if (this._isClearButton(event)) { this._clear(); } } /** * @param {CustomEvent} event * @protected * @override */ _overlaySelectedItemChanged(event) { event.stopPropagation(); if (event.detail.item instanceof ComboBoxPlaceholder) { return; } if (this.opened) { this.dispatchEvent( new CustomEvent('combo-box-item-selected', { detail: { item: event.detail.item } }) ); } } } customElements.define(MultiselectComboBoxInternal.is, MultiselectComboBoxInternal);