Skip to content

Commit

Permalink
Merge pull request #749 from catenax-ng/feature/TRACEFOSS-2796-count-…
Browse files Browse the repository at this point in the history
…filter

Feature/tracefoss 2796 custom count filter for active quality alerts
  • Loading branch information
ds-mmaul authored Nov 10, 2023
2 parents 3fd1749 + 9caade4 commit ab8b5f1
Show file tree
Hide file tree
Showing 18 changed files with 1,093 additions and 820 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- Cypress Login to E2E Environment to enable cypress e2e tests.
- Fixed bug in argo workflow which allows to successfully run on INT-A/INT-B
- New job named 'print_environment' to the Argo-workflow that prints the selected environment to the GitHub Step Summary.
- Added NOTIFICATION_COUNT_EQUAL filter strategy for Assets as built Specifications
- Added new supported filter for notifications assetId that allows filtering alerts and investigations by assetId

### Changed
- Fixed table-settings reset bug
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/app/modules/page/parts/model/parts.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,8 @@ export enum FilterOperator {
AT_LOCAL_DATE = 'AT_LOCAL_DATE',
STARTS_WITH = 'STARTS_WITH',
BEFORE_LOCAL_DATE = 'BEFORE_LOCAL_DATE',
AFTER_LOCAL_DATE = 'AFTER_LOCAL_DATE'
AFTER_LOCAL_DATE = 'AFTER_LOCAL_DATE',
NOTIFICATION_COUNT_EQUAL = 'NOTIFICATION_COUNT_EQUAL'
}

export function getFilterOperatorValue(operator: FilterOperator) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -752,10 +752,6 @@ export class PartsTableComponent implements OnInit {
this.multiSelect.emit(this.selection.selected);
}

public toggleFilter(): void {
this.displayedFilter = !this.displayedFilter;
}

public isSelected(row: unknown): boolean {
return !!this.selection.selected.find(data => JSON.stringify(data) === JSON.stringify(row));
}
Expand Down
162 changes: 92 additions & 70 deletions frontend/src/app/modules/shared/helper/filter-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,56 +24,70 @@ import {
getFilterOperatorValue,
} from '@page/parts/model/parts.model';

export const FILTER_KEYS = ['manufacturingDate', 'functionValidFrom', 'functionValidUntil', 'validityPeriodFrom', 'validityPeriodTo'];
export const DATE_FILTER_KEYS = [ 'manufacturingDate', 'functionValidFrom', 'functionValidUntil', 'validityPeriodFrom', 'validityPeriodTo' ];

