The process filter should not be created twice (#1789)

This commit is contained in:
Maurizio Vitale
2017-03-30 18:12:35 +01:00
committed by Mario Romano
parent 548054c05e
commit 3c25266bc9
7 changed files with 183 additions and 110 deletions

View File

@@ -46,12 +46,15 @@ describe('ActivitiFilters', () => {
beforeEach(() => { beforeEach(() => {
logService = new LogServiceMock(); logService = new LogServiceMock();
activitiService = new ActivitiProcessService(null); activitiService = new ActivitiProcessService(null, logService);
filterList = new ActivitiProcessFilters(null, activitiService, logService); filterList = new ActivitiProcessFilters(null, activitiService, logService);
}); });
it('should return the filter task list', (done) => { it('should return the filter task list', (done) => {
spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeGlobalFilterPromise)); spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeGlobalFilterPromise));
const appId = '1';
let change = new SimpleChange(null, appId);
filterList.ngOnChanges({ 'appId': change });
filterList.onSuccess.subscribe((res) => { filterList.onSuccess.subscribe((res) => {
expect(res).toBeDefined(); expect(res).toBeDefined();
@@ -74,7 +77,8 @@ describe('ActivitiFilters', () => {
spyOn(activitiService, 'getDeployedApplications').and.returnValue(Observable.fromPromise(fakeDeployedApplicationsPromise)); spyOn(activitiService, 'getDeployedApplications').and.returnValue(Observable.fromPromise(fakeDeployedApplicationsPromise));
spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeGlobalFilterPromise)); spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeGlobalFilterPromise));
filterList.appName = 'test'; let change = new SimpleChange(null, 'test');
filterList.ngOnChanges({ 'appName': change });
filterList.onSuccess.subscribe((res) => { filterList.onSuccess.subscribe((res) => {
let deployApp: any = activitiService.getDeployedApplications; let deployApp: any = activitiService.getDeployedApplications;
@@ -87,9 +91,12 @@ describe('ActivitiFilters', () => {
}); });
it('should emit an error with a bad response', (done) => { it('should emit an error with a bad response', (done) => {
filterList.appId = 1;
spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeErrorFilterPromise)); spyOn(activitiService, 'getProcessFilters').and.returnValue(Observable.fromPromise(fakeErrorFilterPromise));
const appId = '1';
let change = new SimpleChange(null, appId);
filterList.ngOnChanges({ 'appId': change });
filterList.onError.subscribe((err) => { filterList.onError.subscribe((err) => {
expect(err).toBeDefined(); expect(err).toBeDefined();
done(); done();
@@ -99,9 +106,12 @@ describe('ActivitiFilters', () => {
}); });
it('should emit an error with a bad response', (done) => { it('should emit an error with a bad response', (done) => {
filterList.appName = 'fake-app';
spyOn(activitiService, 'getDeployedApplications').and.returnValue(Observable.fromPromise(fakeErrorFilterPromise)); spyOn(activitiService, 'getDeployedApplications').and.returnValue(Observable.fromPromise(fakeErrorFilterPromise));
const appId = 'fake-app';
let change = new SimpleChange(null, appId);
filterList.ngOnChanges({ 'appName': change });
filterList.onError.subscribe((err) => { filterList.onError.subscribe((err) => {
expect(err).toBeDefined(); expect(err).toBeDefined();
done(); done();

View File

@@ -67,8 +67,6 @@ export class ActivitiProcessFilters implements OnInit, OnChanges {
this.filter$.subscribe((filter: FilterProcessRepresentationModel) => { this.filter$.subscribe((filter: FilterProcessRepresentationModel) => {
this.filters.push(filter); this.filters.push(filter);
}); });
this.getFilters(this.appId, this.appName);
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
@@ -84,19 +82,6 @@ export class ActivitiProcessFilters implements OnInit, OnChanges {
} }
} }
/**
* Return the task list filtered by appId or by appName
* @param appId
* @param appName
*/
getFilters(appId?: number, appName?: string) {
if (appName) {
this.getFiltersByAppName(appName);
} else {
this.getFiltersByAppId(appId);
}
}
/** /**
* Return the filter list filtered by appId * Return the filter list filtered by appId
* @param appId - optional * @param appId - optional
@@ -104,12 +89,31 @@ export class ActivitiProcessFilters implements OnInit, OnChanges {
getFiltersByAppId(appId?: number) { getFiltersByAppId(appId?: number) {
this.activiti.getProcessFilters(appId).subscribe( this.activiti.getProcessFilters(appId).subscribe(
(res: FilterProcessRepresentationModel[]) => { (res: FilterProcessRepresentationModel[]) => {
this.resetFilter(); if (res.length === 0 && this.isFilterListEmpty()) {
res.forEach((filter) => { this.activiti.createDefaultFilters(appId).subscribe(
this.filterObserver.next(filter); (resDefault: FilterProcessRepresentationModel[]) => {
}); this.resetFilter();
this.selectFirstFilter(); resDefault.forEach((filter) => {
this.onSuccess.emit(res); this.filterObserver.next(filter);
});
this.selectFirstFilter();
this.onSuccess.emit(resDefault);
},
(errDefault: any) => {
this.logService.error(errDefault);
this.onError.emit(errDefault);
}
);
} else {
this.resetFilter();
res.forEach((filter) => {
this.filterObserver.next(filter);
});
this.selectFirstFilter();
this.onSuccess.emit(res);
}
}, },
(err: any) => { (err: any) => {
this.logService.error(err); this.logService.error(err);

View File

@@ -21,7 +21,6 @@ import { CoreModule, AlfrescoApiService } from 'ng2-alfresco-core';
import { FilterRepresentationModel } from 'ng2-activiti-tasklist'; import { FilterRepresentationModel } from 'ng2-activiti-tasklist';
import { AlfrescoApi } from 'alfresco-js-api'; import { AlfrescoApi } from 'alfresco-js-api';
import { import {
fakeEmptyFilters,
fakeFilters, fakeFilters,
fakeError, fakeError,
fakeApp1, fakeApp1,
@@ -32,9 +31,11 @@ import {
} from '../assets/activiti-process.service.mock'; } from '../assets/activiti-process.service.mock';
import { exampleProcess } from '../assets/activiti-process.model.mock'; import { exampleProcess } from '../assets/activiti-process.model.mock';
import { ProcessFilterRequestRepresentation } from '../models/process-instance-filter.model'; import { ProcessFilterRequestRepresentation } from '../models/process-instance-filter.model';
import { FilterProcessRepresentationModel } from '../models/filter-process.model';
import { ProcessInstanceVariable } from '../models/process-instance-variable.model'; import { ProcessInstanceVariable } from '../models/process-instance-variable.model';
import { ActivitiProcessService } from './activiti-process.service'; import { ActivitiProcessService } from './activiti-process.service';
declare let jasmine: any;
describe('ActivitiProcessService', () => { describe('ActivitiProcessService', () => {
let service: ActivitiProcessService; let service: ActivitiProcessService;
@@ -603,26 +604,18 @@ describe('ActivitiProcessService', () => {
); );
})); }));
it('should return the default filters when none are returned by the API', async(() => { it('should return the default filters', (done) => {
getFilters = getFilters.and.returnValue(Promise.resolve(fakeEmptyFilters)); service.createDefaultFilters(1234).subscribe(
(res: FilterProcessRepresentationModel []) => {
service.getProcessFilters(null).subscribe( expect(res).toBeDefined();
(res) => { expect(res.length).toEqual(3);
expect(res.length).toBe(3); expect(res[0].name).toEqual('Running');
expect(res[1].name).toEqual('Completed');
expect(res[2].name).toEqual('All');
done();
} }
); );
})); });
it('should create the default filters when none are returned by the API', async(() => {
getFilters = getFilters.and.returnValue(Promise.resolve(fakeEmptyFilters));
createFilter = createFilter.and.returnValue(Promise.resolve({}));
service.getProcessFilters(null).subscribe(
() => {
expect(createFilter).toHaveBeenCalledTimes(3);
}
);
}));
it('should pass on any error that is returned by the API', async(() => { it('should pass on any error that is returned by the API', async(() => {
getFilters = getFilters.and.returnValue(Promise.reject(fakeError)); getFilters = getFilters.and.returnValue(Promise.reject(fakeError));

View File

@@ -17,7 +17,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { AlfrescoApiService } from 'ng2-alfresco-core'; import { AlfrescoApiService, LogService } from 'ng2-alfresco-core';
import { ProcessInstance, ProcessDefinitionRepresentation } from '../models/index'; import { ProcessInstance, ProcessDefinitionRepresentation } from '../models/index';
import { ProcessFilterRequestRepresentation } from '../models/process-instance-filter.model'; import { ProcessFilterRequestRepresentation } from '../models/process-instance-filter.model';
import { ProcessInstanceVariable } from './../models/process-instance-variable.model'; import { ProcessInstanceVariable } from './../models/process-instance-variable.model';
@@ -29,7 +29,8 @@ declare var moment: any;
@Injectable() @Injectable()
export class ActivitiProcessService { export class ActivitiProcessService {
constructor(private apiService: AlfrescoApiService) { constructor(private apiService: AlfrescoApiService,
private logService: LogService) {
} }
/** /**
@@ -64,9 +65,6 @@ export class ActivitiProcessService {
let filterModel = new FilterProcessRepresentationModel(filter); let filterModel = new FilterProcessRepresentationModel(filter);
filters.push(filterModel); filters.push(filterModel);
}); });
if (response && response.data && response.data.length === 0) {
return this.createDefaultFilters(appId);
}
return filters; return filters;
}) })
.catch(err => this.handleError(err)); .catch(err => this.handleError(err));
@@ -77,29 +75,42 @@ export class ActivitiProcessService {
* @param appId * @param appId
* @returns {FilterRepresentationModel[]} * @returns {FilterRepresentationModel[]}
*/ */
private createDefaultFilters(appId: number): FilterProcessRepresentationModel[] { public createDefaultFilters(appId: number): Observable<FilterProcessRepresentationModel[]> {
let filters: FilterProcessRepresentationModel[] = []; let runnintFilter = this.getRunningFilterInstance(appId);
let runnintObservable = this.addFilter(runnintFilter);
let involvedTasksFilter = this.getRunningFilterInstance(appId); let completedFilter = this.getCompletedFilterInstance(appId);
this.addFilter(involvedTasksFilter); let completedObservable = this.addFilter(completedFilter);
filters.push(involvedTasksFilter);
let myTasksFilter = this.getCompletedFilterInstance(appId); let allFilter = this.getAllFilterInstance(appId);
this.addFilter(myTasksFilter); let allObservable = this.addFilter(allFilter);
filters.push(myTasksFilter);
let queuedTasksFilter = this.getAllFilterInstance(appId); return Observable.create(observer => {
this.addFilter(queuedTasksFilter); Observable.forkJoin(
filters.push(queuedTasksFilter); runnintObservable,
completedObservable,
return filters; allObservable
).subscribe(
(res) => {
let filters: FilterProcessRepresentationModel[] = [];
res.forEach((filter) => {
if (filter.name === runnintFilter.name) {
filters.push(runnintFilter);
} else if (filter.name === completedFilter.name) {
filters.push(completedFilter);
} else if (filter.name === allFilter.name) {
filters.push(allFilter);
}
});
observer.next(filters);
observer.complete();
},
(err: any) => {
this.logService.error(err);
});
});
} }
/**
* Return a static Running filter instance
* @param appId
* @returns {FilterProcessRepresentationModel}
*/
private getRunningFilterInstance(appId: number): FilterProcessRepresentationModel { private getRunningFilterInstance(appId: number): FilterProcessRepresentationModel {
return new FilterProcessRepresentationModel({ return new FilterProcessRepresentationModel({
'name': 'Running', 'name': 'Running',
@@ -147,7 +158,10 @@ export class ActivitiProcessService {
*/ */
addFilter(filter: FilterProcessRepresentationModel): Observable<FilterProcessRepresentationModel> { addFilter(filter: FilterProcessRepresentationModel): Observable<FilterProcessRepresentationModel> {
return Observable.fromPromise(this.callApiAddFilter(filter)) return Observable.fromPromise(this.callApiAddFilter(filter))
.catch(err => this.handleError(err)); .map(res => res)
.map((response: FilterProcessRepresentationModel) => {
return response;
}).catch(err => this.handleError(err));
} }
getProcess(id: string): Observable<ProcessInstance> { getProcess(id: string): Observable<ProcessInstance> {

View File

@@ -105,14 +105,33 @@ export class ActivitiFilters implements OnInit, OnChanges {
getFiltersByAppId(appId?: string) { getFiltersByAppId(appId?: string) {
this.activiti.getTaskListFilters(appId).subscribe( this.activiti.getTaskListFilters(appId).subscribe(
(res: FilterRepresentationModel[]) => { (res: FilterRepresentationModel[]) => {
this.resetFilter(); if (res.length === 0 && this.isFilterListEmpty()) {
res.forEach((filter) => { this.activiti.createDefaultFilters(appId).subscribe(
this.filterObserver.next(filter); (resDefault: FilterRepresentationModel[]) => {
}); this.resetFilter();
this.selectFirstFilter(); resDefault.forEach((filter) => {
this.onSuccess.emit(res); this.filterObserver.next(filter);
});
this.selectFirstFilter();
this.onSuccess.emit(resDefault);
},
(errDefault: any) => {
this.logService.error(errDefault);
this.onError.emit(errDefault);
}
);
} else {
this.resetFilter();
res.forEach((filter) => {
this.filterObserver.next(filter);
});
this.selectFirstFilter();
this.onSuccess.emit(res);
}
}, },
(err) => { (err: any) => {
this.logService.error(err); this.logService.error(err);
this.onError.emit(err); this.onError.emit(err);
} }

View File

@@ -26,14 +26,9 @@ import {
} from '../models/filter.model'; } from '../models/filter.model';
import { Comment } from '../models/comment.model'; import { Comment } from '../models/comment.model';
declare let AlfrescoApi: any;
declare let jasmine: any; declare let jasmine: any;
describe('ActivitiTaskListService', () => { describe('ActivitiTaskListService', () => {
let fakeEmptyFilters = {
size: 0, total: 0, start: 0,
data: []
};
let fakeFilters = { let fakeFilters = {
size: 2, total: 2, start: 0, size: 2, total: 2, start: 0,
@@ -431,29 +426,50 @@ describe('ActivitiTaskListService', () => {
}); });
}); });
it('should call the createDefaultFilter when the list is empty', (done) => { it('should return the default filters', (done) => {
spyOn(service, 'createDefaultFilter'); service.createDefaultFilters('1234').subscribe(
(res: FilterRepresentationModel []) => {
service.getTaskListFilters().subscribe( expect(res).toBeDefined();
(res) => { expect(res.length).toEqual(4);
expect(service.createDefaultFilter).toHaveBeenCalled(); expect(res[0].name).toEqual('Involved Tasks');
expect(res[1].name).toEqual('My Tasks');
expect(res[2].name).toEqual('Queued Tasks');
expect(res[3].name).toEqual('Completed Tasks');
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.at(0).respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeEmptyFilters) responseText: JSON.stringify({
id: '111', name: 'Involved Tasks', filter: { assignment: 'fake-involved' }
})
}); });
});
it('should return the default filters', () => { jasmine.Ajax.requests.at(1).respondWith({
spyOn(service, 'addFilter'); 'status': 200,
let filters = service.createDefaultFilter(null); contentType: 'application/json',
expect(service.addFilter).toHaveBeenCalledTimes(4); responseText: JSON.stringify({
expect(filters).toBeDefined(); id: '222', name: 'My Tasks', filter: { assignment: 'fake-assignee' }
expect(filters.length).toEqual(4); })
});
jasmine.Ajax.requests.at(2).respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify({
id: '333', name: 'Queued Tasks', filter: { assignment: 'fake-candidate' }
})
});
jasmine.Ajax.requests.at(3).respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify({
id: '444', name: 'Completed Tasks', filter: { assignment: 'fake-involved' }
})
});
}); });
it('should add a filter ', (done) => { it('should add a filter ', (done) => {

View File

@@ -61,9 +61,6 @@ export class ActivitiTaskListService {
let filterModel = new FilterRepresentationModel(filter); let filterModel = new FilterRepresentationModel(filter);
filters.push(filterModel); filters.push(filterModel);
}); });
if (response && response.data && response.data.length === 0) {
return this.createDefaultFilter(appId);
}
return filters; return filters;
}).catch(err => this.handleError(err)); }).catch(err => this.handleError(err));
} }
@@ -204,26 +201,46 @@ export class ActivitiTaskListService {
* @param appId * @param appId
* @returns {FilterRepresentationModel[]} * @returns {FilterRepresentationModel[]}
*/ */
createDefaultFilter(appId: string): FilterRepresentationModel[] { public createDefaultFilters(appId: string): Observable<FilterRepresentationModel[]> {
let filters: FilterRepresentationModel[] = [];
let involvedTasksFilter = this.getInvolvedTasksFilterInstance(appId); let involvedTasksFilter = this.getInvolvedTasksFilterInstance(appId);
this.addFilter(involvedTasksFilter); let involvedObservable = this.addFilter(involvedTasksFilter);
filters.push(involvedTasksFilter);
let myTasksFilter = this.getMyTasksFilterInstance(appId); let myTasksFilter = this.getMyTasksFilterInstance(appId);
this.addFilter(myTasksFilter); let myTaskObservable = this.addFilter(myTasksFilter);
filters.push(myTasksFilter);
let queuedTasksFilter = this.getQueuedTasksFilterInstance(appId); let queuedTasksFilter = this.getQueuedTasksFilterInstance(appId);
this.addFilter(queuedTasksFilter); let queuedObservable = this.addFilter(queuedTasksFilter);
filters.push(queuedTasksFilter);
let completedTasksFilter = this.getCompletedTasksFilterInstance(appId); let completedTasksFilter = this.getCompletedTasksFilterInstance(appId);
this.addFilter(completedTasksFilter); let completeObservable = this.addFilter(completedTasksFilter);
filters.push(completedTasksFilter);
return filters; return Observable.create(observer => {
Observable.forkJoin(
involvedObservable,
myTaskObservable,
queuedObservable,
completeObservable
).subscribe(
(res) => {
let filters: FilterRepresentationModel[] = [];
res.forEach((filter) => {
if (filter.name === involvedTasksFilter.name) {
filters.push(involvedTasksFilter);
} else if (filter.name === myTasksFilter.name) {
filters.push(myTasksFilter);
} else if (filter.name === queuedTasksFilter.name) {
filters.push(queuedTasksFilter);
} else if (filter.name === completedTasksFilter.name) {
filters.push(completedTasksFilter);
}
});
observer.next(filters);
observer.complete();
},
(err: any) => {
this.logService.error(err);
});
});
} }
/** /**