import {UIElement} from "../UIElement"; import {InputElement} from "./InputElement"; import Translations from "../i18n/Translations"; import {UIEventSource} from "../../Logic/UIEventSource"; export class TextField extends InputElement { private readonly value: UIEventSource; public readonly enterPressed = new UIEventSource(undefined); private readonly _placeholder: UIElement; public readonly IsSelected: UIEventSource = new UIEventSource(false); private readonly _isArea: boolean; private readonly _textAreaRows: number; constructor(options?: { placeholder?: string | UIElement, value?: UIEventSource, textArea?: boolean, textAreaRows?: number, isValid?: ((s: string) => boolean) }) { super(undefined); const self = this; this.value = new UIEventSource(""); options = options ?? {}; this._isArea = options.textArea ?? false; this.value = options?.value ?? new UIEventSource(undefined); // @ts-ignore this._fromString = options.fromString ?? ((str) => (str)) this._textAreaRows = options.textAreaRows; this._placeholder = Translations.W(options.placeholder ?? ""); this.ListenTo(this._placeholder._source); this.onClick(() => { self.IsSelected.setData(true) }); this.value.addCallback((t) => { const field = document.getElementById(this.id); if (field === undefined || field === null) { return; } if (options.isValid) { field.className = options.isValid(t) ? "" : "invalid"; } if (t === undefined || t === null) { // @ts-ignore return; } // @ts-ignore field.value = t; }); } GetValue(): UIEventSource { return this.value; } InnerRender(): string { if (this._isArea) { return `` } const placeholder = this._placeholder.InnerRender().replace("'", "'"); return `
` + `` + `
`; } InnerUpdate(field) { const self = this; field.oninput = () => { // @ts-ignore self.value.setData(field.value); }; if (this.value.data !== undefined && this.value.data !== null) { // @ts-ignore field.value = this.value.data; } field.addEventListener("focusin", () => self.IsSelected.setData(true)); field.addEventListener("focusout", () => self.IsSelected.setData(false)); field.addEventListener("keyup", function (event) { if (event.key === "Enter") { // @ts-ignore self.enterPressed.setData(field.value); } }); } public SetCursorPosition(i: number) { const field = document.getElementById('text-' + this.id); if(field === undefined || field === null){ return; } if (i === -1) { // @ts-ignore i = field.value.length; } field.focus(); // @ts-ignore field.setSelectionRange(i, i); } IsValid(t: string): boolean { return !(t === undefined || t === null); } }