diff --git a/lib/content-services/search/components/search-filter/search-filter.component.html b/lib/content-services/search/components/search-filter/search-filter.component.html
index 6cb593290c..d949d9d007 100644
--- a/lib/content-services/search/components/search-filter/search-filter.component.html
+++ b/lib/content-services/search/components/search-filter/search-filter.component.html
@@ -44,16 +44,22 @@
-
+
-
@@ -91,17 +97,32 @@
+
+
+
+
-
+
-
diff --git a/lib/content-services/search/components/search-filter/search-filter.component.spec.ts b/lib/content-services/search/components/search-filter/search-filter.component.spec.ts
index a5e7bebc1c..111e4a05ad 100644
--- a/lib/content-services/search/components/search-filter/search-filter.component.spec.ts
+++ b/lib/content-services/search/components/search-filter/search-filter.component.spec.ts
@@ -21,6 +21,9 @@ import { SearchConfiguration } from '../../search-configuration.interface';
import { AppConfigService, TranslationMock } from '@alfresco/adf-core';
import { Subject } from 'rxjs/Subject';
import { ResponseFacetQueryList } from './models/response-facet-query-list.model';
+import { ResponseFacetField } from '../../response-facet-field.interface';
+import { SearchFilterList } from './models/search-filter-list.model';
+import { FacetFieldBucket } from '../../facet-field-bucket.interface';
describe('SearchSettingsComponent', () => {
@@ -340,4 +343,100 @@ describe('SearchSettingsComponent', () => {
expect(queryBuilder.update).not.toHaveBeenCalled();
});
+ it('should allow to to reset selected buckets', () => {
+ const buckets: FacetFieldBucket[] = [
+ { label: 'bucket1', $checked: true, count: 1, filterQuery: 'q1' },
+ { label: 'bucket2', $checked: false, count: 1, filterQuery: 'q2' }
+ ];
+
+ const field: ResponseFacetField = {
+ label: 'field1',
+ buckets: new SearchFilterList(buckets)
+ };
+
+ expect(component.canResetSelectedBuckets(field)).toBeTruthy();
+ });
+
+ it('should not allow to reset selected buckets', () => {
+ const buckets: FacetFieldBucket[] = [
+ { label: 'bucket1', $checked: false, count: 1, filterQuery: 'q1' },
+ { label: 'bucket2', $checked: false, count: 1, filterQuery: 'q2' }
+ ];
+
+ const field: ResponseFacetField = {
+ label: 'field1',
+ buckets: new SearchFilterList(buckets)
+ };
+
+ expect(component.canResetSelectedBuckets(field)).toBeFalsy();
+ });
+
+ it('should reset selected buckets', () => {
+ const buckets: FacetFieldBucket[] = [
+ { label: 'bucket1', $checked: false, count: 1, filterQuery: 'q1', $field: 'field1' },
+ { label: 'bucket2', $checked: true, count: 1, filterQuery: 'q2', $field: 'field1' }
+ ];
+
+ const field: ResponseFacetField = {
+ label: 'field1',
+ buckets: new SearchFilterList(buckets)
+ };
+
+ component.selectedBuckets = [buckets[1]];
+ component.resetSelectedBuckets(field);
+
+ expect(buckets[0].$checked).toBeFalsy();
+ expect(buckets[1].$checked).toBeFalsy();
+ expect(component.selectedBuckets.length).toBe(0);
+ });
+
+ it('should update query builder upon resetting buckets', () => {
+ spyOn(queryBuilder, 'update').and.stub();
+
+ const buckets: FacetFieldBucket[] = [
+ { label: 'bucket1', $checked: false, count: 1, filterQuery: 'q1', $field: 'field1' },
+ { label: 'bucket2', $checked: true, count: 1, filterQuery: 'q2', $field: 'field1' }
+ ];
+
+ const field: ResponseFacetField = {
+ label: 'field1',
+ buckets: new SearchFilterList(buckets)
+ };
+
+ component.selectedBuckets = [buckets[1]];
+ component.resetSelectedBuckets(field);
+
+ expect(queryBuilder.update).toHaveBeenCalled();
+ });
+
+ it('should allow to reset selected queries', () => {
+ component.selectedFacetQueries = ['q1', 'q2'];
+ expect(component.canResetSelectedQueries()).toBeTruthy();
+ });
+
+ it('should not allow to reset selected queries when nothing selected', () => {
+ component.selectedFacetQueries = [];
+ expect(component.canResetSelectedQueries()).toBeFalsy();
+ });
+
+ it('should reset selected queries', () => {
+ const methodSpy = spyOn(component, 'unselectFacetQuery').and.stub();
+
+ component.selectedFacetQueries = ['q1', 'q2'];
+ component.resetSelectedQueries();
+
+ expect(methodSpy.calls.count()).toBe(2);
+ expect(methodSpy.calls.argsFor(0)).toEqual(['q1', false]);
+ expect(methodSpy.calls.argsFor(1)).toEqual(['q2', false]);
+ });
+
+ it('should update query builder upon resetting selected queries', () => {
+ spyOn(queryBuilder, 'update').and.stub();
+
+ component.selectedFacetQueries = ['q1', 'q2'];
+ component.resetSelectedQueries();
+
+ expect(queryBuilder.update).toHaveBeenCalled();
+ });
+
});
diff --git a/lib/content-services/search/components/search-filter/search-filter.component.ts b/lib/content-services/search/components/search-filter/search-filter.component.ts
index 06008e475e..c8bd6e1eca 100644
--- a/lib/content-services/search/components/search-filter/search-filter.component.ts
+++ b/lib/content-services/search/components/search-filter/search-filter.component.ts
@@ -129,15 +129,20 @@ export class SearchFilterComponent implements OnInit {
this.queryBuilder.update();
}
- unselectFacetQuery(label: string) {
+ unselectFacetQuery(label: string, reloadQuery: boolean = true) {
const facetQuery = this.queryBuilder.getFacetQuery(label);
+ if (facetQuery) {
+ this.queryBuilder.removeFilterQuery(facetQuery.query);
+ }
+
this.selectedFacetQueries = this.selectedFacetQueries.filter(selectedQuery => selectedQuery !== label);
- this.queryBuilder.removeFilterQuery(facetQuery.query);
- this.queryBuilder.update();
+ if (reloadQuery) {
+ this.queryBuilder.update();
+ }
}
- unselectFacetBucket(bucket: FacetFieldBucket) {
+ unselectFacetBucket(bucket: FacetFieldBucket, reloadQuery: boolean = true) {
if (bucket) {
const idx = this.selectedBuckets.findIndex(
selectedBucket => selectedBucket.$field === bucket.$field && selectedBucket.label === bucket.label
@@ -147,6 +152,40 @@ export class SearchFilterComponent implements OnInit {
this.selectedBuckets.splice(idx, 1);
}
this.queryBuilder.removeFilterQuery(bucket.filterQuery);
+
+ bucket.$checked = false;
+
+ if (reloadQuery) {
+ this.queryBuilder.update();
+ }
+ }
+ }
+
+ canResetSelectedQueries(): boolean {
+ return this.selectedFacetQueries && this.selectedFacetQueries.length > 0;
+ }
+
+ resetSelectedQueries() {
+ if (this.canResetSelectedQueries()) {
+ this.selectedFacetQueries.forEach(query => {
+ this.unselectFacetQuery(query, false);
+ });
+ this.queryBuilder.update();
+ }
+ }
+
+ canResetSelectedBuckets(field: ResponseFacetField): boolean {
+ if (field && field.buckets) {
+ return field.buckets.items.some(bucket => bucket.$checked);
+ }
+ return false;
+ }
+
+ resetSelectedBuckets(field: ResponseFacetField) {
+ if (field && field.buckets) {
+ field.buckets.items.forEach(bucket => {
+ this.unselectFacetBucket(bucket, false);
+ });
this.queryBuilder.update();
}
}
diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts
index 2a6880c299..49a9f9bfd0 100644
--- a/lib/content-services/search/search-query-builder.service.ts
+++ b/lib/content-services/search/search-query-builder.service.ts
@@ -74,9 +74,8 @@ export class SearchQueryBuilderService {
}
getFacetQuery(label: string): FacetQuery {
- if (label) {
- const queries = this.config.facetQueries.queries || [];
- return queries.find(query => query.label === label);
+ if (label && this.hasFacetQueries) {
+ return this.config.facetQueries.queries.find(query => query.label === label);
}
return null;
}
@@ -171,10 +170,8 @@ export class SearchQueryBuilderService {
}
private get facetQueries(): FacetQuery[] {
- const config = this.config.facetQueries;
-
- if (config && config.queries && config.queries.length > 0) {
- return config.queries.map(query => {
+ if (this.hasFacetQueries) {
+ return this.config.facetQueries.queries.map(query => {
return { ...query };
});
}
@@ -200,4 +197,14 @@ export class SearchQueryBuilderService {
return null;
}
+
+ private get hasFacetQueries(): boolean {
+ if (this.config
+ && this.config.facetQueries
+ && this.config.facetQueries.queries
+ && this.config.facetQueries.queries.length > 0) {
+ return true;
+ }
+ return false;
+ }
}