forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {UIEventSource} from "../UIEventSource";
 | 
						|
import {UIElement} from "../UIElement";
 | 
						|
 | 
						|
export class DropDownUI extends UIElement {
 | 
						|
 | 
						|
    selectedElement: UIEventSource<string>
 | 
						|
    private _label: string;
 | 
						|
    private _values: { value: string; shown: string }[];
 | 
						|
 | 
						|
    constructor(label: string, values: { value: string, shown: string }[],
 | 
						|
                selectedElement: UIEventSource<string> = undefined) {
 | 
						|
        super(undefined);
 | 
						|
        this._label = label;
 | 
						|
        this._values = values;
 | 
						|
        this.selectedElement = selectedElement ?? new UIEventSource<string>(values[0].value);
 | 
						|
        if(selectedElement.data === undefined){
 | 
						|
            this.selectedElement.setData(values[0].value)
 | 
						|
        }
 | 
						|
        const self = this;
 | 
						|
        this.selectedElement.addCallback(() => {
 | 
						|
            self.InnerUpdate();
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    protected InnerRender(): string {
 | 
						|
 | 
						|
        let options = "";
 | 
						|
        for (const value of this._values) {
 | 
						|
            options += "<option value='" + value.value + "'>" + value.shown + "</option>"
 | 
						|
        }
 | 
						|
 | 
						|
        return "<form>" +
 | 
						|
            "<label for='dropdown-" + this.id + "'>" + this._label + "</label>" +
 | 
						|
            "<select name='dropdown-" + this.id + "' id='dropdown-" + this.id + "'>" +
 | 
						|
            options +
 | 
						|
            "</select>" +
 | 
						|
            "</form>";
 | 
						|
    }
 | 
						|
 | 
						|
    InnerUpdate() {
 | 
						|
        const self = this;
 | 
						|
        const e = document.getElementById("dropdown-" + this.id);
 | 
						|
        if(e === null){
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        // @ts-ignore
 | 
						|
        if (this.selectedElement.data !== e.value) {
 | 
						|
            // @ts-ignore
 | 
						|
            e.value = this.selectedElement.data;
 | 
						|
        }
 | 
						|
        e.onchange = function () {
 | 
						|
            // @ts-ignore
 | 
						|
            const selectedValue = e.options[e.selectedIndex].value;
 | 
						|
            console.log("Putting data", selectedValue)
 | 
						|
            self.selectedElement.setData(selectedValue);
 | 
						|
        }
 | 
						|
        
 | 
						|
    }
 | 
						|
 | 
						|
} |