forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			170 lines
		
	
	
		
			No EOL
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			No EOL
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
 | 
						|
import {OH} from "./OpeningHours";
 | 
						|
import {UIEventSource} from "../../Logic/UIEventSource";
 | 
						|
import {UIElement} from "../UIElement";
 | 
						|
import Combine from "../Base/Combine";
 | 
						|
import {TextField} from "../Input/TextField";
 | 
						|
import {DropDown} from "../Input/DropDown";
 | 
						|
import {InputElement} from "../Input/InputElement";
 | 
						|
import Translations from "../i18n/Translations";
 | 
						|
 | 
						|
export default class PublicHolidayInput extends InputElement<string> {
 | 
						|
    IsSelected: UIEventSource<boolean> = new UIEventSource<boolean>(false);
 | 
						|
 | 
						|
    private readonly _value: UIEventSource<string>;
 | 
						|
    private readonly _dropdown: UIElement;
 | 
						|
    private readonly _mode: UIEventSource<string>;
 | 
						|
    private readonly _startHour: UIElement;
 | 
						|
    private readonly _endHour: UIElement;
 | 
						|
 | 
						|
    constructor(value: UIEventSource<string> = new UIEventSource<string>("")) {
 | 
						|
        super();
 | 
						|
        this._value = value;
 | 
						|
 | 
						|
        const dropdown = new DropDown(
 | 
						|
            Translations.t.general.opening_hours.open_during_ph,
 | 
						|
            [
 | 
						|
                {shown: Translations.t.general.opening_hours.ph_not_known, value: ""},
 | 
						|
                {shown: Translations.t.general.opening_hours.ph_closed, value: "off"},
 | 
						|
                {shown:Translations.t.general.opening_hours.ph_open, value: " "}
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        this._dropdown = dropdown.SetStyle("display:inline-block;");
 | 
						|
        this._mode = dropdown.GetValue();
 | 
						|
        this.ListenTo(this._mode);
 | 
						|
 | 
						|
        const start = new TextField({
 | 
						|
            placeholder: "starthour",
 | 
						|
            htmlType: "time"
 | 
						|
        });
 | 
						|
        const end = new TextField({
 | 
						|
            placeholder: "starthour",
 | 
						|
            htmlType: "time"
 | 
						|
        });
 | 
						|
        this._startHour = start.SetStyle("display:inline-block;");
 | 
						|
        this._endHour = end.SetStyle("display:inline-block;");
 | 
						|
        const self = this;
 | 
						|
 | 
						|
        this._value.addCallbackAndRun(ph => {
 | 
						|
            if (ph === undefined) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            const parsed = PublicHolidayInput.LoadValue(ph);
 | 
						|
            if (parsed === null) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            dropdown.GetValue().setData(parsed.mode);
 | 
						|
            if (parsed.start) {
 | 
						|
                start.GetValue().setData(parsed.start);
 | 
						|
            }
 | 
						|
            if (parsed.end) {
 | 
						|
                end.GetValue().setData(parsed.end);
 | 
						|
            }
 | 
						|
 | 
						|
        })
 | 
						|
 | 
						|
 | 
						|
        function updateValue() {
 | 
						|
            const phStart = dropdown.GetValue().data;
 | 
						|
            if (phStart === undefined || phStart === "") {
 | 
						|
                // Unknown
 | 
						|
                self._value.setData("");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            if (phStart === " ") {
 | 
						|
                // THey are open, we need to include the start- and enddate
 | 
						|
                const startV = start.GetValue().data;
 | 
						|
                const endV = end.GetValue().data;
 | 
						|
                if (startV === undefined || endV === undefined) {
 | 
						|
                    self._value.setData(`PH open`);
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                self._value.setData(`PH ${startV}-${endV}`);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            self._value.setData(`PH ${phStart}`);
 | 
						|
        }
 | 
						|
 | 
						|
        dropdown.GetValue().addCallbackAndRun(() => {
 | 
						|
            updateValue();
 | 
						|
        });
 | 
						|
        start.GetValue().addCallbackAndRun(() => {
 | 
						|
            updateValue();
 | 
						|
        });
 | 
						|
        end.GetValue().addCallbackAndRun(() => {
 | 
						|
            updateValue();
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public static LoadValue(str: string): {
 | 
						|
        mode: string,
 | 
						|
        start?: string,
 | 
						|
        end?: string
 | 
						|
    } {
 | 
						|
        str = str.trim();
 | 
						|
        if (!str.startsWith("PH")) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        str = str.trim();
 | 
						|
        if (str === "PH off") {
 | 
						|
            return {
 | 
						|
                mode: "off"
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        if(str === "PH open"){
 | 
						|
            return {
 | 
						|
                mode: " "
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (!str.startsWith("PH ")) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
        try {
 | 
						|
 | 
						|
            const timerange = OH.parseHHMMRange(str.substring(2));
 | 
						|
            if (timerange === null) {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
 | 
						|
            return {
 | 
						|
                mode: " ",
 | 
						|
                start: OH.hhmm(timerange.startHour, timerange.startMinutes),
 | 
						|
                end: OH.hhmm(timerange.endHour, timerange.endMinutes),
 | 
						|
 | 
						|
            }
 | 
						|
        } catch (e) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    InnerRender(): string {
 | 
						|
        const mode = this._mode.data;
 | 
						|
        if (mode === " ") {
 | 
						|
            return new Combine([this._dropdown,
 | 
						|
                " ",
 | 
						|
                Translations.t.general.opening_hours.opensAt,
 | 
						|
                " ",
 | 
						|
                this._startHour,
 | 
						|
                " ",
 | 
						|
                Translations.t.general.opening_hours.openTill,
 | 
						|
                " ",
 | 
						|
                this._endHour]).Render();
 | 
						|
        }
 | 
						|
        return this._dropdown.Render();
 | 
						|
    }
 | 
						|
 | 
						|
    GetValue(): UIEventSource<string> {
 | 
						|
        return this._value;
 | 
						|
    }
 | 
						|
 | 
						|
    IsValid(t: string): boolean {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
} |