UNPKG

flexacore-ui-dev

Version:

Universal UI Framework for CDN, React, Angular, Vue, Svelte with TypeScript support

78 lines (68 loc) 1.84 kB
import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ selector: 'fc-textarea', template: ` <textarea [ngClass]="classes" [placeholder]="placeholder" [value]="value" [disabled]="disabled" [readonly]="readonly" [rows]="rows" [cols]="cols" (input)="onInput($event)" (blur)="onBlur()" (focus)="onFocus()" ></textarea> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FCTextareaComponent), multi: true } ] }) export class FCTextareaComponent implements ControlValueAccessor { @Input() placeholder: string = ''; @Input() disabled: boolean = false; @Input() readonly: boolean = false; @Input() rows: number = 3; @Input() cols: number = 50; @Input() size: 'sm' | 'md' | 'lg' = 'md'; @Output() valueChange = new EventEmitter<string>(); value: string = ''; private onChange = (value: string) => {}; private onTouched = () => {}; get classes() { return [ 'fc-textarea', `fc-textarea-${this.size}` ]; } onInput(event: Event) { const target = event.target as HTMLTextAreaElement; this.value = target.value; this.onChange(this.value); this.valueChange.emit(this.value); } onBlur() { this.onTouched(); } onFocus() { // Focus event handling if needed } writeValue(value: string): void { this.value = value || ''; } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } setDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; } }