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