Newer
Older
import { Component, OnInit, ViewChild, ElementRef, EventEmitter, Output, Input } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { TranslateService } from '@ngx-translate/core';
import { AppService } from '../../../service/app.service';
import { FunctionsService } from '../../../service/functions.service';
import { Observable } from 'rxjs';
import { FormControl } from '@angular/forms';
import { startWith, map } from 'rxjs/operators';
import { LatinisePipe } from 'ngx-pipes';
import { MatExpansionPanel } from '@angular/material/expansion';
import { IndexingFieldsService } from '../../../service/indexing-fields.service';
@Component({
selector: 'app-criteria-tool',
templateUrl: 'criteria-tool.component.html',
styleUrls: ['criteria-tool.component.scss']
})
export class CriteriaToolComponent implements OnInit {
criteria: any = [];
currentCriteria: any = [];
filteredCriteria: Observable<string[]>;
searchTermControl = new FormControl();
searchCriteria = new FormControl();
@Input() searchTerm: string = 'Foo';
@Input() defaultCriteria: any = [];
@Output() searchUrlGenerated = new EventEmitter<string>();
@ViewChild('criteriaTool', { static: false }) criteriaTool: MatExpansionPanel;
@ViewChild('searchCriteriaInput', { static: false }) searchCriteriaInput: ElementRef;
constructor(
public translate: TranslateService,
public http: HttpClient,
public appService: AppService,
public functions: FunctionsService,
public indexingFields: IndexingFieldsService,
private latinisePipe: LatinisePipe) { }
async ngOnInit(): Promise<void> {
// console.log('getAllFields()', await this.indexingFields.getAllFields());
this.searchTermControl.setValue(this.searchTerm);
this.criteria = await this.indexingFields.getAllFields();
this.criteria.forEach((element: any) => {
if (this.defaultCriteria.indexOf(element.identifier) > -1) {
element.control = new FormControl('');
this.currentCriteria.push(element);
}
this.filteredCriteria = this.searchCriteria.valueChanges
.pipe(
startWith(''),
map(value => this._filter(value))
);
this.searchTermControl.valueChanges
.pipe(
startWith(''),
map(value => {
if (typeof value === 'string') {
this.searchTerm = value;
}
})
).subscribe();
private _filter(value: string): string[] {
if (typeof value === 'string') {
const filterValue = this.latinisePipe.transform(value.toLowerCase());
return this.criteria.filter((option: any) => this.latinisePipe.transform(option['label'].toLowerCase()).includes(filterValue));
return this.criteria;
}
}
isCurrentCriteria(criteriaId: string) {
return this.currentCriteria.filter((currCrit: any) => currCrit.identifier === criteriaId).length > 0;
}
addCriteria(criteria: any) {
criteria.control = new FormControl('');
this.currentCriteria.push(criteria);
this.searchTermControl.setValue(this.searchTerm);
// this.searchCriteriaInput.nativeElement.blur();
}
removeCriteria(index: number) {
this.currentCriteria.splice(index, 1);
}
getSearchUrl() {
let arrUrl: any[] = [];
this.currentCriteria.forEach((crit: any) => {
if (!this.functions.empty(crit.control.value)) {
arrUrl.push(`${crit.id}=${crit.control.value}`);
}
});
this.criteriaTool.close();
this.searchUrlGenerated.emit('&' + arrUrl.join('&'));
getFilterControl() {
return this.searchCriteria;
}
getCriterias() {
return this.criteria;
}
getFilteredCriterias() {
return this.filteredCriteria;
}
}