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]
 | 
						|
            )
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 |