diff --git a/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.html b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.html new file mode 100644 index 0000000000..38ed36c0f1 --- /dev/null +++ b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.html @@ -0,0 +1,12 @@ + diff --git a/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.scss b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.spec.ts b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.spec.ts new file mode 100644 index 0000000000..ef132ff522 --- /dev/null +++ b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.spec.ts @@ -0,0 +1,90 @@ +import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../../mocks/translate-loader.mock'; +import { ClaimedTaskDataService } from '../../../../core/tasks/claimed-task-data.service'; +import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; +import { getMockSearchService } from '../../../mocks/search-service.mock'; +import { getMockRequestService } from '../../../mocks/request.service.mock'; +import { PoolTaskDataService } from '../../../../core/tasks/pool-task-data.service'; +import { NotificationsService } from '../../../notifications/notifications.service'; +import { NotificationsServiceStub } from '../../../testing/notifications-service.stub'; +import { Router } from '@angular/router'; +import { RouterStub } from '../../../testing/router.stub'; +import { SearchService } from '../../../../core/shared/search/search.service'; +import { RequestService } from '../../../../core/data/request.service'; +import { ClaimedTaskActionsDeclineTaskComponent } from './claimed-task-actions-decline-task.component'; +import { ClaimedTaskDataServiceStub } from '../../../testing/claimed-task-data-service.stub'; + +let component: ClaimedTaskActionsDeclineTaskComponent; +let fixture: ComponentFixture; + +const searchService = getMockSearchService(); + +const requestService = getMockRequestService(); + +let mockPoolTaskDataService: PoolTaskDataService; + +describe('ClaimedTaskActionsDeclineTaskComponent', () => { + const object = Object.assign(new ClaimedTask(), { id: 'claimed-task-1' }); + + let claimedTaskService: ClaimedTaskDataServiceStub; + + beforeEach(waitForAsync(() => { + claimedTaskService = new ClaimedTaskDataServiceStub(); + + mockPoolTaskDataService = new PoolTaskDataService(null, null, null, null, null, null, null, null); + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) + ], + providers: [ + { provide: ClaimedTaskDataService, useValue: claimedTaskService }, + { provide: Injector, useValue: {} }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: Router, useValue: new RouterStub() }, + { provide: SearchService, useValue: searchService }, + { provide: RequestService, useValue: requestService }, + { provide: PoolTaskDataService, useValue: mockPoolTaskDataService }, + ], + declarations: [ClaimedTaskActionsDeclineTaskComponent], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ClaimedTaskActionsDeclineTaskComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClaimedTaskActionsDeclineTaskComponent); + component = fixture.componentInstance; + component.object = object; + spyOn(component, 'initReloadAnchor').and.returnValue(undefined); + fixture.detectChanges(); + }); + + afterEach(() => { + fixture.debugElement.nativeElement.remove(); + }); + + it('should display decline button', () => { + const btn = fixture.debugElement.query(By.css('.declineTaskAction')); + + expect(btn).not.toBeNull(); + }); + + it('should display spin icon when decline is pending', () => { + component.processing$.next(true); + fixture.detectChanges(); + + const span = fixture.debugElement.query(By.css('.declineTaskAction .fa-spin')); + + expect(span).not.toBeNull(); + }); + +}); diff --git a/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.ts b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.ts new file mode 100644 index 0000000000..ab867d62d6 --- /dev/null +++ b/src/app/shared/mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component.ts @@ -0,0 +1,34 @@ +import { Component, Injector } from '@angular/core'; +import { ClaimedTaskActionsAbstractComponent } from '../abstract/claimed-task-actions-abstract.component'; +import { rendersWorkflowTaskOption } from '../switcher/claimed-task-actions-decorator'; +import { Router } from '@angular/router'; +import { NotificationsService } from '../../../notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; +import { SearchService } from '../../../../core/shared/search/search.service'; +import { RequestService } from '../../../../core/data/request.service'; + +export const WORKFLOW_TASK_OPTION_DECLINE_TASK = 'submit_decline_task'; + +@rendersWorkflowTaskOption(WORKFLOW_TASK_OPTION_DECLINE_TASK) +@Component({ + selector: 'ds-claimed-task-actions-decline-task', + templateUrl: './claimed-task-actions-decline-task.component.html', + styleUrls: ['./claimed-task-actions-decline-task.component.scss'] +}) +/** + * Component for displaying and processing the decline task action on a workflow task item + */ +export class ClaimedTaskActionsDeclineTaskComponent extends ClaimedTaskActionsAbstractComponent { + + option = WORKFLOW_TASK_OPTION_DECLINE_TASK; + + constructor(protected injector: Injector, + protected router: Router, + protected notificationsService: NotificationsService, + protected translate: TranslateService, + protected searchService: SearchService, + protected requestService: RequestService) { + super(injector, router, notificationsService, translate, searchService, requestService); + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 9a859dff9b..1cc0a86115 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -181,6 +181,7 @@ import { AdvancedClaimedTaskActionSelectReviewerComponent } from './mydspace-act import { AdvancedClaimedTaskActionRatingReviewerComponent } from './mydspace-actions/claimed-task/rating-reviewer/advanced-claimed-task-action-rating-reviewer.component'; +import { ClaimedTaskActionsDeclineTaskComponent } from './mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -265,6 +266,7 @@ const COMPONENTS = [ ClaimedTaskActionsRejectComponent, ClaimedTaskActionsReturnToPoolComponent, ClaimedTaskActionsEditMetadataComponent, + ClaimedTaskActionsDeclineTaskComponent, ClaimedTaskActionsLoaderComponent, ItemActionsComponent, PoolTaskActionsComponent, @@ -389,6 +391,7 @@ const ENTRY_COMPONENTS = [ LogInOidcComponent, BundleListElementComponent, ClaimedTaskActionsApproveComponent, + ClaimedTaskActionsDeclineTaskComponent, ClaimedTaskActionsRejectComponent, ClaimedTaskActionsReturnToPoolComponent, ClaimedTaskActionsEditMetadataComponent, diff --git a/src/app/shared/testing/claimed-task-data-service.stub.ts b/src/app/shared/testing/claimed-task-data-service.stub.ts index ef04e3bf27..3a9f3d852d 100644 --- a/src/app/shared/testing/claimed-task-data-service.stub.ts +++ b/src/app/shared/testing/claimed-task-data-service.stub.ts @@ -1,5 +1,7 @@ import { Observable, EMPTY } from 'rxjs'; import { ProcessTaskResponse } from '../../core/tasks/models/process-task-response'; +import { ClaimedTask } from '../../core/tasks/models/claimed-task-object.model'; +import { RemoteData } from '../../core/data/remote-data'; export class ClaimedTaskDataServiceStub { @@ -7,4 +9,8 @@ export class ClaimedTaskDataServiceStub { return EMPTY; } + public findByItem(_uuid: string): Observable> { + return EMPTY; + } + } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 9d455fb422..6addb5a81b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4069,6 +4069,10 @@ "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + "submission.workflow.tasks.claimed.decline": "Decline", + + "submission.workflow.tasks.claimed.decline_help": "", + "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject",