From e86b7dec849b786cfb85b187954ff44a676f05c0 Mon Sep 17 00:00:00 2001 From: mauriziovitale84 Date: Thu, 15 Sep 2016 11:15:37 +0100 Subject: [PATCH] Fix the activiti processes using the appId --- .../components/activiti-filters.component.ts | 41 ++++-- ...viti-process-instance-details.component.ts | 29 +++- .../activiti-processlist.component.ts | 57 ++++++-- .../src/models/filter.model.ts | 133 +++++++++++++++--- .../src/services/activiti-process.service.ts | 6 +- 5 files changed, 219 insertions(+), 47 deletions(-) diff --git a/ng2-components/ng2-activiti-processlist/src/components/activiti-filters.component.ts b/ng2-components/ng2-activiti-processlist/src/components/activiti-filters.component.ts index a040f8a8f8..0d13e5c307 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/activiti-filters.component.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/activiti-filters.component.ts @@ -15,10 +15,10 @@ * limitations under the License. */ -import { Component, Output, EventEmitter, OnInit, Input } from '@angular/core'; +import { Component, Output, EventEmitter, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core'; import { AlfrescoTranslationService, AlfrescoAuthenticationService, AlfrescoPipeTranslate } from 'ng2-alfresco-core'; import { ActivitiProcessService } from './../services/activiti-process.service'; -import { FilterModel } from '../models/filter.model'; +import { FilterRepresentationModel } from '../models/filter.model'; import { Observer } from 'rxjs/Observer'; import { Observable } from 'rxjs/Observable'; @@ -34,10 +34,10 @@ declare let __moduleName: string; pipes: [AlfrescoPipeTranslate] }) -export class ActivitiProcessFilters implements OnInit { +export class ActivitiProcessFilters implements OnInit, OnChanges { @Output() - filterClick: EventEmitter = new EventEmitter(); + filterClick: EventEmitter = new EventEmitter(); @Output() onSuccess: EventEmitter = new EventEmitter(); @@ -51,12 +51,12 @@ export class ActivitiProcessFilters implements OnInit { @Input() appName: string; - private filterObserver: Observer; - filter$: Observable; + private filterObserver: Observer; + filter$: Observable; - currentFilter: FilterModel; + currentFilter: FilterRepresentationModel; - filters: FilterModel [] = []; + filters: FilterRepresentationModel [] = []; /** * Constructor @@ -67,7 +67,7 @@ export class ActivitiProcessFilters implements OnInit { constructor(private auth: AlfrescoAuthenticationService, private translate: AlfrescoTranslationService, public activiti: ActivitiProcessService) { - this.filter$ = new Observable(observer => this.filterObserver = observer).share(); + this.filter$ = new Observable(observer => this.filterObserver = observer).share(); if (translate) { translate.addTranslationFolder('node_modules/ng2-activiti-processlist/src'); @@ -75,18 +75,27 @@ export class ActivitiProcessFilters implements OnInit { } ngOnInit() { - this.filter$.subscribe((filter: FilterModel) => { + this.filter$.subscribe((filter: FilterRepresentationModel) => { this.filters.push(filter); }); this.load(); } + ngOnChanges(changes: SimpleChanges) { + let appId = changes['appId']; + if (appId && appId.currentValue) { + this.load(); + return; + } + } + /** * The method call the adapter data table component for render the task list * @param tasks */ private load() { + this.resetFilter(); if (this.appName) { this.filterByAppName(); } else { @@ -96,7 +105,7 @@ export class ActivitiProcessFilters implements OnInit { private filterByAppId(appId) { this.activiti.getProcessFilters(appId).subscribe( - (res: FilterModel[]) => { + (res: FilterRepresentationModel[]) => { res.forEach((filter) => { this.filterObserver.next(filter); }); @@ -124,8 +133,16 @@ export class ActivitiProcessFilters implements OnInit { * Pass the selected filter as next * @param filter */ - public selectFilter(filter: FilterModel) { + public selectFilter(filter: FilterRepresentationModel) { this.currentFilter = filter; this.filterClick.emit(filter); } + + /** + * Reset the filters properties + */ + private resetFilter() { + this.filters = []; + this.currentFilter = null; + } } diff --git a/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-details.component.ts b/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-details.component.ts index 0196992b82..b7e5b7b8b7 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-details.component.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-details.component.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { Component, Input, ViewChild, Output, EventEmitter } from '@angular/core'; +import { Component, Input, ViewChild, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core'; import { AlfrescoTranslationService, AlfrescoAuthenticationService, AlfrescoPipeTranslate } from 'ng2-alfresco-core'; import { ActivitiProcessService } from './../services/activiti-process.service'; import { ActivitiProcessInstanceHeader } from './activiti-process-instance-header.component'; @@ -37,7 +37,7 @@ declare let __moduleName: string; pipes: [AlfrescoPipeTranslate] }) -export class ActivitiProcessInstanceDetails { +export class ActivitiProcessInstanceDetails implements OnInit, OnChanges { @Input() processInstanceId: string; @@ -80,6 +80,31 @@ export class ActivitiProcessInstanceDetails { } } + ngOnInit() { + if (this.processInstanceId) { + this.load(this.processInstanceId); + } + } + + ngOnChanges(changes: SimpleChanges) { + let processInstanceId = changes['processInstanceId']; + if (processInstanceId && !processInstanceId.currentValue) { + this.reset(); + return; + } + if (processInstanceId && processInstanceId.currentValue) { + this.load(processInstanceId.currentValue); + return; + } + } + + /** + * Reset the task detail to undefined + */ + reset() { + this.processInstanceDetails = null; + } + load(processId: string) { if (processId) { this.activitiProcess.getProcess(processId).subscribe( diff --git a/ng2-components/ng2-activiti-processlist/src/components/activiti-processlist.component.ts b/ng2-components/ng2-activiti-processlist/src/components/activiti-processlist.component.ts index 6f22951373..c13fa88fbf 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/activiti-processlist.component.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/activiti-processlist.component.ts @@ -15,11 +15,11 @@ * limitations under the License. */ -import {Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import {Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core'; import { AlfrescoPipeTranslate, AlfrescoTranslationService, CONTEXT_MENU_DIRECTIVES, CONTEXT_MENU_PROVIDERS } from 'ng2-alfresco-core'; import { ALFRESCO_DATATABLE_DIRECTIVES, ObjectDataTableAdapter, DataRowEvent } from 'ng2-alfresco-datatable'; import { ActivitiProcessService } from '../services/activiti-process.service'; -import { FilterModel } from '../models/filter.model'; +import { UserProcessInstanceFilterRepresentationModel, TaskQueryRequestRepresentationModel } from '../models/filter.model'; declare let __moduleName: string; @@ -38,14 +38,14 @@ declare let __moduleName: string; pipes: [ AlfrescoPipeTranslate ], providers: [ CONTEXT_MENU_PROVIDERS, ActivitiProcessService ] }) -export class ActivitiProcessInstanceListComponent implements OnInit { +export class ActivitiProcessInstanceListComponent implements OnInit, OnChanges { errorMessage: string; data: ObjectDataTableAdapter; currentProcessInstanceId: string; @Input() - filter: FilterModel; + filter: UserProcessInstanceFilterRepresentationModel; @Input() schemaColumn: any[] = [ @@ -76,15 +76,26 @@ export class ActivitiProcessInstanceListComponent implements OnInit { this.schemaColumn ); if (this.filter) { - this.load(this.filter); + let requestNode = this.convertProcessInstanceToTaskQuery(this.filter); + this.load(requestNode); } } - load(filter: FilterModel) { - this.processService.getProcessInstances(filter) + ngOnChanges(changes: SimpleChanges) { + let filter = changes['filter']; + if (filter && filter.currentValue) { + let requestNode = this.convertProcessInstanceToTaskQuery(filter.currentValue); + this.load(requestNode); + return; + } + } + + load(requestNode: TaskQueryRequestRepresentationModel) { + this.processService.getProcessInstances(requestNode) .subscribe( (processInstances) => { this.renderProcessInstances(processInstances); + this.selectFirstProcess(); this.onSuccess.emit(processInstances); }, error => { @@ -93,10 +104,6 @@ export class ActivitiProcessInstanceListComponent implements OnInit { }); } - reload() { - this.load(this.filter); - } - /** * Render the process list * @@ -110,6 +117,25 @@ export class ActivitiProcessInstanceListComponent implements OnInit { ); } + /** + * Select the first process of a process list if present + */ + private selectFirstProcess() { + if (!this.isListEmpty()) { + this.currentProcessInstanceId = this.data.getRows()[0].getValue('id'); + } else { + this.currentProcessInstanceId = null; + } + } + + /** + * Return the current process + * @returns {string} + */ + getCurrentProcessId(): string { + return this.currentProcessInstanceId; + } + /** * Check if the list is empty * @returns {ObjectDataTableAdapter|boolean} @@ -144,4 +170,13 @@ export class ActivitiProcessInstanceListComponent implements OnInit { }); return tasks; } + + private convertProcessInstanceToTaskQuery(processFilter: UserProcessInstanceFilterRepresentationModel) { + let requestNode = {appDefinitionId: processFilter.appId, + processDefinitionKey: processFilter.filter.processDefinitionKey, + text: processFilter.filter.name, + state: processFilter.filter.state, + sort: processFilter.filter.sort}; + return new TaskQueryRequestRepresentationModel(requestNode); + } } diff --git a/ng2-components/ng2-activiti-processlist/src/models/filter.model.ts b/ng2-components/ng2-activiti-processlist/src/models/filter.model.ts index 2cd0c0eb42..fd706963d4 100644 --- a/ng2-components/ng2-activiti-processlist/src/models/filter.model.ts +++ b/ng2-components/ng2-activiti-processlist/src/models/filter.model.ts @@ -15,26 +15,58 @@ * limitations under the License. */ +/** + * + * This object represent the app definition. + * + * + * @returns {AppDefinitionRepresentationModel} . + */ +export class AppDefinitionRepresentationModel { + defaultAppId: string; + deploymentId: string; + name: string; + description: string; + theme: string; + id: number; + modelId: number; + tenantId: number; + + constructor(obj?: any) { + this.defaultAppId = obj && obj.defaultAppId || null; + this.deploymentId = obj && obj.deploymentId || false; + this.name = obj && obj.name || null; + this.description = obj && obj.description || null; + this.theme = obj && obj.theme || null; + this.id = obj && obj.id; + this.modelId = obj && obj.modelId; + this.tenantId = obj && obj.tenantId; + } +} + /** * * This object represent the filter. * * - * @returns {FilterModel} . + * @returns {FilterRepresentationModel} . */ -export class FilterModel { +export class FilterRepresentationModel { id: number; + appId: string; name: string; - recent: boolean = false; + recent: boolean; icon: string; - filter: FilterParamsModel; - appId: number; + filter: FilterParamRepresentationModel; + index: number; - constructor(name: string, recent: boolean, icon: string, query: string, state: string, assignment: string, appDefinitionId?: string) { - this.name = name; - this.recent = recent; - this.icon = icon; - this.filter = new FilterParamsModel(query, state, assignment, appDefinitionId); + constructor(obj?: any) { + this.appId = obj && obj.appId || null; + this.name = obj && obj.name || null; + this.recent = obj && obj.recent || false; + this.icon = obj && obj.icon || null; + this.filter = new FilterParamRepresentationModel(obj.filter); + this.index = obj && obj.index; } } @@ -43,18 +75,81 @@ export class FilterModel { * This object represent the parameters of a filter. * * - * @returns {FilterModel} . + * @returns {FilterParamRepresentationModel} . */ -export class FilterParamsModel { +export class FilterParamRepresentationModel { + processDefinitionId: string; + processDefinitionKey: string; name: string; - sort: string; state: string; - appDefinitionId: string; + sort: string; - constructor(query: string, sort: string, state: string, appDefinitionId?: string) { - this.name = query; - this.sort = sort; - this.state = state; - this.appDefinitionId = appDefinitionId; + constructor(obj?: any) { + this.processDefinitionId = obj && obj.processDefinitionId || null; + this.processDefinitionKey = obj && obj.processDefinitionKey || null; + this.name = obj && obj.name || null; + this.state = obj && obj.state || null; + this.sort = obj && obj.sort || null; + } +} + +export class UserProcessInstanceFilterRepresentationModel extends FilterRepresentationModel { + public filter: ProcessInstanceFilterRepresentation; + constructor(obj?: any) { + super(obj); + this.filter = new ProcessInstanceFilterRepresentation(obj.filter); + } +} + +export class ProcessInstanceFilterRepresentation extends FilterParamRepresentationModel { + constructor(obj?: any) { + super(obj); + } +} + +export class UserTaskFilterRepresentationModel extends FilterRepresentationModel { + public filter: TaskFilterRepresentationModel; + constructor(obj?: any) { + super(obj); + this.filter = new TaskFilterRepresentationModel(obj.filter); + } +} + +export class TaskFilterRepresentationModel extends FilterParamRepresentationModel { + assignment: string; + dueAfter: Date; + dueBefore: Date; + + constructor(obj?: any) { + super(obj); + this.assignment = obj && obj.assignment || null; + this.dueAfter = obj && obj.dueAfter || null; + this.dueBefore = obj && obj.dueBefore || null; + } +} + +export class TaskQueryRequestRepresentationModel { + appDefinitionId: string; + processInstanceId: string; + processDefinitionId: string; + processDefinitionKey: string; + text: string; + assignment: string; + state: string; + sort: string; + page: number; + size: number; + + constructor(obj?: any) { + this.appDefinitionId = obj && obj.appDefinitionId || null; + this.processInstanceId = obj && obj.processInstanceId || null; + this.processDefinitionId = obj && obj.processDefinitionId || null; + this.processDefinitionKey = obj && obj.processDefinitionKey || null; + this.text = obj && obj.text || null; + this.assignment = obj && obj.assignment || null; + this.state = obj && obj.state || null; + this.sort = obj && obj.sort || null; + this.page = obj && obj.page || 0; + this.size = obj && obj.size || 25; } } diff --git a/ng2-components/ng2-activiti-processlist/src/services/activiti-process.service.ts b/ng2-components/ng2-activiti-processlist/src/services/activiti-process.service.ts index 9f5926172e..f0e0a2a1d9 100644 --- a/ng2-components/ng2-activiti-processlist/src/services/activiti-process.service.ts +++ b/ng2-components/ng2-activiti-processlist/src/services/activiti-process.service.ts @@ -17,7 +17,7 @@ import {AlfrescoAuthenticationService} from 'ng2-alfresco-core'; import {ProcessInstance} from '../models/process-instance'; -import {FilterModel} from '../models/filter.model'; +import {TaskQueryRequestRepresentationModel} from '../models/filter.model'; import {User} from '../models/user.model'; import {Comment} from '../models/comment.model'; import {Injectable} from '@angular/core'; @@ -49,8 +49,8 @@ export class ActivitiProcessService { .catch(this.handleError); } - getProcessInstances(filter: FilterModel): Observable { - return Observable.fromPromise(this.authService.getAlfrescoApi().activiti.processApi.getProcessInstances(filter)) + getProcessInstances(requestNode: TaskQueryRequestRepresentationModel): Observable { + return Observable.fromPromise(this.authService.getAlfrescoApi().activiti.processApi.getProcessInstances(requestNode)) .map(this.extractData) .catch(this.handleError); }