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 }