How to get the active task of a process instance using ADF services

There are several ways to get the active task/s from a process instance. In this case, we’re using the TaskListService that returns an Observable. You will need to add it to the constructor.

import {
TaskQueryRequestRepresentationModel,
TaskListService,
TaskDetailsModel
} from '@alfresco/adf-process-services';

.

constructor (private taskListService: TaskListService)
{}

 

To prepare the query we will use a TaskQueryRequestRepresentationModel object that will contain the state of the task (‘active’) and the process instance ID.

/**
* Gets an active task query to filter by process instance Id
* @param {string} processInstanceId process instance ID
* @returns {TaskQueryRequestRepresentationModel}
*/
getActiveTaskQuery(processInstanceId: string) {
return this.getTaskQuery('active', processInstanceId);
}
/**
* Gets a task query to filter by task state and process instance ID
* @param {string} state task state
* @param {string} processInstanceId process instance ID
* @returns {TaskQueryRequestRepresentationModel}
*/
getTaskQuery(state: string, processInstanceId: string) {
const taskQuery = new TaskQueryRequestRepresentationModel();
taskQuery.state = state;
taskQuery.processInstanceId = processInstanceId;
return taskQuery;
}

 

If your process model doesn’t include a parallel gateway you can assume there will be only one active task per process instance.

/**
* Gets the active task if there's only one active task, throws an error if there are more than one
* @param {string} processInstanceId process instance ID to filter by
* @returns {Observable}
*/
getActiveTask(processInstanceId: string): Observable<TaskDetailsModel> {
return this.taskListService.getTasks(this.getActiveTaskQuery(processInstanceId)).map((taskList: TaskListModel) => {
if (taskList.data.length === 1) {
return taskList.data[0];

} else if (taskList.data.length > 1) {
throw new Error(`There are multiple active tasks, process instance ID: ${processInstanceId}`);
}

}, error => {
this.logger.error('Error: ', error);
});
}

 

If your process model includes a parallel gateway you might get multiple active tasks from the same process instance.

/**
* Gets the list of active tasks
* @param {string} processInstanceId process instance ID to filter by
* @returns {Observable}
*/
getActiveTaskList(processInstanceId: string): Observable<TaskListModel> {
return this.taskListService.getTasks(this.getActiveTaskQuery(processInstanceId));
}