Fixes and improvements
This commit is contained in:
parent
6e9ff8c5c5
commit
44d5fa8c1d
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@tp/tp-dropdown",
|
||||
"version": "1.1.0",
|
||||
"version": "1.2.0",
|
||||
"description": "",
|
||||
"main": "tp-dropdown.js",
|
||||
"scripts": {
|
||||
|
@ -121,7 +121,7 @@ class TpDropdown extends BaseElement {
|
||||
pointer-events: none;
|
||||
transition: opacity 0ms;
|
||||
opacity: 0;
|
||||
position: fixed;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
height: auto;
|
||||
}
|
||||
@ -249,14 +249,18 @@ class TpDropdown extends BaseElement {
|
||||
</div>
|
||||
</div>
|
||||
<div id="list" ?open="${isOpen}">
|
||||
<tp-input part="filter" exportparts="wrap:filterWrap" id="filter" .value=${this._filterTerm || ''} @input=${e => this._filterTerm = e.target.value} .inert=${!isOpen} ?hidden=${!(filterable || extensible)}>
|
||||
<input type="text" placeholder=${filterPlaceholder}>
|
||||
<tp-icon id="filterIcon" .icon=${extensible ? TpDropdown.addIcon : TpDropdown.filterIcon} slot="suffix"></tp-icon>
|
||||
</tp-input>
|
||||
${filterable ? html`
|
||||
<tp-input part="filter" exportparts="wrap:filterWrap" id="filter" .value=${this._filterTerm || ''} @input=${e => this._filterTerm = e.target.value} .inert=${!isOpen} ?hidden=${!(filterable || extensible)}>
|
||||
<input type="text" placeholder=${filterPlaceholder}>
|
||||
<tp-icon id="filterIcon" .icon=${extensible ? TpDropdown.addIcon : TpDropdown.filterIcon} slot="suffix"></tp-icon>
|
||||
</tp-input>
|
||||
` : null}
|
||||
<div id="itemList" part="list">
|
||||
${items.map(item => this._filter(item) ? html`
|
||||
<div part="item" role="option" .value=${item.value} tabindex=${isOpen ? '0' : '-1'}>${item.label}</div>
|
||||
` : null)}
|
||||
${isOpen ? html`
|
||||
${items.map(item => this._filter(item) ? html`
|
||||
<div part="item" role="option" .value=${item.value} tabindex=${isOpen ? '0' : '-1'}>${item.label}</div>
|
||||
` : null)}
|
||||
` : null}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -328,8 +332,11 @@ class TpDropdown extends BaseElement {
|
||||
}
|
||||
document.removeEventListener('click', this._onDocClickHandler, true);
|
||||
this.unlisten(this, 'keydown', '_onKeyDown');
|
||||
this.unlisten(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.unlisten(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
|
||||
if (this.filterable) {
|
||||
this.unlisten(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.unlisten(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
}
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
@ -358,6 +365,7 @@ class TpDropdown extends BaseElement {
|
||||
|
||||
if (changes.has('value')) {
|
||||
this._valueChanged();
|
||||
this._updateLabel();
|
||||
this.dispatchEvent(new CustomEvent('value-changed', { detail: this.value, bubbles: true, composed: true }));
|
||||
}
|
||||
}
|
||||
@ -369,24 +377,26 @@ class TpDropdown extends BaseElement {
|
||||
_focusChanged(newState, oldState) {
|
||||
if (newState) {
|
||||
this.listen(this, 'keydown', '_onKeyDown');
|
||||
this.listen(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.listen(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
|
||||
if (this.filterable) {
|
||||
this.listen(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.listen(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
this.$.filter.focus();
|
||||
}
|
||||
} else if (oldState) {
|
||||
this.unlisten(this, 'keydown', '_onKeyDown');
|
||||
this.unlisten(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.unlisten(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
|
||||
if (!newState) {
|
||||
if (oldState && this.$.filter.value !== '') {
|
||||
if (this.extensible && this.autoExtend) {
|
||||
this._addItem();
|
||||
} else if (!this._selectByLabel(this.$.filter.value)) {
|
||||
if (!this.value) {
|
||||
this.$.filter.value = '';
|
||||
if (this.filterable) {
|
||||
this.unlisten(this.$.filter, 'keydown', '_onKeyDownFilter');
|
||||
this.unlisten(this.$.filterIcon, 'click', '_filterIconClicked');
|
||||
|
||||
if (!newState) {
|
||||
if (oldState && this.$.filter.value !== '') {
|
||||
if (this.extensible && this.autoExtend) {
|
||||
this._addItem();
|
||||
} else if (!this._selectByLabel(this.$.filter.value)) {
|
||||
if (!this.value) {
|
||||
this.$.filter.value = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -408,15 +418,19 @@ class TpDropdown extends BaseElement {
|
||||
return Array.isArray(this.items) && this.items.find(item => item.value.toString() === value.toString()) !== undefined;
|
||||
}
|
||||
|
||||
_valueChanged() {
|
||||
if (this._setDefault()) {
|
||||
return;
|
||||
}
|
||||
|
||||
_updateLabel() {
|
||||
// Show selection in selector.
|
||||
const idx = this.items.findIndex(item => item.value === this.value);
|
||||
if (idx > -1) {
|
||||
this.label = this.items[idx].label;
|
||||
} else {
|
||||
this.label = null;
|
||||
}
|
||||
}
|
||||
|
||||
_valueChanged() {
|
||||
if (this._setDefault()) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.invalid = false;
|
||||
@ -471,7 +485,9 @@ class TpDropdown extends BaseElement {
|
||||
window.addEventListener('resize', this._boundSetListPosition);
|
||||
document.addEventListener('scroll', this._boundSetListPosition, { passive: true });
|
||||
document.addEventListener('click', this._onDocClickHandler, true);
|
||||
this.listen(this.$.filter, 'click', '_filterClicked');
|
||||
if (this.filterable) {
|
||||
this.listen(this.$.filter, 'click', '_filterClicked');
|
||||
}
|
||||
|
||||
this._setListPosition();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user