diff --git a/lib/process-services/src/lib/mock/task/task-details.mock.ts b/lib/process-services/src/lib/mock/task/task-details.mock.ts index 55e42d040d..c126fc95e9 100644 --- a/lib/process-services/src/lib/mock/task/task-details.mock.ts +++ b/lib/process-services/src/lib/mock/task/task-details.mock.ts @@ -845,3 +845,131 @@ export let noDataMock = [ } }) ]; + +export const involvedUserTaskForm = { + id: '20259', + name: 'Shared task', + description: '', + category: null, + assignee: { + id: 347, + firstName: 'Fake', + lastName: 'assignee', + email: 'fake-assignee@test.com' + }, + created: '2020-08-14T11:02:44.992+0000', + dueDate: null, + endDate: null, + duration: null, + priority: 50, + parentTaskId: null, + parentTaskName: null, + processInstanceId: null, + processInstanceName: null, + processDefinitionId: null, + processDefinitionName: null, + processDefinitionDescription: null, + processDefinitionKey: null, + processDefinitionCategory: null, + processDefinitionVersion: 0, + processDefinitionDeploymentId: null, + formKey: '3896', + processInstanceStartUserId: null, + initiatorCanCompleteTask: false, + adhocTaskCanBeReassigned: true, + taskDefinitionKey: null, + executionId: null, + involvedPeople: [ + { + id: 1001, + email: 'fake-email@gmail.com', + firstName: 'fake', + lastName: 'user' + } + ], + involvedGroups: [], + memberOfCandidateGroup: false, + memberOfCandidateUsers: false, + managerOfCandidateGroup: false +}; + +export const involvedGroupTaskForm = { + id: '20259', + name: 'Shared task', + description: '', + category: null, + assignee: { + id: 347, + firstName: 'Fake', + lastName: 'assignee', + email: 'fake-assignee@test.com' + }, + created: '2020-08-14T11:02:44.992+0000', + dueDate: null, + endDate: null, + duration: null, + priority: 50, + parentTaskId: null, + parentTaskName: null, + processInstanceId: null, + processInstanceName: null, + processDefinitionId: null, + processDefinitionName: null, + processDefinitionDescription: null, + processDefinitionKey: null, + processDefinitionCategory: null, + processDefinitionVersion: 0, + processDefinitionDeploymentId: null, + formKey: '3896', + processInstanceStartUserId: null, + initiatorCanCompleteTask: false, + adhocTaskCanBeReassigned: true, + taskDefinitionKey: null, + executionId: null, + involvedPeople: [], + involvedGroups: [ + { + id: 637, + name: 'one-group' + } + ], + memberOfCandidateGroup: false, + memberOfCandidateUsers: false, + managerOfCandidateGroup: false +}; + +export const fakeUser = { + id: 1001, + email: 'fake-email@gmail.com', + firstName: 'fake', + lastName: 'user', + externalId: null, + company: null, + pictureId: null, + fullname: 'One Alfrsco', + password: null, + type: 'enterprise', + status: 'active', + created: '2020-08-14T09:21:52.306Z', + lastUpdate: '2020-08-14T09:22:48.147Z', + tenantId: 310, + groups: [ + { + id: 637, + name: 'one-group', + externalId: null, + status: 'active', + parentGroupId: null, + tenantId: 310, + type: 1, + userCount: null, + users: null, + capabilities: null, + groups: null + } + ], + capabilities: null, + apps: [], + tenantPictureId: null, + tenantName: 'abc' +}; diff --git a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.html b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.html index 51c1faad68..3e4ede94f8 100644 --- a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.html +++ b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.html @@ -6,6 +6,7 @@ [showRefreshButton]="showFormRefreshButton" [showCompleteButton]="showFormCompleteButton" [showSaveButton]="isSaveButtonVisible()" + [disableCompleteButton]="!isCompleteButtonEnabled()" [readOnly]="isReadOnlyForm()" [fieldValidators]="fieldValidators" (formSaved)='onFormSaved($event)' diff --git a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts index 7fbdf281ad..ac82ce7ab1 100644 --- a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts +++ b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts @@ -41,7 +41,10 @@ import { taskDetailsWithOutCandidateGroup, claimedTaskDetailsMock, claimedByGroupMemberMock, - initiatorWithCandidatesTaskDetailsMock + initiatorWithCandidatesTaskDetailsMock, + involvedUserTaskForm, + fakeUser, + involvedGroupTaskForm } from '../../../mock/task/task-details.mock'; import { TaskDetailsModel } from '../../models/task-details.model'; import { ProcessTestingModule } from '../../../testing/process.testing.module'; @@ -81,7 +84,7 @@ describe('TaskFormComponent', () => { taskDetailsMock.processDefinitionId = null; spyOn(formService, 'getTask').and.returnValue(of(taskDetailsMock)); authService = TestBed.inject(AuthenticationService); - getBpmLoggedUserSpy = spyOn(authService, 'getBpmLoggedUser').and.returnValue(of({ id: 1001, email: 'fake-email@gmail.com' })); + getBpmLoggedUserSpy = spyOn(authService, 'getBpmLoggedUser').and.returnValue(of(fakeUser)); }); afterEach(async() => { @@ -734,4 +737,35 @@ describe('TaskFormComponent', () => { unclaimBtn.nativeElement.click(); }); }); + + describe('Involved user task', () => { + + beforeEach(() => { + component.taskId = '20259'; + }); + + it('Should be able to save a form for a involved user', async() => { + getTaskDetailsSpy.and.returnValue(of(involvedUserTaskForm)); + fixture.detectChanges(); + await fixture.whenStable(); + const activitFormSelector = element.querySelector('adf-form'); + const saveButton = fixture.debugElement.nativeElement.querySelector('[id="adf-form-save"]'); + const completeButton = fixture.debugElement.nativeElement.querySelector('[id="adf-form-complete"]'); + expect(activitFormSelector).toBeDefined(); + expect(saveButton.disabled).toEqual(false); + expect(completeButton.disabled).toEqual(true); + }); + + it('Should be able to save a form for a involved group user', async() => { + getTaskDetailsSpy.and.returnValue(of(involvedGroupTaskForm)); + fixture.detectChanges(); + await fixture.whenStable(); + const activitFormSelector = element.querySelector('adf-form'); + const saveButton = fixture.debugElement.nativeElement.querySelector('[id="adf-form-save"]'); + const completeButton = fixture.debugElement.nativeElement.querySelector('[id="adf-form-complete"]'); + expect(activitFormSelector).toBeDefined(); + expect(saveButton.disabled).toEqual(false); + expect(completeButton.disabled).toEqual(true); + }); + }); }); diff --git a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.ts b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.ts index 89bea13441..a96ef37911 100644 --- a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.ts @@ -28,7 +28,7 @@ import { } from '@alfresco/adf-core'; import { TaskDetailsModel } from '../../models/task-details.model'; import { TaskListService } from '../../services/tasklist.service'; -import { UserRepresentation, LightUserRepresentation } from '@alfresco/js-api'; +import { UserRepresentation, LightGroupRepresentation, LightUserRepresentation } from '@alfresco/js-api'; import { Observable } from 'rxjs'; import { ProcessFormRenderingService } from '../../../form/process-form-rendering.service'; @@ -297,6 +297,16 @@ export class TaskFormComponent implements OnInit { ); isInvolved = !!userInvolved; } + + if (this.taskDetails.involvedGroups?.length && this.currentLoggedUser.groups?.length && !isInvolved) { + const userGroup = this.taskDetails.involvedGroups.find( + (involvedGroup: LightGroupRepresentation) => + this.currentLoggedUser.groups.find( + group => group.name === involvedGroup.name.toLocaleLowerCase() || group.id === involvedGroup.id + ) + ); + isInvolved = !!userGroup; + } return isInvolved; } @@ -309,7 +319,7 @@ export class TaskFormComponent implements OnInit { } isSaveButtonVisible(): boolean { - return this.showFormSaveButton && (!this.canInitiatorComplete() || this.isAssignedToMe()); + return this.showFormSaveButton && (!this.canInitiatorComplete() || this.isAssignedToMe() || this.isCurrentUserInvolved()); } canCompleteNoFormTask(): boolean {