diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json
index f7f6a78af8..2245285ab7 100644
--- a/demo-shell/src/app.config.json
+++ b/demo-shell/src/app.config.json
@@ -84,13 +84,16 @@
{ "query": "TYPE:'cm:folder' OR TYPE:'cm:content'" },
{ "query": "NOT cm:creator:System" }
],
- "facetFields": [
- { "field": "content.mimetype", "mincount": 1, "label": "1:Type" },
- { "field": "content.size", "mincount": 1, "label": "2:Size" },
- { "field": "creator", "mincount": 1, "label": "3:Creator" },
- { "field": "modifier", "mincount": 1, "label": "4:Modifier" },
- { "field": "created", "mincount": 1, "label": "5:Created" }
- ],
+ "facetFields": {
+ "expanded": true,
+ "fields": [
+ { "field": "content.mimetype", "mincount": 1, "label": "1:Type" },
+ { "field": "content.size", "mincount": 1, "label": "2:Size" },
+ { "field": "creator", "mincount": 1, "label": "3:Creator" },
+ { "field": "modifier", "mincount": 1, "label": "4:Modifier" },
+ { "field": "created", "mincount": 1, "label": "5:Created" }
+ ]
+ },
"facetQueries": {
"label": "My facet queries",
"pageSize": 5,
diff --git a/e2e/content-services/search_multiselect.e2e.ts b/e2e/content-services/search_multiselect.e2e.ts
index 118cdf9db6..bd73c83407 100644
--- a/e2e/content-services/search_multiselect.e2e.ts
+++ b/e2e/content-services/search_multiselect.e2e.ts
@@ -192,14 +192,14 @@ describe('Search Component - Multi-Select Facet', () => {
it('[C280056] Multiple items can be selected from multiple search facets', () => {
searchFiltersPage.checkSearchFiltersIsDisplayed();
- searchFiltersPage.filterByFileType('Plain Text');
- searchFiltersPage.filterByFileType('JPEG Image');
+ searchFiltersPage.filterByCreator(userUploadingTxt.firstName, userUploadingTxt.lastName);
+ searchFiltersPage.filterByCreator(userUploadingImg.firstName, userUploadingImg.lastName);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name);
- searchFiltersPage.filterByCreator(userUploadingTxt.firstName, userUploadingTxt.lastName);
- searchFiltersPage.filterByCreator(userUploadingImg.firstName, userUploadingImg.lastName);
+ searchFiltersPage.filterByFileType('Plain Text');
+ searchFiltersPage.filterByFileType('JPEG Image');
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(2);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
diff --git a/e2e/pages/adf/searchFiltersPage.js b/e2e/pages/adf/searchFiltersPage.js
index c07899b174..1f20a1ae80 100644
--- a/e2e/pages/adf/searchFiltersPage.js
+++ b/e2e/pages/adf/searchFiltersPage.js
@@ -81,7 +81,6 @@ var SearchFiltersPage = function () {
this.filterByFileType = function (fileType) {
this.checkFileTypeFilterIsDisplayed();
- this.clickFileTypeFilter();
this.checkSearchFileTypeFilterIsDisplayed();
this.searchInFileTypeFilter(fileType);
@@ -90,7 +89,6 @@ var SearchFiltersPage = function () {
this.filterByCreator = function (creatorFirstName, creatorLastName) {
this.checkCreatorFilterIsDisplayed();
- this.clickCreatorFilter();
this.checkSearchCreatorFilterIsDisplayed();
this.searchInCreatorFilter(`${creatorFirstName} ${creatorLastName}`);
diff --git a/lib/content-services/search/components/search-chip-list/search-chip-list.component.html b/lib/content-services/search/components/search-chip-list/search-chip-list.component.html
index 0a4c8276fc..9245fc3db0 100644
--- a/lib/content-services/search/components/search-chip-list/search-chip-list.component.html
+++ b/lib/content-services/search/components/search-chip-list/search-chip-list.component.html
@@ -3,7 +3,7 @@
+ (removed)="searchFilter.unselectFacetQuery(query)">
{{ query.label | translate }}
cancel
@@ -12,7 +12,7 @@
+ (removed)="searchFilter.unselectFacetBucket(selection.field, selection.bucket)">
{{ (selection.bucket.display || selection.bucket.label) | translate }}
cancel
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 2b1fac61bd..e233d0f1c9 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
@@ -69,7 +69,8 @@
-
+
{{ field.label }}
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 d17dacbb52..f8ac696f0f 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
@@ -190,10 +190,10 @@ describe('SearchFilterComponent', () => {
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -221,10 +221,10 @@ describe('SearchFilterComponent', () => {
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -257,10 +257,10 @@ describe('SearchFilterComponent', () => {
it('should fetch facet fields from response payload and update the existing bucket values', () => {
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -297,10 +297,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -312,6 +312,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }}
];
+ component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const serverResponseFields: any = [
{ label: 'f1', field: 'f1', buckets: [
@@ -336,10 +337,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -351,6 +352,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }}
];
+ component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const serverResponseFields: any = [
{ label: 'f1', field: 'f1', buckets: [
@@ -375,10 +377,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = {
categories: [],
- facetFields: [
+ facetFields: { fields: [
{ label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' }
- ],
+ ]},
facetQueries: {
queries: []
}
@@ -390,6 +392,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }}
];
+ component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const data = {
list: {
context: {}
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 b2c303c88e..fc47c1a05f 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
@@ -44,6 +44,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
private facetQueriesPageSize = this.DEFAULT_PAGE_SIZE;
facetQueriesLabel: string = 'Facet Queries';
facetQueriesExpanded = false;
+ facetFieldsExpanded = false;
canResetSelectedQueries = false;
selectedFacetQueries: Array = [];
@@ -57,6 +58,9 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
this.facetQueriesPageSize = queryBuilder.config.facetQueries.pageSize || this.DEFAULT_PAGE_SIZE;
this.facetQueriesExpanded = queryBuilder.config.facetQueries.expanded;
}
+ if (queryBuilder.config && queryBuilder.config.facetFields) {
+ this.facetFieldsExpanded = queryBuilder.config.facetFields.expanded;
+ }
this.queryBuilder.updated.pipe(
takeWhile(() => this.isAlive)
@@ -114,7 +118,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
for (let field of this.responseFacetFields) {
if (field.buckets) {
this.selectedBuckets.push(
- ...field.buckets.items
+ ...this.queryBuilder.getUserFacetBuckets(field.field)
.filter(bucket => bucket.checked)
.map(bucket => {
return { field, bucket };
@@ -208,7 +212,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
}
private parseFacetFields(context: any) {
- const configFacetFields = this.queryBuilder.config.facetFields || [];
+ const configFacetFields = this.queryBuilder.config.facetFields && this.queryBuilder.config.facetFields.fields || [];
const bkpResponseFacetFields = [...this.responseFacetFields || []];
this.responseFacetFields = configFacetFields
@@ -242,7 +246,8 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
}
const buckets: FacetFieldBucket[] = ((responseField && responseField.buckets) || []).map(bucket => {
- const selectedBucket = this.selectedBuckets.find(facetBucket => facetBucket.bucket.label === bucket.label);
+ const selectedBucket = this.selectedBuckets.find(facetBucket =>
+ facetBucket.bucket.label === bucket.label && facetBucket.field.field === field.field);
return {
...bucket,
diff --git a/lib/content-services/search/search-configuration.interface.ts b/lib/content-services/search/search-configuration.interface.ts
index 8a20ceb7e7..22ff951d5d 100644
--- a/lib/content-services/search/search-configuration.interface.ts
+++ b/lib/content-services/search/search-configuration.interface.ts
@@ -32,7 +32,10 @@ export interface SearchConfiguration {
expanded?: boolean;
queries: Array;
};
- facetFields?: Array;
+ facetFields?: {
+ expanded?: boolean;
+ fields: Array;
+ };
sorting?: {
options: Array;
defaults: Array;
diff --git a/lib/content-services/search/search-query-builder.service.spec.ts b/lib/content-services/search/search-query-builder.service.spec.ts
index 6d26e6c496..0a1727f370 100644
--- a/lib/content-services/search/search-query-builder.service.spec.ts
+++ b/lib/content-services/search/search-query-builder.service.spec.ts
@@ -190,10 +190,10 @@ describe('SearchQueryBuilder', () => {
it('should fetch facet from the config by label', () => {
const config: SearchConfiguration = {
categories: [],
- facetFields: [
+ facetFields: { 'fields': [
{ 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' },
{ 'field': 'content.size', 'mincount': 1, 'label': 'Size' }
- ]
+ ]}
};
const builder = new SearchQueryBuilderService(buildConfig(config), null);
const field = builder.getFacetField('Size');
@@ -205,10 +205,10 @@ describe('SearchQueryBuilder', () => {
it('should not fetch facet from the config by label', () => {
const config: SearchConfiguration = {
categories: [],
- facetFields: [
+ facetFields: { 'fields': [
{ 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' },
{ 'field': 'content.size', 'mincount': 1, 'label': 'Size' }
- ]
+ ]}
};
const builder = new SearchQueryBuilderService(buildConfig(config), null);
const field = builder.getFacetField('Missing');
@@ -359,16 +359,16 @@ describe('SearchQueryBuilder', () => {
categories: [
{ id: 'cat1', enabled: true }
],
- facetFields: [
+ facetFields: { fields: [
{ field: 'field1', label: 'field1', mincount: 1, limit: null, offset: 0, prefix: null },
{ field: 'field2', label: 'field2', mincount: 1, limit: null, offset: 0, prefix: null }
- ]
+ ]}
};
const builder = new SearchQueryBuilderService(buildConfig(config), null);
builder.queryFragments['cat1'] = 'cm:name:test';
const compiled = builder.buildQuery();
- expect(compiled.facetFields.facets).toEqual(jasmine.objectContaining(config.facetFields));
+ expect(compiled.facetFields.facets).toEqual(jasmine.objectContaining(config.facetFields.fields));
});
it('should build query with sorting', () => {
diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts
index 6f6613d55d..f19b0f04d5 100644
--- a/lib/content-services/search/search-query-builder.service.ts
+++ b/lib/content-services/search/search-query-builder.service.ts
@@ -106,6 +106,10 @@ export class SearchQueryBuilderService {
}
}
+ getUserFacetBuckets(field: string) {
+ return this.userFacetBuckets[field] || [];
+ }
+
removeUserFacetBucket(field: FacetField, bucket: FacetFieldBucket) {
if (field && field.field && bucket) {
const buckets = this.userFacetBuckets[field.field] || [];
@@ -142,7 +146,7 @@ export class SearchQueryBuilderService {
getFacetField(label: string): FacetField {
if (label) {
- const fields = this.config.facetFields || [];
+ const fields = this.config.facetFields.fields || [];
const result = fields.find(field => field.label === label);
if (result) {
return { ...result };
@@ -286,7 +290,7 @@ export class SearchQueryBuilderService {
}
protected get facetFields(): RequestFacetFields {
- const facetFields = this.config.facetFields;
+ const facetFields = this.config.facetFields && this.config.facetFields.fields;
if (facetFields && facetFields.length > 0) {
return {