import { Directive, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; import { v4 as uuidv4 } from 'uuid'; @Directive() export class AbstractInputComponent implements OnInit, ControlValueAccessor { @ViewChild("inputField") inputField: ElementRef constructor() { } onChange = (newValue: T) => {}; onTouched = () => {}; writeValue(newValue: any): void { this.value = newValue } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } setDisabledState?(isDisabled: boolean): void { this.disabled = isDisabled; } focus() { if (this.inputField && this.inputField.nativeElement) { this.inputField.nativeElement.focus() } } @Input() title: string @Input() disabled = false; @Input() error: string value: T ngOnInit(): void { this.inputId = uuidv4() } inputId: string @Input() hint: string }