// TODO: Refactor function as soon as multi value filter is supported
export function enrichFilterAndGetUpdatedParams(filter: AssetAsBuiltFilter, params: HttpParams, filterOperator: string): HttpParams {
const semanticDataModelKey = "semanticDataModel";
for (const key in filter) {
let operator: string;
const filterValues: string = filter[key];
if (key !== semanticDataModelKey) {
if (filterValues.length !== 0) {
if (isDateFilter(key)) {
if(isDateRangeFilter(filterValues)) {
const [startDate, endDate] = filterValues.split(",")
if(isSameDate(startDate,endDate)) {
operator = getFilterOperatorValue(FilterOperator.AT_LOCAL_DATE);
params = params.append('filter', `${key},${operator},${startDate},${filterOperator}`);
continue;
}
let endDateOperator = getFilterOperatorValue(FilterOperator.BEFORE_LOCAL_DATE)
operator = getFilterOperatorValue((FilterOperator.AFTER_LOCAL_DATE));
params = params.append('filter', `${key},${operator},${startDate},${filterOperator}`);
params = params.append('filter', `${key},${endDateOperator},${endDate},${filterOperator}`);
continue;
} else {
operator = getFilterOperatorValue(FilterOperator.AFTER_LOCAL_DATE);
}
} else {
operator = getFilterOperatorValue(FilterOperator.STARTS_WITH);
}
params = params.append('filter', `${key},${operator},${filterValues},${filterOperator}`);
const semanticDataModelKey = 'semanticDataModel';
for (const key in filter) {
let operator: string;
const filterValues: string = filter[key];
if (key !== semanticDataModelKey) {
if (filterValues.length !== 0) {
if (isDateFilter(key)) {
if (isDateRangeFilter(filterValues)) {
const [ startDate, endDate ] = filterValues.split(',');
if (isSameDate(startDate, endDate)) {
operator = getFilterOperatorValue(FilterOperator.AT_LOCAL_DATE);
params = params.append('filter', `${ key },${ operator },${ startDate },${ filterOperator }`);
continue;
}
let endDateOperator = getFilterOperatorValue(FilterOperator.BEFORE_LOCAL_DATE);
operator = getFilterOperatorValue((FilterOperator.AFTER_LOCAL_DATE));
params = params.append('filter', `${ key },${ operator },${ startDate },${ filterOperator }`);
params = params.append('filter', `${ key },${ endDateOperator },${ endDate },${ filterOperator }`);
continue;
} else {
operator = getFilterOperatorValue(FilterOperator.AFTER_LOCAL_DATE);
}
} else {
operator = getFilterOperatorValue(FilterOperator.EQUAL);
if (Array.isArray(filterValues)) {
for (let value of filterValues) {
params = params.append('filter', `${key},${operator},${value},${filterOperator}`);
}
} else {
params = params.append('filter', `${key},${operator},${filterValues},${filterOperator}`);
}
if (isNotificationCountFilter(key)) {
operator = getFilterOperatorValue(FilterOperator.NOTIFICATION_COUNT_EQUAL);
} else {
operator = getFilterOperatorValue(FilterOperator.STARTS_WITH);
}

}
params = params.append('filter', `${ key },${ operator },${ filterValues },${ filterOperator }`);
}
} else {
operator = getFilterOperatorValue(FilterOperator.EQUAL);
if (Array.isArray(filterValues)) {
for (let value of filterValues) {
params = params.append('filter', `${ key },${ operator },${ value },${ filterOperator }`);
}
} else {
params = params.append('filter', `${ key },${ operator },${ filterValues },${ filterOperator }`);
}
}
return params;
}
return params;
}

export function isStartsWithFilter(key: string): boolean {
return !isDateFilter(key) && !isNotificationCountFilter(key);
}

export function isNotificationCountFilter(key: string): boolean {
return 'qualityInvestigationIdsInStatusActive' === key || 'qualityAlertIdsInStatusActive' === key;
}

export function isDateFilter(key: string): boolean {
return FILTER_KEYS.includes(key);
return DATE_FILTER_KEYS.includes(key);
}

export function isDateRangeFilter(filterValues: string): boolean {
return filterValues.includes(",");
return filterValues.includes(',');
}

export function isSameDate(startDate: string, endDate: string): boolean {
Expand All @@ -82,46 +96,54 @@ export function isSameDate(startDate: string, endDate: string): boolean {

export function toAssetFilter(formValues: any, isAsBuilt: boolean): AssetAsPlannedFilter | AssetAsBuiltFilter {

const transformedFilter: any = {};
const transformedFilter: any = {};

// Loop through each form control and add it to the transformedFilter if it has a non-null and non-undefined value
for (const key in formValues) {
if (formValues[key] !== null && formValues[key] !== undefined) {
if ('activeAlerts' === key) {
transformedFilter['qualityAlertIdsInStatusActive'] = formValues[key];
}
if ('activeInvestigations' === key) {
transformedFilter['qualityInvestigationIdsInStatusActive'] = formValues[key];
} else {
transformedFilter[key] = formValues[key];
}

// Loop through each form control and add it to the transformedFilter if it has a non-null and non-undefined value
for (const key in formValues) {
if (formValues[key] !== null && formValues[key] !== undefined) {
transformedFilter[key] = formValues[key];
}
}
}

const filterIsSet = Object.values(transformedFilter).some(value => value !== undefined && value !== null);
if (filterIsSet) {
if (isAsBuilt) {
return transformedFilter as AssetAsBuiltFilter;
} else {
return transformedFilter as AssetAsPlannedFilter;
}
const filterIsSet = Object.values(transformedFilter).some(value => value !== undefined && value !== null);
if (filterIsSet) {
if (isAsBuilt) {
return transformedFilter as AssetAsBuiltFilter;
} else {
return null;
return transformedFilter as AssetAsPlannedFilter;
}
} else {
return null;
}

}

export function toGlobalSearchAssetFilter(formValues: string, isAsBuilt: boolean) {
let filter;
if (isAsBuilt) {
filter = {
id: formValues,
semanticModelId: formValues,
idShort: formValues,
customerPartId: formValues,
manufacturerPartId: formValues
} as AssetAsBuiltFilter;
} else {
filter = {
id: formValues,
idShort: formValues,
semanticModelId: formValues,
manufacturerPartId: formValues
} as AssetAsPlannedFilter;
}
let filter;
if (isAsBuilt) {
filter = {
id: formValues,
semanticModelId: formValues,
idShort: formValues,
customerPartId: formValues,
manufacturerPartId: formValues,
} as AssetAsBuiltFilter;
} else {
filter = {
id: formValues,
idShort: formValues,
semanticModelId: formValues,
manufacturerPartId: formValues,
} as AssetAsPlannedFilter;
}

return filter;
return filter;
}
Loading

0 comments on commit ab8b5f1

Please sign in to comment.