forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.8 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]
 | |
|             )
 | |
|         )
 | |
|     }
 | |
| }
 |