SearchMixin: Fix selected remote options got lost if adding a freeEntry

This commit is contained in:
nathan 2022-12-05 13:56:31 -07:00
parent e875b9ddf4
commit fa2375b1a6

View File

@ -12,6 +12,7 @@ import {css, html, LitElement, render, SlotMixin} from "@lion/core";
import {cleanSelectOptions, SelectOption} from "./FindSelectOptions"; import {cleanSelectOptions, SelectOption} from "./FindSelectOptions";
import {Validator} from "@lion/form-core"; import {Validator} from "@lion/form-core";
import {Et2Tag} from "./Tag/Et2Tag"; import {Et2Tag} from "./Tag/Et2Tag";
import {SlMenuItem} from "@shoelace-style/shoelace";
// Otherwise import gets stripped // Otherwise import gets stripped
let keep_import : Et2Tag; let keep_import : Et2Tag;
@ -478,7 +479,7 @@ export const Et2WithSearchMixin = <T extends Constructor<LitElement>>(superclass
return this.querySelectorAll(this.optionTag + ".freeEntry"); return this.querySelectorAll(this.optionTag + ".freeEntry");
} }
get search_options() : SelectOption[] get select_options() : SelectOption[]
{ {
let options = []; let options = [];
@ -490,7 +491,7 @@ export const Et2WithSearchMixin = <T extends Constructor<LitElement>>(superclass
}) })
} }
// Any provided options // Any provided options
options = options.concat(this.__search_options); options = options.concat(this.__select_options);
// Any kept remote options // Any kept remote options
options = options.concat(this._selected_remote); options = options.concat(this._selected_remote);
@ -498,6 +499,12 @@ export const Et2WithSearchMixin = <T extends Constructor<LitElement>>(superclass
return options; return options;
} }
set select_options(options : SelectOption[])
{
this.__select_options = options;
this.requestUpdate('select_options');
}
get value() get value()
{ {
return super.value; return super.value;
@ -789,21 +796,21 @@ export const Et2WithSearchMixin = <T extends Constructor<LitElement>>(superclass
async _handleSearchBlur(event : FocusEvent) async _handleSearchBlur(event : FocusEvent)
{ {
clearTimeout(this._searchTimeout); clearTimeout(this._searchTimeout);
if(event.relatedTarget && [this, this.dropdown].indexOf((<Element>event.relatedTarget).parentElement) == -1 || if(event.relatedTarget && event.relatedTarget instanceof SlMenuItem)
event.relatedTarget === null
)
{ {
// Try any value they had in progress return;
if(this._searchInputNode.value && this.allowFreeEntries) }
{
this.createFreeEntry(this._searchInputNode.value); // Try any value they had in progress
} if(this._searchInputNode.value && this.allowFreeEntries)
await this.dropdown.hide(); {
this.clearSearch(); this.createFreeEntry(this._searchInputNode.value);
if(event.relatedTarget && event.relatedTarget !== this) }
{ await this.dropdown.hide();
event.relatedTarget.focus(); this.clearSearch();
} if(event.relatedTarget && event.relatedTarget !== this)
{
event.relatedTarget.focus();
} }
} }