mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
[AAE-5280] Better error handling for user task (#7070)
* [AAE-5280] [ADF] Better error handling for user task * * fixed comments
This commit is contained in:
@@ -9,7 +9,8 @@
|
|||||||
(taskClaimed)="onClaimTask()"
|
(taskClaimed)="onClaimTask()"
|
||||||
(taskCompleted)="onTaskCompleted()"
|
(taskCompleted)="onTaskCompleted()"
|
||||||
(taskUnclaimed)="onUnclaimTask()"
|
(taskUnclaimed)="onUnclaimTask()"
|
||||||
(formSaved)="onFormSaved()">
|
(formSaved)="onFormSaved()"
|
||||||
|
(error)="onError($event)">
|
||||||
</adf-cloud-task-form>
|
</adf-cloud-task-form>
|
||||||
</div>
|
</div>
|
||||||
<adf-cloud-task-header fxFlex
|
<adf-cloud-task-header fxFlex
|
||||||
|
@@ -64,4 +64,13 @@ export class CommunityTaskDetailsCloudDemoComponent {
|
|||||||
onFormSaved() {
|
onFormSaved() {
|
||||||
this.notificationService.openSnackMessage('Task has been saved successfully');
|
this.notificationService.openSnackMessage('Task has been saved successfully');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onError({ message: error }: Error) {
|
||||||
|
let errorMessage;
|
||||||
|
try {
|
||||||
|
errorMessage = JSON.parse(error).message || JSON.parse(error).entry?.message;
|
||||||
|
errorMessage = JSON.parse(errorMessage).message;
|
||||||
|
} catch {}
|
||||||
|
this.notificationService.showError(errorMessage || error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,8 @@
|
|||||||
(cancelClick)="goBack()"
|
(cancelClick)="goBack()"
|
||||||
(taskCompleted)="onTaskCompleted()"
|
(taskCompleted)="onTaskCompleted()"
|
||||||
(formContentClicked)="onFormContentClicked($event)"
|
(formContentClicked)="onFormContentClicked($event)"
|
||||||
(formSaved)="onFormSaved()">
|
(formSaved)="onFormSaved()"
|
||||||
|
(error)="onError($event)">
|
||||||
</adf-cloud-task-form>
|
</adf-cloud-task-form>
|
||||||
</div>
|
</div>
|
||||||
<adf-cloud-task-header #taskHeader fxFlex
|
<adf-cloud-task-header #taskHeader fxFlex
|
||||||
|
@@ -67,4 +67,13 @@ export class TaskDetailsCloudDemoComponent {
|
|||||||
onFormSaved() {
|
onFormSaved() {
|
||||||
this.notificationService.openSnackMessage('Task has been saved successfully');
|
this.notificationService.openSnackMessage('Task has been saved successfully');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onError({ message: error }: Error) {
|
||||||
|
let errorMessage;
|
||||||
|
try {
|
||||||
|
errorMessage = JSON.parse(error).message || JSON.parse(error).entry?.message;
|
||||||
|
errorMessage = JSON.parse(errorMessage).message;
|
||||||
|
} catch {}
|
||||||
|
this.notificationService.showError(errorMessage || error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@ import { Component, ContentChildren, ViewChild } from '@angular/core';
|
|||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
import { setupTestBed } from '@alfresco/adf-core';
|
import { setupTestBed } from '@alfresco/adf-core';
|
||||||
import { TaskCloudService } from '../services/task-cloud.service';
|
import { TaskCloudService } from '../services/task-cloud.service';
|
||||||
import { of } from 'rxjs';
|
import { of, throwError } from 'rxjs';
|
||||||
import { ClaimTaskCloudDirective } from './claim-task-cloud.directive';
|
import { ClaimTaskCloudDirective } from './claim-task-cloud.directive';
|
||||||
import { taskClaimCloudMock } from '../task-header/mocks/fake-claim-task.mock';
|
import { taskClaimCloudMock } from '../task-header/mocks/fake-claim-task.mock';
|
||||||
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
||||||
@@ -28,7 +28,7 @@ describe('ClaimTaskCloudDirective', () => {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'adf-cloud-claim-test-component',
|
selector: 'adf-cloud-claim-test-component',
|
||||||
template: '<button adf-cloud-claim-task [taskId]="taskMock" [appName]="appNameMock"></button>'
|
template: '<button adf-cloud-claim-task [taskId]="taskMock" [appName]="appNameMock" (error)="onError($event)"></button>'
|
||||||
})
|
})
|
||||||
class TestComponent {
|
class TestComponent {
|
||||||
|
|
||||||
@@ -37,6 +37,10 @@ describe('ClaimTaskCloudDirective', () => {
|
|||||||
|
|
||||||
@ViewChild(ClaimTaskCloudDirective, { static: false })
|
@ViewChild(ClaimTaskCloudDirective, { static: false })
|
||||||
claimTaskDirective: ClaimTaskCloudDirective;
|
claimTaskDirective: ClaimTaskCloudDirective;
|
||||||
|
|
||||||
|
onError(error: Error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let fixture: ComponentFixture<TestComponent>;
|
let fixture: ComponentFixture<TestComponent>;
|
||||||
@@ -64,6 +68,17 @@ describe('ClaimTaskCloudDirective', () => {
|
|||||||
button.click();
|
button.click();
|
||||||
expect(taskCloudService.claimTask).toHaveBeenCalled();
|
expect(taskCloudService.claimTask).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should emit error on api fail', async () => {
|
||||||
|
const error = { message: 'task key not found' };
|
||||||
|
spyOn(taskCloudService, 'claimTask').and.returnValue(throwError(error));
|
||||||
|
spyOn(fixture.componentInstance, 'onError').and.callThrough();
|
||||||
|
const button = fixture.nativeElement.querySelector('button');
|
||||||
|
button.click();
|
||||||
|
await fixture.whenStable();
|
||||||
|
expect(taskCloudService.claimTask).toHaveBeenCalled();
|
||||||
|
expect(fixture.componentInstance.onError).toHaveBeenCalledWith(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Claim Task Directive validation errors', () => {
|
describe('Claim Task Directive validation errors', () => {
|
||||||
|
@@ -18,7 +18,7 @@ import { Component, ViewChild, ContentChildren } from '@angular/core';
|
|||||||
import { CompleteTaskDirective } from './complete-task.directive';
|
import { CompleteTaskDirective } from './complete-task.directive';
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
import { setupTestBed } from '@alfresco/adf-core';
|
import { setupTestBed } from '@alfresco/adf-core';
|
||||||
import { of } from 'rxjs';
|
import { of, throwError } from 'rxjs';
|
||||||
import { taskCompleteCloudMock } from '../task-header/mocks/fake-complete-task.mock';
|
import { taskCompleteCloudMock } from '../task-header/mocks/fake-complete-task.mock';
|
||||||
import { TaskCloudService } from '../services/task-cloud.service';
|
import { TaskCloudService } from '../services/task-cloud.service';
|
||||||
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
||||||
@@ -28,7 +28,7 @@ describe('CompleteTaskDirective', () => {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'adf-cloud-test-component',
|
selector: 'adf-cloud-test-component',
|
||||||
template: `<button adf-cloud-complete-task [taskId]='taskMock' [appName]='appNameMock' (success)="onCompleteTask($event)"></button>`
|
template: `<button adf-cloud-complete-task [taskId]='taskMock' [appName]='appNameMock' (success)="onCompleteTask($event)" (error)="onError($event)"></button>`
|
||||||
})
|
})
|
||||||
class TestComponent {
|
class TestComponent {
|
||||||
|
|
||||||
@@ -41,6 +41,10 @@ describe('CompleteTaskDirective', () => {
|
|||||||
onCompleteTask(event: any) {
|
onCompleteTask(event: any) {
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onError(error: Error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let fixture: ComponentFixture<TestComponent>;
|
let fixture: ComponentFixture<TestComponent>;
|
||||||
@@ -68,6 +72,17 @@ describe('CompleteTaskDirective', () => {
|
|||||||
button.click();
|
button.click();
|
||||||
expect(taskCloudService.completeTask).toHaveBeenCalled();
|
expect(taskCloudService.completeTask).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should emit error on api fail', async () => {
|
||||||
|
const error = { message: 'process key not found' };
|
||||||
|
spyOn(taskCloudService, 'completeTask').and.returnValue(throwError(error));
|
||||||
|
spyOn(fixture.componentInstance, 'onError').and.callThrough();
|
||||||
|
const button = fixture.nativeElement.querySelector('button');
|
||||||
|
button.click();
|
||||||
|
await fixture.whenStable();
|
||||||
|
expect(taskCloudService.completeTask).toHaveBeenCalled();
|
||||||
|
expect(fixture.componentInstance.onError).toHaveBeenCalledWith(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Complete Task Directive validation errors', () => {
|
describe('Complete Task Directive validation errors', () => {
|
||||||
|
@@ -18,7 +18,7 @@ import { Component, ContentChildren, ViewChild } from '@angular/core';
|
|||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
import { setupTestBed } from '@alfresco/adf-core';
|
import { setupTestBed } from '@alfresco/adf-core';
|
||||||
import { TaskCloudService } from '../services/task-cloud.service';
|
import { TaskCloudService } from '../services/task-cloud.service';
|
||||||
import { of } from 'rxjs';
|
import { of, throwError } from 'rxjs';
|
||||||
import { UnClaimTaskCloudDirective } from './unclaim-task-cloud.directive';
|
import { UnClaimTaskCloudDirective } from './unclaim-task-cloud.directive';
|
||||||
import { taskClaimCloudMock } from '../task-header/mocks/fake-claim-task.mock';
|
import { taskClaimCloudMock } from '../task-header/mocks/fake-claim-task.mock';
|
||||||
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
|
||||||
@@ -28,7 +28,7 @@ describe('UnClaimTaskCloudDirective', () => {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'adf-cloud-test-component',
|
selector: 'adf-cloud-test-component',
|
||||||
template: '<button adf-cloud-unclaim-task [taskId]="taskIdMock" [appName]="appName"></button>'
|
template: '<button adf-cloud-unclaim-task [taskId]="taskIdMock" [appName]="appName" (error)="onError($event)"></button>'
|
||||||
})
|
})
|
||||||
class TestComponent {
|
class TestComponent {
|
||||||
|
|
||||||
@@ -37,6 +37,10 @@ describe('UnClaimTaskCloudDirective', () => {
|
|||||||
|
|
||||||
@ContentChildren(UnClaimTaskCloudDirective)
|
@ContentChildren(UnClaimTaskCloudDirective)
|
||||||
unclaimTaskDirective: UnClaimTaskCloudDirective;
|
unclaimTaskDirective: UnClaimTaskCloudDirective;
|
||||||
|
|
||||||
|
onError(error: Error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let fixture: ComponentFixture<TestComponent>;
|
let fixture: ComponentFixture<TestComponent>;
|
||||||
@@ -64,6 +68,17 @@ describe('UnClaimTaskCloudDirective', () => {
|
|||||||
button.click();
|
button.click();
|
||||||
expect(taskCloudService.unclaimTask).toHaveBeenCalled();
|
expect(taskCloudService.unclaimTask).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should emit error on api fail', async () => {
|
||||||
|
const error = { message: 'task key not found' };
|
||||||
|
spyOn(taskCloudService, 'unclaimTask').and.returnValue(throwError(error));
|
||||||
|
spyOn(fixture.componentInstance, 'onError').and.callThrough();
|
||||||
|
const button = fixture.nativeElement.querySelector('button');
|
||||||
|
button.click();
|
||||||
|
await fixture.whenStable();
|
||||||
|
expect(taskCloudService.unclaimTask).toHaveBeenCalled();
|
||||||
|
expect(fixture.componentInstance.onError).toHaveBeenCalledWith(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('UnClaim Task Directive validation errors', () => {
|
describe('UnClaim Task Directive validation errors', () => {
|
||||||
|
@@ -72,16 +72,10 @@ export class UnClaimTaskCloudDirective implements OnInit {
|
|||||||
@HostListener('click')
|
@HostListener('click')
|
||||||
async onClick() {
|
async onClick() {
|
||||||
try {
|
try {
|
||||||
await this.unclaimTask();
|
await this.taskListService.unclaimTask(this.appName, this.taskId).toPromise();
|
||||||
|
this.success.emit(this.taskId);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.error.emit(error);
|
this.error.emit(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async unclaimTask() {
|
|
||||||
await this.taskListService.unclaimTask(this.appName, this.taskId).subscribe(
|
|
||||||
() => {
|
|
||||||
this.success.emit(this.taskId);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
(formSaved)="onFormSaved($event)"
|
(formSaved)="onFormSaved($event)"
|
||||||
(formCompleted)="onFormCompleted($event)"
|
(formCompleted)="onFormCompleted($event)"
|
||||||
(formError)="onError($event)"
|
(formError)="onError($event)"
|
||||||
|
(error)="onError($event)"
|
||||||
(formContentClicked)="onFormContentClicked($event)">
|
(formContentClicked)="onFormContentClicked($event)">
|
||||||
<adf-cloud-form-custom-outcomes>
|
<adf-cloud-form-custom-outcomes>
|
||||||
<ng-template [ngTemplateOutlet]="taskFormCloudButtons">
|
<ng-template [ngTemplateOutlet]="taskFormCloudButtons">
|
||||||
@@ -42,7 +43,7 @@
|
|||||||
<ng-template [ngTemplateOutlet]="taskFormCloudButtons">
|
<ng-template [ngTemplateOutlet]="taskFormCloudButtons">
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<button mat-button *ngIf="canCompleteTask()" adf-cloud-complete-task [appName]="appName"
|
<button mat-button *ngIf="canCompleteTask()" adf-cloud-complete-task [appName]="appName"
|
||||||
[taskId]="taskId" (success)="onCompleteTask()" color="primary" id="adf-form-complete">
|
[taskId]="taskId" (success)="onCompleteTask()" (error)="onError($event)" color="primary" id="adf-form-complete">
|
||||||
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.COMPLETE' | translate}}
|
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.COMPLETE' | translate}}
|
||||||
</button>
|
</button>
|
||||||
</mat-card-actions>
|
</mat-card-actions>
|
||||||
@@ -53,11 +54,11 @@
|
|||||||
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.CANCEL' | translate}}
|
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.CANCEL' | translate}}
|
||||||
</button>
|
</button>
|
||||||
<button mat-button *ngIf="canClaimTask()" adf-cloud-claim-task [appName]="appName" [taskId]="taskId"
|
<button mat-button *ngIf="canClaimTask()" adf-cloud-claim-task [appName]="appName" [taskId]="taskId"
|
||||||
(success)="onClaimTask()">
|
(success)="onClaimTask()" (error)="onError($event)">
|
||||||
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.CLAIM' | translate}}
|
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.CLAIM' | translate}}
|
||||||
</button>
|
</button>
|
||||||
<button mat-button *ngIf="hasCandidateUsersOrGroups()" adf-cloud-unclaim-task [appName]="appName" [taskId]="taskId"
|
<button mat-button *ngIf="hasCandidateUsersOrGroups()" adf-cloud-unclaim-task [appName]="appName" [taskId]="taskId"
|
||||||
(success)="onUnclaimTask()">
|
(success)="onUnclaimTask()" (error)="onError($event)">
|
||||||
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.UNCLAIM' | translate}}
|
{{'ADF_CLOUD_TASK_FORM.EMPTY_FORM.BUTTONS.UNCLAIM' | translate}}
|
||||||
</button>
|
</button>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
Reference in New Issue
Block a user