Skip to content

Commit 379ff4e

Browse files
authored
feat: making group by compatible with url (#1487)
1 parent e6c75c7 commit 379ff4e

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

projects/components/src/filtering/filter/filter-url.service.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ describe('Filter URL service', () => {
6262
providers: [
6363
mockProvider(NavigationService, {
6464
navigation$: EMPTY,
65-
addQueryParametersToUrl: (paramObject: QueryParamObject) => (testQueryParamObject = paramObject),
65+
addQueryParametersToUrl: (paramObject: QueryParamObject) =>
66+
(testQueryParamObject = { ...testQueryParamObject, ...paramObject }),
6667
getAllValuesForQueryParameter: (param: string) => testQueryParamObject[param] ?? []
6768
})
6869
]
@@ -361,4 +362,23 @@ describe('Filter URL service', () => {
361362
filter: ['numberAttribute_neq_217', 'stringAttribute_eq_test', 'stringMapAttribute.myKey_eq_myValue']
362363
});
363364
});
365+
366+
test('correctly gets filters and group by from url', () => {
367+
testQueryParamObject = {
368+
...expectedQueryParamObject,
369+
['group-by']: ['field1,field2']
370+
};
371+
expect(spectator.service.getUrlFilters(attributes)).toEqual(filters);
372+
expect(spectator.service.getUrlGroupBy()).toEqual(['field1', 'field2']);
373+
});
374+
375+
test('correctly sets filters and group by in url', () => {
376+
spectator.service.setUrlGroupBy(['field1', 'field2']);
377+
spectator.service.setUrlFilters(filters);
378+
379+
expect(testQueryParamObject).toEqual({
380+
...expectedQueryParamObject,
381+
['group-by']: ['field1,field2']
382+
});
383+
});
364384
});

projects/components/src/filtering/filter/filter-url.service.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Injectable } from '@angular/core';
22
import { NavigationService } from '@hypertrace/common';
3-
import { remove } from 'lodash-es';
3+
import { isEmpty, remove } from 'lodash-es';
44
import { Observable } from 'rxjs';
55
import { map } from 'rxjs/operators';
66
import { FilterBuilderLookupService } from './builder/filter-builder-lookup.service';
@@ -15,6 +15,7 @@ import { splitFilterStringByOperator } from './parser/parsed-filter';
1515
})
1616
export class FilterUrlService {
1717
private static readonly FILTER_QUERY_PARAM: string = 'filter';
18+
private static readonly GROUP_BY_QUERY_PARAM: string = 'group-by';
1819

1920
public constructor(
2021
private readonly navigationService: NavigationService,
@@ -54,6 +55,19 @@ export class FilterUrlService {
5455
});
5556
}
5657

58+
public setUrlGroupBy(groupBy?: string[]): void {
59+
this.navigationService.addQueryParametersToUrl({
60+
[FilterUrlService.GROUP_BY_QUERY_PARAM]: isEmpty(groupBy) ? undefined : [groupBy!.toString()]
61+
});
62+
}
63+
64+
public getUrlGroupBy(): string[] {
65+
return this.navigationService
66+
.getAllValuesForQueryParameter(FilterUrlService.GROUP_BY_QUERY_PARAM)
67+
.map(groupByString => groupByString.split(',').map(attributeName => attributeName.trim()))
68+
.flat();
69+
}
70+
5771
public addUrlFilter(attributes: FilterAttribute[], filter: Filter): void {
5872
const remainingFilters = this.getUrlFilters(attributes).filter(f => areCompatibleFilters(f, filter));
5973

0 commit comments

Comments
 (0)