import HTMLInputElement from '../html-input-element/HTMLInputElement'; import HTMLSelectElement from '../html-select-element/HTMLSelectElement'; /** * Input validity state. * * @see https://developer.mozilla.org/en-US/docs/Web/API/ValidityState */ export default class ValidityState { public badInput = false; public customError = false; public patternMismatch = false; public rangeOverflow = false; public rangeUnderflow = false; public stepMismatch = false; private element: HTMLInputElement | HTMLSelectElement = null; /** * Constructor. * * @param element Input element. */ constructor(element: HTMLInputElement | HTMLSelectElement) { this.element = element; } /** * Returns validity. * * @returns "true" if valid. */ public get tooLong(): boolean { if (this.element instanceof HTMLInputElement) { return this.element.maxLength && this.element.value.length > this.element.maxLength; } return false; } /** * Returns validity. * * @returns "true" if valid. */ public get tooShort(): boolean { if (this.element instanceof HTMLInputElement) { return this.element.minLength && this.element.value.length < this.element.minLength; } return false; } /** * Returns validity. * * @returns "true" if valid. */ public get typeMismatch(): boolean { return false; } /** * Returns validity. * * @returns "true" if valid. */ public get valueMissing(): boolean { return this.element.required && !this.element.value; } /** * Returns validity. * * @returns "true" if valid. */ public get valid(): boolean { for (const key of Object.keys(this)) { if (this[key]) { return false; } } return !this.tooLong && !this.tooShort && !this.typeMismatch && !this.valueMissing; } }