diff --git a/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-tasks.component.ts b/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-tasks.component.ts index 15de210f0c..e7848282c6 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-tasks.component.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/activiti-process-instance-tasks.component.ts @@ -144,7 +144,7 @@ export class ActivitiProcessInstanceTasks implements OnInit, OnChanges { ? user.firstName + ' ' : '') + user.lastName; } - return ''; + return 'Nobody'; } getFormatDate(value, format: string) { diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.html index dde8190e57..c59d74e9c8 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.html +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.html @@ -9,7 +9,10 @@

{{taskDetails.name}}

- +
- - +
+ + +
+
+ {{ 'TASK_DETAILS.MESSAGES.CLAIM' | translate }} +
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts index 9c1a85a846..6a5079bd9c 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts @@ -178,6 +178,10 @@ export class ActivitiTaskDetails implements OnInit, OnChanges { } } + isAssignedToMe(): boolean { + return this.taskDetails.assignee ? true : false; + } + /** * Retrieve the next open task * @param processInstanceId @@ -243,4 +247,8 @@ export class ActivitiTaskDetails implements OnInit, OnChanges { closeErrorDialog(): void { this.errorDialog.nativeElement.close(); } + + onClaimTask(taskId: string) { + this.loadDetails(taskId); + } } diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html index 9cb0f62abd..e0ee454c12 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html @@ -15,5 +15,10 @@ {{ formName }} {{ 'TASK_DETAILS.FORM.NONE' | translate }}
+ + + diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts index ebb1263b7e..2ad4311c22 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts @@ -24,9 +24,11 @@ import { ActivitiTaskHeader } from './activiti-task-header.component'; import { TranslationMock } from './../assets/translation.service.mock'; import { taskDetailsMock } from './../assets/task-details.mock'; import { TaskDetailsModel } from '../models/task-details.model'; +import { ActivitiTaskListService } from './../services/activiti-tasklist.service'; describe('ActivitiTaskHeader', () => { + let service: ActivitiTaskListService; let componentHandler: any; let component: ActivitiTaskHeader; let fixture: ComponentFixture; @@ -40,7 +42,8 @@ describe('ActivitiTaskHeader', () => { ActivitiTaskHeader ], providers: [ - { provide: AlfrescoTranslationService, useClass: TranslationMock } + { provide: AlfrescoTranslationService, useClass: TranslationMock }, + ActivitiTaskListService ] }).compileComponents(); })); @@ -49,6 +52,7 @@ describe('ActivitiTaskHeader', () => { fixture = TestBed.createComponent(ActivitiTaskHeader); component = fixture.componentInstance; + service = fixture.debugElement.injector.get(ActivitiTaskListService); component.taskDetails = new TaskDetailsModel(taskDetailsMock); @@ -78,6 +82,13 @@ describe('ActivitiTaskHeader', () => { expect(valueEl.nativeElement.innerText).toBe('TASK_DETAILS.ASSIGNEE.NONE'); }); + it('should display the claim button if no assignee', () => { + component.taskDetails.assignee = null; + fixture.detectChanges(); + let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-claim-button"]')); + expect(valueEl.nativeElement.innerText).toBe('TASK_DETAILS.BUTTON.CLAIM'); + }); + it('should display due date', () => { component.taskDetails.dueDate = '2016-11-03T15:25:42.749+0000'; fixture.detectChanges(); diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts index 4856dba405..dc1a38d3cc 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts @@ -15,9 +15,10 @@ * limitations under the License. */ -import { Component, Input } from '@angular/core'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; import { AlfrescoTranslationService } from 'ng2-alfresco-core'; import { TaskDetailsModel } from '../models/task-details.model'; +import { ActivitiTaskListService } from './../services/activiti-tasklist.service'; @Component({ selector: 'activiti-task-header', @@ -33,7 +34,11 @@ export class ActivitiTaskHeader { @Input() taskDetails: TaskDetailsModel; - constructor(private translate: AlfrescoTranslationService) { + @Output() + claim: EventEmitter = new EventEmitter(); + + constructor(private translate: AlfrescoTranslationService, + private activitiTaskService: ActivitiTaskListService) { if (translate) { translate.addTranslationFolder('ng2-activiti-tasklist', 'node_modules/ng2-activiti-tasklist/src'); } @@ -42,4 +47,16 @@ export class ActivitiTaskHeader { public hasAssignee(): boolean { return (this.taskDetails && this.taskDetails.assignee) ? true : false; } + + isAssignedToMe(): boolean { + return this.taskDetails.assignee ? true : false; + } + + claimTask(taskId: string) { + this.activitiTaskService.claimTask(taskId).subscribe( + (res: any) => { + console.log('Task claimed'); + this.claim.emit(taskId); + }); + } } diff --git a/ng2-components/ng2-activiti-tasklist/src/i18n/en.json b/ng2-components/ng2-activiti-tasklist/src/i18n/en.json index f01705e4a9..5630564c2c 100644 --- a/ng2-components/ng2-activiti-tasklist/src/i18n/en.json +++ b/ng2-components/ng2-activiti-tasklist/src/i18n/en.json @@ -14,10 +14,12 @@ "CHECKLIST": "Checklist" }, "BUTTON": { - "COMPLETE": "Complete" + "COMPLETE": "Complete", + "CLAIM": "Claim" }, "MESSAGES": { - "NONE": "No task details found." + "NONE": "No task details found.", + "CLAIM": "To work on this task, you need to claim it first. You can do that by pressing the Claim button above." }, "FORM": { "NONE": "No form." diff --git a/ng2-components/ng2-activiti-tasklist/src/i18n/it.json b/ng2-components/ng2-activiti-tasklist/src/i18n/it.json index f75fe405d4..8d2e557e10 100644 --- a/ng2-components/ng2-activiti-tasklist/src/i18n/it.json +++ b/ng2-components/ng2-activiti-tasklist/src/i18n/it.json @@ -13,8 +13,13 @@ "COMMENTS": "Commenti", "CHECKLIST": "Checklist" }, + "BUTTON": { + "COMPLETE": "Completa", + "CLAIM": "Richiedi" + }, "MESSAGES": { - "NONE": "Nessun dettaglio task trovato." + "NONE": "Nessun dettaglio task trovato.", + "CLAIM": "Per lavorare con questo task, hai bisogno di richiederlo prima. Per richiedere il task basta premere il tasto Richiedi" }, "FORM": { "NONE": "Nessuna form." diff --git a/ng2-components/ng2-activiti-tasklist/src/models/task-details.model.ts b/ng2-components/ng2-activiti-tasklist/src/models/task-details.model.ts index 7407656360..83e5df4ee4 100644 --- a/ng2-components/ng2-activiti-tasklist/src/models/task-details.model.ts +++ b/ng2-components/ng2-activiti-tasklist/src/models/task-details.model.ts @@ -61,7 +61,7 @@ export class TaskDetailsModel { this.id = obj && obj.id || null; this.name = obj && obj.name || null; this.priority = obj && obj.priority; - this.assignee = new User(obj.assignee); + this.assignee = obj.assignee ? new User(obj.assignee) : null; this.adhocTaskCanBeReassigned = obj && obj.adhocTaskCanBeReassigned; this.category = obj && obj.category || null; this.created = obj && obj.created || null; diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts index b42bdcef6d..c8c1540283 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts @@ -513,4 +513,20 @@ describe('ActivitiTaskListService', () => { }); }); + it('should claim a task', (done) => { + let taskId = '111'; + + service.claimTask(taskId).subscribe( + (res: any) => { + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + }); diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts index 269a5122b8..562684b217 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts @@ -232,6 +232,15 @@ export class ActivitiTaskListService { }).catch(this.handleError); } + /** + * Claim a task + * @param id - taskId + */ + claimTask(taskId: string): Observable { + return Observable.fromPromise(this.apiService.getInstance().activiti.taskApi.claimTask(taskId)) + .catch(this.handleError); + } + private callApiTasksFiltered(requestNode: TaskQueryRequestRepresentationModel) { return this.apiService.getInstance().activiti.taskApi.listTasks(requestNode); }