40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
|
import BaseUIElement from "../BaseUIElement";
|
||
|
import {UIEventSource} from "../../Logic/UIEventSource";
|
||
|
import {VariableUiElement} from "./VariableUIElement";
|
||
|
import Combine from "./Combine";
|
||
|
import Locale from "../i18n/Locale";
|
||
|
import {Utils} from "../../Utils";
|
||
|
|
||
|
export default class FilteredCombine extends VariableUiElement {
|
||
|
|
||
|
/**
|
||
|
* Only shows item matching the search
|
||
|
* If predicate of an item is undefined, it will be filtered out as soon as a non-null or non-empty search term is given
|
||
|
* @param entries
|
||
|
* @param searchedValue
|
||
|
* @param options
|
||
|
*/
|
||
|
constructor(entries: {
|
||
|
element: BaseUIElement | string,
|
||
|
predicate?: (s: string) => boolean
|
||
|
}[],
|
||
|
searchedValue: UIEventSource<string>,
|
||
|
options?: {
|
||
|
onEmpty?: BaseUIElement | string,
|
||
|
innerClasses: string
|
||
|
}
|
||
|
) {
|
||
|
entries = Utils.NoNull(entries)
|
||
|
super(searchedValue.map(searchTerm => {
|
||
|
if(searchTerm === undefined || searchTerm === ""){
|
||
|
return new Combine(entries.map(e => e.element)).SetClass(options?.innerClasses ?? "")
|
||
|
}
|
||
|
const kept = entries.filter(entry => entry?.predicate !== undefined && entry.predicate(searchTerm))
|
||
|
if (kept.length === 0) {
|
||
|
return options?.onEmpty
|
||
|
}
|
||
|
return new Combine(kept.map(entry => entry.element)).SetClass(options?.innerClasses ?? "")
|
||
|
}, [Locale.language]))
|
||
|
}
|
||
|
|
||
|
}
|