mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
[CST-7755] Complete refactoring
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
<div class="space-children-mr">
|
||||||
|
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 delete-link" [routerLink]="[getDeleteRoute()]" [title]="'admin.workflow.item.delete' | translate">
|
||||||
|
<i class="fa fa-trash"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.workflow.item.delete" | translate}}</span>
|
||||||
|
</a>
|
||||||
|
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 send-back-link" [routerLink]="[getSendBackRoute()]" [title]="'admin.workflow.item.send-back' | translate">
|
||||||
|
<i class="fa fa-hand-point-left"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.workflow.item.send-back" | translate}}</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
@@ -4,17 +4,17 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
|
|||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
|
import { URLCombiner } from '../../../../../core/url-combiner/url-combiner';
|
||||||
import { WorkflowItemAdminWorkflowActionsComponent } from './workflow-item-admin-workflow-actions.component';
|
import { WorkflowItemAdminWorkflowActionsComponent } from './workflow-item-admin-workflow-actions.component';
|
||||||
import { WorkflowItem } from '../../../core/submission/models/workflowitem.model';
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
import {
|
import {
|
||||||
getWorkflowItemDeleteRoute,
|
getWorkflowItemDeleteRoute,
|
||||||
getWorkflowItemSendBackRoute
|
getWorkflowItemSendBackRoute
|
||||||
} from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
} from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
import { Item } from 'src/app/core/shared/item.model';
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
import { RemoteData } from 'src/app/core/data/remote-data';
|
import { RemoteData } from '../../../../../core/data/remote-data';
|
||||||
import { RequestEntryState } from 'src/app/core/data/request-entry-state.model';
|
import { RequestEntryState } from '../../../../../core/data/request-entry-state.model';
|
||||||
|
|
||||||
describe('WorkflowItemAdminWorkflowActionsComponent', () => {
|
describe('WorkflowItemAdminWorkflowActionsComponent', () => {
|
||||||
let component: WorkflowItemAdminWorkflowActionsComponent;
|
let component: WorkflowItemAdminWorkflowActionsComponent;
|
||||||
@@ -68,10 +68,4 @@ describe('WorkflowItemAdminWorkflowActionsComponent', () => {
|
|||||||
expect(link).toContain(new URLCombiner(getWorkflowItemSendBackRoute(wfi.id)).toString());
|
expect(link).toContain(new URLCombiner(getWorkflowItemSendBackRoute(wfi.id)).toString());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render a policies button with the correct link', () => {
|
|
||||||
const a = fixture.debugElement.query(By.css('a.policies-link'));
|
|
||||||
const link = a.nativeElement.href;
|
|
||||||
expect(link).toContain(new URLCombiner('/items/itemUUID1111/edit/bitstreams').toString());
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
@@ -0,0 +1,43 @@
|
|||||||
|
import { Component, Input } from '@angular/core';
|
||||||
|
|
||||||
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
|
import {
|
||||||
|
getWorkflowItemDeleteRoute,
|
||||||
|
getWorkflowItemSendBackRoute
|
||||||
|
} from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'ds-workflow-item-admin-workflow-actions-element',
|
||||||
|
styleUrls: ['./workflow-item-admin-workflow-actions.component.scss'],
|
||||||
|
templateUrl: './workflow-item-admin-workflow-actions.component.html'
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* The component for displaying the actions for a list element for a workflow-item on the admin workflow search page
|
||||||
|
*/
|
||||||
|
export class WorkflowItemAdminWorkflowActionsComponent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The workflow item to perform the actions on
|
||||||
|
*/
|
||||||
|
@Input() public wfi: WorkflowItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use small buttons or not
|
||||||
|
*/
|
||||||
|
@Input() public small: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the path to the delete page of this workflow item
|
||||||
|
*/
|
||||||
|
getDeleteRoute(): string {
|
||||||
|
return getWorkflowItemDeleteRoute(this.wfi.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the path to the send back page of this workflow item
|
||||||
|
*/
|
||||||
|
getSendBackRoute(): string {
|
||||||
|
return getWorkflowItemSendBackRoute(this.wfi.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -11,7 +11,6 @@
|
|||||||
<select name="supervisionOrder" id="supervisionOrder" class="form-control"
|
<select name="supervisionOrder" id="supervisionOrder" class="form-control"
|
||||||
[(ngModel)]="selectedOrderType"
|
[(ngModel)]="selectedOrderType"
|
||||||
attr.aria-label="{{'supervision-group-selector.select.type-of-order.label' | translate}}">
|
attr.aria-label="{{'supervision-group-selector.select.type-of-order.label' | translate}}">
|
||||||
<option value="NONE">{{'supervision-group-selector.select.type-of-order.option.none' | translate}}</option>
|
|
||||||
<option value="EDITOR">{{'supervision-group-selector.select.type-of-order.option.editor' | translate}}</option>
|
<option value="EDITOR">{{'supervision-group-selector.select.type-of-order.option.editor' | translate}}</option>
|
||||||
<option value="OBSERVER">{{'supervision-group-selector.select.type-of-order.option.observer' | translate}}</option>
|
<option value="OBSERVER">{{'supervision-group-selector.select.type-of-order.option.observer' | translate}}</option>
|
||||||
</select>
|
</select>
|
@@ -2,16 +2,16 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
|||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
|
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { SupervisionGroupSelectorComponent } from './supervision-group-selector.component';
|
import { SupervisionOrderGroupSelectorComponent } from './supervision-order-group-selector.component';
|
||||||
import { SupervisionOrderDataService } from '../../../../core/supervision-order/supervision-order-data.service';
|
import { SupervisionOrderDataService } from '../../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../../../../../shared/notifications/notifications.service';
|
||||||
import { Group } from '../../../../core/eperson/models/group.model';
|
import { Group } from '../../../../../../core/eperson/models/group.model';
|
||||||
import { SupervisionOrder } from '../../../../core/supervision-order/models/supervision-order.model';
|
import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
|
|
||||||
describe('SupervisionGroupSelectorComponent', () => {
|
describe('SupervisionOrderGroupSelectorComponent', () => {
|
||||||
let component: SupervisionGroupSelectorComponent;
|
let component: SupervisionOrderGroupSelectorComponent;
|
||||||
let fixture: ComponentFixture<SupervisionGroupSelectorComponent>;
|
let fixture: ComponentFixture<SupervisionOrderGroupSelectorComponent>;
|
||||||
let debugElement: DebugElement;
|
let debugElement: DebugElement;
|
||||||
|
|
||||||
const modalStub = jasmine.createSpyObj('modalStub', ['close']);
|
const modalStub = jasmine.createSpyObj('modalStub', ['close']);
|
||||||
@@ -32,7 +32,7 @@ describe('SupervisionGroupSelectorComponent', () => {
|
|||||||
beforeEach(waitForAsync(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [TranslateModule.forRoot()],
|
imports: [TranslateModule.forRoot()],
|
||||||
declarations: [SupervisionGroupSelectorComponent],
|
declarations: [SupervisionOrderGroupSelectorComponent],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: NgbActiveModal, useValue: modalStub },
|
{ provide: NgbActiveModal, useValue: modalStub },
|
||||||
{ provide: SupervisionOrderDataService, useValue: supervisionOrderDataService },
|
{ provide: SupervisionOrderDataService, useValue: supervisionOrderDataService },
|
||||||
@@ -44,7 +44,7 @@ describe('SupervisionGroupSelectorComponent', () => {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(waitForAsync(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
fixture = TestBed.createComponent(SupervisionGroupSelectorComponent);
|
fixture = TestBed.createComponent(SupervisionOrderGroupSelectorComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
|
|
||||||
}));
|
}));
|
@@ -1,13 +1,13 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component, EventEmitter, Output } from '@angular/core';
|
||||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators';
|
import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators';
|
||||||
import { NotificationsService } from 'src/app/shared/notifications/notifications.service';
|
import { NotificationsService } from 'src/app/shared/notifications/notifications.service';
|
||||||
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
|
import { DSONameService } from '../../../../../../core/breadcrumbs/dso-name.service';
|
||||||
import { Group } from '../../../../core/eperson/models/group.model';
|
import { Group } from '../../../../../../core/eperson/models/group.model';
|
||||||
import { SupervisionOrder } from '../../../../core/supervision-order/models/supervision-order.model';
|
import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
import { SupervisionOrderDataService } from '../../../../core/supervision-order/supervision-order-data.service';
|
import { SupervisionOrderDataService } from '../../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
import { followLink } from '../../../../shared/utils/follow-link-config.model';
|
import { RemoteData } from '../../../../../../core/data/remote-data';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to wrap a dropdown - for type of order -
|
* Component to wrap a dropdown - for type of order -
|
||||||
@@ -18,10 +18,10 @@ import { followLink } from '../../../../shared/utils/follow-link-config.model';
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-supervision-group-selector',
|
selector: 'ds-supervision-group-selector',
|
||||||
styleUrls: ['./supervision-group-selector.component.scss'],
|
styleUrls: ['./supervision-order-group-selector.component.scss'],
|
||||||
templateUrl: './supervision-group-selector.component.html',
|
templateUrl: './supervision-order-group-selector.component.html',
|
||||||
})
|
})
|
||||||
export class SupervisionGroupSelectorComponent {
|
export class SupervisionOrderGroupSelectorComponent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The item to perform the actions on
|
* The item to perform the actions on
|
||||||
@@ -43,6 +43,11 @@ export class SupervisionGroupSelectorComponent {
|
|||||||
*/
|
*/
|
||||||
isSubmitted = false;
|
isSubmitted = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event emitted when a new SupervisionOrder has been created
|
||||||
|
*/
|
||||||
|
@Output() create: EventEmitter<SupervisionOrder> = new EventEmitter<SupervisionOrder>();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public dsoNameService: DSONameService,
|
public dsoNameService: DSONameService,
|
||||||
private activeModal: NgbActiveModal,
|
private activeModal: NgbActiveModal,
|
||||||
@@ -75,10 +80,10 @@ export class SupervisionGroupSelectorComponent {
|
|||||||
supervisionDataObject.ordertype = this.selectedOrderType;
|
supervisionDataObject.ordertype = this.selectedOrderType;
|
||||||
this.supervisionOrderDataService.create(supervisionDataObject, this.itemUUID, this.selectedGroup.uuid, this.selectedOrderType).pipe(
|
this.supervisionOrderDataService.create(supervisionDataObject, this.itemUUID, this.selectedGroup.uuid, this.selectedOrderType).pipe(
|
||||||
getFirstCompletedRemoteData(),
|
getFirstCompletedRemoteData(),
|
||||||
).subscribe(rd => {
|
).subscribe((rd: RemoteData<SupervisionOrder>) => {
|
||||||
if (rd.state === 'Success') {
|
if (rd.state === 'Success') {
|
||||||
this.supervisionOrderDataService.searchByItem(this.itemUUID, null, null, followLink('group'));
|
|
||||||
this.notificationsService.success(this.translateService.get('supervision-group-selector.notification.create.success.title', { name: this.selectedGroup.name }));
|
this.notificationsService.success(this.translateService.get('supervision-group-selector.notification.create.success.title', { name: this.selectedGroup.name }));
|
||||||
|
this.create.emit(rd.payload);
|
||||||
this.close();
|
this.close();
|
||||||
} else {
|
} else {
|
||||||
this.notificationsService.error(
|
this.notificationsService.error(
|
@@ -0,0 +1,15 @@
|
|||||||
|
<ng-container *ngVar="(supervisionOrderEntries$ | async) as supervisionOrders">
|
||||||
|
<div class="item-list-supervision" *ngIf="supervisionOrders?.length > 0">
|
||||||
|
<div>
|
||||||
|
<span>{{'workflow-item.search.result.list.element.supervised-by' | translate}} </span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<a class="badge badge-primary mr-1 mb-1 text-capitalize mw-100 text-truncate" *ngFor="let supervisionOrder of supervisionOrders" data-test="soBadge"
|
||||||
|
[ngbTooltip]="'workflow-item.search.result.list.element.supervised.remove-tooltip' | translate"
|
||||||
|
(click)="$event.preventDefault(); $event.stopImmediatePropagation(); deleteSupervisionOrder(supervisionOrder)" aria-label="Close">
|
||||||
|
{{supervisionOrder.group.name}}
|
||||||
|
<span aria-hidden="true"> ×</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
@@ -0,0 +1,3 @@
|
|||||||
|
.badge {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
@@ -0,0 +1,61 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { NO_ERRORS_SCHEMA, SimpleChange } from '@angular/core';
|
||||||
|
import { By } from '@angular/platform-browser';
|
||||||
|
|
||||||
|
import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
||||||
|
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { SupervisionOrderStatusComponent } from './supervision-order-status.component';
|
||||||
|
import { VarDirective } from '../../../../../../shared/utils/var.directive';
|
||||||
|
import { TranslateLoaderMock } from '../../../../../../shared/mocks/translate-loader.mock';
|
||||||
|
import { supervisionOrderListMock } from '../../../../../../shared/testing/supervision-order.mock';
|
||||||
|
|
||||||
|
describe('SupervisionOrderStatusComponent', () => {
|
||||||
|
let component: SupervisionOrderStatusComponent;
|
||||||
|
let fixture: ComponentFixture<SupervisionOrderStatusComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [
|
||||||
|
NgbTooltipModule,
|
||||||
|
TranslateModule.forRoot({
|
||||||
|
loader: {
|
||||||
|
provide: TranslateLoader,
|
||||||
|
useClass: TranslateLoaderMock
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
declarations: [ SupervisionOrderStatusComponent, VarDirective ],
|
||||||
|
schemas: [
|
||||||
|
NO_ERRORS_SCHEMA
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(SupervisionOrderStatusComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.supervisionOrderList = supervisionOrderListMock;
|
||||||
|
component.ngOnChanges( {
|
||||||
|
supervisionOrderList: new SimpleChange(null, supervisionOrderListMock, true)
|
||||||
|
});
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render badges properly', () => {
|
||||||
|
const badges = fixture.debugElement.queryAll(By.css('[data-test="soBadge"]'));
|
||||||
|
expect(badges.length).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit delete event on click', () => {
|
||||||
|
spyOn(component.delete, 'emit');
|
||||||
|
const badges = fixture.debugElement.queryAll(By.css('[data-test="soBadge"]'));
|
||||||
|
badges[0].nativeElement.click();
|
||||||
|
expect(component.delete.emit).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
@@ -3,11 +3,11 @@ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from
|
|||||||
import { BehaviorSubject, from, Observable } from 'rxjs';
|
import { BehaviorSubject, from, Observable } from 'rxjs';
|
||||||
import { map, mergeMap, reduce } from 'rxjs/operators';
|
import { map, mergeMap, reduce } from 'rxjs/operators';
|
||||||
|
|
||||||
import { SupervisionOrder } from '../../../core/supervision-order/models/supervision-order.model';
|
import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
import { Group } from '../../../core/eperson/models/group.model';
|
import { Group } from '../../../../../../core/eperson/models/group.model';
|
||||||
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
|
import { getFirstCompletedRemoteData } from '../../../../../../core/shared/operators';
|
||||||
import { isNotEmpty } from '../../empty.util';
|
import { isNotEmpty } from '../../../../../../shared/empty.util';
|
||||||
import { RemoteData } from '../../../core/data/remote-data';
|
import { RemoteData } from '../../../../../../core/data/remote-data';
|
||||||
|
|
||||||
export interface SupervisionOrderListEntry {
|
export interface SupervisionOrderListEntry {
|
||||||
supervisionOrder: SupervisionOrder;
|
supervisionOrder: SupervisionOrder;
|
||||||
@@ -26,11 +26,6 @@ export class SupervisionOrderStatusComponent implements OnChanges {
|
|||||||
*/
|
*/
|
||||||
@Input() supervisionOrderList: SupervisionOrder[] = [];
|
@Input() supervisionOrderList: SupervisionOrder[] = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* The groups the user belongs to
|
|
||||||
*/
|
|
||||||
groups: Group[];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of the supervision orders combined with the group
|
* List of the supervision orders combined with the group
|
||||||
*/
|
*/
|
||||||
@@ -42,10 +37,9 @@ export class SupervisionOrderStatusComponent implements OnChanges {
|
|||||||
if (changes && changes.supervisionOrderList) {
|
if (changes && changes.supervisionOrderList) {
|
||||||
this.getSupervisionOrderEntries(changes.supervisionOrderList.currentValue)
|
this.getSupervisionOrderEntries(changes.supervisionOrderList.currentValue)
|
||||||
.subscribe((supervisionOrderEntries: SupervisionOrderListEntry[]) => {
|
.subscribe((supervisionOrderEntries: SupervisionOrderListEntry[]) => {
|
||||||
this.supervisionOrderEntries$.next(supervisionOrderEntries)
|
this.supervisionOrderEntries$.next(supervisionOrderEntries);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
console.log('ngOnChanges', changes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,12 +65,12 @@ export class SupervisionOrderStatusComponent implements OnChanges {
|
|||||||
)),
|
)),
|
||||||
reduce((acc: SupervisionOrderListEntry[], value: any) => {
|
reduce((acc: SupervisionOrderListEntry[], value: any) => {
|
||||||
if (isNotEmpty(value)) {
|
if (isNotEmpty(value)) {
|
||||||
return [...acc, value]
|
return [...acc, value];
|
||||||
} else {
|
} else {
|
||||||
return acc;
|
return acc;
|
||||||
}
|
}
|
||||||
}, []),
|
}, []),
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
@@ -1,15 +1,16 @@
|
|||||||
|
<div class="my-1">
|
||||||
|
<ds-supervision-order-status [supervisionOrderList]="supervisionOrderList"
|
||||||
|
(delete)="deleteSupervisionOrder($event)"></ds-supervision-order-status>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="space-children-mr">
|
<div class="space-children-mr">
|
||||||
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 delete-link" [routerLink]="[getDeleteRoute()]" [title]="'admin.workflow.item.delete' | translate">
|
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 delete-link" [routerLink]="[getDeleteRoute()]" [title]="'admin.workflow.item.delete' | translate">
|
||||||
<i class="fa fa-trash"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.workflow.item.delete" | translate}}</span>
|
<i class="fa fa-trash"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.workflow.item.delete" | translate}}</span>
|
||||||
</a>
|
</a>
|
||||||
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 send-back-link" [routerLink]="[getSendBackRoute()]" [title]="'admin.workflow.item.send-back' | translate">
|
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 policies-link" [routerLink]="resourcePoliciesPageRoute" [title]="'admin.workflow.item.policies' | translate">
|
||||||
<i class="fa fa-hand-point-left"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{"admin.workflow.item.send-back" | translate}}</span>
|
|
||||||
</a>
|
|
||||||
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 policies-link" [routerLink]="[getPoliciesRoute() | async]" [title]="'admin.workflow.item.policies' | translate">
|
|
||||||
<i class="fas fa-edit"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{'admin.workflow.item.policies' | translate}}</span>
|
<i class="fas fa-edit"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{'admin.workflow.item.policies' | translate}}</span>
|
||||||
</a>
|
</a>
|
||||||
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 supervision-group-selector" [title]="'admin.workflow.item.supervision' | translate"
|
<a [ngClass]="{'btn-sm': small}" class="btn btn-light my-1 supervision-group-selector" [title]="'admin.workflow.item.supervision' | translate" (click)="openSupervisionModal()">
|
||||||
*ngIf="wfi?.type === 'workspaceitem'" (click)="openSupervisionModal()">
|
|
||||||
<i class="fas fa-users-cog"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{'admin.workflow.item.supervision' | translate}}</span>
|
<i class="fas fa-users-cog"></i><span *ngIf="!small" class="d-none d-sm-inline"> {{'admin.workflow.item.supervision' | translate}}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
@@ -0,0 +1 @@
|
|||||||
|
|
@@ -0,0 +1,156 @@
|
|||||||
|
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||||||
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
|
import { By } from '@angular/platform-browser';
|
||||||
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
|
|
||||||
|
import { of } from 'rxjs';
|
||||||
|
import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { URLCombiner } from '../../../../../core/url-combiner/url-combiner';
|
||||||
|
import { WorkspaceItemAdminWorkflowActionsComponent } from './workspace-item-admin-workflow-actions.component';
|
||||||
|
import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model';
|
||||||
|
import {
|
||||||
|
getWorkflowItemDeleteRoute,
|
||||||
|
} from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import { RemoteData } from '../../../../../core/data/remote-data';
|
||||||
|
import { RequestEntryState } from '../../../../../core/data/request-entry-state.model';
|
||||||
|
import { NotificationsServiceStub } from '../../../../../shared/testing/notifications-service.stub';
|
||||||
|
import { NotificationsService } from '../../../../../shared/notifications/notifications.service';
|
||||||
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
|
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
import { ConfirmationModalComponent } from '../../../../../shared/confirmation-modal/confirmation-modal.component';
|
||||||
|
import { supervisionOrderEntryMock } from '../../../../../shared/testing/supervision-order.mock';
|
||||||
|
import {
|
||||||
|
SupervisionOrderGroupSelectorComponent
|
||||||
|
} from './supervision-order-group-selector/supervision-order-group-selector.component';
|
||||||
|
|
||||||
|
describe('WorkspaceItemAdminWorkflowActionsComponent', () => {
|
||||||
|
let component: WorkspaceItemAdminWorkflowActionsComponent;
|
||||||
|
let fixture: ComponentFixture<WorkspaceItemAdminWorkflowActionsComponent>;
|
||||||
|
let id;
|
||||||
|
let wsi;
|
||||||
|
let item = new Item();
|
||||||
|
item.uuid = 'itemUUID1111';
|
||||||
|
const rd = new RemoteData(undefined, undefined, undefined, RequestEntryState.Success, undefined, item, 200);
|
||||||
|
let supervisionOrderDataService;
|
||||||
|
let notificationService: NotificationsServiceStub;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
notificationService = new NotificationsServiceStub();
|
||||||
|
supervisionOrderDataService = jasmine.createSpyObj('supervisionOrderDataService', {
|
||||||
|
searchByItem: jasmine.createSpy('searchByItem'),
|
||||||
|
delete: jasmine.createSpy('delete'),
|
||||||
|
});
|
||||||
|
id = '780b2588-bda5-4112-a1cd-0b15000a5339';
|
||||||
|
wsi = new WorkspaceItem();
|
||||||
|
wsi.id = id;
|
||||||
|
wsi.item = of(rd);
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
init();
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
imports: [
|
||||||
|
NgbModalModule,
|
||||||
|
TranslateModule.forRoot(),
|
||||||
|
RouterTestingModule.withRoutes([])
|
||||||
|
],
|
||||||
|
declarations: [WorkspaceItemAdminWorkflowActionsComponent],
|
||||||
|
providers: [
|
||||||
|
{ provide: DSONameService, useClass: DSONameServiceMock },
|
||||||
|
{ provide: NotificationsService, useValue: notificationService },
|
||||||
|
{ provide: SupervisionOrderDataService, useValue: supervisionOrderDataService }
|
||||||
|
],
|
||||||
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(WorkspaceItemAdminWorkflowActionsComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.wsi = wsi;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a delete button with the correct link', () => {
|
||||||
|
const button = fixture.debugElement.query(By.css('a.delete-link'));
|
||||||
|
const link = button.nativeElement.href;
|
||||||
|
expect(link).toContain(new URLCombiner(getWorkflowItemDeleteRoute(wsi.id)).toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a policies button with the correct link', () => {
|
||||||
|
const a = fixture.debugElement.query(By.css('a.policies-link'));
|
||||||
|
const link = a.nativeElement.href;
|
||||||
|
expect(link).toContain(new URLCombiner('/items/itemUUID1111/edit/authorizations').toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('deleteSupervisionOrder', () => {
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
spyOn(component.delete, 'emit');
|
||||||
|
spyOn((component as any).modalService, 'open').and.returnValue({
|
||||||
|
componentInstance: { response: of(true) }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when delete succeeded', () => {
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
supervisionOrderDataService.delete.and.returnValue(of(true));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should notify success', () => {
|
||||||
|
component.deleteSupervisionOrder(supervisionOrderEntryMock);
|
||||||
|
expect((component as any).modalService.open).toHaveBeenCalledWith(ConfirmationModalComponent);
|
||||||
|
expect(notificationService.success).toHaveBeenCalled();
|
||||||
|
expect(component.delete.emit).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when delete failed', () => {
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
supervisionOrderDataService.delete.and.returnValue(of(false));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should notify success', () => {
|
||||||
|
component.deleteSupervisionOrder(supervisionOrderEntryMock);
|
||||||
|
expect((component as any).modalService.open).toHaveBeenCalledWith(ConfirmationModalComponent);
|
||||||
|
expect(notificationService.error).toHaveBeenCalled();
|
||||||
|
expect(component.delete.emit).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('openSupervisionModal', () => {
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
spyOn(component.create, 'emit');
|
||||||
|
spyOn((component as any).modalService, 'open').and.returnValue({
|
||||||
|
componentInstance: { create: of(true) }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit create event properly', () => {
|
||||||
|
component.openSupervisionModal();
|
||||||
|
expect((component as any).modalService.open).toHaveBeenCalledWith(SupervisionOrderGroupSelectorComponent, {
|
||||||
|
size: 'lg',
|
||||||
|
backdrop: 'static'
|
||||||
|
});
|
||||||
|
expect(component.create.emit).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
@@ -0,0 +1,192 @@
|
|||||||
|
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||||
|
|
||||||
|
import { map, Observable } from 'rxjs';
|
||||||
|
import { switchMap, take, tap } from 'rxjs/operators';
|
||||||
|
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import { getFirstSucceededRemoteDataPayload } from '../../../../../core/shared/operators';
|
||||||
|
import {
|
||||||
|
SupervisionOrderGroupSelectorComponent
|
||||||
|
} from './supervision-order-group-selector/supervision-order-group-selector.component';
|
||||||
|
import {
|
||||||
|
getWorkflowItemDeleteRoute
|
||||||
|
} from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
||||||
|
import { ITEM_EDIT_AUTHORIZATIONS_PATH } from '../../../../../item-page/edit-item-page/edit-item-page.routing-paths';
|
||||||
|
import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model';
|
||||||
|
import { SupervisionOrder } from '../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
|
import { SupervisionOrderListEntry } from './supervision-order-status/supervision-order-status.component';
|
||||||
|
import { ConfirmationModalComponent } from '../../../../../shared/confirmation-modal/confirmation-modal.component';
|
||||||
|
import { hasValue } from '../../../../../shared/empty.util';
|
||||||
|
import { NotificationsService } from '../../../../../shared/notifications/notifications.service';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
|
import { DSpaceObject } from '../../../../../core/shared/dspace-object.model';
|
||||||
|
import { getSearchResultFor } from '../../../../../shared/search/search-result-element-decorator';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'ds-workspace-item-admin-workflow-actions-element',
|
||||||
|
styleUrls: ['./workspace-item-admin-workflow-actions.component.scss'],
|
||||||
|
templateUrl: './workspace-item-admin-workflow-actions.component.html'
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* The component for displaying the actions for a list element for a workspace-item on the admin workflow search page
|
||||||
|
*/
|
||||||
|
export class WorkspaceItemAdminWorkflowActionsComponent implements OnInit {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The workspace item to perform the actions on
|
||||||
|
*/
|
||||||
|
@Input() public wsi: WorkspaceItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use small buttons or not
|
||||||
|
*/
|
||||||
|
@Input() public small: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of supervision order object to show
|
||||||
|
*/
|
||||||
|
@Input() supervisionOrderList: SupervisionOrder[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The item related to the workspace item
|
||||||
|
*/
|
||||||
|
item: Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array containing the route to the resource policies page
|
||||||
|
*/
|
||||||
|
resourcePoliciesPageRoute: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The i18n keys prefix
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private messagePrefix = 'workflow-item.search.result';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event emitted when a new SupervisionOrder has been created
|
||||||
|
*/
|
||||||
|
@Output() create: EventEmitter<DSpaceObject> = new EventEmitter<DSpaceObject>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event emitted when new SupervisionOrder has been deleted
|
||||||
|
*/
|
||||||
|
@Output() delete: EventEmitter<DSpaceObject> = new EventEmitter<DSpaceObject>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event emitted when a new SupervisionOrder has been created
|
||||||
|
*/
|
||||||
|
constructor(
|
||||||
|
protected dsoNameService: DSONameService,
|
||||||
|
protected modalService: NgbModal,
|
||||||
|
protected notificationsService: NotificationsService,
|
||||||
|
protected supervisionOrderDataService: SupervisionOrderDataService,
|
||||||
|
protected translateService: TranslateService,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
const item$: Observable<Item> = this.wsi.item.pipe(
|
||||||
|
getFirstSucceededRemoteDataPayload(),
|
||||||
|
);
|
||||||
|
|
||||||
|
item$.pipe(
|
||||||
|
map((item: Item) => this.getPoliciesRoute(item))
|
||||||
|
).subscribe((route: string[]) => {
|
||||||
|
this.resourcePoliciesPageRoute = route;
|
||||||
|
});
|
||||||
|
|
||||||
|
item$.subscribe((item: Item) => {
|
||||||
|
this.item = item;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the path to the delete page of this workflow item
|
||||||
|
*/
|
||||||
|
getDeleteRoute(): string {
|
||||||
|
return getWorkflowItemDeleteRoute(this.wsi.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the path to the administrative edit page policies tab
|
||||||
|
*/
|
||||||
|
getPoliciesRoute(item: Item): string[] {
|
||||||
|
return ['/items', item.uuid, 'edit', ITEM_EDIT_AUTHORIZATIONS_PATH];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the Group from the Repository. The Group will be the only that this form is showing.
|
||||||
|
* It'll either show a success or error message depending on whether delete was successful or not.
|
||||||
|
*/
|
||||||
|
deleteSupervisionOrder(supervisionOrderEntry: SupervisionOrderListEntry) {
|
||||||
|
const modalRef = this.modalService.open(ConfirmationModalComponent);
|
||||||
|
modalRef.componentInstance.dso = supervisionOrderEntry.group;
|
||||||
|
modalRef.componentInstance.headerLabel = this.messagePrefix + '.delete-supervision.modal.header';
|
||||||
|
modalRef.componentInstance.infoLabel = this.messagePrefix + '.delete-supervision.modal.info';
|
||||||
|
modalRef.componentInstance.cancelLabel = this.messagePrefix + '.delete-supervision.modal.cancel';
|
||||||
|
modalRef.componentInstance.confirmLabel = this.messagePrefix + '.delete-supervision.modal.confirm';
|
||||||
|
modalRef.componentInstance.brandColor = 'danger';
|
||||||
|
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
|
||||||
|
modalRef.componentInstance.response.pipe(
|
||||||
|
take(1),
|
||||||
|
switchMap((confirm: boolean) => {
|
||||||
|
if (confirm && hasValue(supervisionOrderEntry.supervisionOrder.id)) {
|
||||||
|
return this.supervisionOrderDataService.delete(supervisionOrderEntry.supervisionOrder.id).pipe(
|
||||||
|
take(1),
|
||||||
|
tap((result: boolean) => {
|
||||||
|
if (result) {
|
||||||
|
this.notificationsService.success(
|
||||||
|
null,
|
||||||
|
this.translateService.get(
|
||||||
|
this.messagePrefix + '.notification.deleted.success',
|
||||||
|
{ name: this.dsoNameService.getName(supervisionOrderEntry.group) }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.notificationsService.error(
|
||||||
|
null,
|
||||||
|
this.translateService.get(
|
||||||
|
this.messagePrefix + '.notification.deleted.failure',
|
||||||
|
{ name: this.dsoNameService.getName(supervisionOrderEntry.group) }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
).subscribe((result: boolean) => {
|
||||||
|
if (result) {
|
||||||
|
this.delete.emit(this.convertReloadedObject());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the Supervision Modal to create a supervision order
|
||||||
|
*/
|
||||||
|
openSupervisionModal() {
|
||||||
|
const supervisionModal: NgbModalRef = this.modalService.open(SupervisionOrderGroupSelectorComponent, {
|
||||||
|
size: 'lg',
|
||||||
|
backdrop: 'static'
|
||||||
|
});
|
||||||
|
supervisionModal.componentInstance.itemUUID = this.item.uuid;
|
||||||
|
supervisionModal.componentInstance.create.subscribe(() => {
|
||||||
|
this.create.emit(this.convertReloadedObject());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the reloadedObject to the Type required by this dso.
|
||||||
|
*/
|
||||||
|
private convertReloadedObject(): DSpaceObject {
|
||||||
|
const constructor = getSearchResultFor((this.wsi as any).constructor);
|
||||||
|
return Object.assign(new constructor(), this.wsi, {
|
||||||
|
indexableObject: this.wsi
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -7,14 +7,22 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl
|
|||||||
import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type';
|
import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type';
|
||||||
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { WorkflowItemSearchResultAdminWorkflowGridElementComponent } from './workflow-item-search-result-admin-workflow-grid-element.component';
|
import {
|
||||||
|
WorkflowItemSearchResultAdminWorkflowGridElementComponent
|
||||||
|
} from './workflow-item-search-result-admin-workflow-grid-element.component';
|
||||||
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
import { Item } from '../../../../../core/shared/item.model';
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
import { ItemGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component';
|
import {
|
||||||
import { ListableObjectDirective } from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive';
|
ItemGridElementComponent
|
||||||
import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
} from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component';
|
||||||
|
import {
|
||||||
|
ListableObjectDirective
|
||||||
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive';
|
||||||
|
import {
|
||||||
|
WorkflowItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
||||||
import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service';
|
import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service';
|
||||||
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
||||||
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
||||||
@@ -22,7 +30,7 @@ import { of as observableOf } from 'rxjs';
|
|||||||
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
|
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
|
||||||
import { ThemeService } from '../../../../../shared/theme-support/theme.service';
|
import { ThemeService } from '../../../../../shared/theme-support/theme.service';
|
||||||
|
|
||||||
describe('WorkflowItemAdminWorkflowGridElementComponent', () => {
|
describe('WorkflowItemSearchResultAdminWorkflowGridElementComponent', () => {
|
||||||
let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent;
|
let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent;
|
||||||
let fixture: ComponentFixture<WorkflowItemSearchResultAdminWorkflowGridElementComponent>;
|
let fixture: ComponentFixture<WorkflowItemSearchResultAdminWorkflowGridElementComponent>;
|
||||||
let id;
|
let id;
|
||||||
|
@@ -0,0 +1,16 @@
|
|||||||
|
<ng-template dsListableObject>
|
||||||
|
</ng-template>
|
||||||
|
<div #badges class="position-absolute ml-1">
|
||||||
|
<div class="workflow-badge">
|
||||||
|
<span class="badge badge-info">{{ "admin.workflow.item.workspace" | translate }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul #buttons class="list-group list-group-flush">
|
||||||
|
<li class="list-group-item">
|
||||||
|
<ds-workspace-item-admin-workflow-actions-element [small]="true"
|
||||||
|
[supervisionOrderList]="supervisionOrder$ | async"
|
||||||
|
[wsi]="dso"
|
||||||
|
(create)="reloadObject($event)"
|
||||||
|
(delete)="reloadObject($event)"></ds-workspace-item-admin-workflow-actions-element>
|
||||||
|
</li>
|
||||||
|
</ul>
|
@@ -0,0 +1,127 @@
|
|||||||
|
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||||||
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
|
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
|
|
||||||
|
import { of as observableOf } from 'rxjs';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
|
||||||
|
import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type';
|
||||||
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowGridElementComponent
|
||||||
|
} from './workspace-item-search-result-admin-workflow-grid-element.component';
|
||||||
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import {
|
||||||
|
ItemGridElementComponent
|
||||||
|
} from '../../../../../shared/object-grid/item-grid-element/item-types/item/item-grid-element.component';
|
||||||
|
import {
|
||||||
|
ListableObjectDirective
|
||||||
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive';
|
||||||
|
import {
|
||||||
|
WorkflowItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
||||||
|
import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service';
|
||||||
|
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
||||||
|
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
||||||
|
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
|
||||||
|
import { ThemeService } from '../../../../../shared/theme-support/theme.service';
|
||||||
|
import {
|
||||||
|
supervisionOrderPaginatedListRD,
|
||||||
|
supervisionOrderPaginatedListRD$
|
||||||
|
} from '../../../../../shared/testing/supervision-order.mock';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
import { DSpaceObject } from '../../../../../core/shared/dspace-object.model';
|
||||||
|
|
||||||
|
describe('WorkspaceItemSearchResultAdminWorkflowGridElementComponent', () => {
|
||||||
|
let component: WorkspaceItemSearchResultAdminWorkflowGridElementComponent;
|
||||||
|
let fixture: ComponentFixture<WorkspaceItemSearchResultAdminWorkflowGridElementComponent>;
|
||||||
|
let id;
|
||||||
|
let wfi;
|
||||||
|
let itemRD$;
|
||||||
|
let linkService;
|
||||||
|
let object;
|
||||||
|
let themeService;
|
||||||
|
let supervisionOrderDataService;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
itemRD$ = createSuccessfulRemoteDataObject$(new Item());
|
||||||
|
id = '780b2588-bda5-4112-a1cd-0b15000a5339';
|
||||||
|
object = new WorkflowItemSearchResult();
|
||||||
|
wfi = new WorkflowItem();
|
||||||
|
wfi.item = itemRD$;
|
||||||
|
object.indexableObject = wfi;
|
||||||
|
linkService = getMockLinkService();
|
||||||
|
themeService = getMockThemeService();
|
||||||
|
supervisionOrderDataService = jasmine.createSpyObj('supervisionOrderDataService', {
|
||||||
|
searchByItem: jasmine.createSpy('searchByItem'),
|
||||||
|
delete: jasmine.createSpy('delete'),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
init();
|
||||||
|
TestBed.configureTestingModule(
|
||||||
|
{
|
||||||
|
declarations: [WorkspaceItemSearchResultAdminWorkflowGridElementComponent, ItemGridElementComponent, ListableObjectDirective],
|
||||||
|
imports: [
|
||||||
|
NoopAnimationsModule,
|
||||||
|
TranslateModule.forRoot(),
|
||||||
|
RouterTestingModule.withRoutes([]),
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{ provide: LinkService, useValue: linkService },
|
||||||
|
{ provide: ThemeService, useValue: themeService },
|
||||||
|
{
|
||||||
|
provide: TruncatableService, useValue: {
|
||||||
|
isCollapsed: () => observableOf(true),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ provide: BitstreamDataService, useValue: {} },
|
||||||
|
{ provide: SupervisionOrderDataService, useValue: supervisionOrderDataService }
|
||||||
|
],
|
||||||
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
})
|
||||||
|
.overrideComponent(WorkspaceItemSearchResultAdminWorkflowGridElementComponent, {
|
||||||
|
set: {
|
||||||
|
entryComponents: [ItemGridElementComponent]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
linkService.resolveLink.and.callFake((a) => a);
|
||||||
|
fixture = TestBed.createComponent(WorkspaceItemSearchResultAdminWorkflowGridElementComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.object = object;
|
||||||
|
component.linkTypes = CollectionElementLinkType;
|
||||||
|
component.index = 0;
|
||||||
|
component.viewModes = ViewMode;
|
||||||
|
supervisionOrderDataService.searchByItem.and.returnValue(supervisionOrderPaginatedListRD$);
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should retrieve the item using the link service', () => {
|
||||||
|
expect(linkService.resolveLink).toHaveBeenCalledWith(wfi, followLink('item'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should retrieve supervision order objects properly', () => {
|
||||||
|
expect(component.supervisionOrder$.value).toEqual(supervisionOrderPaginatedListRD.payload.page);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit reloadedObject properly ', () => {
|
||||||
|
spyOn(component.reloadedObject, 'emit');
|
||||||
|
const dso = new DSpaceObject();
|
||||||
|
component.reloadObject(dso);
|
||||||
|
expect(component.reloadedObject.emit).toHaveBeenCalledWith(dso);
|
||||||
|
});
|
||||||
|
});
|
@@ -0,0 +1,158 @@
|
|||||||
|
import { Component, ComponentFactoryResolver, ElementRef, ViewChild } from '@angular/core';
|
||||||
|
|
||||||
|
import { BehaviorSubject, Observable } from 'rxjs';
|
||||||
|
import { map, mergeMap, take, tap } from 'rxjs/operators';
|
||||||
|
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
|
import {
|
||||||
|
getListableObjectComponent,
|
||||||
|
listableObjectComponent
|
||||||
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
|
||||||
|
import { Context } from '../../../../../core/shared/context.model';
|
||||||
|
import {
|
||||||
|
SearchResultGridElementComponent
|
||||||
|
} from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component';
|
||||||
|
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
|
||||||
|
import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service';
|
||||||
|
import { GenericConstructor } from '../../../../../core/shared/generic-constructor';
|
||||||
|
import {
|
||||||
|
ListableObjectDirective
|
||||||
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive';
|
||||||
|
import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model';
|
||||||
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
|
import { RemoteData } from '../../../../../core/data/remote-data';
|
||||||
|
import {
|
||||||
|
getAllSucceededRemoteData,
|
||||||
|
getFirstCompletedRemoteData,
|
||||||
|
getRemoteDataPayload
|
||||||
|
} from '../../../../../core/shared/operators';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workspace-item-search-result.model';
|
||||||
|
import { ThemeService } from '../../../../../shared/theme-support/theme.service';
|
||||||
|
import { DSpaceObject } from '../../../../../core/shared/dspace-object.model';
|
||||||
|
import { SupervisionOrder } from '../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
|
import { PaginatedList } from '../../../../../core/data/paginated-list.model';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
|
||||||
|
@listableObjectComponent(WorkspaceItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch)
|
||||||
|
@Component({
|
||||||
|
selector: 'ds-workflow-item-search-result-admin-workflow-grid-element',
|
||||||
|
styleUrls: ['./workspace-item-search-result-admin-workflow-grid-element.component.scss'],
|
||||||
|
templateUrl: './workspace-item-search-result-admin-workflow-grid-element.component.html'
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* The component for displaying a grid element for an workflow item on the admin workflow search page
|
||||||
|
*/
|
||||||
|
export class WorkspaceItemSearchResultAdminWorkflowGridElementComponent extends SearchResultGridElementComponent<WorkspaceItemSearchResult, WorkspaceItem> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The item linked to the workspace item
|
||||||
|
*/
|
||||||
|
public item$: Observable<Item>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The id of the item linked to the workflow item
|
||||||
|
*/
|
||||||
|
public itemId: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The supervision orders linked to the workflow item
|
||||||
|
*/
|
||||||
|
public supervisionOrder$: BehaviorSubject<SupervisionOrder[]> = new BehaviorSubject<SupervisionOrder[]>([]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directive used to render the dynamic component in
|
||||||
|
*/
|
||||||
|
@ViewChild(ListableObjectDirective, { static: true }) listableObjectDirective: ListableObjectDirective;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The html child that contains the badges html
|
||||||
|
*/
|
||||||
|
@ViewChild('badges', { static: true }) badges: ElementRef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The html child that contains the button html
|
||||||
|
*/
|
||||||
|
@ViewChild('buttons', { static: true }) buttons: ElementRef;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private componentFactoryResolver: ComponentFactoryResolver,
|
||||||
|
private linkService: LinkService,
|
||||||
|
protected truncatableService: TruncatableService,
|
||||||
|
private themeService: ThemeService,
|
||||||
|
protected bitstreamDataService: BitstreamDataService,
|
||||||
|
protected supervisionOrderDataService: SupervisionOrderDataService,
|
||||||
|
) {
|
||||||
|
super(truncatableService, bitstreamDataService);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the dynamic child component
|
||||||
|
* Initialize the item object from the workflow item
|
||||||
|
*/
|
||||||
|
ngOnInit(): void {
|
||||||
|
super.ngOnInit();
|
||||||
|
this.dso = this.linkService.resolveLink(this.dso, followLink('item'));
|
||||||
|
this.item$ = (this.dso.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
|
||||||
|
this.item$.pipe(take(1)).subscribe((item: Item) => {
|
||||||
|
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent(item));
|
||||||
|
|
||||||
|
const viewContainerRef = this.listableObjectDirective.viewContainerRef;
|
||||||
|
viewContainerRef.clear();
|
||||||
|
|
||||||
|
const componentRef = viewContainerRef.createComponent(
|
||||||
|
componentFactory,
|
||||||
|
0,
|
||||||
|
undefined,
|
||||||
|
[
|
||||||
|
[this.badges.nativeElement],
|
||||||
|
[this.buttons.nativeElement]
|
||||||
|
]);
|
||||||
|
(componentRef.instance as any).object = item;
|
||||||
|
(componentRef.instance as any).index = this.index;
|
||||||
|
(componentRef.instance as any).linkType = this.linkType;
|
||||||
|
(componentRef.instance as any).listID = this.listID;
|
||||||
|
componentRef.changeDetectorRef.detectChanges();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
this.item$.pipe(
|
||||||
|
take(1),
|
||||||
|
tap((item: Item) => this.itemId = item.id),
|
||||||
|
mergeMap((item: Item) => this.retrieveSupervisorOrders(item.id))
|
||||||
|
).subscribe((supervisionOrderList: SupervisionOrder[]) => {
|
||||||
|
this.supervisionOrder$.next(supervisionOrderList);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the component depending on the item's entity type, view mode and context
|
||||||
|
* @returns {GenericConstructor<Component>}
|
||||||
|
*/
|
||||||
|
private getComponent(item: Item): GenericConstructor<Component> {
|
||||||
|
return getListableObjectComponent(item.getRenderTypes(), ViewMode.GridElement, undefined, this.themeService.getThemeName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the list of SupervisionOrder object related to the given item
|
||||||
|
*
|
||||||
|
* @param itemId
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private retrieveSupervisorOrders(itemId): Observable<SupervisionOrder[]> {
|
||||||
|
return this.supervisionOrderDataService.searchByItem(
|
||||||
|
itemId, false, true, followLink('group')
|
||||||
|
).pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map((soRD: RemoteData<PaginatedList<SupervisionOrder>>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : [])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
reloadObject(dso: DSpaceObject) {
|
||||||
|
this.reloadedObject.emit(dso);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,18 +1,10 @@
|
|||||||
<div class="workflow-badge" *ngIf="dso?.type === 'workflowitem'">
|
<div class="workflow-badge">
|
||||||
<span class="badge badge-info">{{ "admin.workflow.item.workflow" | translate }}</span>
|
<span class="badge badge-info">{{ "admin.workflow.item.workflow" | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-badge" *ngIf="dso?.type === 'workspaceitem'">
|
|
||||||
<span class="badge badge-info">{{ "admin.workflow.item.workspace" | translate }}</span>
|
|
||||||
</div>
|
|
||||||
<ds-listable-object-component-loader *ngIf="item$ | async"
|
<ds-listable-object-component-loader *ngIf="item$ | async"
|
||||||
[object]="item$ | async"
|
[object]="item$ | async"
|
||||||
[viewMode]="viewModes.ListElement"
|
[viewMode]="viewModes.ListElement"
|
||||||
[index]="index"
|
[index]="index"
|
||||||
[linkType]="linkType"
|
[linkType]="linkType"
|
||||||
[listID]="listID"></ds-listable-object-component-loader>
|
[listID]="listID"></ds-listable-object-component-loader>
|
||||||
<div class="my-1">
|
|
||||||
<ds-supervision-order-status [supervisionOrderList]="supervisionOrder$ | async"
|
|
||||||
(delete)="deleteSupervisionOrder($event)"></ds-supervision-order-status>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ds-workflow-item-admin-workflow-actions-element [wfi]="dso" [small]="false"></ds-workflow-item-admin-workflow-actions-element>
|
<ds-workflow-item-admin-workflow-actions-element [wfi]="dso" [small]="false"></ds-workflow-item-admin-workflow-actions-element>
|
||||||
|
@@ -9,11 +9,15 @@ import { CollectionElementLinkType } from '../../../../../shared/object-collecti
|
|||||||
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
import { WorkflowItemSearchResultAdminWorkflowListElementComponent } from './workflow-item-search-result-admin-workflow-list-element.component';
|
import {
|
||||||
|
WorkflowItemSearchResultAdminWorkflowListElementComponent
|
||||||
|
} from './workflow-item-search-result-admin-workflow-list-element.component';
|
||||||
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
import { Item } from '../../../../../core/shared/item.model';
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
import {
|
||||||
|
WorkflowItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
||||||
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
||||||
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
||||||
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
@@ -21,7 +25,7 @@ import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service
|
|||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
|
|
||||||
describe('WorkflowItemAdminWorkflowListElementComponent', () => {
|
describe('WorkflowItemSearchResultAdminWorkflowListElementComponent', () => {
|
||||||
let component: WorkflowItemSearchResultAdminWorkflowListElementComponent;
|
let component: WorkflowItemSearchResultAdminWorkflowListElementComponent;
|
||||||
let fixture: ComponentFixture<WorkflowItemSearchResultAdminWorkflowListElementComponent>;
|
let fixture: ComponentFixture<WorkflowItemSearchResultAdminWorkflowListElementComponent>;
|
||||||
let id;
|
let id;
|
||||||
|
@@ -1,24 +1,15 @@
|
|||||||
import { Component, Inject, OnInit } from '@angular/core';
|
import { Component, Inject, OnInit } from '@angular/core';
|
||||||
|
|
||||||
import { BehaviorSubject, Observable } from 'rxjs';
|
|
||||||
import { map, mergeMap, take, tap } from 'rxjs/operators';
|
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
|
||||||
|
|
||||||
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
import {
|
import {
|
||||||
listableObjectComponent
|
listableObjectComponent
|
||||||
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
|
||||||
import { Context } from '../../../../../core/shared/context.model';
|
import { Context } from '../../../../../core/shared/context.model';
|
||||||
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
import { RemoteData } from '../../../../../core/data/remote-data';
|
import { RemoteData } from '../../../../../core/data/remote-data';
|
||||||
import {
|
import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators';
|
||||||
getAllSucceededRemoteData,
|
|
||||||
getFirstCompletedRemoteData,
|
|
||||||
getRemoteDataPayload
|
|
||||||
} from '../../../../../core/shared/operators';
|
|
||||||
import { Item } from '../../../../../core/shared/item.model';
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
import {
|
import {
|
||||||
SearchResultListElementComponent
|
SearchResultListElementComponent
|
||||||
@@ -29,21 +20,8 @@ import {
|
|||||||
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
||||||
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface';
|
||||||
import {
|
|
||||||
WorkspaceItemSearchResult
|
|
||||||
} from '../../../../../shared/object-collection/shared/workspace-item-search-result.model';
|
|
||||||
import { SupervisionOrder } from '../../../../../core/supervision-order/models/supervision-order.model';
|
|
||||||
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
|
||||||
import { PaginatedList } from '../../../../../core/data/paginated-list.model';
|
|
||||||
import { ConfirmationModalComponent } from '../../../../../shared/confirmation-modal/confirmation-modal.component';
|
|
||||||
import { hasValue } from '../../../../../shared/empty.util';
|
|
||||||
import {
|
|
||||||
SupervisionOrderListEntry
|
|
||||||
} from '../../../../../shared/object-list/supervision-order-status/supervision-order-status.component';
|
|
||||||
import { NotificationsService } from '../../../../../shared/notifications/notifications.service';
|
|
||||||
|
|
||||||
@listableObjectComponent(WorkflowItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
|
@listableObjectComponent(WorkflowItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
|
||||||
@listableObjectComponent(WorkspaceItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-workflow-item-search-result-admin-workflow-list-element',
|
selector: 'ds-workflow-item-search-result-admin-workflow-list-element',
|
||||||
styleUrls: ['./workflow-item-search-result-admin-workflow-list-element.component.scss'],
|
styleUrls: ['./workflow-item-search-result-admin-workflow-list-element.component.scss'],
|
||||||
@@ -59,25 +37,9 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S
|
|||||||
*/
|
*/
|
||||||
public item$: Observable<Item>;
|
public item$: Observable<Item>;
|
||||||
|
|
||||||
/**
|
|
||||||
* The id of the item linked to the workflow item
|
|
||||||
*/
|
|
||||||
public itemId: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The supervision orders linked to the workflow item
|
|
||||||
*/
|
|
||||||
public supervisionOrder$: BehaviorSubject<SupervisionOrder[]> = new BehaviorSubject<SupervisionOrder[]>([]);
|
|
||||||
|
|
||||||
private messagePrefix = 'workflow-item.search.result';
|
|
||||||
|
|
||||||
constructor(private linkService: LinkService,
|
constructor(private linkService: LinkService,
|
||||||
protected dsoNameService: DSONameService,
|
|
||||||
protected modalService: NgbModal,
|
|
||||||
protected notificationsService: NotificationsService,
|
|
||||||
protected supervisionOrderDataService: SupervisionOrderDataService,
|
|
||||||
protected translateService: TranslateService,
|
|
||||||
protected truncatableService: TruncatableService,
|
protected truncatableService: TruncatableService,
|
||||||
|
protected dsoNameService: DSONameService,
|
||||||
@Inject(APP_CONFIG) protected appConfig: AppConfig
|
@Inject(APP_CONFIG) protected appConfig: AppConfig
|
||||||
) {
|
) {
|
||||||
super(truncatableService, dsoNameService, appConfig);
|
super(truncatableService, dsoNameService, appConfig);
|
||||||
@@ -90,77 +52,5 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S
|
|||||||
super.ngOnInit();
|
super.ngOnInit();
|
||||||
this.dso = this.linkService.resolveLink(this.dso, followLink('item'));
|
this.dso = this.linkService.resolveLink(this.dso, followLink('item'));
|
||||||
this.item$ = (this.dso.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
|
this.item$ = (this.dso.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
|
||||||
|
|
||||||
this.item$.pipe(
|
|
||||||
take(1),
|
|
||||||
tap((item: Item) => this.itemId = item.id),
|
|
||||||
mergeMap((item: Item) => this.retrieveSupervisorOrders(item.id))
|
|
||||||
).subscribe((supervisionOrderList: SupervisionOrder[]) => {
|
|
||||||
this.supervisionOrder$.next(supervisionOrderList);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes the Group from the Repository. The Group will be the only that this form is showing.
|
|
||||||
* It'll either show a success or error message depending on whether the delete was successful or not.
|
|
||||||
*/
|
|
||||||
deleteSupervisionOrder(supervisionOrderEntry: SupervisionOrderListEntry) {
|
|
||||||
const modalRef = this.modalService.open(ConfirmationModalComponent);
|
|
||||||
modalRef.componentInstance.dso = supervisionOrderEntry.group;
|
|
||||||
modalRef.componentInstance.headerLabel = this.messagePrefix + '.delete-supervision.modal.header';
|
|
||||||
modalRef.componentInstance.infoLabel = this.messagePrefix + '.delete-supervision.modal.info';
|
|
||||||
modalRef.componentInstance.cancelLabel = this.messagePrefix + '.delete-supervision.modal.cancel';
|
|
||||||
modalRef.componentInstance.confirmLabel = this.messagePrefix + '.delete-supervision.modal.confirm';
|
|
||||||
modalRef.componentInstance.brandColor = 'danger';
|
|
||||||
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
|
|
||||||
modalRef.componentInstance.response.pipe(
|
|
||||||
take(1),
|
|
||||||
mergeMap((confirm: boolean) => {
|
|
||||||
if (confirm && hasValue(supervisionOrderEntry.supervisionOrder.id)) {
|
|
||||||
return this.supervisionOrderDataService.delete(supervisionOrderEntry.supervisionOrder.id).pipe(
|
|
||||||
take(1),
|
|
||||||
tap((result: boolean) => {
|
|
||||||
if (result) {
|
|
||||||
this.notificationsService.success(
|
|
||||||
null,
|
|
||||||
this.translateService.get(
|
|
||||||
this.messagePrefix + '.notification.deleted.success',
|
|
||||||
{ name: this.dsoNameService.getName(supervisionOrderEntry.group) }
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this.notificationsService.error(
|
|
||||||
null,
|
|
||||||
this.translateService.get(
|
|
||||||
this.messagePrefix + '.notification.deleted.failure',
|
|
||||||
{ name: this.dsoNameService.getName(supervisionOrderEntry.group) }
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
mergeMap((result: boolean) => result ? this.retrieveSupervisorOrders(this.itemId) : this.supervisionOrder$.asObservable())
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return this.supervisionOrder$.asObservable()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
).subscribe((supervisionOrderList: SupervisionOrder[]) => {
|
|
||||||
this.supervisionOrder$.next(supervisionOrderList)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the list of SupervisionOrder object related to the given item
|
|
||||||
*
|
|
||||||
* @param itemId
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private retrieveSupervisorOrders(itemId): Observable<SupervisionOrder[]> {
|
|
||||||
return this.supervisionOrderDataService.searchByItem(
|
|
||||||
itemId, false, true, followLink('group')
|
|
||||||
).pipe(
|
|
||||||
getFirstCompletedRemoteData(),
|
|
||||||
map((soRD: RemoteData<PaginatedList<SupervisionOrder>>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : [])
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
<span class="badge badge-info">{{ "admin.workflow.item.workspace" | translate }}</span>
|
||||||
|
<ds-listable-object-component-loader *ngIf="item$ | async"
|
||||||
|
[object]="item$ | async"
|
||||||
|
[viewMode]="viewModes.ListElement"
|
||||||
|
[index]="index"
|
||||||
|
[linkType]="linkType"
|
||||||
|
[listID]="listID"></ds-listable-object-component-loader>
|
||||||
|
|
||||||
|
<ds-workspace-item-admin-workflow-actions-element [small]="false"
|
||||||
|
[supervisionOrderList]="supervisionOrder$ | async"
|
||||||
|
[wsi]="dso"
|
||||||
|
(create)="reloadObject($event)"
|
||||||
|
(delete)="reloadObject($event)"></ds-workspace-item-admin-workflow-actions-element>
|
@@ -0,0 +1,111 @@
|
|||||||
|
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||||||
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
|
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
|
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
|
||||||
|
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
|
||||||
|
import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type';
|
||||||
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
|
import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowListElementComponent
|
||||||
|
} from './workspace-item-search-result-admin-workflow-list-element.component';
|
||||||
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import {
|
||||||
|
WorkflowItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
|
||||||
|
import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils';
|
||||||
|
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
|
||||||
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
|
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
|
||||||
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
|
import { environment } from '../../../../../../environments/environment';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
import {
|
||||||
|
supervisionOrderPaginatedListRD,
|
||||||
|
supervisionOrderPaginatedListRD$
|
||||||
|
} from '../../../../../shared/testing/supervision-order.mock';
|
||||||
|
import { DSpaceObject } from '../../../../../core/shared/dspace-object.model';
|
||||||
|
|
||||||
|
describe('WorkspaceItemSearchResultAdminWorkflowListElementComponent', () => {
|
||||||
|
let component: WorkspaceItemSearchResultAdminWorkflowListElementComponent;
|
||||||
|
let fixture: ComponentFixture<WorkspaceItemSearchResultAdminWorkflowListElementComponent>;
|
||||||
|
let id;
|
||||||
|
let wfi;
|
||||||
|
let itemRD$;
|
||||||
|
let linkService;
|
||||||
|
let object;
|
||||||
|
let supervisionOrderDataService;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
itemRD$ = createSuccessfulRemoteDataObject$(new Item());
|
||||||
|
id = '780b2588-bda5-4112-a1cd-0b15000a5339';
|
||||||
|
object = new WorkflowItemSearchResult();
|
||||||
|
wfi = new WorkflowItem();
|
||||||
|
wfi.item = itemRD$;
|
||||||
|
object.indexableObject = wfi;
|
||||||
|
linkService = getMockLinkService();
|
||||||
|
supervisionOrderDataService = jasmine.createSpyObj('supervisionOrderDataService', {
|
||||||
|
searchByItem: jasmine.createSpy('searchByItem'),
|
||||||
|
delete: jasmine.createSpy('delete'),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
init();
|
||||||
|
TestBed.configureTestingModule(
|
||||||
|
{
|
||||||
|
declarations: [WorkspaceItemSearchResultAdminWorkflowListElementComponent],
|
||||||
|
imports: [
|
||||||
|
NoopAnimationsModule,
|
||||||
|
TranslateModule.forRoot(),
|
||||||
|
RouterTestingModule.withRoutes([]),
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{ provide: TruncatableService, useValue: mockTruncatableService },
|
||||||
|
{ provide: LinkService, useValue: linkService },
|
||||||
|
{ provide: DSONameService, useClass: DSONameServiceMock },
|
||||||
|
{ provide: SupervisionOrderDataService, useValue: supervisionOrderDataService },
|
||||||
|
{ provide: APP_CONFIG, useValue: environment }
|
||||||
|
],
|
||||||
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
linkService.resolveLink.and.callFake((a) => a);
|
||||||
|
fixture = TestBed.createComponent(WorkspaceItemSearchResultAdminWorkflowListElementComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.object = object;
|
||||||
|
component.linkTypes = CollectionElementLinkType;
|
||||||
|
component.index = 0;
|
||||||
|
component.viewModes = ViewMode;
|
||||||
|
supervisionOrderDataService.searchByItem.and.returnValue(supervisionOrderPaginatedListRD$);
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should retrieve the item using the link service', () => {
|
||||||
|
expect(linkService.resolveLink).toHaveBeenCalledWith(wfi, followLink('item'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should retrieve supervision order objects properly', () => {
|
||||||
|
expect(component.supervisionOrder$.value).toEqual(supervisionOrderPaginatedListRD.payload.page);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit reloadedObject properly ', () => {
|
||||||
|
spyOn(component.reloadedObject, 'emit');
|
||||||
|
const dso = new DSpaceObject();
|
||||||
|
component.reloadObject(dso);
|
||||||
|
expect(component.reloadedObject.emit).toHaveBeenCalledWith(dso);
|
||||||
|
});
|
||||||
|
});
|
@@ -0,0 +1,109 @@
|
|||||||
|
import { Component, Inject, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
import { BehaviorSubject, Observable } from 'rxjs';
|
||||||
|
import { map, mergeMap, take, tap } from 'rxjs/operators';
|
||||||
|
|
||||||
|
import { ViewMode } from '../../../../../core/shared/view-mode.model';
|
||||||
|
import {
|
||||||
|
listableObjectComponent
|
||||||
|
} from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
|
||||||
|
import { Context } from '../../../../../core/shared/context.model';
|
||||||
|
import { WorkspaceItem } from '../../../../../core/submission/models/workspaceitem.model';
|
||||||
|
import { LinkService } from '../../../../../core/cache/builders/link.service';
|
||||||
|
import { followLink } from '../../../../../shared/utils/follow-link-config.model';
|
||||||
|
import { RemoteData } from '../../../../../core/data/remote-data';
|
||||||
|
import {
|
||||||
|
getAllSucceededRemoteData,
|
||||||
|
getFirstCompletedRemoteData,
|
||||||
|
getRemoteDataPayload
|
||||||
|
} from '../../../../../core/shared/operators';
|
||||||
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
|
import {
|
||||||
|
SearchResultListElementComponent
|
||||||
|
} from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component';
|
||||||
|
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
|
||||||
|
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
|
||||||
|
import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResult
|
||||||
|
} from '../../../../../shared/object-collection/shared/workspace-item-search-result.model';
|
||||||
|
import { SupervisionOrder } from '../../../../../core/supervision-order/models/supervision-order.model';
|
||||||
|
import { SupervisionOrderDataService } from '../../../../../core/supervision-order/supervision-order-data.service';
|
||||||
|
import { PaginatedList } from '../../../../../core/data/paginated-list.model';
|
||||||
|
import { DSpaceObject } from '../../../../../core/shared/dspace-object.model';
|
||||||
|
|
||||||
|
@listableObjectComponent(WorkspaceItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
|
||||||
|
@Component({
|
||||||
|
selector: 'ds-workflow-item-search-result-admin-workflow-list-element',
|
||||||
|
styleUrls: ['./workspace-item-search-result-admin-workflow-list-element.component.scss'],
|
||||||
|
templateUrl: './workspace-item-search-result-admin-workflow-list-element.component.html'
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* The component for displaying a list element for a workflow item on the admin workflow search page
|
||||||
|
*/
|
||||||
|
export class WorkspaceItemSearchResultAdminWorkflowListElementComponent extends SearchResultListElementComponent<WorkspaceItemSearchResult, WorkspaceItem> implements OnInit {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The item linked to the workflow item
|
||||||
|
*/
|
||||||
|
public item$: Observable<Item>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The id of the item linked to the workflow item
|
||||||
|
*/
|
||||||
|
public itemId: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The supervision orders linked to the workflow item
|
||||||
|
*/
|
||||||
|
public supervisionOrder$: BehaviorSubject<SupervisionOrder[]> = new BehaviorSubject<SupervisionOrder[]>([]);
|
||||||
|
|
||||||
|
constructor(private linkService: LinkService,
|
||||||
|
protected dsoNameService: DSONameService,
|
||||||
|
protected supervisionOrderDataService: SupervisionOrderDataService,
|
||||||
|
protected truncatableService: TruncatableService,
|
||||||
|
@Inject(APP_CONFIG) protected appConfig: AppConfig
|
||||||
|
) {
|
||||||
|
super(truncatableService, dsoNameService, appConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the item object from the workflow item
|
||||||
|
*/
|
||||||
|
ngOnInit(): void {
|
||||||
|
super.ngOnInit();
|
||||||
|
this.dso = this.linkService.resolveLink(this.dso, followLink('item'));
|
||||||
|
this.item$ = (this.dso.item as Observable<RemoteData<Item>>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload());
|
||||||
|
|
||||||
|
this.item$.pipe(
|
||||||
|
take(1),
|
||||||
|
tap((item: Item) => this.itemId = item.id),
|
||||||
|
mergeMap((item: Item) => this.retrieveSupervisorOrders(item.id))
|
||||||
|
).subscribe((supervisionOrderList: SupervisionOrder[]) => {
|
||||||
|
this.supervisionOrder$.next(supervisionOrderList);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the list of SupervisionOrder object related to the given item
|
||||||
|
*
|
||||||
|
* @param itemId
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private retrieveSupervisorOrders(itemId): Observable<SupervisionOrder[]> {
|
||||||
|
return this.supervisionOrderDataService.searchByItem(
|
||||||
|
itemId, false, true, followLink('group')
|
||||||
|
).pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map((soRD: RemoteData<PaginatedList<SupervisionOrder>>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : [])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reload list element after supervision order change.
|
||||||
|
*/
|
||||||
|
reloadObject(dso: DSpaceObject) {
|
||||||
|
this.reloadedObject.emit(dso);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -1,75 +0,0 @@
|
|||||||
import { Component, Input } from '@angular/core';
|
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
||||||
import { map, Observable } from 'rxjs';
|
|
||||||
import { Item } from '../../../core/shared/item.model';
|
|
||||||
import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators';
|
|
||||||
import { SupervisionGroupSelectorComponent } from '../../../shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component';
|
|
||||||
import { WorkflowItem } from '../../../core/submission/models/workflowitem.model';
|
|
||||||
import {
|
|
||||||
getWorkflowItemSendBackRoute,
|
|
||||||
getWorkflowItemDeleteRoute
|
|
||||||
} from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'ds-workflow-item-admin-workflow-actions-element',
|
|
||||||
styleUrls: ['./workflow-item-admin-workflow-actions.component.scss'],
|
|
||||||
templateUrl: './workflow-item-admin-workflow-actions.component.html'
|
|
||||||
})
|
|
||||||
/**
|
|
||||||
* The component for displaying the actions for a list element for an item on the admin workflow search page
|
|
||||||
*/
|
|
||||||
export class WorkflowItemAdminWorkflowActionsComponent {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The workflow item to perform the actions on
|
|
||||||
*/
|
|
||||||
@Input() public wfi: WorkflowItem;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not to use small buttons
|
|
||||||
*/
|
|
||||||
@Input() public small: boolean;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private modalService: NgbModal
|
|
||||||
) { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the path to the delete page of this workflow item
|
|
||||||
*/
|
|
||||||
getDeleteRoute(): string {
|
|
||||||
|
|
||||||
return getWorkflowItemDeleteRoute(this.wfi.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the path to the send back page of this workflow item
|
|
||||||
*/
|
|
||||||
getSendBackRoute(): string {
|
|
||||||
return getWorkflowItemSendBackRoute(this.wfi.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the path to the to administrative edit page policies tab
|
|
||||||
*/
|
|
||||||
getPoliciesRoute(): Observable<string> {
|
|
||||||
return this.wfi.item.pipe(
|
|
||||||
getFirstSucceededRemoteDataPayload(),
|
|
||||||
map((item: Item) => {
|
|
||||||
return '/items/' + item.uuid + '/edit/bitstreams';
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the Supervision Modal to create a supervision order
|
|
||||||
*/
|
|
||||||
openSupervisionModal() {
|
|
||||||
this.wfi.item.pipe(
|
|
||||||
getFirstSucceededRemoteDataPayload(),
|
|
||||||
).subscribe((item: Item) => {
|
|
||||||
const supervisionModal = this.modalService.open(SupervisionGroupSelectorComponent, { size: 'lg', backdrop: 'static' });
|
|
||||||
supervisionModal.componentInstance.itemUUID = item.uuid;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,16 +1,39 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { SharedModule } from '../../shared/shared.module';
|
|
||||||
|
|
||||||
import { WorkflowItemSearchResultAdminWorkflowGridElementComponent } from './admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component';
|
import { SharedModule } from '../../shared/shared.module';
|
||||||
import { WorkflowItemAdminWorkflowActionsComponent } from './admin-workflow-search-results/workflow-item-admin-workflow-actions.component';
|
import {
|
||||||
import { WorkflowItemSearchResultAdminWorkflowListElementComponent } from './admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component';
|
WorkflowItemSearchResultAdminWorkflowGridElementComponent
|
||||||
|
} from './admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component';
|
||||||
|
import {
|
||||||
|
WorkflowItemAdminWorkflowActionsComponent
|
||||||
|
} from './admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component';
|
||||||
|
import {
|
||||||
|
WorkflowItemSearchResultAdminWorkflowListElementComponent
|
||||||
|
} from './admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component';
|
||||||
import { AdminWorkflowPageComponent } from './admin-workflow-page.component';
|
import { AdminWorkflowPageComponent } from './admin-workflow-page.component';
|
||||||
import { SearchModule } from '../../shared/search/search.module';
|
import { SearchModule } from '../../shared/search/search.module';
|
||||||
|
import {
|
||||||
|
WorkspaceItemAdminWorkflowActionsComponent
|
||||||
|
} from './admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowListElementComponent
|
||||||
|
} from './admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component';
|
||||||
|
import {
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowGridElementComponent
|
||||||
|
} from './admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component';
|
||||||
|
import {
|
||||||
|
SupervisionOrderGroupSelectorComponent
|
||||||
|
} from './admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component';
|
||||||
|
import {
|
||||||
|
SupervisionOrderStatusComponent
|
||||||
|
} from './admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component';
|
||||||
|
|
||||||
const ENTRY_COMPONENTS = [
|
const ENTRY_COMPONENTS = [
|
||||||
// put only entry components that use custom decorator
|
// put only entry components that use custom decorator
|
||||||
WorkflowItemSearchResultAdminWorkflowListElementComponent,
|
WorkflowItemSearchResultAdminWorkflowListElementComponent,
|
||||||
WorkflowItemSearchResultAdminWorkflowGridElementComponent,
|
WorkflowItemSearchResultAdminWorkflowGridElementComponent,
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowListElementComponent,
|
||||||
|
WorkspaceItemSearchResultAdminWorkflowGridElementComponent
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@@ -20,7 +43,10 @@ const ENTRY_COMPONENTS = [
|
|||||||
],
|
],
|
||||||
declarations: [
|
declarations: [
|
||||||
AdminWorkflowPageComponent,
|
AdminWorkflowPageComponent,
|
||||||
|
SupervisionOrderGroupSelectorComponent,
|
||||||
|
SupervisionOrderStatusComponent,
|
||||||
WorkflowItemAdminWorkflowActionsComponent,
|
WorkflowItemAdminWorkflowActionsComponent,
|
||||||
|
WorkspaceItemAdminWorkflowActionsComponent,
|
||||||
...ENTRY_COMPONENTS
|
...ENTRY_COMPONENTS
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
|
@@ -128,7 +128,6 @@ export class ProcessDetailComponent implements OnInit {
|
|||||||
* Sets the outputLogs when retrieved and sets the showOutputLogs boolean to show them and hide the button.
|
* Sets the outputLogs when retrieved and sets the showOutputLogs boolean to show them and hide the button.
|
||||||
*/
|
*/
|
||||||
showProcessOutputLogs() {
|
showProcessOutputLogs() {
|
||||||
console.log('showProcessOutputLogs');
|
|
||||||
this.retrievingOutputLogs$.next(true);
|
this.retrievingOutputLogs$.next(true);
|
||||||
this.zone.runOutsideAngular(() => {
|
this.zone.runOutsideAngular(() => {
|
||||||
const processOutputRD$: Observable<RemoteData<Bitstream>> = this.processRD$.pipe(
|
const processOutputRD$: Observable<RemoteData<Bitstream>> = this.processRD$.pipe(
|
||||||
|
@@ -6,21 +6,21 @@ import { TranslateModule } from '@ngx-translate/core';
|
|||||||
import { cold } from 'jasmine-marbles';
|
import { cold } from 'jasmine-marbles';
|
||||||
import uniqueId from 'lodash/uniqueId';
|
import uniqueId from 'lodash/uniqueId';
|
||||||
|
|
||||||
import { createSuccessfulRemoteDataObject } from '../../remote-data.utils';
|
import { createSuccessfulRemoteDataObject } from '../remote-data.utils';
|
||||||
import { createTestComponent } from '../../testing/utils.test';
|
import { createTestComponent } from '../testing/utils.test';
|
||||||
import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
|
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
|
||||||
import { GroupDataService } from '../../../core/eperson/group-data.service';
|
import { GroupDataService } from '../../core/eperson/group-data.service';
|
||||||
import { RequestService } from '../../../core/data/request.service';
|
import { RequestService } from '../../core/data/request.service';
|
||||||
import { getMockRequestService } from '../../mocks/request.service.mock';
|
import { getMockRequestService } from '../mocks/request.service.mock';
|
||||||
import { EpersonGroupListComponent, SearchEvent } from './eperson-group-list.component';
|
import { EpersonGroupListComponent, SearchEvent } from './eperson-group-list.component';
|
||||||
import { EPersonMock } from '../../testing/eperson.mock';
|
import { EPersonMock } from '../testing/eperson.mock';
|
||||||
import { GroupMock } from '../../testing/group-mock';
|
import { GroupMock } from '../testing/group-mock';
|
||||||
import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model';
|
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
|
||||||
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
|
import { buildPaginatedList } from '../../core/data/paginated-list.model';
|
||||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
import { PageInfo } from '../../core/shared/page-info.model';
|
||||||
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
import { PaginationService } from '../../../core/pagination/pagination.service';
|
import { PaginationService } from '../../core/pagination/pagination.service';
|
||||||
import { PaginationServiceStub } from '../../testing/pagination-service.stub';
|
import { PaginationServiceStub } from '../testing/pagination-service.stub';
|
||||||
|
|
||||||
describe('EpersonGroupListComponent test suite', () => {
|
describe('EpersonGroupListComponent test suite', () => {
|
||||||
let comp: EpersonGroupListComponent;
|
let comp: EpersonGroupListComponent;
|
@@ -4,22 +4,22 @@ import { BehaviorSubject, Observable, Subscription } from 'rxjs';
|
|||||||
import { map } from 'rxjs/operators';
|
import { map } from 'rxjs/operators';
|
||||||
import uniqueId from 'lodash/uniqueId';
|
import uniqueId from 'lodash/uniqueId';
|
||||||
|
|
||||||
import { RemoteData } from '../../../core/data/remote-data';
|
import { RemoteData } from '../../core/data/remote-data';
|
||||||
import { PaginatedList } from '../../../core/data/paginated-list.model';
|
import { PaginatedList } from '../../core/data/paginated-list.model';
|
||||||
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
|
import { DSpaceObject } from '../../core/shared/dspace-object.model';
|
||||||
import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model';
|
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
|
||||||
import { hasValue, isNotEmpty } from '../../empty.util';
|
import { hasValue, isNotEmpty } from '../empty.util';
|
||||||
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
|
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
|
||||||
import { EPERSON } from '../../../core/eperson/models/eperson.resource-type';
|
import { EPERSON } from '../../core/eperson/models/eperson.resource-type';
|
||||||
import { GROUP } from '../../../core/eperson/models/group.resource-type';
|
import { GROUP } from '../../core/eperson/models/group.resource-type';
|
||||||
import { ResourceType } from '../../../core/shared/resource-type';
|
import { ResourceType } from '../../core/shared/resource-type';
|
||||||
import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
|
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
|
||||||
import { GroupDataService } from '../../../core/eperson/group-data.service';
|
import { GroupDataService } from '../../core/eperson/group-data.service';
|
||||||
import { fadeInOut } from '../../animations/fade';
|
import { fadeInOut } from '../animations/fade';
|
||||||
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
|
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
|
||||||
import { PaginationService } from '../../../core/pagination/pagination.service';
|
import { PaginationService } from '../../core/pagination/pagination.service';
|
||||||
import { FindListOptions } from '../../../core/data/find-list-options.model';
|
import { FindListOptions } from '../../core/data/find-list-options.model';
|
||||||
import { getDataServiceFor } from '../../../core/data/base/data-service.decorator';
|
import { getDataServiceFor } from '../../core/data/base/data-service.decorator';
|
||||||
|
|
||||||
export interface SearchEvent {
|
export interface SearchEvent {
|
||||||
scope: string;
|
scope: string;
|
@@ -4,7 +4,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|||||||
|
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
import { createTestComponent } from '../../../testing/utils.test';
|
import { createTestComponent } from '../../testing/utils.test';
|
||||||
import { EpersonSearchBoxComponent } from './eperson-search-box.component';
|
import { EpersonSearchBoxComponent } from './eperson-search-box.component';
|
||||||
import { SearchEvent } from '../eperson-group-list.component';
|
import { SearchEvent } from '../eperson-group-list.component';
|
||||||
|
|
@@ -4,7 +4,7 @@ import { FormBuilder } from '@angular/forms';
|
|||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
import { SearchEvent } from '../eperson-group-list.component';
|
import { SearchEvent } from '../eperson-group-list.component';
|
||||||
import { isNotNull } from '../../../empty.util';
|
import { isNotNull } from '../../empty.util';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A component used to show a search box for epersons.
|
* A component used to show a search box for epersons.
|
@@ -4,7 +4,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|||||||
|
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
import { createTestComponent } from '../../../testing/utils.test';
|
import { createTestComponent } from '../../testing/utils.test';
|
||||||
import { GroupSearchBoxComponent } from './group-search-box.component';
|
import { GroupSearchBoxComponent } from './group-search-box.component';
|
||||||
import { SearchEvent } from '../eperson-group-list.component';
|
import { SearchEvent } from '../eperson-group-list.component';
|
||||||
|
|
@@ -4,7 +4,7 @@ import { FormBuilder } from '@angular/forms';
|
|||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
import { SearchEvent } from '../eperson-group-list.component';
|
import { SearchEvent } from '../eperson-group-list.component';
|
||||||
import { isNotNull } from '../../../empty.util';
|
import { isNotNull } from '../../empty.util';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A component used to show a search box for groups.
|
* A component used to show a search box for groups.
|
@@ -1,13 +0,0 @@
|
|||||||
<ng-container *ngVar="(supervisionOrderEntries$ | async) as supervisionOrders">
|
|
||||||
<div class="item-list-supervision row" *ngIf="supervisionOrders?.length > 0">
|
|
||||||
<div class="col-md-3">
|
|
||||||
<span>{{'workflow-item.search.result.list.element.supervised-by' | translate}} </span>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-9">
|
|
||||||
<span class="badge badge-primary d-table mt-1" *ngFor="let supervisionOrder of supervisionOrders">
|
|
||||||
{{supervisionOrder.group.name}}
|
|
||||||
<a [ngbTooltip]="'workflow-item.search.result.list.element.supervised.remove-tooltip' | translate" (click)="deleteSupervisionOrder(supervisionOrder)">X</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</ng-container>
|
|
@@ -1,25 +0,0 @@
|
|||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { SupervisionOrderStatusComponent } from './supervision-order-status.component';
|
|
||||||
|
|
||||||
describe('SupervisionOrderStatusComponent', () => {
|
|
||||||
let component: SupervisionOrderStatusComponent;
|
|
||||||
let fixture: ComponentFixture<SupervisionOrderStatusComponent>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
declarations: [ SupervisionOrderStatusComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(SupervisionOrderStatusComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
@@ -24,9 +24,9 @@ import { ResourcePolicyEvent, ResourcePolicyFormComponent } from './resource-pol
|
|||||||
import { FormService } from '../../form/form.service';
|
import { FormService } from '../../form/form.service';
|
||||||
import { getMockFormService } from '../../mocks/form-service.mock';
|
import { getMockFormService } from '../../mocks/form-service.mock';
|
||||||
import { FormBuilderService } from '../../form/builder/form-builder.service';
|
import { FormBuilderService } from '../../form/builder/form-builder.service';
|
||||||
import { EpersonGroupListComponent } from '../../form/eperson-group-list/eperson-group-list.component';
|
import { EpersonGroupListComponent } from '../../eperson-group-list/eperson-group-list.component';
|
||||||
import { FormComponent } from '../../form/form.component';
|
import { FormComponent } from '../../form/form.component';
|
||||||
import { stringToNgbDateStruct, dateToISOFormat } from '../../date.util';
|
import { dateToISOFormat, stringToNgbDateStruct } from '../../date.util';
|
||||||
import { ResourcePolicy } from '../../../core/resource-policy/models/resource-policy.model';
|
import { ResourcePolicy } from '../../../core/resource-policy/models/resource-policy.model';
|
||||||
import { RESOURCE_POLICY } from '../../../core/resource-policy/models/resource-policy.resource-type';
|
import { RESOURCE_POLICY } from '../../../core/resource-policy/models/resource-policy.resource-type';
|
||||||
import { EPersonMock } from '../../testing/eperson.mock';
|
import { EPersonMock } from '../../testing/eperson.mock';
|
||||||
|
@@ -84,8 +84,9 @@ import { LangSwitchComponent } from './lang-switch/lang-switch.component';
|
|||||||
import {
|
import {
|
||||||
PlainTextMetadataListElementComponent
|
PlainTextMetadataListElementComponent
|
||||||
} from './object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component';
|
} from './object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component';
|
||||||
import { BrowseLinkMetadataListElementComponent }
|
import {
|
||||||
from './object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component';
|
BrowseLinkMetadataListElementComponent
|
||||||
|
} from './object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component';
|
||||||
import {
|
import {
|
||||||
ItemMetadataListElementComponent
|
ItemMetadataListElementComponent
|
||||||
} from './object-list/metadata-representation-list-element/item/item-metadata-list-element.component';
|
} from './object-list/metadata-representation-list-element/item/item-metadata-list-element.component';
|
||||||
@@ -246,21 +247,21 @@ import {
|
|||||||
import { ThemedCollectionDropdownComponent } from './collection-dropdown/themed-collection-dropdown.component';
|
import { ThemedCollectionDropdownComponent } from './collection-dropdown/themed-collection-dropdown.component';
|
||||||
import { MetadataFieldWrapperComponent } from './metadata-field-wrapper/metadata-field-wrapper.component';
|
import { MetadataFieldWrapperComponent } from './metadata-field-wrapper/metadata-field-wrapper.component';
|
||||||
import { ShortNumberPipe } from './utils/short-number.pipe';
|
import { ShortNumberPipe } from './utils/short-number.pipe';
|
||||||
import { LogInExternalProviderComponent } from './log-in/methods/log-in-external-provider/log-in-external-provider.component';
|
import {
|
||||||
import { AdvancedClaimedTaskActionSelectReviewerComponent } from './mydspace-actions/claimed-task/select-reviewer/advanced-claimed-task-action-select-reviewer.component';
|
LogInExternalProviderComponent
|
||||||
|
} from './log-in/methods/log-in-external-provider/log-in-external-provider.component';
|
||||||
|
import {
|
||||||
|
AdvancedClaimedTaskActionSelectReviewerComponent
|
||||||
|
} from './mydspace-actions/claimed-task/select-reviewer/advanced-claimed-task-action-select-reviewer.component';
|
||||||
import {
|
import {
|
||||||
AdvancedClaimedTaskActionRatingComponent
|
AdvancedClaimedTaskActionRatingComponent
|
||||||
} from './mydspace-actions/claimed-task/rating/advanced-claimed-task-action-rating.component';
|
} from './mydspace-actions/claimed-task/rating/advanced-claimed-task-action-rating.component';
|
||||||
import { ClaimedTaskActionsDeclineTaskComponent } from './mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component';
|
|
||||||
import {
|
import {
|
||||||
SupervisionOrderStatusComponent
|
ClaimedTaskActionsDeclineTaskComponent
|
||||||
} from './object-list/supervision-order-status/supervision-order-status.component';
|
} from './mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component';
|
||||||
import {
|
import { EpersonGroupListComponent } from './eperson-group-list/eperson-group-list.component';
|
||||||
SupervisionGroupSelectorComponent
|
import { EpersonSearchBoxComponent } from './eperson-group-list/eperson-search-box/eperson-search-box.component';
|
||||||
} from './dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component';
|
import { GroupSearchBoxComponent } from './eperson-group-list/group-search-box/group-search-box.component';
|
||||||
import { EpersonGroupListComponent } from './form/eperson-group-list/eperson-group-list.component';
|
|
||||||
import { EpersonSearchBoxComponent } from './form/eperson-group-list/eperson-search-box/eperson-search-box.component';
|
|
||||||
import { GroupSearchBoxComponent } from './form/eperson-group-list/group-search-box/group-search-box.component';
|
|
||||||
|
|
||||||
const MODULES = [
|
const MODULES = [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
@@ -364,9 +365,7 @@ const COMPONENTS = [
|
|||||||
ContextHelpWrapperComponent,
|
ContextHelpWrapperComponent,
|
||||||
EpersonGroupListComponent,
|
EpersonGroupListComponent,
|
||||||
EpersonSearchBoxComponent,
|
EpersonSearchBoxComponent,
|
||||||
GroupSearchBoxComponent,
|
GroupSearchBoxComponent
|
||||||
SupervisionGroupSelectorComponent,
|
|
||||||
SupervisionOrderStatusComponent
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const ENTRY_COMPONENTS = [
|
const ENTRY_COMPONENTS = [
|
||||||
@@ -427,8 +426,7 @@ const ENTRY_COMPONENTS = [
|
|||||||
AdvancedClaimedTaskActionRatingComponent,
|
AdvancedClaimedTaskActionRatingComponent,
|
||||||
EpersonGroupListComponent,
|
EpersonGroupListComponent,
|
||||||
EpersonSearchBoxComponent,
|
EpersonSearchBoxComponent,
|
||||||
GroupSearchBoxComponent,
|
GroupSearchBoxComponent
|
||||||
SupervisionGroupSelectorComponent
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const PROVIDERS = [
|
const PROVIDERS = [
|
||||||
|
95
src/app/shared/testing/supervision-order.mock.ts
Normal file
95
src/app/shared/testing/supervision-order.mock.ts
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
import { Item } from '../../core/shared/item.model';
|
||||||
|
import { SupervisionOrder } from '../../core/supervision-order/models/supervision-order.model';
|
||||||
|
import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../remote-data.utils';
|
||||||
|
import { GroupMock, GroupMock2 } from './group-mock';
|
||||||
|
import { buildPaginatedList } from '../../core/data/paginated-list.model';
|
||||||
|
import { PageInfo } from '../../core/shared/page-info.model';
|
||||||
|
|
||||||
|
const itemMock = Object.assign(new Item(), {
|
||||||
|
metadata: {
|
||||||
|
'dc.title': [
|
||||||
|
{
|
||||||
|
value: 'Item one'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.contributor.author': [
|
||||||
|
{
|
||||||
|
value: 'Smith, Donald'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.publisher': [
|
||||||
|
{
|
||||||
|
value: 'a publisher'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.date.issued': [
|
||||||
|
{
|
||||||
|
value: '2015-06-26'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.description.abstract': [
|
||||||
|
{
|
||||||
|
value: 'This is the abstract'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const anotherItemMock = Object.assign(new Item(), {
|
||||||
|
metadata: {
|
||||||
|
'dc.title': [
|
||||||
|
{
|
||||||
|
value: 'Item two'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.contributor.author': [
|
||||||
|
{
|
||||||
|
value: 'Smith, Donald'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.publisher': [
|
||||||
|
{
|
||||||
|
value: 'a publisher'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.date.issued': [
|
||||||
|
{
|
||||||
|
value: '2015-06-26'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'dc.description.abstract': [
|
||||||
|
{
|
||||||
|
value: 'This is the abstract'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export const supervisionOrderMock: any = Object.assign(new SupervisionOrder(),{
|
||||||
|
id: '1',
|
||||||
|
item: createSuccessfulRemoteDataObject$(itemMock),
|
||||||
|
group: createSuccessfulRemoteDataObject$(GroupMock)
|
||||||
|
});
|
||||||
|
|
||||||
|
export const anotherSupervisionOrderMock: any = {
|
||||||
|
id: '2',
|
||||||
|
item: createSuccessfulRemoteDataObject$(anotherItemMock),
|
||||||
|
group: createSuccessfulRemoteDataObject$(GroupMock2)
|
||||||
|
};
|
||||||
|
|
||||||
|
export const supervisionOrderListMock = [supervisionOrderMock, anotherSupervisionOrderMock];
|
||||||
|
export const supervisionOrderEntryMock = {
|
||||||
|
supervisionOrder: supervisionOrderMock,
|
||||||
|
group: GroupMock
|
||||||
|
};
|
||||||
|
|
||||||
|
const pageInfo = new PageInfo({
|
||||||
|
elementsPerPage: 10,
|
||||||
|
totalElements: 2,
|
||||||
|
totalPages: 1,
|
||||||
|
currentPage: 1
|
||||||
|
});
|
||||||
|
const array = [supervisionOrderMock, anotherSupervisionOrderMock];
|
||||||
|
const paginatedList = buildPaginatedList(pageInfo, array);
|
||||||
|
export const supervisionOrderPaginatedListRD = createSuccessfulRemoteDataObject(paginatedList);
|
||||||
|
export const supervisionOrderPaginatedListRD$ = createSuccessfulRemoteDataObject$(paginatedList);
|
@@ -3745,6 +3745,8 @@
|
|||||||
|
|
||||||
"search.filters.applied.f.birthDate.min": "Start birth date",
|
"search.filters.applied.f.birthDate.min": "Start birth date",
|
||||||
|
|
||||||
|
"search.filters.applied.f.supervisedBy": "Supervised by",
|
||||||
|
|
||||||
"search.filters.applied.f.withdrawn": "Withdrawn",
|
"search.filters.applied.f.withdrawn": "Withdrawn",
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user