import {
Component,
ElementRef,
EventEmitter,
HostListener,
Input,
OnChanges,
OnDestroy,
OnInit,
Output,
SimpleChanges,
ViewChild
} from "@angular/core";
import {AbstractControl, FormArray, FormControl, ValidatorFn} from "@angular/forms";
import {HelperFunctions} from "../../utils/HelperFunctions.class";
import {Observable, of, Subscription} from "rxjs";
import {MatSelect} from "@angular/material/select";
import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete";
import {map, startWith} from "rxjs/operators";
import {MatChipInputEvent} from "@angular/material/chips";
export interface Option {
icon?: string,
iconClass?: string,
value: any,
label: string
}
@Component({
selector: '[dashboard-input]',
template: `
{{label + (required ? ' *' : '')}}
{{hint}}
{{placeholder}}
{{option.label}}
{{getLabel(formControl.value)}}
{{placeholder}}
{{option.label}}
{{getLabel(chip.value)}}
{{placeholder}}
{{option.label}}
{{formControl.errors.error}}Please provide a valid URL (e.g. https://example.com)Note: Prefer urls like "https://example.com/my-secure-image.png"
instead of "http://example.com/my-image.png".
Browsers may not load non secure content.
{{label}}
`,
styleUrls: ['input.component.css']
})
export class InputComponent implements OnInit, OnDestroy, OnChanges {
/** Basic information */
@Input('formInput') formControl: AbstractControl;
@Input('type') type: 'text' | 'URL' | 'logoURL' | 'autocomplete' | 'textarea' | 'select' | 'checkbox' | 'chips' = 'text';
@Input('label') label: string;
/** Text */
@ViewChild('input') input: ElementRef;
/** Textarea options */
@Input('rows') rows: number = 3;
/** Select | chips available options */
@Input('options') options: Option[] = [];
@Input('hint') hint = null;
@Input('placeholder') placeholder = '';
@Input() inputClass: string = 'input-box';
/** Extra element Right or Left of the input */
@Input() extraLeft: boolean = true;
@Input() gridSmall: boolean = false;
@Input() hideControl: boolean = false;
@Input() flex: 'middle' | 'top' | 'bottom' = 'middle';
/** Icon Right or Left on the input */
@Input() icon: string = null;
@Input() iconLeft: boolean = false;
/** Chip options */
@Input() removable: boolean = true;
@Input() addExtraChips: boolean = false;
@Input() smallChip: boolean = false;
@Input() panelWidth: number = 300;
@Input() panelClass: string = null;
@Input() showOptionsOnEmpty: boolean = true;
@Input() validators: ValidatorFn[];
@Output() focusEmitter: EventEmitter = new EventEmitter();
/** LogoUrl information */
public secure: boolean = true;
/** Internal basic information */
public required: boolean = false;
private initValue: any;
/** Chips && Autocomplete*/
public filteredOptions: Observable