Merge pull request #672 from Alfresco/dev-mvitale-611

Activiti Task List does not show all entries
This commit is contained in:
Mario Romano
2016-09-05 14:46:42 +01:00
committed by GitHub
7 changed files with 91 additions and 39 deletions
@@ -82,7 +82,7 @@ export class ActivitiDemoComponent implements AfterViewChecked {
onTaskFilterClick(event: any) { onTaskFilterClick(event: any) {
this.taskFilter = event; this.taskFilter = event;
this.activititasklist.load(this.taskFilter); this.activititasklist.load(this.taskFilter.filter);
} }
onProcessFilterClick(event: any) { onProcessFilterClick(event: any) {
@@ -50,7 +50,7 @@ Also make sure you include these dependencies in your `index.html` file:
## Basic usage example Activiti Task List ## Basic usage example Activiti Task List
The component shows the list of all the tasks filter by the The component shows the list of all the tasks filter by the
FilterModel passed in input. FilterParamModel passed in input.
```html ```html
<activiti-tasklist [taskFilter]="taskFilterModel"></activiti-tasklist> <activiti-tasklist [taskFilter]="taskFilterModel"></activiti-tasklist>
``` ```
@@ -62,25 +62,19 @@ clicked<br />
#### Options #### Options
**taskFilter**: { FilterModel } required) FilterModel object that **taskFilter**: { FilterParamModel } required) FilterParamModel object that
is passed to the task list API to filter the task list. is passed to the task list API to filter the task list.
Example: Example:
```json ```json
{ {
"id": 4,
"name": "Involved Tasks",
"recent": false,
"icon": "glyphicon-align-left",
"filter": {
"appDefinitionId": "1", "appDefinitionId": "1",
"processDefinitionId": "1533", "processDefinitionId": "1533",
"sort": "created-desc", "sort": "created-desc",
"name": "", "text": "",
"state": "open", "state": "open",
"assignment": "involved", "assignment": "involved",
"page": "0", "page": "0",
"size": "25" "size": "25"
}
} }
``` ```
**schemaColumn**: { any[] } optional) JSON object that represent **schemaColumn**: { any[] } optional) JSON object that represent
@@ -34,7 +34,7 @@ describe('ActivitiTaskList', () => {
let taskList: ActivitiTaskList; let taskList: ActivitiTaskList;
let fakeGlobalTask = { let fakeGlobalTask = {
size: 1, total: 12, start: 0, size: 2, total: 2, start: 0,
data: [ data: [
{ {
id: 14, name: 'fake-long-name-fake-long-name-fake-long-name-fak50-long-name', description: null, category: null, id: 14, name: 'fake-long-name-fake-long-name-fake-long-name-fak50-long-name', description: null, category: null,
@@ -51,10 +51,19 @@ describe('ActivitiTaskList', () => {
] ]
}; };
let fakeGlobalTotalTasks = {
size: 2, total: 2, start: 0,
data: []
};
let fakeGlobalTaskPromise = new Promise(function (resolve, reject) { let fakeGlobalTaskPromise = new Promise(function (resolve, reject) {
resolve(fakeGlobalTask); resolve(fakeGlobalTask);
}); });
let fakeGlobalTotalTasksPromise = new Promise(function (resolve, reject) {
resolve(fakeGlobalTotalTasks);
});
let fakeErrorTaskList = { let fakeErrorTaskList = {
error: 'wrong request' error: 'wrong request'
}; };
@@ -91,6 +100,7 @@ describe('ActivitiTaskList', () => {
}); });
it('should return the filtered task list when the taskFilter is passed', (done) => { it('should return the filtered task list when the taskFilter is passed', (done) => {
spyOn(taskList.activiti, 'getTotalTasks').and.returnValue(Observable.fromPromise(fakeGlobalTotalTasksPromise));
spyOn(taskList.activiti, 'getTasks').and.returnValue(Observable.fromPromise(fakeGlobalTaskPromise)); spyOn(taskList.activiti, 'getTasks').and.returnValue(Observable.fromPromise(fakeGlobalTaskPromise));
taskList.taskFilter = new FilterModel('name', false, 'icon', '', 'open', 'fake-assignee'); taskList.taskFilter = new FilterModel('name', false, 'icon', '', 'open', 'fake-assignee');
@@ -108,7 +118,7 @@ describe('ActivitiTaskList', () => {
}); });
it('should throw an exception when the response is wrong', (done) => { it('should throw an exception when the response is wrong', (done) => {
spyOn(taskList.activiti, 'getTasks').and.returnValue(Observable.fromPromise(fakeErrorTaskPromise)); spyOn(taskList.activiti, 'getTotalTasks').and.returnValue(Observable.fromPromise(fakeErrorTaskPromise));
taskList.taskFilter = new FilterModel('name', false, 'icon', '', 'open', 'fake-assignee'); taskList.taskFilter = new FilterModel('name', false, 'icon', '', 'open', 'fake-assignee');
taskList.onError.subscribe( (err) => { taskList.onError.subscribe( (err) => {
@@ -19,7 +19,7 @@ import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
import { AlfrescoTranslationService, AlfrescoAuthenticationService, AlfrescoPipeTranslate } from 'ng2-alfresco-core'; import { AlfrescoTranslationService, AlfrescoAuthenticationService, AlfrescoPipeTranslate } from 'ng2-alfresco-core';
import { ALFRESCO_DATATABLE_DIRECTIVES, ObjectDataTableAdapter, DataTableAdapter, DataRowEvent } from 'ng2-alfresco-datatable'; import { ALFRESCO_DATATABLE_DIRECTIVES, ObjectDataTableAdapter, DataTableAdapter, DataRowEvent } from 'ng2-alfresco-datatable';
import { ActivitiTaskListService } from './../services/activiti-tasklist.service'; import { ActivitiTaskListService } from './../services/activiti-tasklist.service';
import { FilterModel } from '../models/filter.model'; import { FilterModel, FilterParamsModel } from '../models/filter.model';
declare let componentHandler: any; declare let componentHandler: any;
declare let __moduleName: string; declare let __moduleName: string;
@@ -84,15 +84,22 @@ export class ActivitiTaskList implements OnInit {
); );
if (this.taskFilter) { if (this.taskFilter) {
this.load(this.taskFilter); this.load(this.taskFilter.filter);
} }
} }
public load(filter: FilterModel) { public load(filterParam: FilterParamsModel) {
this.activiti.getTasks(filter).subscribe( this.activiti.getTotalTasks(filterParam).subscribe(
(res) => { (res) => {
this.renderTasks(res.data); filterParam.size = res.total;
this.onSuccess.emit(res); this.activiti.getTasks(filterParam).subscribe(
(response) => {
this.renderTasks(response.data);
this.onSuccess.emit(response);
}, (error) => {
console.error(error);
this.onError.emit(error);
});
}, (err) => { }, (err) => {
console.error(err); console.error(err);
this.onError.emit(err); this.onError.emit(err);
@@ -33,7 +33,7 @@ export class FilterModel {
this.name = name; this.name = name;
this.recent = recent; this.recent = recent;
this.icon = icon; this.icon = icon;
this.filter = new FilterParamsModel(query, state, assignment, appDefinitionId); this.filter = new FilterParamsModel(assignment, state, query, appDefinitionId);
} }
} }
@@ -45,15 +45,25 @@ export class FilterModel {
* @returns {FilterModel} . * @returns {FilterModel} .
*/ */
export class FilterParamsModel { export class FilterParamsModel {
name: string;
state: string;
assignment: string;
appDefinitionId: string; appDefinitionId: string;
processInstanceId: string;
processDefinitionId: string;
text: string;
assignment: string;
state: string;
sort: string;
page: number = 0;
size: number = 25;
constructor(query: string, state: string, assignment: string, appDefinitionId?: string) { constructor(assignment: string, state: string, text: string, appDefinitionId?: string, processInstanceId?: string,
this.name = query; processDefinitionId?: string, page?: number, size?: number) {
this.state = state;
this.assignment = assignment;
this.appDefinitionId = appDefinitionId; this.appDefinitionId = appDefinitionId;
this.processInstanceId = processInstanceId;
this.processDefinitionId = processDefinitionId;
this.text = text;
this.assignment = assignment;
this.state = state;
this.page = page;
this.size = size;
} }
} }
@@ -42,8 +42,7 @@ describe('ActivitiTaskListService', () => {
}; };
let fakeFilter = { let fakeFilter = {
page: 2, filterId: 2, appDefinitionId: null, sort: 'created-desc', text: '', state: 'open', assignment: 'fake-assignee'
filter: {sort: 'created-desc', name: '', state: 'open', assignment: 'fake-assignee'}
}; };
let fakeUser = {id: 1, email: 'fake-email@dom.com', firstName: 'firstName', lastName: 'lastName'}; let fakeUser = {id: 1, email: 'fake-email@dom.com', firstName: 'firstName', lastName: 'lastName'};
@@ -302,4 +301,22 @@ describe('ActivitiTaskListService', () => {
}); });
}); });
it('should return the total number of tasks', (done) => {
service.getTotalTasks(fakeFilter).subscribe(
res => {
expect(res).toBeDefined();
expect(res.size).toEqual(1);
expect(res.total).toEqual(1);
done();
}
);
jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify(fakeTaskList)
});
});
}); });
@@ -59,11 +59,11 @@ export class ActivitiTaskListService {
/** /**
* Retrive all the tasks filtered by filterModel * Retrive all the tasks filtered by filterModel
* @param filter - FilterModel * @param filter - FilterParamsModel
* @returns {any} * @returns {any}
*/ */
getTasks(filter: FilterModel): Observable<any> { getTasks(filter: FilterParamsModel): Observable<any> {
return Observable.fromPromise(this.callApiTasksFiltered(filter.filter)) return Observable.fromPromise(this.callApiTasksFiltered(filter))
.map((res: any) => { .map((res: any) => {
return res; return res;
}).catch(this.handleError); }).catch(this.handleError);
@@ -156,6 +156,20 @@ export class ActivitiTaskListService {
.map(res => res); .map(res => res);
} }
/**
* Return the total number of the tasks by filter
* @param filter - FilterParamsModel
* @returns {any}
*/
public getTotalTasks(filter: FilterParamsModel): Observable<any> {
filter.size = 0;
return Observable.fromPromise(this.callApiTasksFiltered(filter))
.map((res: any) => {
return res;
}).catch(this.handleError);
}
private callApiTasksFiltered(filter: FilterParamsModel) { private callApiTasksFiltered(filter: FilterParamsModel) {
return this.authService.getAlfrescoApi().activiti.taskApi.listTasks(filter); return this.authService.getAlfrescoApi().activiti.taskApi.listTasks(filter);
} }