import {
ChangeDetectionStrategy,
Component,
ElementRef,
EventEmitter,
Input,
Output,
Optional
} from '@angular/core';
import {NgControl, ControlValueAccessor} from '@angular/forms';
import * as _ from 'lodash';
/**
* Angular 2 wrapper around Semantic UI Input Element.
* @see http://semantic-ui.com/elements/input.html
*/
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
host: {'role': 'text'},
selector: 'cw-input-text',
template: `
`,
})
export class InputText implements ControlValueAccessor {
@Input() placeholder = '';
@Input() type = 'text';
@Input() icon: string;
@Input() disabled = false;
@Input() readonly = false;
@Input() focused = false;
@Input() tabIndex: number = null;
@Input() required = false;
@Output() blur: EventEmitter = new EventEmitter();
errorMessage: string;
onChange: Function;
onTouched: Function;
private _modelValue: any;
constructor( @Optional() control: NgControl, private _elementRef: ElementRef) {
if (control) {
control.valueAccessor = this;
}
}
ngOnChanges(change): void {
if (change.focused) {
let f = change.focused.currentValue === true || change.focused.currentValue === 'true';
if (f) {
let el = this._elementRef.nativeElement;
// More info: http://stackoverflow.com/questions/36332418/angular-2-exception-expression-ngclassuntouched-has-changed-after-it-was-che
setTimeout(() => {
el.querySelector('input').focus();
}, 0);
}
}
}
@Input()
set value(v: string){
this.writeValue(v);
}
get value(): string {
return this._modelValue;
}
onBlur(value): void {
this.onTouched();
this.blur.emit(value);
}
writeValue(value: any): void {
this._modelValue = _.isEmpty(value) ? '' : value;
this._elementRef.nativeElement.firstElementChild.firstElementChild.setAttribute('value', this._modelValue);
}
registerOnChange(fn): void {
this.onChange = fn;
}
registerOnTouched(fn): void {
this.onTouched = fn;
}
}