@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
JavaScript
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);