import {Store, UIEventSource} from "../../Logic/UIEventSource"; import BaseUIElement from "../BaseUIElement"; import {VariableUiElement} from "../Base/VariableUIElement"; import Lazy from "../Base/Lazy"; /** * The 'Toggle' is a UIElement showing either one of two elements, depending on the state. * It can be used to implement e.g. checkboxes or collapsible elements */ export default class Toggle extends VariableUiElement { public readonly isEnabled: Store; constructor(showEnabled: string | BaseUIElement, showDisabled: string | BaseUIElement, isEnabled: Store) { super( isEnabled?.map(isEnabled => isEnabled ? showEnabled : showDisabled) ); this.isEnabled = isEnabled } public static If(condition: Store, constructor: () => BaseUIElement): BaseUIElement { if (constructor === undefined) { return undefined } return new Toggle( new Lazy(constructor), undefined, condition ) } } /** * Same as `Toggle`, but will swap on click */ export class ClickableToggle extends Toggle { public readonly isEnabled: UIEventSource; constructor(showEnabled: string | BaseUIElement, showDisabled: string | BaseUIElement, isEnabled: UIEventSource = new UIEventSource(false)) { super( showEnabled, showDisabled, isEnabled ); this.isEnabled = isEnabled } public ToggleOnClick(): ClickableToggle { const self = this; this.onClick(() => { self.isEnabled.setData(!self.isEnabled.data); }) return this; } }