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",