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 c45b0b5173..06008e475e 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 @@ -35,13 +35,15 @@ import { SearchFilterList } from './models/search-filter-list.model'; }) export class SearchFilterComponent implements OnInit { + private DEFAULT_PAGE_SIZE = 5; + selectedFacetQueries: string[] = []; selectedBuckets: FacetFieldBucket[] = []; responseFacetQueries: ResponseFacetQueryList; responseFacetFields: ResponseFacetField[] = []; facetQueriesLabel: string = 'Facet Queries'; - facetQueriesPageSize = 5; + facetQueriesPageSize = this.DEFAULT_PAGE_SIZE; facetQueriesExpanded = false; constructor(public queryBuilder: SearchQueryBuilderService, @@ -51,7 +53,7 @@ export class SearchFilterComponent implements OnInit { if (queryBuilder.config && queryBuilder.config.facetQueries) { this.facetQueriesLabel = queryBuilder.config.facetQueries.label || 'Facet Queries'; - this.facetQueriesPageSize = queryBuilder.config.facetQueries.pageSize || 5; + this.facetQueriesPageSize = queryBuilder.config.facetQueries.pageSize || this.DEFAULT_PAGE_SIZE; this.facetQueriesExpanded = queryBuilder.config.facetQueries.expanded; } @@ -161,12 +163,21 @@ export class SearchFilterComponent implements OnInit { this.responseFacetQueries = new ResponseFacetQueryList(facetQueries, this.facetQueriesPageSize); - const expandedFields = this.responseFacetFields.filter(field => field.expanded).map(field => field.label); + const expandedFields = this.responseFacetFields + .filter(field => field.expanded) + .map(field => field.label); this.responseFacetFields = (context.facetsFields || []).map( field => { + const settings = this.queryBuilder.getFacetField(field.label); + + let fallbackPageSize = this.DEFAULT_PAGE_SIZE; + if (settings && settings.pageSize) { + fallbackPageSize = settings.pageSize; + } + field.label = this.translationService.instant(field.label); - field.pageSize = field.pageSize || 5; + field.pageSize = field.pageSize || fallbackPageSize; field.currentPageSize = field.pageSize; field.expanded = expandedFields.includes(field.label); diff --git a/lib/content-services/search/facet-field.interface.ts b/lib/content-services/search/facet-field.interface.ts index bba89a325e..96f19b11b5 100644 --- a/lib/content-services/search/facet-field.interface.ts +++ b/lib/content-services/search/facet-field.interface.ts @@ -23,5 +23,6 @@ export interface FacetField { offset?: number; prefix?: string; + pageSize?: number; $checked?: boolean; } 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 375cdb01d8..155a332542 100644 --- a/lib/content-services/search/search-query-builder.service.spec.ts +++ b/lib/content-services/search/search-query-builder.service.spec.ts @@ -144,6 +144,35 @@ describe('SearchQueryBuilder', () => { expect(query2).toBeNull(); }); + it('should fetch facet from the config by label', () => { + const config: SearchConfiguration = { + categories: [], + facetFields: [ + { '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'); + + expect(field.label).toBe('Size'); + expect(field.field).toBe('content.size'); + }); + + it('should not fetch facet from the config by label', () => { + const config: SearchConfiguration = { + categories: [], + facetFields: [ + { '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'); + + expect(field).toBeUndefined(); + }); + xit('should build query and raise an event on update', async () => { const builder = new SearchQueryBuilderService(buildConfig({}), null); const query = {}; diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts index b3b87fb5c9..2a6880c299 100644 --- a/lib/content-services/search/search-query-builder.service.ts +++ b/lib/content-services/search/search-query-builder.service.ts @@ -25,6 +25,7 @@ import { SearchRange } from './search-range.interface'; import { SearchConfiguration } from './search-configuration.interface'; import { FacetQuery } from './facet-query.interface'; import { SearchSortingDefinition } from './search-sorting-definition.interface'; +import { FacetField } from './facet-field.interface'; @Injectable() export class SearchQueryBuilderService { @@ -47,7 +48,7 @@ export class SearchQueryBuilderService { this.config = appConfig.get('search'); if (this.config) { - this.categories = (this.config.categories || []).filter(f => f.enabled); + this.categories = (this.config.categories || []).filter(category => category.enabled); this.filterQueries = this.config.filterQueries || []; if (this.config.sorting) { @@ -58,7 +59,7 @@ export class SearchQueryBuilderService { addFilterQuery(query: string): void { if (query) { - const existing = this.filterQueries.find(q => q.query === query); + const existing = this.filterQueries.find(filterQuery => filterQuery.query === query); if (!existing) { this.filterQueries.push({ query: query }); } @@ -67,14 +68,23 @@ export class SearchQueryBuilderService { removeFilterQuery(query: string): void { if (query) { - this.filterQueries = this.filterQueries.filter(f => f.query !== query); + this.filterQueries = this.filterQueries + .filter(filterQuery => filterQuery.query !== query); } } getFacetQuery(label: string): FacetQuery { if (label) { const queries = this.config.facetQueries.queries || []; - return queries.find(q => q.label === label); + return queries.find(query => query.label === label); + } + return null; + } + + getFacetField(label: string): FacetField { + if (label) { + const fields = this.config.facetFields || []; + return fields.find(field => field.label === label); } return null; }