forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			64 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {InputElement} from "../Input/InputElement";
							 | 
						||
| 
								 | 
							
								import {AndOrTagConfigJson} from "../../Customizations/JSON/TagConfigJson";
							 | 
						||
| 
								 | 
							
								import {UIEventSource} from "../../Logic/UIEventSource";
							 | 
						||
| 
								 | 
							
								import {UIElement} from "../UIElement";
							 | 
						||
| 
								 | 
							
								import SettingsTable from "./SettingsTable";
							 | 
						||
| 
								 | 
							
								import SingleSetting from "./SingleSetting";
							 | 
						||
| 
								 | 
							
								import {AndOrTagInput} from "../Input/AndOrTagInput";
							 | 
						||
| 
								 | 
							
								import MultiLingualTextFields from "../Input/MultiLingualTextFields";
							 | 
						||
| 
								 | 
							
								import {DropDown} from "../Input/DropDown";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export default class MappingInput extends InputElement<{ if: AndOrTagConfigJson, then: (string | any), hideInAnswer?: boolean }> {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private readonly _value: UIEventSource<{ if: AndOrTagConfigJson; then: any; hideInAnswer?: boolean }>;
							 | 
						||
| 
								 | 
							
								    private readonly _panel: UIElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    constructor(languages: UIEventSource<any>, disableQuestions: boolean = false) {
							 | 
						||
| 
								 | 
							
								        super();
							 | 
						||
| 
								 | 
							
								        const currentSelected = new UIEventSource<SingleSetting<any>>(undefined);
							 | 
						||
| 
								 | 
							
								        this._value = new UIEventSource<{ if: AndOrTagConfigJson, then: any, hideInAnswer?: boolean }>({
							 | 
						||
| 
								 | 
							
								            if: undefined,
							 | 
						||
| 
								 | 
							
								            then: undefined
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        const self = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        function setting(inputElement: InputElement<any>, path: string, name: string, description: string | UIElement) {
							 | 
						||
| 
								 | 
							
								            return new SingleSetting(self._value, inputElement, path, name, description);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        const withQuestions = [setting(new DropDown("",
							 | 
						||
| 
								 | 
							
								            [{value: false, shown: "Can be used as answer"}, {value: true, shown: "Not an answer option"}]),
							 | 
						||
| 
								 | 
							
								            "hideInAnswer", "Answer option",
							 | 
						||
| 
								 | 
							
								            "Sometimes, multiple tags for the same meaning are used (e.g. <span class='literal-code'>access=yes</span> and <span class='literal-code'>access=public</span>)." +
							 | 
						||
| 
								 | 
							
								            "Use this toggle to disable an anwer. Alternatively an implied/assumed rendering can be used. In order to do this:" +
							 | 
						||
| 
								 | 
							
								            "use a single tag in the 'if' with <i>no</i> value defined, e.g. <span class='literal-code'>indoor=</span>. The mapping will then be shown as default until explicitly changed"
							 | 
						||
| 
								 | 
							
								        )];
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        this._panel = new SettingsTable([
							 | 
						||
| 
								 | 
							
								            setting(new AndOrTagInput(), "if", "If matches", "If this condition matches, the template <b>then</b> below will be used"),
							 | 
						||
| 
								 | 
							
								            setting(new MultiLingualTextFields(languages),
							 | 
						||
| 
								 | 
							
								                "then", "Then show", "If the condition above matches, this template <b>then</b> below will be shown to the user."),
							 | 
						||
| 
								 | 
							
								            ...(disableQuestions ? [] : withQuestions)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ], currentSelected).SetClass("bordered tag-mapping");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    InnerRender(): string {
							 | 
						||
| 
								 | 
							
								        return this._panel.Render();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    GetValue(): UIEventSource<{ if: AndOrTagConfigJson; then: any; hideInAnswer?: boolean }> {
							 | 
						||
| 
								 | 
							
								        return this._value;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    IsSelected: UIEventSource<boolean> = new UIEventSource<boolean>(false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    IsValid(t: { if: AndOrTagConfigJson; then: any; hideInAnswer: boolean }): boolean {
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |