import {
AfterViewInit,
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
HostListener,
Input,
OnInit,
Output,
ViewChild
} from '@angular/core';
import {AbstractControl} from '@angular/forms';
import {InputComponent} from "../input/input.component";
import {ClickEvent} from "../../utils/click/click-outside-or-esc.directive";
@Component({
selector: '[search-input]',
template: `
`
})
export class SearchInputComponent implements OnInit, AfterViewInit {
@Input() disabled: boolean = false;
@Input() searchInputClass: string = 'inner';
@Input() iconPosition: 'left' | 'right' = 'right';
@Input() searchControl: AbstractControl;
@Input() value: string;
@Output() valueChange = new EventEmitter();
@Input() options: string[] = [];
@Input() placeholder: string;
@Input() expandable: boolean = false;
@Output() searchEmitter: EventEmitter = new EventEmitter();
@ViewChild('searchInput') searchInput: ElementRef;
@ViewChild('input') input: InputComponent;
public expanded: boolean = true;
public initialized: boolean = false;
public ratio: number = 1;
constructor(private cdr: ChangeDetectorRef) {
}
@HostListener('window:keydown.enter', ['$event'])
enter(event: KeyboardEvent) {
if(this.input.focused && !this.input.opened) {
event.preventDefault();
this.search(event);
} else {
this.input.enter(event);
event.stopPropagation();
this.search(event);
}
}
click(event: ClickEvent) {
if(this.expandable && !this.disabled) {
this.expand(!event.clicked);
}
}
ngOnInit() {
this.expanded = !this.expandable;
this.initialized = true;
}
ngAfterViewInit() {
if(typeof document !== 'undefined') {
this.ratio = Number.parseFloat(getComputedStyle(this.searchInput.nativeElement).getPropertyValue('--search-input-icon-ratio'));
this.cdr.detectChanges();
}
}
expand(value: boolean) {
this.expanded = value;
this.cdr.detectChanges();
if(this.expanded) {
this.input.focus(true);
}
}
public search(event) {
if(!this.disabled) {
this.searchEmitter.emit();
if(this.expandable) {
this.expand(!this.expanded);
}
event.stopPropagation();
}
}
public reset() {
if(this.searchControl){
this.searchControl.setValue('');
} else {
this.valueChange.emit('');
}
setTimeout(() => {
this.input.focus(true);
}, 100)
}
get hidden(): boolean {
return !this.expanded && (!this.searchControl?.value && !this.value);
}
}