99053: Added DeclinedTask search result banner

This commit is contained in:
Alexandre Vryghem
2023-02-06 19:01:45 +01:00
parent 34e970827e
commit 615c74288e
13 changed files with 228 additions and 5 deletions

View File

@@ -16,6 +16,7 @@ import { WorkflowItemSearchResultListElementComponent } from '../shared/object-l
import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component'; import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component';
import { ClaimedApprovedSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component'; import { ClaimedApprovedSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component';
import { ClaimedDeclinedSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component'; import { ClaimedDeclinedSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component';
import { ClaimedDeclinedTaskSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-task-search-result/claimed-declined-task-search-result-list-element.component';
const ENTRY_COMPONENTS = [ const ENTRY_COMPONENTS = [
// put only entry components that use custom decorator // put only entry components that use custom decorator
@@ -24,6 +25,7 @@ const ENTRY_COMPONENTS = [
ClaimedSearchResultListElementComponent, ClaimedSearchResultListElementComponent,
ClaimedApprovedSearchResultListElementComponent, ClaimedApprovedSearchResultListElementComponent,
ClaimedDeclinedSearchResultListElementComponent, ClaimedDeclinedSearchResultListElementComponent,
ClaimedDeclinedTaskSearchResultListElementComponent,
PoolSearchResultListElementComponent, PoolSearchResultListElementComponent,
ItemSearchResultDetailElementComponent, ItemSearchResultDetailElementComponent,
WorkspaceItemSearchResultDetailElementComponent, WorkspaceItemSearchResultDetailElementComponent,

View File

@@ -6,6 +6,12 @@ import { NotificationsService } from '../../../notifications/notifications.servi
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { SearchService } from '../../../../core/shared/search/search.service'; import { SearchService } from '../../../../core/shared/search/search.service';
import { RequestService } from '../../../../core/data/request.service'; import { RequestService } from '../../../../core/data/request.service';
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
import {
ClaimedDeclinedTaskTaskSearchResult
} from '../../../object-collection/shared/claimed-declined-task-task-search-result.model';
import { Observable, of as observableOf } from 'rxjs';
import { RemoteData } from 'src/app/core/data/remote-data';
export const WORKFLOW_TASK_OPTION_DECLINE_TASK = 'submit_decline_task'; export const WORKFLOW_TASK_OPTION_DECLINE_TASK = 'submit_decline_task';
@@ -31,4 +37,14 @@ export class ClaimedTaskActionsDeclineTaskComponent extends ClaimedTaskActionsAb
super(injector, router, notificationsService, translate, searchService, requestService); super(injector, router, notificationsService, translate, searchService, requestService);
} }
reloadObjectExecution(): Observable<RemoteData<DSpaceObject> | DSpaceObject> {
return observableOf(this.object);
}
convertReloadedObject(dso: DSpaceObject): DSpaceObject {
return Object.assign(new ClaimedDeclinedTaskTaskSearchResult(), dso, {
indexableObject: dso
});
}
} }

View File

@@ -2,7 +2,7 @@ import { ClaimedTask } from '../../../core/tasks/models/claimed-task-object.mode
import { SearchResult } from '../../search/models/search-result.model'; import { SearchResult } from '../../search/models/search-result.model';
/** /**
* Represents a search result object of a Declined ClaimedTask object * Represents a search result object of a Declined/Rejected ClaimedTask object (sent back to the submitter)
*/ */
export class ClaimedDeclinedTaskSearchResult extends SearchResult<ClaimedTask> { export class ClaimedDeclinedTaskSearchResult extends SearchResult<ClaimedTask> {
} }

View File

@@ -0,0 +1,8 @@
import { ClaimedTask } from '../../../core/tasks/models/claimed-task-object.model';
import { SearchResult } from '../../search/models/search-result.model';
/**
* Represents a search result object of a Declined ClaimedTask object (sent back to the Review Managers)
*/
export class ClaimedDeclinedTaskTaskSearchResult extends SearchResult<ClaimedTask> {
}

View File

@@ -6,4 +6,5 @@ export enum MyDspaceItemStatusType {
ARCHIVED = 'mydspace.status.archived', ARCHIVED = 'mydspace.status.archived',
DECLINED = 'mydspace.status.declined', DECLINED = 'mydspace.status.declined',
APPROVED = 'mydspace.status.approved', APPROVED = 'mydspace.status.approved',
DECLINED_TASk = 'mydspace.status.declined-task',
} }

View File

@@ -1,6 +1,6 @@
<ng-container *ngVar="(workflowitemRD$ | async)?.payload as workflowitem"> <ng-container *ngVar="(workflowitemRD$ | async)?.payload as workflowitem">
<div class="alert alert-success w-100" role="alert"> <div class="alert alert-success w-100" role="alert">
<h4 class="alert-heading">Approved</h4> <h4 class="alert-heading mb-0">{{ 'claimed-approved-search-result-list-element.title' | translate }}</h4>
<ds-item-list-preview *ngIf="workflowitem" <ds-item-list-preview *ngIf="workflowitem"
[item]="(workflowitem?.item | async)?.payload" [item]="(workflowitem?.item | async)?.payload"
[object]="object" [object]="object"

View File

@@ -17,6 +17,7 @@ import { ClaimedApprovedTaskSearchResult } from '../../../../object-collection/s
import { ClaimedApprovedSearchResultListElementComponent } from './claimed-approved-search-result-list-element.component'; import { ClaimedApprovedSearchResultListElementComponent } from './claimed-approved-search-result-list-element.component';
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock';
import { TranslateModule } from '@ngx-translate/core';
let component: ClaimedApprovedSearchResultListElementComponent; let component: ClaimedApprovedSearchResultListElementComponent;
let fixture: ComponentFixture<ClaimedApprovedSearchResultListElementComponent>; let fixture: ComponentFixture<ClaimedApprovedSearchResultListElementComponent>;
@@ -62,7 +63,10 @@ const linkService = getMockLinkService();
describe('ClaimedApprovedSearchResultListElementComponent', () => { describe('ClaimedApprovedSearchResultListElementComponent', () => {
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NoopAnimationsModule], imports: [
TranslateModule.forRoot(),
NoopAnimationsModule,
],
declarations: [ClaimedApprovedSearchResultListElementComponent, VarDirective], declarations: [ClaimedApprovedSearchResultListElementComponent, VarDirective],
providers: [ providers: [
{ provide: TruncatableService, useValue: {} }, { provide: TruncatableService, useValue: {} },

View File

@@ -1,6 +1,6 @@
<ng-container *ngVar="(workflowitemRD$ | async)?.payload as workflowitem"> <ng-container *ngVar="(workflowitemRD$ | async)?.payload as workflowitem">
<div class="alert alert-secondary w-100" role="alert"> <div class="alert alert-secondary w-100" role="alert">
<h4 class="alert-heading">Declined</h4> <h4 class="alert-heading mb-0">{{ 'claimed-declined-search-result-list-element.title' | translate }}</h4>
<ds-item-list-preview *ngIf="workflowitem" <ds-item-list-preview *ngIf="workflowitem"
[item]="(workflowitem?.item | async)?.payload" [item]="(workflowitem?.item | async)?.payload"
[object]="object" [object]="object"

View File

@@ -17,6 +17,7 @@ import { LinkService } from '../../../../../core/cache/builders/link.service';
import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock';
import { TranslateModule } from '@ngx-translate/core';
let component: ClaimedDeclinedSearchResultListElementComponent; let component: ClaimedDeclinedSearchResultListElementComponent;
let fixture: ComponentFixture<ClaimedDeclinedSearchResultListElementComponent>; let fixture: ComponentFixture<ClaimedDeclinedSearchResultListElementComponent>;
@@ -62,7 +63,10 @@ const linkService = getMockLinkService();
describe('ClaimedDeclinedSearchResultListElementComponent', () => { describe('ClaimedDeclinedSearchResultListElementComponent', () => {
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NoopAnimationsModule], imports: [
TranslateModule.forRoot(),
NoopAnimationsModule,
],
declarations: [ClaimedDeclinedSearchResultListElementComponent, VarDirective], declarations: [ClaimedDeclinedSearchResultListElementComponent, VarDirective],
providers: [ providers: [
{ provide: TruncatableService, useValue: {} }, { provide: TruncatableService, useValue: {} },

View File

@@ -0,0 +1,10 @@
<ng-container *ngVar="(workflowitemRD$ | async)?.payload as workflowitem">
<div class="alert alert-warning w-100" role="alert">
<h4 class="alert-heading mb-0">{{ 'claimed-declined-task-search-result-list-element.title' | translate }}</h4>
<ds-item-list-preview *ngIf="workflowitem"
[item]="(workflowitem?.item | async)?.payload"
[object]="object"
[status]="status"
[showSubmitter]="showSubmitter"></ds-item-list-preview>
</div>
</ng-container>

View File

@@ -0,0 +1,106 @@
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { of as observableOf } from 'rxjs';
import { ClaimedDeclinedTaskSearchResultListElementComponent } from './claimed-declined-task-search-result-list-element.component';
import { ClaimedDeclinedTaskTaskSearchResult } from '../../../../object-collection/shared/claimed-declined-task-task-search-result.model';
import { Item } from '../../../../../core/shared/item.model';
import { createSuccessfulRemoteDataObject } from '../../../../remote-data.utils';
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
import { ClaimedTask } from '../../../../../core/tasks/models/claimed-task-object.model';
import { getMockLinkService } from '../../../../mocks/link-service.mock';
import { VarDirective } from '../../../../utils/var.directive';
import { TruncatableService } from '../../../../truncatable/truncatable.service';
import { LinkService } from '../../../../../core/cache/builders/link.service';
import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock';
import { TranslateModule } from '@ngx-translate/core';
let component: ClaimedDeclinedTaskSearchResultListElementComponent;
let fixture: ComponentFixture<ClaimedDeclinedTaskSearchResultListElementComponent>;
const mockResultObject: ClaimedDeclinedTaskTaskSearchResult = new ClaimedDeclinedTaskTaskSearchResult();
mockResultObject.hitHighlights = {};
const item = Object.assign(new Item(), {
bundles: observableOf({}),
metadata: {
'dc.title': [
{
language: 'en_US',
value: 'This is just another title'
}
],
'dc.type': [
{
language: null,
value: 'Article'
}
],
'dc.contributor.author': [
{
language: 'en_US',
value: 'Smith, Donald'
}
],
'dc.date.issued': [
{
language: null,
value: '2015-06-26'
}
]
}
});
const rdItem = createSuccessfulRemoteDataObject(item);
const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdItem) });
const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) });
const linkService = getMockLinkService();
describe('ClaimedDeclinedTaskSearchResultListElementComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
TranslateModule.forRoot(),
],
declarations: [ClaimedDeclinedTaskSearchResultListElementComponent, VarDirective],
providers: [
{ provide: TruncatableService, useValue: {} },
{ provide: LinkService, useValue: linkService },
{ provide: DSONameService, useClass: DSONameServiceMock }
],
schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(ClaimedDeclinedTaskSearchResultListElementComponent, {
set: { changeDetection: ChangeDetectionStrategy.Default }
}).compileComponents();
}));
beforeEach(waitForAsync(() => {
fixture = TestBed.createComponent(ClaimedDeclinedTaskSearchResultListElementComponent);
component = fixture.componentInstance;
}));
beforeEach(() => {
component.dso = mockResultObject.indexableObject;
fixture.detectChanges();
});
it('should init workflowitem properly', (done) => {
component.workflowitemRD$.subscribe((workflowitemRD) => {
expect(linkService.resolveLinks).toHaveBeenCalledWith(
component.dso,
jasmine.objectContaining({ name: 'workflowitem' }),
jasmine.objectContaining({ name: 'action' })
);
expect(workflowitemRD.payload).toEqual(workflowitem);
done();
});
});
it('should have properly status', () => {
expect(component.status).toEqual(MyDspaceItemStatusType.DECLINED_TASk);
});
});

