blob: 64bef6badc2cb9502bfa8ee641184f8911d10be5 [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 {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import {map} from 'rxjs/operators';
import {PropertyService} from '../core/property.service';
import {PreferenceService, Preference, Scope} from '../core/preference.service';
import {Exclude, serialize, deserialize} from 'class-transformer';
import { TRANSLATE } from '../core/mdm-core.module';
export enum Operator {
EQUALS,
LESS_THAN,
GREATER_THAN,
LIKE
}
export namespace OperatorUtil {
export function values() {
return [ Operator.EQUALS, Operator.LESS_THAN, Operator.GREATER_THAN, Operator.LIKE ];
}
export function toString(operator: Operator) {
switch (operator) {
case Operator.EQUALS:
return '=';
case Operator.LESS_THAN:
return '<';
case Operator.GREATER_THAN:
return '>';
case Operator.LIKE:
return 'like';
default:
return undefined;
}
}
export function toFilterString(operator: Operator) {
switch (operator) {
case Operator.EQUALS:
return 'eq';
case Operator.LESS_THAN:
return 'lt';
case Operator.GREATER_THAN:
return 'gt';
case Operator.LIKE:
return 'lk';
default:
return undefined;
}
}
}
export class Condition {
type: string;
attribute: string;
operator: Operator;
value: string[];
valueType: string;
@Exclude()
sortIndex: number;
constructor(type: string, attribute: string, operator: Operator, value: string[], valueType?: string) {
this.type = type;
this.attribute = attribute;
this.operator = operator;
this.value = value;
if (valueType) {
this.valueType = valueType.toLowerCase();
} else {
this.valueType = 'string';
}
}
}
export class SearchFilter {
name: string;
environments: string[];
resultType: string;
fulltextQuery: string;
conditions: Condition[] = [];
constructor(name: string, environments: string[], resultType: string, fulltextQuery: string, conditions: Condition[]) {
this.name = name;
this.environments = environments;
this.resultType = resultType;
this.fulltextQuery = fulltextQuery;
this.conditions = conditions;
}
}
@Injectable()
export class FilterService {
public readonly NO_FILTER_NAME = TRANSLATE('search.filter.no-filter-selected');
public readonly NEW_FILTER_NAME = TRANSLATE('search.filter.new-filter');
public readonly EMPTY_FILTER: SearchFilter = new SearchFilter(this.NO_FILTER_NAME, [], 'Test', '', []);
constructor(private http: Http,
private _prop: PropertyService,
private preferenceService: PreferenceService) {
}
getFilters() {
return this.preferenceService.getPreferenceForScope(Scope.USER, 'filter.nodes.').pipe(
map(preferences => preferences.map(p => this.preferenceToFilter(p))));
}
saveFilter(filter: SearchFilter) {
return this.preferenceService.savePreference(this.filterToPreference(filter));
}
private preferenceToFilter(pref: Preference) {
return deserialize(SearchFilter, pref.value);
}
private filterToPreference(filter: SearchFilter) {
let pref = new Preference();
pref.value = serialize(filter);
pref.key = filter ? 'filter.nodes.' + filter.name : 'filter.nodes.';
pref.scope = Scope.USER;
return pref;
}
deleteFilter(name: string) {
return this.preferenceService.deletePreferenceByScopeAndKey(Scope.USER, 'filter.nodes.' + name);
}
}