blob: 0fabadb0af9e131618f596d0d353fba5c7bfe687 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
import {Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ViewChild, AfterViewInit} from '@angular/core';
import {FormGroup} from '@angular/forms';
import {LocalizationService} from '../localization/localization.service';
import {Condition, Operator, OperatorUtil} from './filter.service';
import {Node} from '../navigator/node';
import {PropertyService} from '../core/property.service';
import {QueryService} from '../tableview/query.service';
import {AutoComplete} from 'primeng/primeng';
import {MDMNotificationService} from '../core/mdm-notification.service';
import {TranslateService} from '@ngx-translate/core';
import { DatePipe } from '@angular/common';
@Component({
selector: '[search-condition]',
templateUrl: 'search-condition.component.html',
styleUrls: ['search-condition.component.css'],
})
export class SearchConditionComponent implements OnChanges, AfterViewInit {
@Input() env: string;
@Input() condition: Condition;
@Input() form: FormGroup;
@Input() disabled: boolean;
@Input() selectedEnvs: Node[];
@Output() onRemove = new EventEmitter<Condition>();
suggestions: string[];
displayedSuggestions: string[] = [];
lastQuery: string;
dateValue: Date;
@ViewChild(AutoComplete) primeAutoCompleteComponent: AutoComplete;
constructor(private localservice: LocalizationService,
private prop: PropertyService,
private queryService: QueryService,
private notificationService: MDMNotificationService,
private translateService: TranslateService,
private datePipe: DatePipe) { }
ngAfterViewInit() {
if (this.primeAutoCompleteComponent) {
/* Workaround for missing onBlur handler in primeng version 2.x.
* We overwrite the existing implementation and additional call our own event handler.
* In later versions this feature was added https://github.com/primefaces/primeng/issues/2256
* and this workaround should be removed when using primeng version 4 or later
*/
this.primeAutoCompleteComponent.onBlur = function() {
this.primeAutoCompleteComponent.focus = false;
this.primeAutoCompleteComponent.onModelTouched();
this.onAutocompleteBlur();
}.bind(this);
}
}
onAutocompleteBlur() {
this.onEnter(new Event('blur'));
}
ngOnChanges(changes: SimpleChanges) {
if (changes['selectedEnvs'] && this.condition.valueType === 'string') {
this.setAutoCompleteValues();
}
if (this.condition.valueType === 'date') {
console.log(this.condition.value[0]);
if (this.condition.value === undefined || this.condition.value[0] === undefined) {
this.dateValue = new Date();
(<Date> this.dateValue).setHours(0, 0, 0, 0);
} else {
this.dateValue = new Date(this.condition.value[0]);
}
}
}
onEnter(e: Event) {
let hl = this.primeAutoCompleteComponent.highlightOption;
if (hl == undefined && this.lastQuery !== '' || hl != undefined && this.displayedSuggestions.find(s => s === hl) == undefined) {
if (this.primeAutoCompleteComponent.value[this.primeAutoCompleteComponent.value.length - 1] === hl) {
this.primeAutoCompleteComponent.value.pop();
}
this.primeAutoCompleteComponent.selectItem(this.lastQuery);
this.lastQuery = '';
}
this.primeAutoCompleteComponent.highlightOption = undefined;
this.displayedSuggestions = [];
}
setAutoCompleteValues() {
this.queryService.suggestValues(this.env === 'Global' ?
this.selectedEnvs.map(env => env.sourceName) :
[this.env], this.condition.type, this.condition.attribute)
.subscribe(
values => this.suggestions = Array.from(new Set<string>(values)),
error => this.notificationService.notifyError(
this.translateService.instant('search.search-condition.err-cannot-initialize-autocompletion'), error)
);
}
updateSuggestions(e: any) {
if (this.suggestions) {
this.displayedSuggestions =
[...this.suggestions.filter(sug => sug.toLowerCase().indexOf(e.query.toLowerCase()) > -1).slice(0, 10)];
}
this.lastQuery = e.query;
}
getOperators() {
return OperatorUtil.values();
}
getOperatorName(op: Operator) {
return OperatorUtil.toString(op);
}
setOperator(operator: Operator) {
this.condition.operator = operator;
}
setValue(value: string) {
this.condition.value = [value];
}
setValues(value: string[]) {
this.condition.value = value;
}
setDateValue(value: Date) {
console.log(value);
this.condition.value = [this.datePipe.transform(value, 'yyyy-MM-dd' + 'T' + 'HH:mm:ss')];
}
remove() {
this.onRemove.emit(this.condition);
}
}