View File

@@ -0,0 +1,66 @@
import { Component } from '@angular/core';
import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator';
import { ClaimedDeclinedTaskTaskSearchResult } from 'src/app/shared/object-collection/shared/claimed-declined-task-task-search-result.model';
import { ViewMode } from '../../../../../core/shared/view-mode.model';
import { LinkService } from '../../../../../core/cache/builders/link.service';
import { TruncatableService } from '../../../../truncatable/truncatable.service';
import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { Observable } from 'rxjs';
import { RemoteData } from '../../../../../core/data/remote-data';
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
import { followLink } from '../../../../utils/follow-link-config.model';
import { SearchResultListElementComponent } from '../../../search-result-list-element/search-result-list-element.component';
import { ClaimedTaskSearchResult } from '../../../../object-collection/shared/claimed-task-search-result.model';
import { ClaimedTask } from '../../../../../core/tasks/models/claimed-task-object.model';
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
/**
* This component renders claimed task declined task object for the search result in the list view.
*/
@Component({
selector: 'ds-claimed-declined-task-search-result-list-element',
styleUrls: ['../../../search-result-list-element/search-result-list-element.component.scss'],
templateUrl: './claimed-declined-task-search-result-list-element.component.html'
})
@listableObjectComponent(ClaimedDeclinedTaskTaskSearchResult, ViewMode.ListElement)
export class ClaimedDeclinedTaskSearchResultListElementComponent extends SearchResultListElementComponent<ClaimedTaskSearchResult, ClaimedTask> {
/**
* A boolean representing if to show submitter information
*/
public showSubmitter = true;
/**
* Represent item's status
*/
public status = MyDspaceItemStatusType.DECLINED_TASk;
/**
* The workflowitem object that belonging to the result object
*/
public workflowitemRD$: Observable<RemoteData<WorkflowItem>>;
public constructor(
protected linkService: LinkService,
protected truncatableService: TruncatableService,
protected dsoNameService: DSONameService
) {
super(truncatableService, dsoNameService);
}
/**
* Initialize all instance variables
*/
ngOnInit() {
super.ngOnInit();
this.linkService.resolveLinks(this.dso,
followLink('workflowitem',
{ useCachedVersionIfAvailable: false },
followLink('item'),
followLink('submitter')
),
followLink('action'));
this.workflowitemRD$ = this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>;
}
}

View File

@@ -792,6 +792,12 @@
"chips.remove": "Remove chip", "chips.remove": "Remove chip",
"claimed-approved-search-result-list-element.title": "Approved",
"claimed-declined-search-result-list-element.title": "Rejected, sent back to submitter",
"claimed-declined-task-search-result-list-element.title": "Declined, sent back to Review Manager's workflow",
"collection.create.head": "Create a Collection", "collection.create.head": "Create a Collection",