From 666dd45fa26cc49eb447ffd8d9ee644460a02a95 Mon Sep 17 00:00:00 2001 From: siva kumar Date: Mon, 23 Mar 2020 16:29:30 +0530 Subject: [PATCH] [AAE-1725] ADF Task filters - default filters should be recreated when they all get deleted. (#5551) --- ...dit-process-filter-cloud.component.spec.ts | 56 +++++++++++++++++++ .../edit-process-filter-cloud.component.ts | 22 +++++--- .../services/process-filter-cloud.service.ts | 2 +- .../edit-task-filter-cloud.component.spec.ts | 44 +++++++++++++++ .../edit-task-filter-cloud.component.ts | 22 +++++--- .../services/task-filter-cloud.service.ts | 2 +- 6 files changed, 132 insertions(+), 16 deletions(-) diff --git a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts index 581c425f77..382d8c1485 100644 --- a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts @@ -561,5 +561,61 @@ describe('EditProcessFilterCloudComponent', () => { }); component.onFilterChange(); }); + + it('should call restore default filters service on deletion of last filter', (done) => { + component.toggleFilterActions = true; + const deleteFilterSpy = spyOn(service, 'deleteFilter').and.returnValue(of([])); + const restoreFiltersSpy = spyOn(component, 'restoreDefaultProcessFilters').and.returnValue(of([])); + const deleteSpy: jasmine.Spy = spyOn(component.action, 'emit'); + fixture.detectChanges(); + + const expansionPanel = fixture.debugElement.nativeElement.querySelector('mat-expansion-panel-header'); + expansionPanel.click(); + fixture.detectChanges(); + const stateElement = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-cloud-edit-process-property-status"] .mat-select-trigger'); + stateElement.click(); + fixture.detectChanges(); + const deleteButton = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-filter-action-delete"]'); + deleteButton.click(); + fixture.detectChanges(); + fixture.whenStable().then(() => { + expect(deleteFilterSpy).toHaveBeenCalled(); + fixture.detectChanges(); + fixture.whenStable().then(() => { + expect(deleteSpy).toHaveBeenCalled(); + expect(restoreFiltersSpy).toHaveBeenCalled(); + done(); + }); + + }); + }); + + it('should not call restore default filters service on deletion first filter', (done) => { + component.toggleFilterActions = true; + const deleteFilterSpy = spyOn(service, 'deleteFilter').and.returnValue(of([{ name: 'mock-filter-name'}])); + const restoreFiltersSpy = spyOn(component, 'restoreDefaultProcessFilters').and.returnValue(of([])); + const deleteSpy: jasmine.Spy = spyOn(component.action, 'emit'); + fixture.detectChanges(); + + const expansionPanel = fixture.debugElement.nativeElement.querySelector('mat-expansion-panel-header'); + expansionPanel.click(); + fixture.detectChanges(); + const stateElement = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-cloud-edit-process-property-status"] .mat-select-trigger'); + stateElement.click(); + fixture.detectChanges(); + const deleteButton = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-filter-action-delete"]'); + deleteButton.click(); + fixture.detectChanges(); + fixture.whenStable().then(() => { + expect(deleteFilterSpy).toHaveBeenCalled(); + fixture.detectChanges(); + fixture.whenStable().then(() => { + expect(deleteSpy).toHaveBeenCalled(); + expect(restoreFiltersSpy).not.toHaveBeenCalled(); + done(); + }); + + }); + }); }); }); diff --git a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts index 645883292a..9787023bcc 100644 --- a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts @@ -18,8 +18,8 @@ import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, OnDestroy } from '@angular/core'; import { FormGroup, FormBuilder, AbstractControl } from '@angular/forms'; import { MatDialog, DateAdapter } from '@angular/material'; -import { debounceTime, filter, takeUntil, finalize } from 'rxjs/operators'; -import { Subject } from 'rxjs'; +import { debounceTime, filter, takeUntil, finalize, switchMap } from 'rxjs/operators'; +import { Subject, Observable } from 'rxjs'; import moment from 'moment-es6'; import { Moment } from 'moment'; @@ -338,11 +338,15 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes delete(deleteAction: ProcessFilterAction) { this.processFilterCloudService .deleteFilter(this.processFilter) - .pipe(takeUntil(this.onDestroy$)) - .subscribe(() => { - deleteAction.filter = this.processFilter; - this.action.emit(deleteAction); - }); + .pipe( + filter((filters) => { + deleteAction.filter = this.processFilter; + this.action.emit(deleteAction); + return filters.length === 0; + }), + switchMap(() => this.restoreDefaultProcessFilters()), + takeUntil(this.onDestroy$)) + .subscribe(() => {}); } /** @@ -396,6 +400,10 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes return name.replace(regExt, '-'); } + restoreDefaultProcessFilters(): Observable { + return this.processFilterCloudService.getProcessFilters(this.appName); + } + showActions(): boolean { return this.showFilterActions; } diff --git a/lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts b/lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts index c020851539..28e79f4c8e 100644 --- a/lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts +++ b/lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts @@ -159,7 +159,7 @@ export class ProcessFilterCloudService { filters = filters.filter(filter => filter.id !== deletedFilter.id); return this.updateProcessFilters(deletedFilter.appName, key, filters); } else { - return []; + return of([]); } }), map((filters: ProcessFilterCloudModel[]) => { diff --git a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts index c45c9344b8..5c1420f340 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts @@ -493,5 +493,49 @@ describe('EditTaskFilterCloudComponent', () => { expect(dialog.open).toHaveBeenCalled(); }); })); + + it('should call restore default filters service on deletion of last filter', async(() => { + component.toggleFilterActions = true; + spyOn(service, 'deleteFilter').and.returnValue(of([])); + const restoreDefaultFiltersSpy = spyOn(component, 'restoreDefaultTaskFilters').and.returnValue(of([])); + fixture.detectChanges(); + const expansionPanel = fixture.debugElement.nativeElement.querySelector('mat-expansion-panel-header'); + expansionPanel.click(); + fixture.detectChanges(); + const stateElement = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-cloud-edit-task-property-sort"] .mat-select-trigger'); + stateElement.click(); + fixture.detectChanges(); + const deleteButton = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-filter-action-delete"]'); + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(deleteButton.disabled).toBe(false); + deleteButton.click(); + expect(service.deleteFilter).toHaveBeenCalled(); + expect(component.action.emit).toHaveBeenCalled(); + expect(restoreDefaultFiltersSpy).toHaveBeenCalled(); + }); + })); + + it('should not call restore default filters service on deletion of first filter', async(() => { + component.toggleFilterActions = true; + spyOn(service, 'deleteFilter').and.returnValue(of([{ name: 'mock-filter-name'}])); + const restoreDefaultFiltersSpy = spyOn(component, 'restoreDefaultTaskFilters').and.returnValue(of([])); + fixture.detectChanges(); + const expansionPanel = fixture.debugElement.nativeElement.querySelector('mat-expansion-panel-header'); + expansionPanel.click(); + fixture.detectChanges(); + const stateElement = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-cloud-edit-task-property-sort"] .mat-select-trigger'); + stateElement.click(); + fixture.detectChanges(); + const deleteButton = fixture.debugElement.nativeElement.querySelector('[data-automation-id="adf-filter-action-delete"]'); + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(deleteButton.disabled).toBe(false); + deleteButton.click(); + expect(service.deleteFilter).toHaveBeenCalled(); + expect(component.action.emit).toHaveBeenCalled(); + expect(restoreDefaultFiltersSpy).not.toHaveBeenCalled(); + }); + })); }); }); diff --git a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts index a3fdaae800..0af6e6bc57 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts @@ -18,8 +18,8 @@ import { Component, OnChanges, Input, Output, EventEmitter, SimpleChanges, OnInit, OnDestroy } from '@angular/core'; import { AbstractControl, FormGroup, FormBuilder } from '@angular/forms'; import { MatDialog, DateAdapter } from '@angular/material'; -import { debounceTime, filter, takeUntil, finalize } from 'rxjs/operators'; -import { Subject } from 'rxjs'; +import { debounceTime, filter, takeUntil, finalize, switchMap } from 'rxjs/operators'; +import { Subject, Observable } from 'rxjs'; import moment from 'moment-es6'; import { Moment } from 'moment'; @@ -357,11 +357,15 @@ export class EditTaskFilterCloudComponent implements OnInit, OnChanges, OnDestro delete(deleteAction: TaskFilterAction): void { this.taskFilterCloudService .deleteFilter(this.taskFilter) - .pipe(takeUntil(this.onDestroy$)) - .subscribe(() => { - deleteAction.filter = this.taskFilter; - this.action.emit(deleteAction); - }); + .pipe( + filter((filters) => { + deleteAction.filter = this.taskFilter; + this.action.emit(deleteAction); + return filters.length === 0; + }), + switchMap(() => this.restoreDefaultTaskFilters()), + takeUntil(this.onDestroy$)) + .subscribe(() => {}); } saveAs(saveAsAction: TaskFilterAction): void { @@ -410,6 +414,10 @@ export class EditTaskFilterCloudComponent implements OnInit, OnChanges, OnDestro return name.replace(regExt, '-'); } + restoreDefaultTaskFilters(): Observable { + return this.taskFilterCloudService.getTaskListFilters(this.appName); + } + showActions(): boolean { return this.showFilterActions; } diff --git a/lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts b/lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts index bbb00e1986..ebdff7814b 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts @@ -206,7 +206,7 @@ export class TaskFilterCloudService { filters = filters.filter(filter => filter.id !== deletedFilter.id); return this.updateTaskFilters(deletedFilter.appName, key, filters); } - return []; + return of([]); }), map(filters => { this.addFiltersToStream(filters);