diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.html new file mode 100644 index 0000000000..7f19ef3c2e --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.html @@ -0,0 +1,8 @@ +
+ + {{"admin.workflow.item.delete" | translate}} + + + {{"admin.workflow.item.send-back" | translate}} + +
diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.scss similarity index 100% rename from src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.scss rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.scss diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.spec.ts similarity index 75% rename from src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.spec.ts index 9b2bffffef..04377fcc81 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.spec.ts @@ -4,17 +4,17 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; import { By } from '@angular/platform-browser'; 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 { WorkflowItem } from '../../../core/submission/models/workflowitem.model'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { getWorkflowItemDeleteRoute, getWorkflowItemSendBackRoute -} from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; +} from '../../../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; import { of } from 'rxjs'; -import { Item } from 'src/app/core/shared/item.model'; -import { RemoteData } from 'src/app/core/data/remote-data'; -import { RequestEntryState } from 'src/app/core/data/request-entry-state.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { RequestEntryState } from '../../../../../core/data/request-entry-state.model'; describe('WorkflowItemAdminWorkflowActionsComponent', () => { let component: WorkflowItemAdminWorkflowActionsComponent; @@ -68,10 +68,4 @@ describe('WorkflowItemAdminWorkflowActionsComponent', () => { 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()); - }); - }); diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.ts new file mode 100644 index 0000000000..480c48f25e --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workflow-item/workflow-item-admin-workflow-actions.component.ts @@ -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); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.html similarity index 95% rename from src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.html rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.html index c6d45c8743..3ad1dce0b8 100644 --- a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.html +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.html @@ -11,7 +11,6 @@ diff --git a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.scss similarity index 100% rename from src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.scss rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.scss diff --git a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.spec.ts similarity index 69% rename from src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.spec.ts rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.spec.ts index b5e62ef8ac..6e917ed088 100644 --- a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.spec.ts @@ -2,16 +2,16 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { SupervisionGroupSelectorComponent } from './supervision-group-selector.component'; -import { SupervisionOrderDataService } from '../../../../core/supervision-order/supervision-order-data.service'; -import { NotificationsService } from '../../../../shared/notifications/notifications.service'; -import { Group } from '../../../../core/eperson/models/group.model'; -import { SupervisionOrder } from '../../../../core/supervision-order/models/supervision-order.model'; +import { SupervisionOrderGroupSelectorComponent } from './supervision-order-group-selector.component'; +import { SupervisionOrderDataService } from '../../../../../../core/supervision-order/supervision-order-data.service'; +import { NotificationsService } from '../../../../../../shared/notifications/notifications.service'; +import { Group } from '../../../../../../core/eperson/models/group.model'; +import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model'; import { of } from 'rxjs'; -describe('SupervisionGroupSelectorComponent', () => { - let component: SupervisionGroupSelectorComponent; - let fixture: ComponentFixture; +describe('SupervisionOrderGroupSelectorComponent', () => { + let component: SupervisionOrderGroupSelectorComponent; + let fixture: ComponentFixture; let debugElement: DebugElement; const modalStub = jasmine.createSpyObj('modalStub', ['close']); @@ -32,7 +32,7 @@ describe('SupervisionGroupSelectorComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [TranslateModule.forRoot()], - declarations: [SupervisionGroupSelectorComponent], + declarations: [SupervisionOrderGroupSelectorComponent], providers: [ { provide: NgbActiveModal, useValue: modalStub }, { provide: SupervisionOrderDataService, useValue: supervisionOrderDataService }, @@ -44,7 +44,7 @@ describe('SupervisionGroupSelectorComponent', () => { })); beforeEach(waitForAsync(() => { - fixture = TestBed.createComponent(SupervisionGroupSelectorComponent); + fixture = TestBed.createComponent(SupervisionOrderGroupSelectorComponent); component = fixture.componentInstance; })); diff --git a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.ts similarity index 70% rename from src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.ts rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.ts index da22fe0d44..bbb1df3c49 100644 --- a/src/app/shared/dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-group-selector/supervision-order-group-selector.component.ts @@ -1,13 +1,13 @@ -import { Component } from '@angular/core'; +import { Component, EventEmitter, Output } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; import { NotificationsService } from 'src/app/shared/notifications/notifications.service'; -import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; -import { Group } from '../../../../core/eperson/models/group.model'; -import { SupervisionOrder } from '../../../../core/supervision-order/models/supervision-order.model'; -import { SupervisionOrderDataService } from '../../../../core/supervision-order/supervision-order-data.service'; -import { followLink } from '../../../../shared/utils/follow-link-config.model'; +import { DSONameService } from '../../../../../../core/breadcrumbs/dso-name.service'; +import { Group } from '../../../../../../core/eperson/models/group.model'; +import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model'; +import { SupervisionOrderDataService } from '../../../../../../core/supervision-order/supervision-order-data.service'; +import { RemoteData } from '../../../../../../core/data/remote-data'; /** * Component to wrap a dropdown - for type of order - @@ -18,10 +18,10 @@ import { followLink } from '../../../../shared/utils/follow-link-config.model'; @Component({ selector: 'ds-supervision-group-selector', - styleUrls: ['./supervision-group-selector.component.scss'], - templateUrl: './supervision-group-selector.component.html', + styleUrls: ['./supervision-order-group-selector.component.scss'], + templateUrl: './supervision-order-group-selector.component.html', }) -export class SupervisionGroupSelectorComponent { +export class SupervisionOrderGroupSelectorComponent { /** * The item to perform the actions on @@ -43,6 +43,11 @@ export class SupervisionGroupSelectorComponent { */ isSubmitted = false; + /** + * Event emitted when a new SupervisionOrder has been created + */ + @Output() create: EventEmitter = new EventEmitter(); + constructor( public dsoNameService: DSONameService, private activeModal: NgbActiveModal, @@ -75,10 +80,10 @@ export class SupervisionGroupSelectorComponent { supervisionDataObject.ordertype = this.selectedOrderType; this.supervisionOrderDataService.create(supervisionDataObject, this.itemUUID, this.selectedGroup.uuid, this.selectedOrderType).pipe( getFirstCompletedRemoteData(), - ).subscribe(rd => { + ).subscribe((rd: RemoteData) => { 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.create.emit(rd.payload); this.close(); } else { this.notificationsService.error( diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.html new file mode 100644 index 0000000000..fa6a2eafff --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.html @@ -0,0 +1,15 @@ + +
+
+ {{'workflow-item.search.result.list.element.supervised-by' | translate}} +
+ +
+
diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.scss new file mode 100644 index 0000000000..7818e34054 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.scss @@ -0,0 +1,3 @@ +.badge { + cursor: pointer; +} diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.spec.ts new file mode 100644 index 0000000000..2f4ed631cc --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.spec.ts @@ -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; + + 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(); + }); +}); diff --git a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.ts similarity index 82% rename from src/app/shared/object-list/supervision-order-status/supervision-order-status.component.ts rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.ts index 92cbf17885..11b6400ffd 100644 --- a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component.ts @@ -3,11 +3,11 @@ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from import { BehaviorSubject, from, Observable } from 'rxjs'; import { map, mergeMap, reduce } from 'rxjs/operators'; -import { SupervisionOrder } from '../../../core/supervision-order/models/supervision-order.model'; -import { Group } from '../../../core/eperson/models/group.model'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { isNotEmpty } from '../../empty.util'; -import { RemoteData } from '../../../core/data/remote-data'; +import { SupervisionOrder } from '../../../../../../core/supervision-order/models/supervision-order.model'; +import { Group } from '../../../../../../core/eperson/models/group.model'; +import { getFirstCompletedRemoteData } from '../../../../../../core/shared/operators'; +import { isNotEmpty } from '../../../../../../shared/empty.util'; +import { RemoteData } from '../../../../../../core/data/remote-data'; export interface SupervisionOrderListEntry { supervisionOrder: SupervisionOrder; @@ -26,11 +26,6 @@ export class SupervisionOrderStatusComponent implements OnChanges { */ @Input() supervisionOrderList: SupervisionOrder[] = []; - /** - * The groups the user belongs to - */ - groups: Group[]; - /** * List of the supervision orders combined with the group */ @@ -42,10 +37,9 @@ export class SupervisionOrderStatusComponent implements OnChanges { if (changes && changes.supervisionOrderList) { this.getSupervisionOrderEntries(changes.supervisionOrderList.currentValue) .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) => { if (isNotEmpty(value)) { - return [...acc, value] + return [...acc, value]; } else { return acc; } }, []), - ) + ); } /** diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.html similarity index 61% rename from src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.html rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.html index f458476bc5..2b904a5429 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.html +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.html @@ -1,15 +1,16 @@ +
+ +
+ diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.scss @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts new file mode 100644 index 0000000000..628fc3f89c --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.spec.ts @@ -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; + 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(); + }); + }); + + +}); diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts new file mode 100644 index 0000000000..adbd421628 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/actions/workspace-item/workspace-item-admin-workflow-actions.component.ts @@ -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 = new EventEmitter(); + + /** + * Event emitted when new SupervisionOrder has been deleted + */ + @Output() delete: EventEmitter = new EventEmitter(); + + /** + * 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 = 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 + }); + } +} diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts index 0b933d0859..8035c53547 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.spec.ts @@ -7,14 +7,22 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; 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 { 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 { + 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'; @@ -22,7 +30,7 @@ import { of as observableOf } from 'rxjs'; import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; -describe('WorkflowItemAdminWorkflowGridElementComponent', () => { +describe('WorkflowItemSearchResultAdminWorkflowGridElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent; let fixture: ComponentFixture; let id; diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.html new file mode 100644 index 0000000000..767ad79786 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.html @@ -0,0 +1,16 @@ + + +
+
+ {{ "admin.workflow.item.workspace" | translate }} +
+
+
    +
  • + +
  • +
diff --git a/src/app/shared/form/eperson-group-list/eperson-group-list.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.scss similarity index 100% rename from src/app/shared/form/eperson-group-list/eperson-group-list.component.scss rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.scss diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts new file mode 100644 index 0000000000..b9e752c104 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.spec.ts @@ -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; + 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); + }); +}); diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts new file mode 100644 index 0000000000..f18c18ca1c --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workspace-item/workspace-item-search-result-admin-workflow-grid-element.component.ts @@ -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 { + + /** + * The item linked to the workspace item + */ + public item$: Observable; + + /** + * The id of the item linked to the workflow item + */ + public itemId: string; + + /** + * The supervision orders linked to the workflow item + */ + public supervisionOrder$: BehaviorSubject = new BehaviorSubject([]); + + /** + * 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>).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} + */ + private getComponent(item: Item): GenericConstructor { + 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 { + return this.supervisionOrderDataService.searchByItem( + itemId, false, true, followLink('group') + ).pipe( + getFirstCompletedRemoteData(), + map((soRD: RemoteData>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : []) + ); + } + + reloadObject(dso: DSpaceObject) { + this.reloadedObject.emit(dso); + } +} diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html index 8963db01bd..192cc751f2 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.html @@ -1,18 +1,10 @@ -
+
{{ "admin.workflow.item.workflow" | translate }}
-
- {{ "admin.workflow.item.workspace" | translate }} -
-
- -
- diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts index a489cb0e57..ab5d8b79a8 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts @@ -9,11 +9,15 @@ import { CollectionElementLinkType } from '../../../../../shared/object-collecti import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { RouterTestingModule } from '@angular/router/testing'; 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 { 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 { + 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'; @@ -21,7 +25,7 @@ import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service import { APP_CONFIG } from '../../../../../../config/app-config.interface'; import { environment } from '../../../../../../environments/environment'; -describe('WorkflowItemAdminWorkflowListElementComponent', () => { +describe('WorkflowItemSearchResultAdminWorkflowListElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowListElementComponent; let fixture: ComponentFixture; let id; diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts index c57d918126..b1db3f99ce 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts @@ -1,24 +1,15 @@ 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 { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { Context } from '../../../../../core/shared/context.model'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { Observable } from 'rxjs'; 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 { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; import { Item } from '../../../../../core/shared/item.model'; import { SearchResultListElementComponent @@ -29,21 +20,8 @@ import { } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; 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 { 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(WorkspaceItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) @Component({ selector: 'ds-workflow-item-search-result-admin-workflow-list-element', styleUrls: ['./workflow-item-search-result-admin-workflow-list-element.component.scss'], @@ -59,25 +37,9 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S */ public item$: Observable; - /** - * The id of the item linked to the workflow item - */ - public itemId: string; - - /** - * The supervision orders linked to the workflow item - */ - public supervisionOrder$: BehaviorSubject = new BehaviorSubject([]); - - private messagePrefix = 'workflow-item.search.result'; - constructor(private linkService: LinkService, - protected dsoNameService: DSONameService, - protected modalService: NgbModal, - protected notificationsService: NotificationsService, - protected supervisionOrderDataService: SupervisionOrderDataService, - protected translateService: TranslateService, protected truncatableService: TruncatableService, + protected dsoNameService: DSONameService, @Inject(APP_CONFIG) protected appConfig: AppConfig ) { super(truncatableService, dsoNameService, appConfig); @@ -90,77 +52,5 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S super.ngOnInit(); this.dso = this.linkService.resolveLink(this.dso, followLink('item')); this.item$ = (this.dso.item as Observable>).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 { - return this.supervisionOrderDataService.searchByItem( - itemId, false, true, followLink('group') - ).pipe( - getFirstCompletedRemoteData(), - map((soRD: RemoteData>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : []) - ); } } diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.html b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.html new file mode 100644 index 0000000000..ed877706c6 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.html @@ -0,0 +1,13 @@ +{{ "admin.workflow.item.workspace" | translate }} + + + diff --git a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.scss b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.scss similarity index 100% rename from src/app/shared/object-list/supervision-order-status/supervision-order-status.component.scss rename to src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.scss diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.spec.ts new file mode 100644 index 0000000000..19eefc9c48 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.spec.ts @@ -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; + 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); + }); +}); diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.ts new file mode 100644 index 0000000000..597ed8bbe7 --- /dev/null +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workspace-item/workspace-item-search-result-admin-workflow-list-element.component.ts @@ -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 implements OnInit { + + /** + * The item linked to the workflow item + */ + public item$: Observable; + + /** + * The id of the item linked to the workflow item + */ + public itemId: string; + + /** + * The supervision orders linked to the workflow item + */ + public supervisionOrder$: BehaviorSubject = new BehaviorSubject([]); + + 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>).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 { + return this.supervisionOrderDataService.searchByItem( + itemId, false, true, followLink('group') + ).pipe( + getFirstCompletedRemoteData(), + map((soRD: RemoteData>) => soRD.hasSucceeded && !soRD.hasNoContent ? soRD.payload.page : []) + ); + } + + /** + * Reload list element after supervision order change. + */ + reloadObject(dso: DSpaceObject) { + this.reloadedObject.emit(dso); + } + +} diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.ts deleted file mode 100644 index 924f24e738..0000000000 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.ts +++ /dev/null @@ -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 { - 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; - }); - } -} diff --git a/src/app/admin/admin-workflow-page/admin-workflow.module.ts b/src/app/admin/admin-workflow-page/admin-workflow.module.ts index 85e8f00a46..21990c1ea9 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow.module.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow.module.ts @@ -1,16 +1,39 @@ 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 { WorkflowItemAdminWorkflowActionsComponent } from './admin-workflow-search-results/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 { 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 { + 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 { 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 = [ // put only entry components that use custom decorator WorkflowItemSearchResultAdminWorkflowListElementComponent, WorkflowItemSearchResultAdminWorkflowGridElementComponent, + WorkspaceItemSearchResultAdminWorkflowListElementComponent, + WorkspaceItemSearchResultAdminWorkflowGridElementComponent ]; @NgModule({ @@ -20,7 +43,10 @@ const ENTRY_COMPONENTS = [ ], declarations: [ AdminWorkflowPageComponent, + SupervisionOrderGroupSelectorComponent, + SupervisionOrderStatusComponent, WorkflowItemAdminWorkflowActionsComponent, + WorkspaceItemAdminWorkflowActionsComponent, ...ENTRY_COMPONENTS ], exports: [ diff --git a/src/app/process-page/detail/process-detail.component.ts b/src/app/process-page/detail/process-detail.component.ts index 9d92dece61..2e7dea5def 100644 --- a/src/app/process-page/detail/process-detail.component.ts +++ b/src/app/process-page/detail/process-detail.component.ts @@ -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. */ showProcessOutputLogs() { - console.log('showProcessOutputLogs'); this.retrievingOutputLogs$.next(true); this.zone.runOutsideAngular(() => { const processOutputRD$: Observable> = this.processRD$.pipe( diff --git a/src/app/shared/form/eperson-group-list/eperson-group-list.component.html b/src/app/shared/eperson-group-list/eperson-group-list.component.html similarity index 100% rename from src/app/shared/form/eperson-group-list/eperson-group-list.component.html rename to src/app/shared/eperson-group-list/eperson-group-list.component.html diff --git a/src/app/shared/eperson-group-list/eperson-group-list.component.scss b/src/app/shared/eperson-group-list/eperson-group-list.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/form/eperson-group-list/eperson-group-list.component.spec.ts b/src/app/shared/eperson-group-list/eperson-group-list.component.spec.ts similarity index 89% rename from src/app/shared/form/eperson-group-list/eperson-group-list.component.spec.ts rename to src/app/shared/eperson-group-list/eperson-group-list.component.spec.ts index 399080c0ef..8c5fc88137 100644 --- a/src/app/shared/form/eperson-group-list/eperson-group-list.component.spec.ts +++ b/src/app/shared/eperson-group-list/eperson-group-list.component.spec.ts @@ -6,21 +6,21 @@ import { TranslateModule } from '@ngx-translate/core'; import { cold } from 'jasmine-marbles'; import uniqueId from 'lodash/uniqueId'; -import { createSuccessfulRemoteDataObject } from '../../remote-data.utils'; -import { createTestComponent } from '../../testing/utils.test'; -import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; -import { GroupDataService } from '../../../core/eperson/group-data.service'; -import { RequestService } from '../../../core/data/request.service'; -import { getMockRequestService } from '../../mocks/request.service.mock'; +import { createSuccessfulRemoteDataObject } from '../remote-data.utils'; +import { createTestComponent } from '../testing/utils.test'; +import { EPersonDataService } from '../../core/eperson/eperson-data.service'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { RequestService } from '../../core/data/request.service'; +import { getMockRequestService } from '../mocks/request.service.mock'; import { EpersonGroupListComponent, SearchEvent } from './eperson-group-list.component'; -import { EPersonMock } from '../../testing/eperson.mock'; -import { GroupMock } from '../../testing/group-mock'; -import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; -import { buildPaginatedList } from '../../../core/data/paginated-list.model'; -import { PageInfo } from '../../../core/shared/page-info.model'; +import { EPersonMock } from '../testing/eperson.mock'; +import { GroupMock } from '../testing/group-mock'; +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; +import { buildPaginatedList } from '../../core/data/paginated-list.model'; +import { PageInfo } from '../../core/shared/page-info.model'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { PaginationServiceStub } from '../../testing/pagination-service.stub'; +import { PaginationService } from '../../core/pagination/pagination.service'; +import { PaginationServiceStub } from '../testing/pagination-service.stub'; describe('EpersonGroupListComponent test suite', () => { let comp: EpersonGroupListComponent; diff --git a/src/app/shared/form/eperson-group-list/eperson-group-list.component.ts b/src/app/shared/eperson-group-list/eperson-group-list.component.ts similarity index 81% rename from src/app/shared/form/eperson-group-list/eperson-group-list.component.ts rename to src/app/shared/eperson-group-list/eperson-group-list.component.ts index e2b56859dc..7cad7a9783 100644 --- a/src/app/shared/form/eperson-group-list/eperson-group-list.component.ts +++ b/src/app/shared/eperson-group-list/eperson-group-list.component.ts @@ -4,22 +4,22 @@ import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import uniqueId from 'lodash/uniqueId'; -import { RemoteData } from '../../../core/data/remote-data'; -import { PaginatedList } from '../../../core/data/paginated-list.model'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; -import { hasValue, isNotEmpty } from '../../empty.util'; -import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; -import { EPERSON } from '../../../core/eperson/models/eperson.resource-type'; -import { GROUP } from '../../../core/eperson/models/group.resource-type'; -import { ResourceType } from '../../../core/shared/resource-type'; -import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; -import { GroupDataService } from '../../../core/eperson/group-data.service'; -import { fadeInOut } from '../../animations/fade'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { FindListOptions } from '../../../core/data/find-list-options.model'; -import { getDataServiceFor } from '../../../core/data/base/data-service.decorator'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; +import { hasValue, isNotEmpty } from '../empty.util'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; +import { EPERSON } from '../../core/eperson/models/eperson.resource-type'; +import { GROUP } from '../../core/eperson/models/group.resource-type'; +import { ResourceType } from '../../core/shared/resource-type'; +import { EPersonDataService } from '../../core/eperson/eperson-data.service'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { fadeInOut } from '../animations/fade'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { PaginationService } from '../../core/pagination/pagination.service'; +import { FindListOptions } from '../../core/data/find-list-options.model'; +import { getDataServiceFor } from '../../core/data/base/data-service.decorator'; export interface SearchEvent { scope: string; diff --git a/src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.html b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.html similarity index 100% rename from src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.html rename to src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.html diff --git a/src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts similarity index 97% rename from src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts rename to src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts index db16af5edf..5a9e74055a 100644 --- a/src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts +++ b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.spec.ts @@ -4,7 +4,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; 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 { SearchEvent } from '../eperson-group-list.component'; diff --git a/src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.ts b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts similarity index 96% rename from src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.ts rename to src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts index 6ae3200d0b..2aa4891c03 100644 --- a/src/app/shared/form/eperson-group-list/eperson-search-box/eperson-search-box.component.ts +++ b/src/app/shared/eperson-group-list/eperson-search-box/eperson-search-box.component.ts @@ -4,7 +4,7 @@ import { FormBuilder } from '@angular/forms'; import { Subscription } from 'rxjs'; 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. diff --git a/src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.html b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.html similarity index 100% rename from src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.html rename to src/app/shared/eperson-group-list/group-search-box/group-search-box.component.html diff --git a/src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.spec.ts b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts similarity index 97% rename from src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.spec.ts rename to src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts index 17e96fc71c..d28a144245 100644 --- a/src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.spec.ts +++ b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.spec.ts @@ -4,7 +4,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; 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 { SearchEvent } from '../eperson-group-list.component'; diff --git a/src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.ts b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts similarity index 96% rename from src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.ts rename to src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts index ad181bdb64..3e45bb0336 100644 --- a/src/app/shared/form/eperson-group-list/group-search-box/group-search-box.component.ts +++ b/src/app/shared/eperson-group-list/group-search-box/group-search-box.component.ts @@ -4,7 +4,7 @@ import { FormBuilder } from '@angular/forms'; import { Subscription } from 'rxjs'; 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. diff --git a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.html b/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.html deleted file mode 100644 index 2e4f8d39cd..0000000000 --- a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.html +++ /dev/null @@ -1,13 +0,0 @@ - -
-
- {{'workflow-item.search.result.list.element.supervised-by' | translate}} -
-
- - {{supervisionOrder.group.name}} - X - -
-
-
diff --git a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.spec.ts b/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.spec.ts deleted file mode 100644 index 9a5516b8e9..0000000000 --- a/src/app/shared/object-list/supervision-order-status/supervision-order-status.component.spec.ts +++ /dev/null @@ -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; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ SupervisionOrderStatusComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(SupervisionOrderStatusComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts index 1a84270f1b..1cc908cc6d 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts @@ -24,9 +24,9 @@ import { ResourcePolicyEvent, ResourcePolicyFormComponent } from './resource-pol import { FormService } from '../../form/form.service'; import { getMockFormService } from '../../mocks/form-service.mock'; 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 { stringToNgbDateStruct, dateToISOFormat } from '../../date.util'; +import { dateToISOFormat, stringToNgbDateStruct } from '../../date.util'; import { ResourcePolicy } from '../../../core/resource-policy/models/resource-policy.model'; import { RESOURCE_POLICY } from '../../../core/resource-policy/models/resource-policy.resource-type'; import { EPersonMock } from '../../testing/eperson.mock'; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c2e5600604..751075ae5f 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -84,8 +84,9 @@ import { LangSwitchComponent } from './lang-switch/lang-switch.component'; import { PlainTextMetadataListElementComponent } from './object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component'; -import { BrowseLinkMetadataListElementComponent } - from './object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component'; +import { + BrowseLinkMetadataListElementComponent +} from './object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component'; import { ItemMetadataListElementComponent } 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 { MetadataFieldWrapperComponent } from './metadata-field-wrapper/metadata-field-wrapper.component'; import { ShortNumberPipe } from './utils/short-number.pipe'; -import { 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 { + 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 { AdvancedClaimedTaskActionRatingComponent } 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 { - SupervisionOrderStatusComponent -} from './object-list/supervision-order-status/supervision-order-status.component'; -import { - SupervisionGroupSelectorComponent -} from './dso-selector/modal-wrappers/supervision-group-selector/supervision-group-selector.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'; + ClaimedTaskActionsDeclineTaskComponent +} from './mydspace-actions/claimed-task/decline-task/claimed-task-actions-decline-task.component'; +import { EpersonGroupListComponent } from './eperson-group-list/eperson-group-list.component'; +import { EpersonSearchBoxComponent } from './eperson-group-list/eperson-search-box/eperson-search-box.component'; +import { GroupSearchBoxComponent } from './eperson-group-list/group-search-box/group-search-box.component'; const MODULES = [ CommonModule, @@ -364,9 +365,7 @@ const COMPONENTS = [ ContextHelpWrapperComponent, EpersonGroupListComponent, EpersonSearchBoxComponent, - GroupSearchBoxComponent, - SupervisionGroupSelectorComponent, - SupervisionOrderStatusComponent + GroupSearchBoxComponent ]; const ENTRY_COMPONENTS = [ @@ -427,8 +426,7 @@ const ENTRY_COMPONENTS = [ AdvancedClaimedTaskActionRatingComponent, EpersonGroupListComponent, EpersonSearchBoxComponent, - GroupSearchBoxComponent, - SupervisionGroupSelectorComponent + GroupSearchBoxComponent ]; const PROVIDERS = [ diff --git a/src/app/shared/testing/supervision-order.mock.ts b/src/app/shared/testing/supervision-order.mock.ts new file mode 100644 index 0000000000..850486016d --- /dev/null +++ b/src/app/shared/testing/supervision-order.mock.ts @@ -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); diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 70bd245ea5..37554b3da7 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3745,6 +3745,8 @@ "search.filters.applied.f.birthDate.min": "Start birth date", + "search.filters.applied.f.supervisedBy": "Supervised by", + "search.filters.applied.f.withdrawn": "Withdrawn",