From 14f08f2178bf34833c6de0d599b2c3d6f2850cbd Mon Sep 17 00:00:00 2001 From: siva kumar Date: Thu, 10 Sep 2020 22:56:43 +0530 Subject: [PATCH] [ACA-3942] Enable assignee edit button only when userTask shared among the candidates (#6113) * [ACA-3942] Enable assignee edit button only when user task shared among the candidates * * Moved logic to service level --- .../task/services/task-cloud.service.spec.ts | 5 +++++ .../lib/task/services/task-cloud.service.ts | 18 ++++++++++++++---- .../task-header-cloud.component.spec.ts | 16 ++++++++++++++-- .../components/task-header-cloud.component.ts | 9 ++++----- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/lib/process-services-cloud/src/lib/task/services/task-cloud.service.spec.ts b/lib/process-services-cloud/src/lib/task/services/task-cloud.service.spec.ts index c61a97a044..5840ab4efc 100644 --- a/lib/process-services-cloud/src/lib/task/services/task-cloud.service.spec.ts +++ b/lib/process-services-cloud/src/lib/task/services/task-cloud.service.spec.ts @@ -139,6 +139,11 @@ describe('Task Cloud Service', () => { expect(isTaskEditable).toEqual(true); }); + it('should verify if the task assignee property is clickable', () => { + const isAssigneePropertyClickable = service.isAssigneePropertyClickable(assignedTaskDetailsCloudMock, [ { icon: '', value: 'user' } ], [ { icon: '', value: 'group' } ]); + expect(isAssigneePropertyClickable).toEqual(true); + }); + it('should complete task with owner as null', async(() => { const appName = 'simple-app'; const taskId = '68d54a8f'; diff --git a/lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts b/lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts index 5aec665460..53af83358d 100644 --- a/lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts +++ b/lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts @@ -16,7 +16,7 @@ */ import { Injectable } from '@angular/core'; -import { AlfrescoApiService, LogService, AppConfigService, IdentityUserService } from '@alfresco/adf-core'; +import { AlfrescoApiService, LogService, AppConfigService, IdentityUserService, CardViewArrayItem } from '@alfresco/adf-core'; import { throwError, Observable, of, Subject } from 'rxjs'; import { map } from 'rxjs/operators'; import { TaskDetailsCloudModel, StartTaskCloudResponseModel } from '../start-task/models/task-details-cloud.model'; @@ -28,6 +28,7 @@ import { StartTaskCloudRequestModel } from '../start-task/models/start-task-clou }) export class TaskCloudService extends BaseCloudService { + static TASK_ASSIGNED_STATE = 'ASSIGNED'; dataChangesDetected$ = new Subject(); constructor( @@ -63,7 +64,7 @@ export class TaskCloudService extends BaseCloudService { * @returns Boolean value if the task can be completed */ canCompleteTask(taskDetails: TaskDetailsCloudModel): boolean { - return taskDetails && taskDetails.status === 'ASSIGNED' && this.isAssignedToMe(taskDetails.assignee); + return taskDetails && taskDetails.status === TaskCloudService.TASK_ASSIGNED_STATE && this.isAssignedToMe(taskDetails.assignee); } /** @@ -72,7 +73,16 @@ export class TaskCloudService extends BaseCloudService { * @returns Boolean value if the task is editable */ isTaskEditable(taskDetails: TaskDetailsCloudModel): boolean { - return taskDetails && taskDetails.status === 'ASSIGNED' && this.isAssignedToMe(taskDetails.assignee); + return taskDetails && taskDetails.status === TaskCloudService.TASK_ASSIGNED_STATE && this.isAssignedToMe(taskDetails.assignee); + } + + isAssigneePropertyClickable(taskDetails: TaskDetailsCloudModel, candidateUsers: CardViewArrayItem[], candidateGroups: CardViewArrayItem[]): boolean { + let isClickable = false; + const states = [TaskCloudService.TASK_ASSIGNED_STATE]; + if (candidateUsers?.length || candidateGroups?.length) { + isClickable = states.includes(taskDetails.status); + } + return isClickable; } /** @@ -91,7 +101,7 @@ export class TaskCloudService extends BaseCloudService { */ canUnclaimTask(taskDetails: TaskDetailsCloudModel): boolean { const currentUser = this.identityUserService.getCurrentUserInfo().username; - return taskDetails && taskDetails.status === 'ASSIGNED' && taskDetails.assignee === currentUser; + return taskDetails && taskDetails.status === TaskCloudService.TASK_ASSIGNED_STATE && taskDetails.assignee === currentUser; } /** diff --git a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts index 56dd4db0aa..759ab67d7c 100644 --- a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts @@ -28,7 +28,8 @@ import { completedTaskDetailsCloudMock, createdStateTaskDetailsCloudMock, suspendedTaskDetailsCloudMock, - taskDetailsWithParentTaskIdMock + taskDetailsWithParentTaskIdMock, + createdTaskDetailsCloudMock } from '../mocks/task-details-cloud.mock'; import moment from 'moment-es6'; import { TranslateModule } from '@ngx-translate/core'; @@ -263,7 +264,7 @@ describe('TaskHeaderCloudComponent', () => { }); })); - it('should render defined edit icon for assignee property if the task in assigned state and assingee should be current user', () => { + it('should render defined edit icon for assignee property if the task in assigned state and shared among candidates', () => { fixture.detectChanges(); const value = fixture.debugElement.query(By.css(`[data-automation-id="header-assignee"] [data-automation-id="card-textitem-clickable-icon-assignee"]`)); @@ -271,6 +272,17 @@ describe('TaskHeaderCloudComponent', () => { expect(value.nativeElement.innerText).toBe('create'); }); + it('should not render defined edit icon for assignee property if the task in created state and shared among condidates', async () => { + getTaskByIdSpy.and.returnValue(of(createdTaskDetailsCloudMock)); + + component.ngOnChanges(); + fixture.detectChanges(); + await fixture.whenStable(); + + const editIcon = fixture.debugElement.query(By.css(`[data-automation-id="header-assignee"] [data-automation-id="card-textitem-clickable-icon-assignee"]`)); + expect(editIcon).toBeNull(); + }); + it('should render edit icon if the task in assigned state and assingee should be current user', () => { fixture.detectChanges(); const priorityEditIcon = fixture.debugElement.query(By.css(`[data-automation-id="header-priority"] [class*="adf-textitem-edit-icon"]`)); diff --git a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts index 4da0f52b5d..3cb8e5e892 100644 --- a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts @@ -31,7 +31,7 @@ import { CardViewDatetimeItemModel, CardViewArrayItem } from '@alfresco/adf-core'; -import { TaskDetailsCloudModel, TaskStatus } from '../../start-task/models/task-details-cloud.model'; +import { TaskDetailsCloudModel } from '../../start-task/models/task-details-cloud.model'; import { TaskCloudService } from '../../services/task-cloud.service'; import { NumericFieldValidator } from '../../../validators/numeric-field.validator'; @@ -141,7 +141,7 @@ export class TaskHeaderCloudComponent implements OnInit, OnDestroy, OnChanges { label: 'ADF_CLOUD_TASK_HEADER.PROPERTIES.ASSIGNEE', value: this.taskDetails.assignee, key: 'assignee', - clickable: this.isClickable(), + clickable: this.isAssigneePropertyClickable(), default: this.translationService.instant('ADF_CLOUD_TASK_HEADER.PROPERTIES.ASSIGNEE_DEFAULT'), icon: 'create' } @@ -318,9 +318,8 @@ export class TaskHeaderCloudComponent implements OnInit, OnDestroy, OnChanges { return this.taskCloudService.isTaskEditable(this.taskDetails); } - isClickable(): boolean { - const states: TaskStatus[] = ['ASSIGNED', 'CREATED']; - return states.includes(this.taskDetails.status); + isAssigneePropertyClickable(): boolean { + return this.taskCloudService.isAssigneePropertyClickable(this.taskDetails, this.candidateUsers, this.candidateGroups); } private isValidSelection(filteredProperties: string[], cardItem: CardViewBaseItemModel): boolean {