[ADF-3435][ADF-3436] fix search chips (#3681)

* fix chip list remove

* fix tests

* better find criteria

* swap to fix e2e test

* set 'expanded' for facetFields from config

* fix e2e test

* remove comments
This commit is contained in:
Suzana Dirla
2018-08-10 15:04:13 +03:00
committed by Eugenio Romano
parent c328d70e43
commit 6f313b7c37
10 changed files with 58 additions and 41 deletions

View File

@@ -84,13 +84,16 @@
{ "query": "TYPE:'cm:folder' OR TYPE:'cm:content'" }, { "query": "TYPE:'cm:folder' OR TYPE:'cm:content'" },
{ "query": "NOT cm:creator:System" } { "query": "NOT cm:creator:System" }
], ],
"facetFields": [ "facetFields": {
{ "field": "content.mimetype", "mincount": 1, "label": "1:Type" }, "expanded": true,
{ "field": "content.size", "mincount": 1, "label": "2:Size" }, "fields": [
{ "field": "creator", "mincount": 1, "label": "3:Creator" }, { "field": "content.mimetype", "mincount": 1, "label": "1:Type" },
{ "field": "modifier", "mincount": 1, "label": "4:Modifier" }, { "field": "content.size", "mincount": 1, "label": "2:Size" },
{ "field": "created", "mincount": 1, "label": "5:Created" } { "field": "creator", "mincount": 1, "label": "3:Creator" },
], { "field": "modifier", "mincount": 1, "label": "4:Modifier" },
{ "field": "created", "mincount": 1, "label": "5:Created" }
]
},
"facetQueries": { "facetQueries": {
"label": "My facet queries", "label": "My facet queries",
"pageSize": 5, "pageSize": 5,

View File

@@ -192,14 +192,14 @@ describe('Search Component - Multi-Select Facet', () => {
it('[C280056] Multiple items can be selected from multiple search facets', () => { it('[C280056] Multiple items can be selected from multiple search facets', () => {
searchFiltersPage.checkSearchFiltersIsDisplayed(); searchFiltersPage.checkSearchFiltersIsDisplayed();
searchFiltersPage.filterByFileType('Plain Text'); searchFiltersPage.filterByCreator(userUploadingTxt.firstName, userUploadingTxt.lastName);
searchFiltersPage.filterByFileType('JPEG Image'); searchFiltersPage.filterByCreator(userUploadingImg.firstName, userUploadingImg.lastName);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name); searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name); searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name);
searchFiltersPage.filterByCreator(userUploadingTxt.firstName, userUploadingTxt.lastName); searchFiltersPage.filterByFileType('Plain Text');
searchFiltersPage.filterByCreator(userUploadingImg.firstName, userUploadingImg.lastName); searchFiltersPage.filterByFileType('JPEG Image');
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(2); expect(searchResultsPage.numberOfResultsDisplayed()).toBe(2);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name); searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);

View File

@@ -81,7 +81,6 @@ var SearchFiltersPage = function () {
this.filterByFileType = function (fileType) { this.filterByFileType = function (fileType) {
this.checkFileTypeFilterIsDisplayed(); this.checkFileTypeFilterIsDisplayed();
this.clickFileTypeFilter();
this.checkSearchFileTypeFilterIsDisplayed(); this.checkSearchFileTypeFilterIsDisplayed();
this.searchInFileTypeFilter(fileType); this.searchInFileTypeFilter(fileType);
@@ -90,7 +89,6 @@ var SearchFiltersPage = function () {
this.filterByCreator = function (creatorFirstName, creatorLastName) { this.filterByCreator = function (creatorFirstName, creatorLastName) {
this.checkCreatorFilterIsDisplayed(); this.checkCreatorFilterIsDisplayed();
this.clickCreatorFilter();
this.checkSearchCreatorFilterIsDisplayed(); this.checkSearchCreatorFilterIsDisplayed();
this.searchInCreatorFilter(`${creatorFirstName} ${creatorLastName}`); this.searchInCreatorFilter(`${creatorFirstName} ${creatorLastName}`);

View File

@@ -3,7 +3,7 @@
<mat-chip <mat-chip
*ngFor="let query of searchFilter.selectedFacetQueries" *ngFor="let query of searchFilter.selectedFacetQueries"
[removable]="true" [removable]="true"
(remove)="searchFilter.unselectFacetQuery(query)"> (removed)="searchFilter.unselectFacetQuery(query)">
{{ query.label | translate }} {{ query.label | translate }}
<mat-icon matChipRemove>cancel</mat-icon> <mat-icon matChipRemove>cancel</mat-icon>
</mat-chip> </mat-chip>
@@ -12,7 +12,7 @@
<mat-chip <mat-chip
*ngFor="let selection of searchFilter.selectedBuckets" *ngFor="let selection of searchFilter.selectedBuckets"
[removable]="true" [removable]="true"
(remove)="searchFilter.unselectFacetBucket(selection.field, selection.bucket)"> (removed)="searchFilter.unselectFacetBucket(selection.field, selection.bucket)">
{{ (selection.bucket.display || selection.bucket.label) | translate }} {{ (selection.bucket.display || selection.bucket.label) | translate }}
<mat-icon matChipRemove>cancel</mat-icon> <mat-icon matChipRemove>cancel</mat-icon>
</mat-chip> </mat-chip>

View File

@@ -69,7 +69,8 @@
</ng-container> </ng-container>
<ng-container *ngIf="responseFacetFields"> <ng-container *ngIf="responseFacetFields">
<mat-expansion-panel [attr.data-automation-id]="'expansion-panel-'+field.label" *ngFor="let field of responseFacetFields"> <mat-expansion-panel [attr.data-automation-id]="'expansion-panel-'+field.label" *ngFor="let field of responseFacetFields"
[expanded]="facetFieldsExpanded">
<mat-expansion-panel-header> <mat-expansion-panel-header>
<mat-panel-title>{{ field.label }}</mat-panel-title> <mat-panel-title>{{ field.label }}</mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>

View File

@@ -190,10 +190,10 @@ describe('SearchFilterComponent', () => {
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -221,10 +221,10 @@ describe('SearchFilterComponent', () => {
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -257,10 +257,10 @@ describe('SearchFilterComponent', () => {
it('should fetch facet fields from response payload and update the existing bucket values', () => { it('should fetch facet fields from response payload and update the existing bucket values', () => {
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -297,10 +297,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub(); spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -312,6 +312,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }} { label: 'f2', field: 'f2', buckets: {items: [] }}
]; ];
component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const serverResponseFields: any = [ const serverResponseFields: any = [
{ label: 'f1', field: 'f1', buckets: [ { label: 'f1', field: 'f1', buckets: [
@@ -336,10 +337,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub(); spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -351,6 +352,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }} { label: 'f2', field: 'f2', buckets: {items: [] }}
]; ];
component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const serverResponseFields: any = [ const serverResponseFields: any = [
{ label: 'f1', field: 'f1', buckets: [ { label: 'f1', field: 'f1', buckets: [
@@ -375,10 +377,10 @@ describe('SearchFilterComponent', () => {
spyOn(queryBuilder, 'execute').and.stub(); spyOn(queryBuilder, 'execute').and.stub();
queryBuilder.config = { queryBuilder.config = {
categories: [], categories: [],
facetFields: [ facetFields: { fields: [
{ label: 'f1', field: 'f1' }, { label: 'f1', field: 'f1' },
{ label: 'f2', field: 'f2' } { label: 'f2', field: 'f2' }
], ]},
facetQueries: { facetQueries: {
queries: [] queries: []
} }
@@ -390,6 +392,7 @@ describe('SearchFilterComponent', () => {
{ label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'b2', count: 1, filterQuery: 'filter2' }] }},
{ label: 'f2', field: 'f2', buckets: {items: [] }} { label: 'f2', field: 'f2', buckets: {items: [] }}
]; ];
component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]);
const data = { const data = {
list: { list: {
context: {} context: {}

View File

@@ -44,6 +44,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
private facetQueriesPageSize = this.DEFAULT_PAGE_SIZE; private facetQueriesPageSize = this.DEFAULT_PAGE_SIZE;
facetQueriesLabel: string = 'Facet Queries'; facetQueriesLabel: string = 'Facet Queries';
facetQueriesExpanded = false; facetQueriesExpanded = false;
facetFieldsExpanded = false;
canResetSelectedQueries = false; canResetSelectedQueries = false;
selectedFacetQueries: Array<FacetQuery> = []; selectedFacetQueries: Array<FacetQuery> = [];
@@ -57,6 +58,9 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
this.facetQueriesPageSize = queryBuilder.config.facetQueries.pageSize || this.DEFAULT_PAGE_SIZE; this.facetQueriesPageSize = queryBuilder.config.facetQueries.pageSize || this.DEFAULT_PAGE_SIZE;
this.facetQueriesExpanded = queryBuilder.config.facetQueries.expanded; this.facetQueriesExpanded = queryBuilder.config.facetQueries.expanded;
} }
if (queryBuilder.config && queryBuilder.config.facetFields) {
this.facetFieldsExpanded = queryBuilder.config.facetFields.expanded;
}
this.queryBuilder.updated.pipe( this.queryBuilder.updated.pipe(
takeWhile(() => this.isAlive) takeWhile(() => this.isAlive)
@@ -114,7 +118,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
for (let field of this.responseFacetFields) { for (let field of this.responseFacetFields) {
if (field.buckets) { if (field.buckets) {
this.selectedBuckets.push( this.selectedBuckets.push(
...field.buckets.items ...this.queryBuilder.getUserFacetBuckets(field.field)
.filter(bucket => bucket.checked) .filter(bucket => bucket.checked)
.map(bucket => { .map(bucket => {
return { field, bucket }; return { field, bucket };
@@ -208,7 +212,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
} }
private parseFacetFields(context: any) { 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 || []]; const bkpResponseFacetFields = [...this.responseFacetFields || []];
this.responseFacetFields = configFacetFields this.responseFacetFields = configFacetFields
@@ -242,7 +246,8 @@ export class SearchFilterComponent implements OnInit, OnDestroy {
} }
const buckets: FacetFieldBucket[] = ((responseField && responseField.buckets) || []).map(bucket => { 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 <FacetFieldBucket> { return <FacetFieldBucket> {
...bucket, ...bucket,

View File

@@ -32,7 +32,10 @@ export interface SearchConfiguration {
expanded?: boolean; expanded?: boolean;
queries: Array<FacetQuery>; queries: Array<FacetQuery>;
}; };
facetFields?: Array<FacetField>; facetFields?: {
expanded?: boolean;
fields: Array<FacetField>;
};
sorting?: { sorting?: {
options: Array<SearchSortingDefinition>; options: Array<SearchSortingDefinition>;
defaults: Array<SearchSortingDefinition>; defaults: Array<SearchSortingDefinition>;

View File

@@ -190,10 +190,10 @@ describe('SearchQueryBuilder', () => {
it('should fetch facet from the config by label', () => { it('should fetch facet from the config by label', () => {
const config: SearchConfiguration = { const config: SearchConfiguration = {
categories: [], categories: [],
facetFields: [ facetFields: { 'fields': [
{ 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' }, { 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' },
{ 'field': 'content.size', 'mincount': 1, 'label': 'Size' } { 'field': 'content.size', 'mincount': 1, 'label': 'Size' }
] ]}
}; };
const builder = new SearchQueryBuilderService(buildConfig(config), null); const builder = new SearchQueryBuilderService(buildConfig(config), null);
const field = builder.getFacetField('Size'); const field = builder.getFacetField('Size');
@@ -205,10 +205,10 @@ describe('SearchQueryBuilder', () => {
it('should not fetch facet from the config by label', () => { it('should not fetch facet from the config by label', () => {
const config: SearchConfiguration = { const config: SearchConfiguration = {
categories: [], categories: [],
facetFields: [ facetFields: { 'fields': [
{ 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' }, { 'field': 'content.mimetype', 'mincount': 1, 'label': 'Type' },
{ 'field': 'content.size', 'mincount': 1, 'label': 'Size' } { 'field': 'content.size', 'mincount': 1, 'label': 'Size' }
] ]}
}; };
const builder = new SearchQueryBuilderService(buildConfig(config), null); const builder = new SearchQueryBuilderService(buildConfig(config), null);
const field = builder.getFacetField('Missing'); const field = builder.getFacetField('Missing');
@@ -359,16 +359,16 @@ describe('SearchQueryBuilder', () => {
categories: [ categories: [
<any> { id: 'cat1', enabled: true } <any> { id: 'cat1', enabled: true }
], ],
facetFields: [ facetFields: { fields: [
{ field: 'field1', label: 'field1', mincount: 1, limit: null, offset: 0, prefix: null }, { field: 'field1', label: 'field1', mincount: 1, limit: null, offset: 0, prefix: null },
{ field: 'field2', label: 'field2', 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); const builder = new SearchQueryBuilderService(buildConfig(config), null);
builder.queryFragments['cat1'] = 'cm:name:test'; builder.queryFragments['cat1'] = 'cm:name:test';
const compiled = builder.buildQuery(); 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', () => { it('should build query with sorting', () => {

View File

@@ -106,6 +106,10 @@ export class SearchQueryBuilderService {
} }
} }
getUserFacetBuckets(field: string) {
return this.userFacetBuckets[field] || [];
}
removeUserFacetBucket(field: FacetField, bucket: FacetFieldBucket) { removeUserFacetBucket(field: FacetField, bucket: FacetFieldBucket) {
if (field && field.field && bucket) { if (field && field.field && bucket) {
const buckets = this.userFacetBuckets[field.field] || []; const buckets = this.userFacetBuckets[field.field] || [];
@@ -142,7 +146,7 @@ export class SearchQueryBuilderService {
getFacetField(label: string): FacetField { getFacetField(label: string): FacetField {
if (label) { if (label) {
const fields = this.config.facetFields || []; const fields = this.config.facetFields.fields || [];
const result = fields.find(field => field.label === label); const result = fields.find(field => field.label === label);
if (result) { if (result) {
return { ...result }; return { ...result };
@@ -286,7 +290,7 @@ export class SearchQueryBuilderService {
} }
protected get facetFields(): RequestFacetFields { protected get facetFields(): RequestFacetFields {
const facetFields = this.config.facetFields; const facetFields = this.config.facetFields && this.config.facetFields.fields;
if (facetFields && facetFields.length > 0) { if (facetFields && facetFields.length > 0) {
return { return {