diff --git a/projects/components/src/filtering/filter/filter-url.service.test.ts b/projects/components/src/filtering/filter/filter-url.service.test.ts index 5de0a1b8e..da7e009b3 100644 --- a/projects/components/src/filtering/filter/filter-url.service.test.ts +++ b/projects/components/src/filtering/filter/filter-url.service.test.ts @@ -62,7 +62,8 @@ describe('Filter URL service', () => { providers: [ mockProvider(NavigationService, { navigation$: EMPTY, - addQueryParametersToUrl: (paramObject: QueryParamObject) => (testQueryParamObject = paramObject), + addQueryParametersToUrl: (paramObject: QueryParamObject) => + (testQueryParamObject = { ...testQueryParamObject, ...paramObject }), getAllValuesForQueryParameter: (param: string) => testQueryParamObject[param] ?? [] }) ] @@ -361,4 +362,23 @@ describe('Filter URL service', () => { filter: ['numberAttribute_neq_217', 'stringAttribute_eq_test', 'stringMapAttribute.myKey_eq_myValue'] }); }); + + test('correctly gets filters and group by from url', () => { + testQueryParamObject = { + ...expectedQueryParamObject, + ['group-by']: ['field1,field2'] + }; + expect(spectator.service.getUrlFilters(attributes)).toEqual(filters); + expect(spectator.service.getUrlGroupBy()).toEqual(['field1', 'field2']); + }); + + test('correctly sets filters and group by in url', () => { + spectator.service.setUrlGroupBy(['field1', 'field2']); + spectator.service.setUrlFilters(filters); + + expect(testQueryParamObject).toEqual({ + ...expectedQueryParamObject, + ['group-by']: ['field1,field2'] + }); + }); }); diff --git a/projects/components/src/filtering/filter/filter-url.service.ts b/projects/components/src/filtering/filter/filter-url.service.ts index 2de20d590..aa6309aff 100644 --- a/projects/components/src/filtering/filter/filter-url.service.ts +++ b/projects/components/src/filtering/filter/filter-url.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { NavigationService } from '@hypertrace/common'; -import { remove } from 'lodash-es'; +import { isEmpty, remove } from 'lodash-es'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { FilterBuilderLookupService } from './builder/filter-builder-lookup.service'; @@ -15,6 +15,7 @@ import { splitFilterStringByOperator } from './parser/parsed-filter'; }) export class FilterUrlService { private static readonly FILTER_QUERY_PARAM: string = 'filter'; + private static readonly GROUP_BY_QUERY_PARAM: string = 'group-by'; public constructor( private readonly navigationService: NavigationService, @@ -54,6 +55,19 @@ export class FilterUrlService { }); } + public setUrlGroupBy(groupBy?: string[]): void { + this.navigationService.addQueryParametersToUrl({ + [FilterUrlService.GROUP_BY_QUERY_PARAM]: isEmpty(groupBy) ? undefined : [groupBy!.toString()] + }); + } + + public getUrlGroupBy(): string[] { + return this.navigationService + .getAllValuesForQueryParameter(FilterUrlService.GROUP_BY_QUERY_PARAM) + .map(groupByString => groupByString.split(',').map(attributeName => attributeName.trim())) + .flat(); + } + public addUrlFilter(attributes: FilterAttribute[], filter: Filter): void { const remainingFilters = this.getUrlFilters(attributes).filter(f => areCompatibleFilters(f, filter));