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); } }