From 6e49ef68592020971d162fb2f8ac488bd08458ee Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 1 Apr 2020 17:04:54 +0200 Subject: [PATCH 01/14] start of admin workflow ui --- src/app/+admin/admin-routing.module.ts | 14 +- .../admin-sidebar/admin-sidebar.component.ts | 13 ++ .../admin-workflow-page.component.html | 3 + .../admin-workflow-page.component.scss | 0 .../admin-workflow-page.component.spec.ts | 27 ++++ .../admin-workflow-page.component.ts | 18 +++ ...-search-result-grid-element.component.html | 15 ++ ...-search-result-grid-element.component.scss | 0 ...arch-result-grid-element.component.spec.ts | 121 +++++++++++++++ ...ow-search-result-grid-element.component.ts | 75 +++++++++ ...-search-result-list-element.component.html | 12 ++ ...-search-result-list-element.component.scss | 0 ...arch-result-list-element.component.spec.ts | 101 ++++++++++++ ...ow-search-result-list-element.component.ts | 20 +++ ...kflow-search-result-actions.component.html | 7 + ...kflow-search-result-actions.component.scss | 1 + ...ow-search-result-actions.component.spec.ts | 144 ++++++++++++++++++ ...orkflow-search-result-actions.component.ts | 46 ++++++ src/app/+admin/admin.module.ts | 17 ++- .../+login-page/login-page-routing.module.ts | 5 + .../search-page-routing.module.ts | 2 + src/app/+search-page/search-page.module.ts | 4 - src/app/app-routing.module.ts | 2 +- src/app/core/shared/context.model.ts | 1 + 24 files changed, 639 insertions(+), 9 deletions(-) create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-page.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-page.component.scss create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-page.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.scss create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts diff --git a/src/app/+admin/admin-routing.module.ts b/src/app/+admin/admin-routing.module.ts index b4a68d692a..c3732c1ba7 100644 --- a/src/app/+admin/admin-routing.module.ts +++ b/src/app/+admin/admin-routing.module.ts @@ -4,6 +4,8 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getAdminModulePath } from '../app-routing.module'; import { AdminSearchPageComponent } from './admin-search-page/admin-search-page.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; +import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; const REGISTRIES_MODULE_PATH = 'registries'; const ACCESS_CONTROL_MODULE_PATH = 'access-control'; @@ -26,10 +28,18 @@ export function getRegistriesModulePath() { { path: 'search', resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: AdminSearchPageComponent, - data: { title: 'admin.search.title', breadcrumbKey: 'admin.search' } + component: AdminWorkflowPageComponent, + data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' } }, + { + path: 'workflow', + component: AdminSearchPageComponent, + } ]) + ], + providers: [ + I18nBreadcrumbResolver, + I18nBreadcrumbsService ] }) export class AdminRoutingModule { diff --git a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts index e3f55b8e18..e86287f85d 100644 --- a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts @@ -439,6 +439,19 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { icon: 'cogs', index: 9 }, + /* Workflow */ + { + id: 'workflow', + active: false, + visible: true, + model: { + type: MenuItemType.LINK, + text: 'menu.section.workflow', + link: '/admin/worklow' + } as LinkMenuItemModel, + icon: 'user-check', + index: 10 + }, ]; menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, menuSection)); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html new file mode 100644 index 0000000000..47906405d9 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html @@ -0,0 +1,3 @@ +BLABLABALAB + + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.spec.ts new file mode 100644 index 0000000000..d329497473 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdminWorkflowPageComponent } from './admin-workflow-page.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; + +describe('AdminSearchPageComponent', () => { + let component: AdminWorkflowPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminWorkflowPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminWorkflowPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts new file mode 100644 index 0000000000..37ddc70692 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import { Context } from '../../core/shared/context.model'; + +@Component({ + selector: 'ds-admin-workflow-page', + templateUrl: './admin-workflow-page.component.html', + styleUrls: ['./admin-workflow-page.component.scss'] +}) + +/** + * Component that represents a search page for administrators + */ +export class AdminWorkflowPageComponent { + /** + * The context of this page + */ + context: Context = Context.AdminWorkflowSearch; +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html new file mode 100644 index 0000000000..1b8daaaff0 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html @@ -0,0 +1,15 @@ + + +
+
+ {{ "admin.search.item.private" | translate }} +
+
+ {{ "admin.search.item.withdrawn" | translate }} +
+
+ diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts new file mode 100644 index 0000000000..7036e5c5ac --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts @@ -0,0 +1,121 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TranslateModule } from '@ngx-translate/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { Bitstream } from '../../../../../core/shared/bitstream.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service'; +import { SharedModule } from '../../../../../shared/shared.module'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; +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 { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { ItemAdminWorkflowSearchResultGridElementComponent } from './item-admin-workflow-search-result-grid-element.component'; + +describe('ItemAdminSearchResultGridElementComponent', () => { + let component: ItemAdminWorkflowSearchResultGridElementComponent; + let fixture: ComponentFixture; + let id; + let searchResult; + + const mockBitstreamDataService = { + getThumbnailFor(item: Item): Observable> { + return createSuccessfulRemoteDataObject$(new Bitstream()); + } + }; + + function init() { + id = '780b2588-bda5-4112-a1cd-0b15000a5339'; + searchResult = new ItemSearchResult(); + searchResult.indexableObject = new Item(); + searchResult.indexableObject.uuid = id; + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule( + { + declarations: [ItemAdminWorkflowSearchResultGridElementComponent], + imports: [ + NoopAnimationsModule, + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]), + SharedModule + ], + providers: [ + { provide: TruncatableService, useValue: mockTruncatableService }, + { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultGridElementComponent); + component = fixture.componentInstance; + component.object = searchResult; + component.linkTypes = CollectionElementLinkType; + component.index = 0; + component.viewModes = ViewMode; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('when the item is not withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = false; + fixture.detectChanges(); + }); + + it('should not show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = true; + fixture.detectChanges(); + }); + + it('should show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).not.toBeNull(); + }); + }); + + describe('when the item is not private', () => { + beforeEach(() => { + component.dso.isDiscoverable = true; + fixture.detectChanges(); + }); + it('should not show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is private', () => { + beforeEach(() => { + component.dso.isDiscoverable = false; + fixture.detectChanges(); + }); + + it('should show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).not.toBeNull(); + }); + }) +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts new file mode 100644 index 0000000000..9b3ed12a24 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts @@ -0,0 +1,75 @@ +import { Component, ComponentFactoryResolver, ElementRef, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; +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 { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { getItemEditPath } from '../../../../../+item-page/item-page-routing.module'; +import { URLCombiner } from '../../../../../core/url-combiner/url-combiner'; +import { + ITEM_EDIT_DELETE_PATH, + ITEM_EDIT_MOVE_PATH, + ITEM_EDIT_PRIVATE_PATH, + ITEM_EDIT_PUBLIC_PATH, + ITEM_EDIT_REINSTATE_PATH, + ITEM_EDIT_WITHDRAW_PATH +} from '../../../../../+item-page/edit-item-page/edit-item-page.routing.module'; +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'; + +@listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) +@Component({ + selector: 'ds-item-admin-workflow-search-result-grid-element', + styleUrls: ['./item-admin-workflow-search-result-grid-element.component.scss'], + templateUrl: './item-admin-workflow-search-result-grid-element.component.html' +}) +/** + * The component for displaying a list element for an item search result on the admin search page + */ +export class ItemAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent implements OnInit { + @ViewChild(ListableObjectDirective, { static: true }) listableObjectDirective: ListableObjectDirective; + @ViewChild('badges', { static: true }) badges: ElementRef; + @ViewChild('buttons', { static: true }) buttons: ElementRef; + + constructor(protected truncatableService: TruncatableService, + protected bitstreamDataService: BitstreamDataService, + private componentFactoryResolver: ComponentFactoryResolver + ) { + super(truncatableService, bitstreamDataService); + } + + /** + * Setup the dynamic child component + */ + ngOnInit(): void { + super.ngOnInit(); + const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent()); + + 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 = this.object; + (componentRef.instance as any).index = this.index; + (componentRef.instance as any).linkType = this.linkType; + (componentRef.instance as any).listID = this.listID; + } + + /** + * Fetch the component depending on the item's relationship type, view mode and context + * @returns {GenericConstructor} + */ + private getComponent(): GenericConstructor { + return getListableObjectComponent(this.object.getRenderTypes(), ViewMode.GridElement, undefined) + } +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html new file mode 100644 index 0000000000..14e6c1bcd1 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html @@ -0,0 +1,12 @@ +
+ {{ "admin.search.item.private" | translate }} +
+
+ {{ "admin.search.item.withdrawn" | translate }} +
+ + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts new file mode 100644 index 0000000000..595a36a5b3 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts @@ -0,0 +1,101 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +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 { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { ItemAdminWorkflowSearchResultListElementComponent } from './item-admin-workflow-search-result-list-element.component'; +import { Item } from '../../../../../core/shared/item.model'; + +describe('ItemAdminSearchResultListElementComponent', () => { + let component: ItemAdminWorkflowSearchResultListElementComponent; + let fixture: ComponentFixture; + let id; + let searchResult; + + function init() { + id = '780b2588-bda5-4112-a1cd-0b15000a5339'; + searchResult = new ItemSearchResult(); + searchResult.indexableObject = new Item(); + searchResult.indexableObject.uuid = id; + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]) + ], + declarations: [ItemAdminWorkflowSearchResultListElementComponent], + providers: [{ provide: TruncatableService, useValue: {} }], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultListElementComponent); + component = fixture.componentInstance; + component.object = searchResult; + component.linkTypes = CollectionElementLinkType; + component.index = 0; + component.viewModes = ViewMode; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('when the item is not withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = false; + fixture.detectChanges(); + }); + + it('should not show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = true; + fixture.detectChanges(); + }); + + it('should show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).not.toBeNull(); + }); + }); + + describe('when the item is not private', () => { + beforeEach(() => { + component.dso.isDiscoverable = true; + fixture.detectChanges(); + }); + it('should not show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is private', () => { + beforeEach(() => { + component.dso.isDiscoverable = false; + fixture.detectChanges(); + }); + + it('should show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).not.toBeNull(); + }); + }) +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts new file mode 100644 index 0000000000..9550028919 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; +import { Item } from '../../../../../core/shared/item.model'; +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 { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; + +@listableObjectComponent(ItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) +@Component({ + selector: 'ds-item-admin-workflow-search-result-list-element', + styleUrls: ['./item-admin-workflow-search-result-list-element.component.scss'], + templateUrl: './item-admin-workflow-search-result-list-element.component.html' +}) +/** + * The component for displaying a list element for an item search result on the admin search page + */ +export class ItemAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent { + +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html new file mode 100644 index 0000000000..3f80b127a8 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html @@ -0,0 +1,7 @@ + + {{"admin.search.item.delete" | translate}} + + + + {{"admin.search.item.send-back" | translate}} + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss @@ -0,0 +1 @@ + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts new file mode 100644 index 0000000000..c1d42341bc --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts @@ -0,0 +1,144 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +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 { ItemAdminWorkflowSearchResultActionsComponent } from './item-admin-workflow-search-result-actions.component'; +import { Item } from '../../../core/shared/item.model'; +import { + ITEM_EDIT_DELETE_PATH, + ITEM_EDIT_MOVE_PATH, + ITEM_EDIT_PRIVATE_PATH, + ITEM_EDIT_PUBLIC_PATH, + ITEM_EDIT_REINSTATE_PATH, + ITEM_EDIT_WITHDRAW_PATH +} from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; +import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; +import { URLCombiner } from '../../../core/url-combiner/url-combiner'; + +describe('ItemAdminSearchResultActionsComponent', () => { + let component: ItemAdminWorkflowSearchResultActionsComponent; + let fixture: ComponentFixture; + let id; + let item; + + function init() { + id = '780b2588-bda5-4112-a1cd-0b15000a5339'; + item = new Item(); + item.uuid = id; + } + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]) + ], + declarations: [ItemAdminWorkflowSearchResultActionsComponent], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultActionsComponent); + component = fixture.componentInstance; + component.item = item; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should render an edit button with the correct link', () => { + const button = fixture.debugElement.query(By.css('a.edit-link')); + const link = button.nativeElement.href; + expect(link).toContain(getItemEditPath(id)); + }); + + 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(getItemEditPath(id), ITEM_EDIT_DELETE_PATH).toString()); + }); + + it('should render a move button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.move-link')); + const link = a.nativeElement.href; + expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_MOVE_PATH).toString()); + }); + + describe('when the item is not withdrawn', () => { + beforeEach(() => { + component.item.isWithdrawn = false; + fixture.detectChanges(); + }); + + it('should render a withdraw button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.withdraw-link')); + const link = a.nativeElement.href; + expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_WITHDRAW_PATH).toString()); + }); + + it('should not render a reinstate button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.reinstate-link')); + expect(a).toBeNull(); + }); + }); + + describe('when the item is withdrawn', () => { + beforeEach(() => { + component.item.isWithdrawn = true; + fixture.detectChanges(); + }); + + it('should not render a withdraw button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.withdraw-link')); + expect(a).toBeNull(); + }); + + it('should render a reinstate button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.reinstate-link')); + const link = a.nativeElement.href; + expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_REINSTATE_PATH).toString()); + }); + }); + + describe('when the item is not private', () => { + beforeEach(() => { + component.item.isDiscoverable = true; + fixture.detectChanges(); + }); + + it('should render a make private button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.private-link')); + const link = a.nativeElement.href; + expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_PRIVATE_PATH).toString()); + }); + + it('should not render a make public button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.public-link')); + expect(a).toBeNull(); + }); + }); + + describe('when the item is private', () => { + beforeEach(() => { + component.item.isDiscoverable = false; + fixture.detectChanges(); + }); + + it('should not render a make private button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.private-link')); + expect(a).toBeNull(); + }); + + it('should render a make private button with the correct link', () => { + const a = fixture.debugElement.query(By.css('a.public-link')); + const link = a.nativeElement.href; + expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_PUBLIC_PATH).toString()); + }); + }) +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts new file mode 100644 index 0000000000..3dc7b96391 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts @@ -0,0 +1,46 @@ +import { Component, Input } from '@angular/core'; +import { Item } from '../../../core/shared/item.model'; +import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; +import { URLCombiner } from '../../../core/url-combiner/url-combiner'; +import { + ITEM_EDIT_DELETE_PATH, + ITEM_EDIT_MOVE_PATH, + ITEM_EDIT_PRIVATE_PATH, + ITEM_EDIT_PUBLIC_PATH, + ITEM_EDIT_REINSTATE_PATH, + ITEM_EDIT_WITHDRAW_PATH +} from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; + +@Component({ + selector: 'ds-item-admin-workflow-search-result-actions-element', + styleUrls: ['./item-admin-workflow-search-result-actions.component.scss'], + templateUrl: './item-admin-workflow-search-result-actions.component.html' +}) +/** + * The component for displaying the actions for a list element for an item search result on the admin search page + */ +export class ItemAdminWorkflowSearchResultActionsComponent { + /** + * The item to perform the actions on + */ + @Input() public item: Item; + + /** + * Whether or not to use small buttons + */ + @Input() public small: boolean; + + /** + * Returns the path to the edit page of this item + */ + getEditPath(): string { + return getItemEditPath(this.item.uuid) + } + + /** + * Returns the path to the withdraw page of this item + */ + getWithdrawPath(): string { + return new URLCombiner(this.getEditPath(), ITEM_EDIT_WITHDRAW_PATH).toString(); + } +} diff --git a/src/app/+admin/admin.module.ts b/src/app/+admin/admin.module.ts index fa2480a6ad..d29d876d02 100644 --- a/src/app/+admin/admin.module.ts +++ b/src/app/+admin/admin.module.ts @@ -12,6 +12,10 @@ import { ItemAdminSearchResultGridElementComponent } from './admin-search-page/a import { CommunityAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component'; import { CollectionAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component'; import { ItemAdminSearchResultActionsComponent } from './admin-search-page/admin-search-results/item-admin-search-result-actions.component'; +import { ItemAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component'; +import { ItemAdminWorkflowSearchResultActionsComponent } from './admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component'; +import { ItemAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component'; +import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; @NgModule({ imports: [ @@ -23,13 +27,18 @@ import { ItemAdminSearchResultActionsComponent } from './admin-search-page/admin ], declarations: [ AdminSearchPageComponent, + AdminWorkflowPageComponent, ItemAdminSearchResultListElementComponent, CommunityAdminSearchResultListElementComponent, CollectionAdminSearchResultListElementComponent, ItemAdminSearchResultGridElementComponent, CommunityAdminSearchResultGridElementComponent, CollectionAdminSearchResultGridElementComponent, - ItemAdminSearchResultActionsComponent + ItemAdminSearchResultActionsComponent, + + ItemAdminWorkflowSearchResultListElementComponent, + ItemAdminWorkflowSearchResultGridElementComponent, + ItemAdminWorkflowSearchResultActionsComponent, ], entryComponents: [ ItemAdminSearchResultListElementComponent, @@ -38,7 +47,11 @@ import { ItemAdminSearchResultActionsComponent } from './admin-search-page/admin ItemAdminSearchResultGridElementComponent, CommunityAdminSearchResultGridElementComponent, CollectionAdminSearchResultGridElementComponent, - ItemAdminSearchResultActionsComponent + ItemAdminSearchResultActionsComponent, + + ItemAdminWorkflowSearchResultListElementComponent, + ItemAdminWorkflowSearchResultGridElementComponent, + ItemAdminWorkflowSearchResultActionsComponent, ] }) export class AdminModule { diff --git a/src/app/+login-page/login-page-routing.module.ts b/src/app/+login-page/login-page-routing.module.ts index cd023da55c..9fa4a9e5ad 100644 --- a/src/app/+login-page/login-page-routing.module.ts +++ b/src/app/+login-page/login-page-routing.module.ts @@ -3,12 +3,17 @@ import { RouterModule } from '@angular/router'; import { LoginPageComponent } from './login-page.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; @NgModule({ imports: [ RouterModule.forChild([ { path: '', pathMatch: 'full', component: LoginPageComponent, resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { breadcrumbKey: 'login', title: 'login.title' } } ]) + ], + providers: [ + I18nBreadcrumbResolver, + I18nBreadcrumbsService ] }) export class LoginPageRoutingModule { diff --git a/src/app/+search-page/search-page-routing.module.ts b/src/app/+search-page/search-page-routing.module.ts index 6e36883394..f71c7b45ee 100644 --- a/src/app/+search-page/search-page-routing.module.ts +++ b/src/app/+search-page/search-page-routing.module.ts @@ -6,9 +6,11 @@ import { ConfigurationSearchPageComponent } from './configuration-search-page.co import { SearchPageComponent } from './search-page.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; +import { SearchPageModule } from './search-page.module'; @NgModule({ imports: [ + SearchPageModule, RouterModule.forChild([{ path: '', resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { title: 'search.title', breadcrumbKey: 'search' }, diff --git a/src/app/+search-page/search-page.module.ts b/src/app/+search-page/search-page.module.ts index b69dcaf935..00c990c665 100644 --- a/src/app/+search-page/search-page.module.ts +++ b/src/app/+search-page/search-page.module.ts @@ -2,10 +2,8 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { CoreModule } from '../core/core.module'; import { SharedModule } from '../shared/shared.module'; -import { SearchPageRoutingModule } from './search-page-routing.module'; import { SearchComponent } from './search.component'; import { SidebarService } from '../shared/sidebar/sidebar.service'; -import { EffectsModule } from '@ngrx/effects'; import { ConfigurationSearchPageComponent } from './configuration-search-page.component'; import { ConfigurationSearchPageGuard } from './configuration-search-page.guard'; import { SearchTrackerComponent } from './search-tracker.component'; @@ -14,7 +12,6 @@ import { SearchPageComponent } from './search-page.component'; import { SidebarFilterService } from '../shared/sidebar/filter/sidebar-filter.service'; import { SearchFilterService } from '../core/shared/search/search-filter.service'; import { SearchConfigurationService } from '../core/shared/search/search-configuration.service'; -import { TranslateModule } from '@ngx-translate/core'; const components = [ SearchPageComponent, @@ -25,7 +22,6 @@ const components = [ @NgModule({ imports: [ - SearchPageRoutingModule, CommonModule, SharedModule, CoreModule.forRoot(), diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 2927cd4e65..06811abd08 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -68,7 +68,7 @@ export function getDSOPath(dso: DSpaceObject): string { loadChildren: './+my-dspace-page/my-dspace-page.module#MyDSpacePageModule', canActivate: [AuthenticatedGuard] }, - { path: 'search', loadChildren: './+search-page/search-page.module#SearchPageModule' }, + { path: 'search', loadChildren: './+search-page/search-page-routing.module#SearchPageRoutingModule' }, { path: 'browse', loadChildren: './+browse-by/browse-by.module#BrowseByModule'}, { path: ADMIN_MODULE_PATH, loadChildren: './+admin/admin.module#AdminModule', canActivate: [AuthenticatedGuard] }, { path: 'login', loadChildren: './+login-page/login-page.module#LoginPageModule' }, diff --git a/src/app/core/shared/context.model.ts b/src/app/core/shared/context.model.ts index 6bb3d77140..ff24b7d090 100644 --- a/src/app/core/shared/context.model.ts +++ b/src/app/core/shared/context.model.ts @@ -11,4 +11,5 @@ export enum Context { AdminMenu = 'adminMenu', SubmissionModal = 'submissionModal', AdminSearch = 'adminSearch', + AdminWorkflowSearch = 'adminWorkflowSearch', } From 258b1228f317e8392758efb5f0211b6df0a209d2 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 2 Apr 2020 17:05:46 +0200 Subject: [PATCH 02/14] replaced wfi components by task components that render wfi's --- resources/i18n/en.json5 | 14 ++ src/app/+admin/admin-routing.module.ts | 10 +- .../admin-sidebar/admin-sidebar.component.ts | 2 +- .../admin-workflow-page.component.html | 4 +- ...-search-result-grid-element.component.html | 15 --- ...-search-result-grid-element.component.html | 6 + ...search-result-grid-element.component.scss} | 0 ...arch-result-grid-element.component.spec.ts | 121 ++++++++++++++++++ ...ow-search-result-grid-element.component.ts | 45 +++++++ ...admin-workflow-grid-element.component.html | 12 ++ ...dmin-workflow-grid-element.component.scss} | 0 ...n-workflow-grid-element.component.spec.ts} | 10 +- ...-admin-workflow-grid-element.component.ts} | 21 ++- ...-search-result-list-element.component.html | 12 -- ...ow-search-result-list-element.component.ts | 20 --- ...-search-result-list-element.component.html | 6 + ...-search-result-list-element.component.scss | 0 ...arch-result-list-element.component.spec.ts | 101 +++++++++++++++ ...ow-search-result-list-element.component.ts | 29 +++++ ...admin-workflow-list-element.component.html | 9 ++ ...admin-workflow-list-element.component.scss | 0 ...n-workflow-list-element.component.spec.ts} | 10 +- ...m-admin-workflow-list-element.component.ts | 19 +++ ...orkflow-search-result-actions.component.ts | 46 ------- ...tem-admin-workflow-actions.component.html} | 0 ...tem-admin-workflow-actions.component.scss} | 0 ...-admin-workflow-actions.component.spec.ts} | 2 +- ...w-item-admin-workflow-actions.component.ts | 39 ++++++ src/app/+admin/admin.module.ts | 26 ++-- .../workflow-item-delete.component.html | 1 + .../workflow-item-delete.component.scss | 0 .../workflow-item-delete.component.spec.ts | 25 ++++ .../workflow-item-delete.component.ts | 16 +++ .../workflowitems-edit-page.module.ts | 3 +- 34 files changed, 491 insertions(+), 133 deletions(-) delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{item-search-result/item-admin-workflow-search-result-grid-element.component.scss => pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.scss} (100%) create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/{admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss => admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts => workflow-item/workflow-item-admin-workflow-grid-element.component.spec.ts} (90%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{item-search-result/item-admin-workflow-search-result-grid-element.component.ts => workflow-item/workflow-item-admin-workflow-grid-element.component.ts} (76%) delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.html create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/{item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts => workflow-item/workflow-item-admin-workflow-list-element.component.spec.ts} (87%) create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.ts delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/{item-admin-workflow-search-result-actions.component.html => workflow-item-admin-workflow-actions.component.html} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/{item-admin-workflow-search-result-actions.component.scss => workflow-item-admin-workflow-actions.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/{item-admin-workflow-search-result-actions.component.spec.ts => workflow-item-admin-workflow-actions.component.spec.ts} (98%) create mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.ts create mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html create mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss create mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts create mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5 index 7b814fd5bc..f874a02bdf 100644 --- a/resources/i18n/en.json5 +++ b/resources/i18n/en.json5 @@ -262,6 +262,14 @@ + + "admin.workflow.breadcrumbs": "Admin Workflow", + + "admin.workflow.title": "Admin Workflow", + + + + "auth.errors.invalid-user": "Invalid email address or password.", "auth.messages.expired": "Your session has expired. Please log in again.", @@ -1385,6 +1393,8 @@ "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + "menu.section.workflow": "Active Workflows", + "mydspace.description": "", @@ -2213,5 +2223,9 @@ "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + + "workflowAdmin.search.results.head": "Active Workflows", + + "workflowAdmin.search.results.head": "Active Workflows", } diff --git a/src/app/+admin/admin-routing.module.ts b/src/app/+admin/admin-routing.module.ts index c3732c1ba7..5cb10c38ba 100644 --- a/src/app/+admin/admin-routing.module.ts +++ b/src/app/+admin/admin-routing.module.ts @@ -28,13 +28,15 @@ export function getRegistriesModulePath() { { path: 'search', resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: AdminWorkflowPageComponent, - data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' } + component: AdminSearchPageComponent, + data: { title: 'admin.search.title', breadcrumbKey: 'admin.search' } }, { path: 'workflow', - component: AdminSearchPageComponent, - } + resolve: { breadcrumb: I18nBreadcrumbResolver }, + component: AdminWorkflowPageComponent, + data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' } + }, ]) ], providers: [ diff --git a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts index e86287f85d..e35a63342a 100644 --- a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts @@ -447,7 +447,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { model: { type: MenuItemType.LINK, text: 'menu.section.workflow', - link: '/admin/worklow' + link: '/admin/workflow' } as LinkMenuItemModel, icon: 'user-check', index: 10 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html index 47906405d9..404af131d1 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html +++ b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.html @@ -1,3 +1 @@ -BLABLABALAB - - + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html deleted file mode 100644 index 1b8daaaff0..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.html +++ /dev/null @@ -1,15 +0,0 @@ - - -
-
- {{ "admin.search.item.private" | translate }} -
-
- {{ "admin.search.item.withdrawn" | translate }} -
-
-
    -
  • - -
  • -
diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html new file mode 100644 index 0000000000..c73a5f5a02 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html @@ -0,0 +1,6 @@ + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.scss rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.scss diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.spec.ts new file mode 100644 index 0000000000..33881dfe70 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.spec.ts @@ -0,0 +1,121 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TranslateModule } from '@ngx-translate/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { Bitstream } from '../../../../../core/shared/bitstream.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service'; +import { SharedModule } from '../../../../../shared/shared.module'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; +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 { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { PoolTaskAdminWorkflowSearchResultGridElementComponent } from './pool-task-admin-workflow-search-result-grid-element.component'; + +describe('ItemAdminSearchResultGridElementComponent', () => { + let component: PoolTaskAdminWorkflowSearchResultGridElementComponent; + let fixture: ComponentFixture; + let id; + let searchResult; + + const mockBitstreamDataService = { + getThumbnailFor(item: Item): Observable> { + return createSuccessfulRemoteDataObject$(new Bitstream()); + } + }; + + function init() { + id = '780b2588-bda5-4112-a1cd-0b15000a5339'; + searchResult = new ItemSearchResult(); + searchResult.indexableObject = new Item(); + searchResult.indexableObject.uuid = id; + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule( + { + declarations: [PoolTaskAdminWorkflowSearchResultGridElementComponent], + imports: [ + NoopAnimationsModule, + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]), + SharedModule + ], + providers: [ + { provide: TruncatableService, useValue: mockTruncatableService }, + { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PoolTaskAdminWorkflowSearchResultGridElementComponent); + component = fixture.componentInstance; + component.object = searchResult; + component.linkTypes = CollectionElementLinkType; + component.index = 0; + component.viewModes = ViewMode; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('when the item is not withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = false; + fixture.detectChanges(); + }); + + it('should not show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = true; + fixture.detectChanges(); + }); + + it('should show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).not.toBeNull(); + }); + }); + + describe('when the item is not private', () => { + beforeEach(() => { + component.dso.isDiscoverable = true; + fixture.detectChanges(); + }); + it('should not show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is private', () => { + beforeEach(() => { + component.dso.isDiscoverable = false; + fixture.detectChanges(); + }); + + it('should show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).not.toBeNull(); + }); + }) +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts new file mode 100644 index 0000000000..e386ec45ae --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts @@ -0,0 +1,45 @@ +import { Component, ComponentFactoryResolver, ElementRef, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; +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 { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { getItemEditPath } from '../../../../../+item-page/item-page-routing.module'; +import { URLCombiner } from '../../../../../core/url-combiner/url-combiner'; +import { + ITEM_EDIT_DELETE_PATH, + ITEM_EDIT_MOVE_PATH, + ITEM_EDIT_PRIVATE_PATH, + ITEM_EDIT_PUBLIC_PATH, + ITEM_EDIT_REINSTATE_PATH, + ITEM_EDIT_WITHDRAW_PATH +} from '../../../../../+item-page/edit-item-page/edit-item-page.routing.module'; +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 { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; +import { PoolTask } from '../../../../../core/tasks/models/pool-task-object.model'; +import { Observable } from 'rxjs'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; + +@listableObjectComponent(PoolTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) +@Component({ + selector: 'ds-pool-task-admin-workflow-search-result-grid-element', + styleUrls: ['./pool-task-admin-workflow-search-result-grid-element.component.scss'], + templateUrl: './pool-task-admin-workflow-search-result-grid-element.component.html' +}) +/** + * The component for displaying a list element for an pool task search result on the admin search page + */ +export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent implements OnInit { + public wfi$: Observable; + + ngOnInit(): void { + super.ngOnInit(); + this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); + } +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html new file mode 100644 index 0000000000..6f940d097e --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html @@ -0,0 +1,12 @@ + + +
+
+ {{ "admin.workflow.item.workflow" | translate }} +
+
+
    +
  • + +
  • +
diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.scss rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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/item-search-result/item-admin-workflow-search-result-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-admin-workflow-grid-element.component.spec.ts similarity index 90% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.spec.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.spec.ts index 7036e5c5ac..61bcdde6cf 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-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-admin-workflow-grid-element.component.spec.ts @@ -17,11 +17,11 @@ import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { ItemAdminWorkflowSearchResultGridElementComponent } from './item-admin-workflow-search-result-grid-element.component'; +import { WorkflowItemAdminWorkflowGridElementComponent } from './workflow-item-admin-workflow-grid-element.component'; describe('ItemAdminSearchResultGridElementComponent', () => { - let component: ItemAdminWorkflowSearchResultGridElementComponent; - let fixture: ComponentFixture; + let component: WorkflowItemAdminWorkflowGridElementComponent; + let fixture: ComponentFixture; let id; let searchResult; @@ -42,7 +42,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { init(); TestBed.configureTestingModule( { - declarations: [ItemAdminWorkflowSearchResultGridElementComponent], + declarations: [WorkflowItemAdminWorkflowGridElementComponent], imports: [ NoopAnimationsModule, TranslateModule.forRoot(), @@ -59,7 +59,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultGridElementComponent); + fixture = TestBed.createComponent(WorkflowItemAdminWorkflowGridElementComponent); component = fixture.componentInstance; component.object = searchResult; component.linkTypes = CollectionElementLinkType; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts similarity index 76% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts index 9b3ed12a24..f00dc4fdb4 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts @@ -19,33 +19,32 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl 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 { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; @listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ - selector: 'ds-item-admin-workflow-search-result-grid-element', - styleUrls: ['./item-admin-workflow-search-result-grid-element.component.scss'], - templateUrl: './item-admin-workflow-search-result-grid-element.component.html' + selector: 'ds-workflow-item-admin-workflow-grid-element', + styleUrls: ['./workflow-item-admin-workflow-grid-element.component.scss'], + templateUrl: './workflow-item-admin-workflow-grid-element.component.html' }) /** - * The component for displaying a list element for an item search result on the admin search page + * The component for displaying a list element for an workflow item on the admin search page */ -export class ItemAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent implements OnInit { +export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractListableElementComponent { @ViewChild(ListableObjectDirective, { static: true }) listableObjectDirective: ListableObjectDirective; @ViewChild('badges', { static: true }) badges: ElementRef; @ViewChild('buttons', { static: true }) buttons: ElementRef; - constructor(protected truncatableService: TruncatableService, - protected bitstreamDataService: BitstreamDataService, - private componentFactoryResolver: ComponentFactoryResolver - ) { - super(truncatableService, bitstreamDataService); + constructor(private componentFactoryResolver: ComponentFactoryResolver) { + super(); } /** * Setup the dynamic child component */ ngOnInit(): void { - super.ngOnInit(); const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent()); const viewContainerRef = this.listableObjectDirective.viewContainerRef; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html deleted file mode 100644 index 14e6c1bcd1..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.html +++ /dev/null @@ -1,12 +0,0 @@ -
- {{ "admin.search.item.private" | translate }} -
-
- {{ "admin.search.item.withdrawn" | translate }} -
- - diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts deleted file mode 100644 index 9550028919..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component } from '@angular/core'; -import { Item } from '../../../../../core/shared/item.model'; -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 { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; - -@listableObjectComponent(ItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) -@Component({ - selector: 'ds-item-admin-workflow-search-result-list-element', - styleUrls: ['./item-admin-workflow-search-result-list-element.component.scss'], - templateUrl: './item-admin-workflow-search-result-list-element.component.html' -}) -/** - * The component for displaying a list element for an item search result on the admin search page - */ -export class ItemAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent { - -} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html new file mode 100644 index 0000000000..e894eedb94 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html @@ -0,0 +1,6 @@ + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts new file mode 100644 index 0000000000..63f36ea033 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts @@ -0,0 +1,101 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NO_ERRORS_SCHEMA } from '@angular/core'; +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 { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { PoolTaskAdminWorkflowSearchResultListElementComponent } from './pool-task-admin-workflow-search-result-list-element.component'; +import { Item } from '../../../../../core/shared/item.model'; + +describe('ItemAdminSearchResultListElementComponent', () => { + let component: PoolTaskAdminWorkflowSearchResultListElementComponent; + let fixture: ComponentFixture; + let id; + let searchResult; + + function init() { + id = '780b2588-bda5-4112-a1cd-0b15000a5339'; + searchResult = new ItemSearchResult(); + searchResult.indexableObject = new Item(); + searchResult.indexableObject.uuid = id; + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]) + ], + declarations: [PoolTaskAdminWorkflowSearchResultListElementComponent], + providers: [{ provide: TruncatableService, useValue: {} }], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PoolTaskAdminWorkflowSearchResultListElementComponent); + component = fixture.componentInstance; + component.object = searchResult; + component.linkTypes = CollectionElementLinkType; + component.index = 0; + component.viewModes = ViewMode; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('when the item is not withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = false; + fixture.detectChanges(); + }); + + it('should not show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is withdrawn', () => { + beforeEach(() => { + component.dso.isWithdrawn = true; + fixture.detectChanges(); + }); + + it('should show the withdrawn badge', () => { + const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); + expect(badge).not.toBeNull(); + }); + }); + + describe('when the item is not private', () => { + beforeEach(() => { + component.dso.isDiscoverable = true; + fixture.detectChanges(); + }); + it('should not show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).toBeNull(); + }); + }); + + describe('when the item is private', () => { + beforeEach(() => { + component.dso.isDiscoverable = false; + fixture.detectChanges(); + }); + + it('should show the private badge', () => { + const badge = fixture.debugElement.query(By.css('div.private-badge')); + expect(badge).not.toBeNull(); + }); + }) +}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts new file mode 100644 index 0000000000..8a6934e755 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts @@ -0,0 +1,29 @@ +import { Component } from '@angular/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 { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; +import { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; +import { PoolTask } from '../../../../../core/tasks/models/pool-task-object.model'; +import { Observable, pipe } from 'rxjs'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; + +@listableObjectComponent(PoolTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) +@Component({ + selector: 'ds-pooltask-admin-workflow-search-result-list-element', + styleUrls: ['./pool-task-admin-workflow-search-result-list-element.component.scss'], + templateUrl: './pool-task-admin-workflow-search-result-list-element.component.html' +}) +/** + * The component for displaying a list element for an pool task search result on the admin search page + */ +export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent { + public wfi$: Observable; + + ngOnInit(): void { + super.ngOnInit(); + this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); + } +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.html new file mode 100644 index 0000000000..736aba2fce --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.html @@ -0,0 +1,9 @@ +
+ {{ "admin.workflow.item.workflow" | translate }} +
+ + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-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-admin-workflow-list-element.component.spec.ts similarity index 87% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component.spec.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.spec.ts index 595a36a5b3..e406e4c28c 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-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-admin-workflow-list-element.component.spec.ts @@ -8,12 +8,12 @@ import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { ItemAdminWorkflowSearchResultListElementComponent } from './item-admin-workflow-search-result-list-element.component'; +import { WorkflowItemAdminWorkflowListElementComponent } from './workflow-item-admin-workflow-list-element.component'; import { Item } from '../../../../../core/shared/item.model'; describe('ItemAdminSearchResultListElementComponent', () => { - let component: ItemAdminWorkflowSearchResultListElementComponent; - let fixture: ComponentFixture; + let component: WorkflowItemAdminWorkflowListElementComponent; + let fixture: ComponentFixture; let id; let searchResult; @@ -31,7 +31,7 @@ describe('ItemAdminSearchResultListElementComponent', () => { TranslateModule.forRoot(), RouterTestingModule.withRoutes([]) ], - declarations: [ItemAdminWorkflowSearchResultListElementComponent], + declarations: [WorkflowItemAdminWorkflowListElementComponent], providers: [{ provide: TruncatableService, useValue: {} }], schemas: [NO_ERRORS_SCHEMA] }) @@ -39,7 +39,7 @@ describe('ItemAdminSearchResultListElementComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultListElementComponent); + fixture = TestBed.createComponent(WorkflowItemAdminWorkflowListElementComponent); component = fixture.componentInstance; component.object = searchResult; component.linkTypes = CollectionElementLinkType; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.ts new file mode 100644 index 0000000000..76698507aa --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/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 { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; + +@listableObjectComponent(WorkflowItem, ViewMode.ListElement, Context.AdminWorkflowSearch) +@Component({ + selector: 'ds-workflow-item-admin-workflow-list-element', + styleUrls: ['./workflow-item-admin-workflow-list-element.component.scss'], + templateUrl: './workflow-item-admin-workflow-list-element.component.html' +}) +/** + * The component for displaying a list element for an workflow item on the admin search page + */ +export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent { + +} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts deleted file mode 100644 index 3dc7b96391..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Item } from '../../../core/shared/item.model'; -import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; -import { URLCombiner } from '../../../core/url-combiner/url-combiner'; -import { - ITEM_EDIT_DELETE_PATH, - ITEM_EDIT_MOVE_PATH, - ITEM_EDIT_PRIVATE_PATH, - ITEM_EDIT_PUBLIC_PATH, - ITEM_EDIT_REINSTATE_PATH, - ITEM_EDIT_WITHDRAW_PATH -} from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; - -@Component({ - selector: 'ds-item-admin-workflow-search-result-actions-element', - styleUrls: ['./item-admin-workflow-search-result-actions.component.scss'], - templateUrl: './item-admin-workflow-search-result-actions.component.html' -}) -/** - * The component for displaying the actions for a list element for an item search result on the admin search page - */ -export class ItemAdminWorkflowSearchResultActionsComponent { - /** - * The item to perform the actions on - */ - @Input() public item: Item; - - /** - * Whether or not to use small buttons - */ - @Input() public small: boolean; - - /** - * Returns the path to the edit page of this item - */ - getEditPath(): string { - return getItemEditPath(this.item.uuid) - } - - /** - * Returns the path to the withdraw page of this item - */ - getWithdrawPath(): string { - return new URLCombiner(this.getEditPath(), ITEM_EDIT_WITHDRAW_PATH).toString(); - } -} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.html similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.html rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.html diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.scss rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.scss diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts similarity index 98% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts index c1d42341bc..2ee8ae2e9d 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.spec.ts @@ -4,7 +4,7 @@ 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 { ItemAdminWorkflowSearchResultActionsComponent } from './item-admin-workflow-search-result-actions.component'; +import { ItemAdminWorkflowSearchResultActionsComponent } from './workflow-item-admin-workflow-actions.component'; import { Item } from '../../../core/shared/item.model'; import { ITEM_EDIT_DELETE_PATH, 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 new file mode 100644 index 0000000000..a19f154f13 --- /dev/null +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component.ts @@ -0,0 +1,39 @@ +import { Component, Input } from '@angular/core'; +import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; +import { URLCombiner } from '../../../core/url-combiner/url-combiner'; +import { ITEM_EDIT_WITHDRAW_PATH } from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; +import { WorkflowItem } from '../../../core/submission/models/workflowitem.model'; + +@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 page + */ +export class WorkflowItemAdminWorkflowActionsComponent { + /** + * The item to perform the actions on + */ + @Input() public wfi: WorkflowItem; + + /** + * Whether or not to use small buttons + */ + @Input() public small: boolean; + + /** + * Returns the path to the delete page of this workflow item + */ + getDeletePath(): string { + return getDeletePath(this.wfi.id) + } + + /** + * Returns the path to the send back page of this workflow item + */ + getSendBackPath(): string { + return getSendPath(this.wfi.id); + } +} diff --git a/src/app/+admin/admin.module.ts b/src/app/+admin/admin.module.ts index d29d876d02..b829c8d868 100644 --- a/src/app/+admin/admin.module.ts +++ b/src/app/+admin/admin.module.ts @@ -12,10 +12,12 @@ import { ItemAdminSearchResultGridElementComponent } from './admin-search-page/a import { CommunityAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component'; import { CollectionAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component'; import { ItemAdminSearchResultActionsComponent } from './admin-search-page/admin-search-results/item-admin-search-result-actions.component'; -import { ItemAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/item-search-result/item-admin-workflow-search-result-grid-element.component'; -import { ItemAdminWorkflowSearchResultActionsComponent } from './admin-workflow-page/admin-workflow-search-results/item-admin-workflow-search-result-actions.component'; -import { ItemAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/item-search-result/item-admin-workflow-search-result-list-element.component'; +import { WorkflowItemAdminWorkflowGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component'; +import { WorkflowItemAdminWorkflowActionsComponent } from './admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component'; +import { WorkflowItemAdminWorkflowListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component'; import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; +import { PoolTaskAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component'; +import { PoolTaskAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component'; @NgModule({ imports: [ @@ -36,9 +38,12 @@ import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow CollectionAdminSearchResultGridElementComponent, ItemAdminSearchResultActionsComponent, - ItemAdminWorkflowSearchResultListElementComponent, - ItemAdminWorkflowSearchResultGridElementComponent, - ItemAdminWorkflowSearchResultActionsComponent, + WorkflowItemAdminWorkflowListElementComponent, + WorkflowItemAdminWorkflowGridElementComponent, + WorkflowItemAdminWorkflowActionsComponent, + + PoolTaskAdminWorkflowSearchResultListElementComponent, + PoolTaskAdminWorkflowSearchResultGridElementComponent, ], entryComponents: [ ItemAdminSearchResultListElementComponent, @@ -49,9 +54,12 @@ import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow CollectionAdminSearchResultGridElementComponent, ItemAdminSearchResultActionsComponent, - ItemAdminWorkflowSearchResultListElementComponent, - ItemAdminWorkflowSearchResultGridElementComponent, - ItemAdminWorkflowSearchResultActionsComponent, + WorkflowItemAdminWorkflowListElementComponent, + WorkflowItemAdminWorkflowGridElementComponent, + WorkflowItemAdminWorkflowActionsComponent, + + PoolTaskAdminWorkflowSearchResultListElementComponent, + PoolTaskAdminWorkflowSearchResultGridElementComponent, ] }) export class AdminModule { diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html new file mode 100644 index 0000000000..f8d7e427b0 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html @@ -0,0 +1 @@ + diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts new file mode 100644 index 0000000000..b42fe965c1 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkflowItemDeleteComponent } from './workflow-item-delete.component'; + +describe('WorkflowItemDeleteComponent', () => { + let component: WorkflowItemDeleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WorkflowItemDeleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkflowItemDeleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts new file mode 100644 index 0000000000..2b3bb3e934 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; +import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; + +@Component({ + selector: 'ds-workflow-item-delete', + templateUrl: './workflow-item-delete.component.html', + styleUrls: ['./workflow-item-delete.component.scss'] +}) +export class WorkflowItemDeleteComponent implements OnInit { + wfi: WorkflowItem; + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts index 7a89f18c7d..8e301390ae 100644 --- a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts +++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts @@ -3,6 +3,7 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; import { WorkflowItemsEditPageRoutingModule } from './workflowitems-edit-page-routing.module'; import { SubmissionModule } from '../submission/submission.module'; +import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component'; @NgModule({ imports: [ @@ -11,7 +12,7 @@ import { SubmissionModule } from '../submission/submission.module'; SharedModule, SubmissionModule, ], - declarations: [] + declarations: [WorkflowItemDeleteComponent] }) /** * This module handles all modules that need to access the workflowitems edit page. From 2eb3d11cd2d8dae8eb1819a211cbcc632d894169 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 3 Apr 2020 16:00:52 +0200 Subject: [PATCH 03/14] debugging issue commit --- ...ow-search-result-grid-element.component.ts | 6 +- ...-search-result-list-element.component.html | 5 +- ...ow-search-result-list-element.component.ts | 16 ++++- ...admin-workflow-list-element.component.html | 3 +- ...m-admin-workflow-list-element.component.ts | 19 +++++- ...item-admin-workflow-actions.component.html | 4 +- ...w-item-admin-workflow-actions.component.ts | 8 +-- .../edit-item-page/edit-item-page.module.ts | 1 - .../workflow-item-delete.component.html | 7 ++- .../workflow-item-delete.component.ts | 48 ++++++++++++++- .../workflow-item-page.resolver.ts | 35 +++++++++++ .../workflowitems-edit-page-routing.module.ts | 61 ++++++++++++++++--- src/app/app-routing.module.ts | 8 ++- .../submission/workflowitem-data.service.ts | 40 +++++++++++- src/app/shared/shared.module.ts | 4 +- 15 files changed, 233 insertions(+), 32 deletions(-) create mode 100644 src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts index e386ec45ae..70659a3f03 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts @@ -25,8 +25,12 @@ import { Observable } from 'rxjs'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { RemoteData } from '../../../../../core/data/remote-data'; import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; +import { SearchResult } from '../../../../../shared/search/search-result.model'; +import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; +import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model'; @listableObjectComponent(PoolTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) +@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ selector: 'ds-pool-task-admin-workflow-search-result-grid-element', styleUrls: ['./pool-task-admin-workflow-search-result-grid-element.component.scss'], @@ -35,7 +39,7 @@ import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../ /** * The component for displaying a list element for an pool task search result on the admin search page */ -export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent implements OnInit { +export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent, TaskObject> implements OnInit { public wfi$: Observable; ngOnInit(): void { diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html index e894eedb94..c60347b08a 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html @@ -1,6 +1,7 @@ - +> diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts index 8a6934e755..db23a3c4aa 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts @@ -4,13 +4,20 @@ import { listableObjectComponent } from '../../../../../shared/object-collection import { Context } from '../../../../../core/shared/context.model'; import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; import { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; -import { PoolTask } from '../../../../../core/tasks/models/pool-task-object.model'; import { Observable, pipe } from 'rxjs'; import { RemoteData } from '../../../../../core/data/remote-data'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; +import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model'; +import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; +import { SearchResult } from '../../../../../shared/search/search-result.model'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; +import { tap } from 'rxjs/operators'; @listableObjectComponent(PoolTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) +@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) @Component({ selector: 'ds-pooltask-admin-workflow-search-result-list-element', styleUrls: ['./pool-task-admin-workflow-search-result-list-element.component.scss'], @@ -19,11 +26,16 @@ import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../ /** * The component for displaying a list element for an pool task search result on the admin search page */ -export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent { +export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent, TaskObject> { public wfi$: Observable; + constructor(private linkService: LinkService, protected truncatableService: TruncatableService) { + super(truncatableService); + } + ngOnInit(): void { super.ngOnInit(); + this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); } } diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.html index 736aba2fce..f3502fe0ab 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.html @@ -1,7 +1,8 @@
{{ "admin.workflow.item.workflow" | translate }}
- { +export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent implements OnInit { + public item$: Observable; + constructor(private linkService: LinkService) { + super(); + } + + ngOnInit(): void { + this.object = this.linkService.resolveLink(this.object, followLink('item')); + this.item$ = (this.object.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); + } } 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/workflow-item-admin-workflow-actions.component.html index 3f80b127a8..3004eb925c 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/workflow-item-admin-workflow-actions.component.html @@ -1,7 +1,7 @@ - + {{"admin.search.item.delete" | translate}} - + {{"admin.search.item.send-back" | translate}} 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 index a19f154f13..58f89e31e6 100644 --- 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 @@ -1,8 +1,6 @@ import { Component, Input } from '@angular/core'; -import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; -import { URLCombiner } from '../../../core/url-combiner/url-combiner'; -import { ITEM_EDIT_WITHDRAW_PATH } from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; import { WorkflowItem } from '../../../core/submission/models/workflowitem.model'; +import { getWorkflowItemDeletePath, getWorkflowItemSendBackPath } from '../../../+workflowitems-edit-page/workflowitems-edit-page-routing.module'; @Component({ selector: 'ds-workflow-item-admin-workflow-actions-element', @@ -27,13 +25,13 @@ export class WorkflowItemAdminWorkflowActionsComponent { * Returns the path to the delete page of this workflow item */ getDeletePath(): string { - return getDeletePath(this.wfi.id) + return getWorkflowItemDeletePath(this.wfi.id) } /** * Returns the path to the send back page of this workflow item */ getSendBackPath(): string { - return getSendPath(this.wfi.id); + return getWorkflowItemSendBackPath(this.wfi.id); } } diff --git a/src/app/+item-page/edit-item-page/edit-item-page.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.module.ts index 2cbd0c57d1..b6aaf5faac 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.module.ts @@ -38,7 +38,6 @@ import { ItemVersionHistoryComponent } from './item-version-history/item-version EditItemPageComponent, ItemOperationComponent, AbstractSimpleItemActionComponent, - ModifyItemOverviewComponent, ItemWithdrawComponent, ItemReinstateComponent, ItemPrivateComponent, diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html index f8d7e427b0..5b1b8c45b3 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html @@ -1 +1,6 @@ - +
+ + + + +
diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts index 2b3bb3e934..4c6f0ff885 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts @@ -1,5 +1,15 @@ import { Component, OnInit } from '@angular/core'; import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; +import { Item } from '../../core/shared/item.model'; +import { Observable } from 'rxjs'; +import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { map, switchMap, take } from 'rxjs/operators'; +import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; +import { TranslateService } from '@ngx-translate/core'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { RouteService } from '../../core/services/route.service'; @Component({ selector: 'ds-workflow-item-delete', @@ -7,10 +17,42 @@ import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; styleUrls: ['./workflow-item-delete.component.scss'] }) export class WorkflowItemDeleteComponent implements OnInit { - wfi: WorkflowItem; - constructor() { } + public wfi$: Observable; + public item$: Observable; - ngOnInit() { + constructor(private route: ActivatedRoute, + private workflowItemService: WorkflowItemDataService, + private router: Router, + private routeService: RouteService, + private notificationsService: NotificationsService, + private translationService: TranslateService) { } + ngOnInit() { + this.route.data.subscribe((t) => console.log(t)); + this.wfi$ = this.route.data.pipe(map((data: Data) => data.wfi as RemoteData), getRemoteDataPayload()); + this.item$ = this.wfi$.pipe(switchMap((wfi: WorkflowItem) => (wfi.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()))); + } + + delete() { + this.wfi$.pipe( + take(1), + switchMap((wfi: WorkflowItem) => this.workflowItemService.delete(wfi.id)) + ).subscribe((successful: boolean) => { + if (successful) { + const title = this.translationService.get('workflowitem.delete.notification.success.title'); + const content = this.translationService.get('workflowitem.delete.notification.success.content'); + this.notificationsService.success(title, content) + } else { + const title = this.translationService.get('workflowitem.delete.notification.error.title'); + const content = this.translationService.get('workflowitem.delete.notification.error.content'); + this.notificationsService.error(title, content) + } + this.previousPage(); + }) + } + + previousPage() { + this.routeService.getPreviousUrl(); + } } diff --git a/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts new file mode 100644 index 0000000000..5ae11efff6 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../core/data/remote-data'; +import { ItemDataService } from '../core/data/item-data.service'; +import { Item } from '../core/shared/item.model'; +import { hasValue } from '../shared/empty.util'; +import { find } from 'rxjs/operators'; +import { followLink } from '../shared/utils/follow-link-config.model'; +import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; +import { WorkflowItem } from '../core/submission/models/workflowitem.model'; + +/** + * This class represents a resolver that requests a specific item before the route is activated + */ +@Injectable() +export class WorkflowItemPageResolver implements Resolve> { + constructor(private workflowItemService: WorkflowItemDataService) { + } + + /** + * Method for resolving an item based on the parameters in the current route + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns Observable<> Emits the found item based on the parameters in the current route, + * or an error if something went wrong + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { + return this.workflowItemService.findById(route.params.id, + followLink('item'), + ).pipe( + find((RD) => hasValue(RD.error) || RD.hasSucceeded), + ); + } +} diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts index d5df70698c..88402ec177 100644 --- a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts +++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts @@ -3,21 +3,64 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { SubmissionEditComponent } from '../submission/edit/submission-edit.component'; +import { URLCombiner } from '../core/url-combiner/url-combiner'; +import { getWorkflowItemModulePath } from '../app-routing.module'; +import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component'; +import { WorkflowItemPageResolver } from './workflow-item-page.resolver'; + +export function getWorkflowItemPageRoute(wfiId: string) { + return new URLCombiner(getWorkflowItemModulePath(), wfiId).toString(); +} + +export function getWorkflowItemEditPath(wfiId: string) { + return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_EDIT_PATH).toString() +} + +export function getWorkflowItemDeletePath(wfiId: string) { + return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_DELETE_PATH).toString() +} + +export function getWorkflowItemSendBackPath(wfiId: string) { + return new URLCombiner(getWorkflowItemModulePath(), wfiId, WORKFLOW_ITEM_SEND_BACK_PATH).toString() +} + +const WORKFLOW_ITEM_EDIT_PATH = 'edit'; +const WORKFLOW_ITEM_DELETE_PATH = 'delete'; +const WORKFLOW_ITEM_SEND_BACK_PATH = 'sendback'; @NgModule({ imports: [ RouterModule.forChild([ - { path: '', redirectTo: '/home', pathMatch: 'full' }, { - canActivate: [AuthenticatedGuard], - path: ':id/edit', - component: SubmissionEditComponent, - data: { title: 'submission.edit.title' } - } - ]) - ] + path: ':id', + resolve: { wfi: WorkflowItemPageResolver }, + children: [ + { + canActivate: [AuthenticatedGuard], + path: WORKFLOW_ITEM_EDIT_PATH, + component: SubmissionEditComponent, + data: { title: 'submission.edit.title' } + }, + { + canActivate: [AuthenticatedGuard], + path: WORKFLOW_ITEM_DELETE_PATH, + component: WorkflowItemDeleteComponent, + data: { title: 'workflow-item.delete.title' } + }, + { + canActivate: [AuthenticatedGuard], + path: WORKFLOW_ITEM_SEND_BACK_PATH, + component: WorkflowItemDeleteComponent, + data: { title: 'workflow-item.sendback.title' } + } + ] + }] + ) + ], + providers: [WorkflowItemPageResolver] }) /** * This module defines the default component to load when navigating to the workflowitems edit page path. */ -export class WorkflowItemsEditPageRoutingModule { } +export class WorkflowItemsEditPageRoutingModule { +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 06811abd08..0ce8530bf2 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -41,6 +41,12 @@ export function getProfileModulePath() { return `/${PROFILE_MODULE_PATH}`; } +const WORKFLOW_ITEM_MODULE_PATH = 'workflowitems'; + +export function getWorkflowItemModulePath() { + return `/${WORKFLOW_ITEM_MODULE_PATH}`; +} + export function getDSOPath(dso: DSpaceObject): string { switch ((dso as any).type) { case Community.type.value: @@ -79,7 +85,7 @@ export function getDSOPath(dso: DSpaceObject): string { loadChildren: './+workspaceitems-edit-page/workspaceitems-edit-page.module#WorkspaceitemsEditPageModule' }, { - path: 'workflowitems', + path: WORKFLOW_ITEM_MODULE_PATH, loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowItemsEditPageModule' }, { diff --git a/src/app/core/submission/workflowitem-data.service.ts b/src/app/core/submission/workflowitem-data.service.ts index a2dfca5eb3..370b2df6dd 100644 --- a/src/app/core/submission/workflowitem-data.service.ts +++ b/src/app/core/submission/workflowitem-data.service.ts @@ -9,10 +9,14 @@ import { DataService } from '../data/data.service'; import { RequestService } from '../data/request.service'; import { WorkflowItem } from './models/workflowitem.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { FindListOptions } from '../data/request.models'; +import { DeleteByIDRequest, FindListOptions } from '../data/request.models'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { hasValue } from '../../shared/empty.util'; +import { RequestEntry } from '../data/request.reducer'; /** * A service that provides methods to make REST requests with workflowitems endpoint. @@ -35,4 +39,38 @@ export class WorkflowItemDataService extends DataService { super(); } + /** + * Delete an existing Workspace Item on the server + * @param id The Workspace Item's id to be removed + * @return an observable that emits true when the deletion was successful, false when it failed + */ + delete(id: string): Observable { + return this.deleteWFI(id, true) + } + + sendBack(id: string): Observable { + return this.deleteWFI(id, false) + } + + private deleteWFI(id: string, expunge: boolean): Observable { + const requestId = this.requestService.generateRequestId(); + + const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( + map((endpoint: string) => this.getIDHref(endpoint, id)), + map((endpoint: string) => endpoint + '?expunge=' + expunge) + ); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new DeleteByIDRequest(requestId, href, id); + this.requestService.configure(request); + }) + ).subscribe(); + + return this.requestService.getByUUID(requestId).pipe( + find((request: RequestEntry) => request.completed), + map((request: RequestEntry) => request.response.isSuccessful) + ); + } } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 698d9c936c..88c26792ad 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -186,6 +186,7 @@ import { LogInPasswordComponent } from './log-in/methods/password/log-in-passwor import { LogInComponent } from './log-in/log-in.component'; import { MissingTranslationHelper } from './translate/missing-translation.helper'; import { ItemVersionsNoticeComponent } from './item/item-versions/notice/item-versions-notice.component'; +import { ModifyItemOverviewComponent } from '../+item-page/edit-item-page/modify-item-overview/modify-item-overview.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -357,7 +358,8 @@ const COMPONENTS = [ LogInContainerComponent, ItemVersionsComponent, PublicationSearchResultListElementComponent, - ItemVersionsNoticeComponent + ItemVersionsNoticeComponent, + ModifyItemOverviewComponent, ]; const ENTRY_COMPONENTS = [ From de1b57d8d951f263632b35dc5d59e9bc4819496d Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 3 Apr 2020 18:13:22 +0200 Subject: [PATCH 04/14] workflow delete/sendback --- resources/i18n/en.json5 | 43 +++++++++++- ...search-result-grid-element.component.html} | 1 + ...search-result-grid-element.component.scss} | 0 ...rch-result-grid-element.component.spec.ts} | 10 +-- ...w-search-result-grid-element.component.ts} | 38 +++++------ ...admin-workflow-grid-element.component.html | 6 +- ...m-admin-workflow-grid-element.component.ts | 50 +++++++++----- ...search-result-list-element.component.html} | 0 ...search-result-list-element.component.scss} | 0 ...rch-result-list-element.component.spec.ts} | 10 +-- ...w-search-result-list-element.component.ts} | 9 ++- ...item-admin-workflow-actions.component.html | 8 +-- src/app/+admin/admin.module.ts | 12 ++-- .../workflow-item-action-page.component.html | 6 ++ .../workflow-item-action-page.component.ts | 65 +++++++++++++++++++ .../workflow-item-delete.component.html | 6 -- .../workflow-item-delete.component.scss | 0 .../workflow-item-delete.component.ts | 63 +++++------------- .../workflow-item-send-back.component.spec.ts | 25 +++++++ .../workflow-item-send-back.component.ts | 31 +++++++++ .../workflowitems-edit-page-routing.module.ts | 5 +- .../workflowitems-edit-page.module.ts | 3 +- .../lookup/dynamic-lookup.component.spec.ts | 2 - .../publication-grid-element.component.html | 5 +- 24 files changed, 271 insertions(+), 127 deletions(-) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html => task-search-result/task-admin-workflow-search-result-grid-element.component.html} (87%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.scss => task-search-result/task-admin-workflow-search-result-grid-element.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.spec.ts => task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts} (89%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts => task-search-result/task-admin-workflow-search-result-grid-element.component.ts} (52%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/{pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html => task-item-search-result/task-admin-workflow-search-result-list-element.component.html} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/{pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss => task-item-search-result/task-admin-workflow-search-result-list-element.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/{pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts => task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts} (86%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/{pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts => task-item-search-result/task-admin-workflow-search-result-list-element.component.ts} (83%) create mode 100644 src/app/+workflowitems-edit-page/workflow-item-action-page.component.html create mode 100644 src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts delete mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html delete mode 100644 src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss create mode 100644 src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts create mode 100644 src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5 index f874a02bdf..a515113445 100644 --- a/resources/i18n/en.json5 +++ b/resources/i18n/en.json5 @@ -267,6 +267,12 @@ "admin.workflow.title": "Admin Workflow", + "admin.workflow.item.workflow": "Workflow", + + "admin.workflow.item.delete": "Delete", + + "admin.workflow.item.send-back": "Send back", + @@ -2224,8 +2230,43 @@ "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - "workflowAdmin.search.results.head": "Active Workflows", + "workflowAdmin.search.results.head": "Active Workflows", + + + + "workflow-item.delete.notification.success.title": "Deleted", + + "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + + "workflow-item.delete.notification.error.title": "Something went wrong", + + "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + + "workflow-item.delete.title": "Delete workflow item", + + "workflow-item.delete.header": "Delete workflow item", + + "workflow-item.delete.button.cancel": "Cancel", + + "workflow-item.delete.button.confirm": "Delete", + + + "workflow-item.send-back.notification.success.title": "Sent back to submitter", + + "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + + "workflow-item.send-back.notification.error.title": "Something went wrong", + + "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + + "workflow-item.send-back.title": "Send workflow item back to submitter", + + "workflow-item.send-back.header": "Send workflow item back to submitter", + + "workflow-item.send-back.button.cancel": "Cancel", + + "workflow-item.send-back.button.confirm": "Send back", } diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html similarity index 87% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html index c73a5f5a02..8403e632db 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.html +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html @@ -1,4 +1,5 @@ { - let component: PoolTaskAdminWorkflowSearchResultGridElementComponent; - let fixture: ComponentFixture; + let component: TaskAdminWorkflowSearchResultGridElementComponent; + let fixture: ComponentFixture; let id; let searchResult; @@ -42,7 +42,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { init(); TestBed.configureTestingModule( { - declarations: [PoolTaskAdminWorkflowSearchResultGridElementComponent], + declarations: [TaskAdminWorkflowSearchResultGridElementComponent], imports: [ NoopAnimationsModule, TranslateModule.forRoot(), @@ -59,7 +59,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(PoolTaskAdminWorkflowSearchResultGridElementComponent); + fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultGridElementComponent); component = fixture.componentInstance; component.object = searchResult; component.linkTypes = CollectionElementLinkType; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts similarity index 52% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts index 70659a3f03..1f394fe134 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts @@ -1,26 +1,9 @@ -import { Component, ComponentFactoryResolver, ElementRef, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; -import { Item } from '../../../../../core/shared/item.model'; +import { Component, OnInit } from '@angular/core'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; -import { getListableObjectComponent, listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { Context } from '../../../../../core/shared/context.model'; -import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { getItemEditPath } from '../../../../../+item-page/item-page-routing.module'; -import { URLCombiner } from '../../../../../core/url-combiner/url-combiner'; -import { - ITEM_EDIT_DELETE_PATH, - ITEM_EDIT_MOVE_PATH, - ITEM_EDIT_PRIVATE_PATH, - ITEM_EDIT_PUBLIC_PATH, - ITEM_EDIT_REINSTATE_PATH, - ITEM_EDIT_WITHDRAW_PATH -} from '../../../../../+item-page/edit-item-page/edit-item-page.routing.module'; 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 { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; -import { PoolTask } from '../../../../../core/tasks/models/pool-task-object.model'; import { Observable } from 'rxjs'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { RemoteData } from '../../../../../core/data/remote-data'; @@ -28,22 +11,31 @@ import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../ import { SearchResult } from '../../../../../shared/search/search-result.model'; import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; @listableObjectComponent(PoolTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @listableObjectComponent(ClaimedTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ - selector: 'ds-pool-task-admin-workflow-search-result-grid-element', - styleUrls: ['./pool-task-admin-workflow-search-result-grid-element.component.scss'], - templateUrl: './pool-task-admin-workflow-search-result-grid-element.component.html' + selector: 'ds-task-admin-workflow-search-result-grid-element', + styleUrls: ['./task-admin-workflow-search-result-grid-element.component.scss'], + templateUrl: './task-admin-workflow-search-result-grid-element.component.html' }) /** * The component for displaying a list element for an pool task search result on the admin search page */ -export class PoolTaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent, TaskObject> implements OnInit { +export class TaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent, TaskObject> implements OnInit { public wfi$: Observable; + constructor(private linkService: LinkService, protected truncatableService: TruncatableService, protected bitstreamService: BitstreamDataService) { + super(truncatableService, bitstreamService); + } + ngOnInit(): void { super.ngOnInit(); + this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); } } diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html index 6f940d097e..d6b76c0a8d 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html @@ -6,7 +6,7 @@
    -
  • - -
  • +
  • + +
diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts index f00dc4fdb4..2ee9f16f52 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts @@ -22,6 +22,12 @@ import { ListableObjectDirective } from '../../../../../shared/object-collection import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; +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, getRemoteDataPayload } from '../../../../../core/shared/operators'; +import { take } from 'rxjs/operators'; @listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ @@ -36,8 +42,9 @@ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractLista @ViewChild(ListableObjectDirective, { static: true }) listableObjectDirective: ListableObjectDirective; @ViewChild('badges', { static: true }) badges: ElementRef; @ViewChild('buttons', { static: true }) buttons: ElementRef; + public item$: Observable; - constructor(private componentFactoryResolver: ComponentFactoryResolver) { + constructor(private componentFactoryResolver: ComponentFactoryResolver, private linkService: LinkService) { super(); } @@ -45,30 +52,37 @@ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractLista * Setup the dynamic child component */ ngOnInit(): void { - const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent()); + this.object = this.linkService.resolveLink(this.object, followLink('item')); + this.item$ = (this.object.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 viewContainerRef = this.listableObjectDirective.viewContainerRef; + viewContainerRef.clear(); - const componentRef = viewContainerRef.createComponent( - componentFactory, - 0, - undefined, - [ - [this.badges.nativeElement], - [this.buttons.nativeElement] - ]); - (componentRef.instance as any).object = this.object; - (componentRef.instance as any).index = this.index; - (componentRef.instance as any).linkType = this.linkType; - (componentRef.instance as any).listID = this.listID; + 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(); + } + ) } /** * Fetch the component depending on the item's relationship type, view mode and context * @returns {GenericConstructor} */ - private getComponent(): GenericConstructor { - return getListableObjectComponent(this.object.getRenderTypes(), ViewMode.GridElement, undefined) + private getComponent(item: Item): GenericConstructor { + return getListableObjectComponent(item.getRenderTypes(), ViewMode.GridElement, undefined) } + } diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.html rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.scss rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.scss diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts similarity index 86% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts index 63f36ea033..684dd8f108 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts @@ -8,12 +8,12 @@ import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { PoolTaskAdminWorkflowSearchResultListElementComponent } from './pool-task-admin-workflow-search-result-list-element.component'; +import { TaskAdminWorkflowSearchResultListElementComponent } from './task-admin-workflow-search-result-list-element.component'; import { Item } from '../../../../../core/shared/item.model'; describe('ItemAdminSearchResultListElementComponent', () => { - let component: PoolTaskAdminWorkflowSearchResultListElementComponent; - let fixture: ComponentFixture; + let component: TaskAdminWorkflowSearchResultListElementComponent; + let fixture: ComponentFixture; let id; let searchResult; @@ -31,7 +31,7 @@ describe('ItemAdminSearchResultListElementComponent', () => { TranslateModule.forRoot(), RouterTestingModule.withRoutes([]) ], - declarations: [PoolTaskAdminWorkflowSearchResultListElementComponent], + declarations: [TaskAdminWorkflowSearchResultListElementComponent], providers: [{ provide: TruncatableService, useValue: {} }], schemas: [NO_ERRORS_SCHEMA] }) @@ -39,7 +39,7 @@ describe('ItemAdminSearchResultListElementComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(PoolTaskAdminWorkflowSearchResultListElementComponent); + fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultListElementComponent); component = fixture.componentInstance; component.object = searchResult; component.linkTypes = CollectionElementLinkType; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts similarity index 83% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts rename to src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts index db23a3c4aa..2de768b747 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts @@ -14,19 +14,18 @@ import { SearchResult } from '../../../../../shared/search/search-result.model'; import { followLink } from '../../../../../shared/utils/follow-link-config.model'; import { LinkService } from '../../../../../core/cache/builders/link.service'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { tap } from 'rxjs/operators'; @listableObjectComponent(PoolTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) @listableObjectComponent(ClaimedTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) @Component({ - selector: 'ds-pooltask-admin-workflow-search-result-list-element', - styleUrls: ['./pool-task-admin-workflow-search-result-list-element.component.scss'], - templateUrl: './pool-task-admin-workflow-search-result-list-element.component.html' + selector: 'ds-task-admin-workflow-search-result-list-element', + styleUrls: ['./task-admin-workflow-search-result-list-element.component.scss'], + templateUrl: './task-admin-workflow-search-result-list-element.component.html' }) /** * The component for displaying a list element for an pool task search result on the admin search page */ -export class PoolTaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent, TaskObject> { +export class TaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent, TaskObject> { public wfi$: Observable; constructor(private linkService: LinkService, protected truncatableService: TruncatableService) { 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/workflow-item-admin-workflow-actions.component.html index 3004eb925c..1a90a4cff4 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/workflow-item-admin-workflow-actions.component.html @@ -1,7 +1,7 @@ - - {{"admin.search.item.delete" | translate}} + + {{"admin.workflow.item.delete" | translate}} - - {{"admin.search.item.send-back" | translate}} + + {{"admin.workflow.item.send-back" | translate}} diff --git a/src/app/+admin/admin.module.ts b/src/app/+admin/admin.module.ts index b829c8d868..cd10aad1ca 100644 --- a/src/app/+admin/admin.module.ts +++ b/src/app/+admin/admin.module.ts @@ -16,8 +16,8 @@ import { WorkflowItemAdminWorkflowGridElementComponent } from './admin-workflow- import { WorkflowItemAdminWorkflowActionsComponent } from './admin-workflow-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component'; import { WorkflowItemAdminWorkflowListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component'; import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; -import { PoolTaskAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/pool-task-item-search-result/pool-task-admin-workflow-search-result-list-element.component'; -import { PoolTaskAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/pool-task-search-result/pool-task-admin-workflow-search-result-grid-element.component'; +import { TaskAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component'; +import { TaskAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component'; @NgModule({ imports: [ @@ -42,8 +42,8 @@ import { PoolTaskAdminWorkflowSearchResultGridElementComponent } from './admin-w WorkflowItemAdminWorkflowGridElementComponent, WorkflowItemAdminWorkflowActionsComponent, - PoolTaskAdminWorkflowSearchResultListElementComponent, - PoolTaskAdminWorkflowSearchResultGridElementComponent, + TaskAdminWorkflowSearchResultGridElementComponent, + TaskAdminWorkflowSearchResultListElementComponent, ], entryComponents: [ ItemAdminSearchResultListElementComponent, @@ -58,8 +58,8 @@ import { PoolTaskAdminWorkflowSearchResultGridElementComponent } from './admin-w WorkflowItemAdminWorkflowGridElementComponent, WorkflowItemAdminWorkflowActionsComponent, - PoolTaskAdminWorkflowSearchResultListElementComponent, - PoolTaskAdminWorkflowSearchResultGridElementComponent, + TaskAdminWorkflowSearchResultGridElementComponent, + TaskAdminWorkflowSearchResultListElementComponent, ] }) export class AdminModule { diff --git a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.html b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.html new file mode 100644 index 0000000000..76808c7e14 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.html @@ -0,0 +1,6 @@ +
+

{{'workflow-item.' + type + '.header' | translate}}

+ + + +
diff --git a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts new file mode 100644 index 0000000000..fcc943a741 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts @@ -0,0 +1,65 @@ +import { OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map, switchMap, take } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; +import { WorkflowItem } from '../core/submission/models/workflowitem.model'; +import { Item } from '../core/shared/item.model'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; +import { RouteService } from '../core/services/route.service'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { RemoteData } from '../core/data/remote-data'; +import { getAllSucceededRemoteData, getRemoteDataPayload } from '../core/shared/operators'; +import { isEmpty } from '../shared/empty.util'; + +export abstract class WorkflowItemActionPageComponent implements OnInit { + public type; + public wfi$: Observable; + public item$: Observable; + + constructor(protected route: ActivatedRoute, + protected workflowItemService: WorkflowItemDataService, + protected router: Router, + protected routeService: RouteService, + protected notificationsService: NotificationsService, + protected translationService: TranslateService) { + } + + ngOnInit() { + this.type = this.getType(); + this.wfi$ = this.route.data.pipe(map((data: Data) => data.wfi as RemoteData), getRemoteDataPayload()); + this.item$ = this.wfi$.pipe(switchMap((wfi: WorkflowItem) => (wfi.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()))); + } + + performAction() { + this.wfi$.pipe( + take(1), + switchMap((wfi: WorkflowItem) => this.sendRequest(wfi.id)) + ).subscribe((successful: boolean) => { + if (successful) { + const title = this.translationService.get('workflow-item.' + this.type + '.notification.success.title'); + const content = this.translationService.get('workflow-item.' + this.type + '.notification.success.content'); + this.notificationsService.success(title, content) + } else { + const title = this.translationService.get('workflow-item.' + this.type + '.notification.error.title'); + const content = this.translationService.get('workflow-item.' + this.type + '.notification.error.content'); + this.notificationsService.error(title, content) + } + this.previousPage(); + }) + } + + previousPage() { + this.routeService.getPreviousUrl().pipe(take(1)) + .subscribe((url) => { + if (isEmpty(url)) { + url = '/mydspace'; + } + this.router.navigateByUrl(url); + + } + ); + } + abstract sendRequest(id: string): Observable; + abstract getType(): string; +} diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html deleted file mode 100644 index 5b1b8c45b3..0000000000 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.html +++ /dev/null @@ -1,6 +0,0 @@ -
- - - - -
diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts index 4c6f0ff885..171aeb27d1 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts @@ -1,58 +1,31 @@ -import { Component, OnInit } from '@angular/core'; -import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; -import { Item } from '../../core/shared/item.model'; +import { Component } from '@angular/core'; import { Observable } from 'rxjs'; -import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; -import { RemoteData } from '../../core/data/remote-data'; -import { ActivatedRoute, Data, Router } from '@angular/router'; -import { map, switchMap, take } from 'rxjs/operators'; +import { WorkflowItemActionPageComponent } from '../workflow-item-action-page.component'; +import { ActivatedRoute, Router } from '@angular/router'; import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; -import { TranslateService } from '@ngx-translate/core'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { RouteService } from '../../core/services/route.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'ds-workflow-item-delete', - templateUrl: './workflow-item-delete.component.html', - styleUrls: ['./workflow-item-delete.component.scss'] + templateUrl: '../workflow-item-action-page.component.html' }) -export class WorkflowItemDeleteComponent implements OnInit { - public wfi$: Observable; - public item$: Observable; - - constructor(private route: ActivatedRoute, - private workflowItemService: WorkflowItemDataService, - private router: Router, - private routeService: RouteService, - private notificationsService: NotificationsService, - private translationService: TranslateService) { +export class WorkflowItemDeleteComponent extends WorkflowItemActionPageComponent { + constructor(protected route: ActivatedRoute, + protected workflowItemService: WorkflowItemDataService, + protected router: Router, + protected routeService: RouteService, + protected notificationsService: NotificationsService, + protected translationService: TranslateService) { + super(route, workflowItemService, router, routeService, notificationsService, translationService); } - ngOnInit() { - this.route.data.subscribe((t) => console.log(t)); - this.wfi$ = this.route.data.pipe(map((data: Data) => data.wfi as RemoteData), getRemoteDataPayload()); - this.item$ = this.wfi$.pipe(switchMap((wfi: WorkflowItem) => (wfi.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()))); + getType(): string { + return 'delete'; } - delete() { - this.wfi$.pipe( - take(1), - switchMap((wfi: WorkflowItem) => this.workflowItemService.delete(wfi.id)) - ).subscribe((successful: boolean) => { - if (successful) { - const title = this.translationService.get('workflowitem.delete.notification.success.title'); - const content = this.translationService.get('workflowitem.delete.notification.success.content'); - this.notificationsService.success(title, content) - } else { - const title = this.translationService.get('workflowitem.delete.notification.error.title'); - const content = this.translationService.get('workflowitem.delete.notification.error.content'); - this.notificationsService.error(title, content) - } - this.previousPage(); - }) - } - - previousPage() { - this.routeService.getPreviousUrl(); + sendRequest(id: string): Observable { + return this.workflowItemService.delete(id); } } diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts new file mode 100644 index 0000000000..ba293845d9 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkflowItemDeleteComponent } from './workflow-item-send-back.component'; + +describe('WorkflowItemDeleteComponent', () => { + let component: WorkflowItemDeleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WorkflowItemDeleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkflowItemDeleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts new file mode 100644 index 0000000000..c4006811d9 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts @@ -0,0 +1,31 @@ +import { Component } from '@angular/core'; +import { WorkflowItemActionPageComponent } from '../workflow-item-action-page.component'; +import { Observable } from 'rxjs'; +import { ActivatedRoute, Router } from '@angular/router'; +import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; +import { RouteService } from '../../core/services/route.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'ds-workflow-item-send-back', + templateUrl: '../workflow-item-action-page.component.html' +}) +export class WorkflowItemSendBackComponent extends WorkflowItemActionPageComponent { + constructor(protected route: ActivatedRoute, + protected workflowItemService: WorkflowItemDataService, + protected router: Router, + protected routeService: RouteService, + protected notificationsService: NotificationsService, + protected translationService: TranslateService) { + super(route, workflowItemService, router, routeService, notificationsService, translationService); + } + + getType(): string { + return 'send-back'; + } + + sendRequest(id: string): Observable { + return this.workflowItemService.sendBack(id); + } +} diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts index 88402ec177..e9989bf947 100644 --- a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts +++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts @@ -7,6 +7,7 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getWorkflowItemModulePath } from '../app-routing.module'; import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component'; import { WorkflowItemPageResolver } from './workflow-item-page.resolver'; +import { WorkflowItemSendBackComponent } from './workflow-item-send-back/workflow-item-send-back.component'; export function getWorkflowItemPageRoute(wfiId: string) { return new URLCombiner(getWorkflowItemModulePath(), wfiId).toString(); @@ -50,8 +51,8 @@ const WORKFLOW_ITEM_SEND_BACK_PATH = 'sendback'; { canActivate: [AuthenticatedGuard], path: WORKFLOW_ITEM_SEND_BACK_PATH, - component: WorkflowItemDeleteComponent, - data: { title: 'workflow-item.sendback.title' } + component: WorkflowItemSendBackComponent, + data: { title: 'workflow-item.send-back.title' } } ] }] diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts index 8e301390ae..ef1e49abf5 100644 --- a/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts +++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page.module.ts @@ -4,6 +4,7 @@ import { SharedModule } from '../shared/shared.module'; import { WorkflowItemsEditPageRoutingModule } from './workflowitems-edit-page-routing.module'; import { SubmissionModule } from '../submission/submission.module'; import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component'; +import { WorkflowItemSendBackComponent } from './workflow-item-send-back/workflow-item-send-back.component'; @NgModule({ imports: [ @@ -12,7 +13,7 @@ import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-ite SharedModule, SubmissionModule, ], - declarations: [WorkflowItemDeleteComponent] + declarations: [WorkflowItemDeleteComponent, WorkflowItemSendBackComponent] }) /** * This module handles all modules that need to access the workflowitems edit page. diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts index c1f8ad69ba..c249c797a6 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/lookup/dynamic-lookup.component.spec.ts @@ -27,8 +27,6 @@ import { AuthorityConfidenceStateDirective } from '../../../../../authority-conf import { ObjNgFor } from '../../../../../utils/object-ngfor.pipe'; import { GLOBAL_CONFIG, GlobalConfig } from '../../../../../../../config'; import { MOCK_SUBMISSION_CONFIG } from '../../../../../testing/mock-submission-config'; -import { WorkspaceitemsEditPageModule } from '../../../../../../+workspaceitems-edit-page/workspaceitems-edit-page.module'; -import { WorkspaceItem } from '../../../../../../core/submission/models/workspaceitem.model'; let LOOKUP_TEST_MODEL_CONFIG = { authorityOptions: { diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html index 81ee3ebcce..a9b5d0bdaa 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html +++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html @@ -1 +1,4 @@ - + + + + From d003400c16496e29a25b4cf6c9df58fda402da4c Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 6 Apr 2020 17:45:27 +0200 Subject: [PATCH 05/14] started fixing tests --- ...arch-result-grid-element.component.spec.ts | 65 +++-------- ...in-workflow-grid-element.component.spec.ts | 80 ++----------- ...arch-result-list-element.component.spec.ts | 70 +++--------- ...in-workflow-list-element.component.spec.ts | 94 +++++----------- ...m-admin-workflow-actions.component.spec.ts | 106 +++--------------- .../workflow-item-send-back.component.spec.ts | 12 +- 6 files changed, 89 insertions(+), 338 deletions(-) diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts index 136c6df2af..a2d88465d5 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts @@ -14,16 +14,20 @@ import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing 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 { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; -import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { TaskAdminWorkflowSearchResultGridElementComponent } from './task-admin-workflow-search-result-grid-element.component'; +import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; +import { SearchResult } from '../../../../../shared/search/search-result.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -describe('ItemAdminSearchResultGridElementComponent', () => { +describe('TaskAdminWorkflowSearchResultGridElementComponent', () => { let component: TaskAdminWorkflowSearchResultGridElementComponent; let fixture: ComponentFixture; let id; let searchResult; + let linkService; const mockBitstreamDataService = { getThumbnailFor(item: Item): Observable> { @@ -33,9 +37,11 @@ describe('ItemAdminSearchResultGridElementComponent', () => { function init() { id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new ItemSearchResult(); - searchResult.indexableObject = new Item(); + searchResult = new SearchResult(); + searchResult.indexableObject = new TaskObject(); + searchResult.indexableObject.workflowitem = createSuccessfulRemoteDataObject$(new WorkflowItem()); searchResult.indexableObject.uuid = id; + linkService = getMockLinkService(); } beforeEach(async(() => { @@ -52,6 +58,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { providers: [ { provide: TruncatableService, useValue: mockTruncatableService }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: LinkService, useValue: linkService }, ], schemas: [NO_ERRORS_SCHEMA] }) @@ -59,6 +66,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { })); beforeEach(() => { + linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultGridElementComponent); component = fixture.componentInstance; component.object = searchResult; @@ -71,51 +79,4 @@ describe('ItemAdminSearchResultGridElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); - - describe('when the item is not withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = false; - fixture.detectChanges(); - }); - - it('should not show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = true; - fixture.detectChanges(); - }); - - it('should show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).not.toBeNull(); - }); - }); - - describe('when the item is not private', () => { - beforeEach(() => { - component.dso.isDiscoverable = true; - fixture.detectChanges(); - }); - it('should not show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is private', () => { - beforeEach(() => { - component.dso.isDiscoverable = false; - fixture.detectChanges(); - }); - - it('should show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).not.toBeNull(); - }); - }) }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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-admin-workflow-grid-element.component.spec.ts index 61bcdde6cf..917d3770bb 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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-admin-workflow-grid-element.component.spec.ts @@ -3,39 +3,28 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { TranslateModule } from '@ngx-translate/core'; -import { Observable } from 'rxjs/internal/Observable'; -import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; -import { RemoteData } from '../../../../../core/data/remote-data'; -import { Bitstream } from '../../../../../core/shared/bitstream.model'; -import { Item } from '../../../../../core/shared/item.model'; import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service'; import { SharedModule } from '../../../../../shared/shared.module'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; 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 { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; -import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { WorkflowItemAdminWorkflowGridElementComponent } from './workflow-item-admin-workflow-grid-element.component'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -describe('ItemAdminSearchResultGridElementComponent', () => { +describe('WorkflowItemAdminWorkflowGridElementComponent', () => { let component: WorkflowItemAdminWorkflowGridElementComponent; let fixture: ComponentFixture; let id; - let searchResult; - - const mockBitstreamDataService = { - getThumbnailFor(item: Item): Observable> { - return createSuccessfulRemoteDataObject$(new Bitstream()); - } - }; + let wfi; + let linkService; function init() { id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new ItemSearchResult(); - searchResult.indexableObject = new Item(); - searchResult.indexableObject.uuid = id; + wfi = new WorkflowItem(); + linkService = getMockLinkService(); } beforeEach(async(() => { @@ -50,8 +39,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { SharedModule ], providers: [ - { provide: TruncatableService, useValue: mockTruncatableService }, - { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: LinkService, useValue: linkService }, ], schemas: [NO_ERRORS_SCHEMA] }) @@ -59,9 +47,10 @@ describe('ItemAdminSearchResultGridElementComponent', () => { })); beforeEach(() => { + linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(WorkflowItemAdminWorkflowGridElementComponent); component = fixture.componentInstance; - component.object = searchResult; + component.object = wfi; component.linkTypes = CollectionElementLinkType; component.index = 0; component.viewModes = ViewMode; @@ -71,51 +60,4 @@ describe('ItemAdminSearchResultGridElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); - - describe('when the item is not withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = false; - fixture.detectChanges(); - }); - - it('should not show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = true; - fixture.detectChanges(); - }); - - it('should show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).not.toBeNull(); - }); - }); - - describe('when the item is not private', () => { - beforeEach(() => { - component.dso.isDiscoverable = true; - fixture.detectChanges(); - }); - it('should not show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is private', () => { - beforeEach(() => { - component.dso.isDiscoverable = false; - fixture.detectChanges(); - }); - - it('should show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).not.toBeNull(); - }); - }) }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts index 684dd8f108..68ffe9e421 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts @@ -2,26 +2,32 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; 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 { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; -import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { TaskAdminWorkflowSearchResultListElementComponent } from './task-admin-workflow-search-result-list-element.component'; -import { Item } from '../../../../../core/shared/item.model'; +import { SearchResult } from '../../../../../shared/search/search-result.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; -describe('ItemAdminSearchResultListElementComponent', () => { +describe('TaskAdminWorkflowSearchResultListElementComponent', () => { let component: TaskAdminWorkflowSearchResultListElementComponent; let fixture: ComponentFixture; let id; let searchResult; + let linkService; function init() { id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new ItemSearchResult(); - searchResult.indexableObject = new Item(); + searchResult = new SearchResult(); + searchResult.indexableObject = new TaskObject(); + searchResult.indexableObject.workflowitem = createSuccessfulRemoteDataObject$(new WorkflowItem()); searchResult.indexableObject.uuid = id; + linkService = getMockLinkService(); } beforeEach(async(() => { @@ -32,13 +38,16 @@ describe('ItemAdminSearchResultListElementComponent', () => { RouterTestingModule.withRoutes([]) ], declarations: [TaskAdminWorkflowSearchResultListElementComponent], - providers: [{ provide: TruncatableService, useValue: {} }], + providers: [{ provide: TruncatableService, useValue: {} }, + { provide: LinkService, useValue: linkService } + ], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); })); beforeEach(() => { + linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultListElementComponent); component = fixture.componentInstance; component.object = searchResult; @@ -51,51 +60,4 @@ describe('ItemAdminSearchResultListElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); - - describe('when the item is not withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = false; - fixture.detectChanges(); - }); - - it('should not show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = true; - fixture.detectChanges(); - }); - - it('should show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).not.toBeNull(); - }); - }); - - describe('when the item is not private', () => { - beforeEach(() => { - component.dso.isDiscoverable = true; - fixture.detectChanges(); - }); - it('should not show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is private', () => { - beforeEach(() => { - component.dso.isDiscoverable = false; - fixture.detectChanges(); - }); - - it('should show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).not.toBeNull(); - }); - }) }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.spec.ts index e406e4c28c..af9bbbc70f 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.spec.ts @@ -1,47 +1,56 @@ import { async, ComponentFixture, TestBed } from '@angular/core/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 { SharedModule } from '../../../../../shared/shared.module'; 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 { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; -import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { WorkflowItemAdminWorkflowListElementComponent } from './workflow-item-admin-workflow-list-element.component'; -import { Item } from '../../../../../core/shared/item.model'; +import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -describe('ItemAdminSearchResultListElementComponent', () => { +describe('WorkflowItemAdminWorkflowListElementComponent', () => { let component: WorkflowItemAdminWorkflowListElementComponent; let fixture: ComponentFixture; let id; - let searchResult; - + let wfi; + let linkService; function init() { id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new ItemSearchResult(); - searchResult.indexableObject = new Item(); - searchResult.indexableObject.uuid = id; + wfi = new WorkflowItem(); + linkService = getMockLinkService(); } beforeEach(async(() => { init(); - TestBed.configureTestingModule({ - imports: [ - TranslateModule.forRoot(), - RouterTestingModule.withRoutes([]) - ], - declarations: [WorkflowItemAdminWorkflowListElementComponent], - providers: [{ provide: TruncatableService, useValue: {} }], - schemas: [NO_ERRORS_SCHEMA] - }) + TestBed.configureTestingModule( + { + declarations: [WorkflowItemAdminWorkflowListElementComponent], + imports: [ + NoopAnimationsModule, + TranslateModule.forRoot(), + RouterTestingModule.withRoutes([]), + SharedModule + ], + providers: [ + { provide: TruncatableService, useValue: mockTruncatableService }, + { provide: LinkService, useValue: linkService }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) .compileComponents(); })); beforeEach(() => { + linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(WorkflowItemAdminWorkflowListElementComponent); component = fixture.componentInstance; - component.object = searchResult; + component.object = wfi; component.linkTypes = CollectionElementLinkType; component.index = 0; component.viewModes = ViewMode; @@ -51,51 +60,4 @@ describe('ItemAdminSearchResultListElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); - - describe('when the item is not withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = false; - fixture.detectChanges(); - }); - - it('should not show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is withdrawn', () => { - beforeEach(() => { - component.dso.isWithdrawn = true; - fixture.detectChanges(); - }); - - it('should show the withdrawn badge', () => { - const badge = fixture.debugElement.query(By.css('div.withdrawn-badge')); - expect(badge).not.toBeNull(); - }); - }); - - describe('when the item is not private', () => { - beforeEach(() => { - component.dso.isDiscoverable = true; - fixture.detectChanges(); - }); - it('should not show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).toBeNull(); - }); - }); - - describe('when the item is private', () => { - beforeEach(() => { - component.dso.isDiscoverable = false; - fixture.detectChanges(); - }); - - it('should show the private badge', () => { - const badge = fixture.debugElement.query(By.css('div.private-badge')); - expect(badge).not.toBeNull(); - }); - }) }); 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/workflow-item-admin-workflow-actions.component.spec.ts index 2ee8ae2e9d..bca2684364 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/workflow-item-admin-workflow-actions.component.spec.ts @@ -4,7 +4,6 @@ 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 { ItemAdminWorkflowSearchResultActionsComponent } from './workflow-item-admin-workflow-actions.component'; import { Item } from '../../../core/shared/item.model'; import { ITEM_EDIT_DELETE_PATH, @@ -16,17 +15,20 @@ import { } from '../../../+item-page/edit-item-page/edit-item-page.routing.module'; import { getItemEditPath } from '../../../+item-page/item-page-routing.module'; 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 { getWorkflowItemDeletePath, getWorkflowItemSendBackPath } from '../../../+workflowitems-edit-page/workflowitems-edit-page-routing.module'; -describe('ItemAdminSearchResultActionsComponent', () => { - let component: ItemAdminWorkflowSearchResultActionsComponent; - let fixture: ComponentFixture; +describe('WorkflowItemAdminWorkflowActionsComponent', () => { + let component: WorkflowItemAdminWorkflowActionsComponent; + let fixture: ComponentFixture; let id; - let item; + let wfi; function init() { id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - item = new Item(); - item.uuid = id; + wfi = new WorkflowItem(); + wfi.id = id; } beforeEach(async(() => { init(); @@ -35,16 +37,16 @@ describe('ItemAdminSearchResultActionsComponent', () => { TranslateModule.forRoot(), RouterTestingModule.withRoutes([]) ], - declarations: [ItemAdminWorkflowSearchResultActionsComponent], + declarations: [WorkflowItemAdminWorkflowActionsComponent], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(ItemAdminWorkflowSearchResultActionsComponent); + fixture = TestBed.createComponent(WorkflowItemAdminWorkflowActionsComponent); component = fixture.componentInstance; - component.item = item; + component.wfi = wfi; fixture.detectChanges(); }); @@ -52,93 +54,15 @@ describe('ItemAdminSearchResultActionsComponent', () => { expect(component).toBeTruthy(); }); - it('should render an edit button with the correct link', () => { - const button = fixture.debugElement.query(By.css('a.edit-link')); - const link = button.nativeElement.href; - expect(link).toContain(getItemEditPath(id)); - }); - 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(getItemEditPath(id), ITEM_EDIT_DELETE_PATH).toString()); + expect(link).toContain(new URLCombiner(getWorkflowItemDeletePath(wfi.id)).toString()); }); it('should render a move button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.move-link')); + const a = fixture.debugElement.query(By.css('a.send-back-link')); const link = a.nativeElement.href; - expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_MOVE_PATH).toString()); + expect(link).toContain(new URLCombiner(getWorkflowItemSendBackPath(wfi.id)).toString()); }); - - describe('when the item is not withdrawn', () => { - beforeEach(() => { - component.item.isWithdrawn = false; - fixture.detectChanges(); - }); - - it('should render a withdraw button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.withdraw-link')); - const link = a.nativeElement.href; - expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_WITHDRAW_PATH).toString()); - }); - - it('should not render a reinstate button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.reinstate-link')); - expect(a).toBeNull(); - }); - }); - - describe('when the item is withdrawn', () => { - beforeEach(() => { - component.item.isWithdrawn = true; - fixture.detectChanges(); - }); - - it('should not render a withdraw button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.withdraw-link')); - expect(a).toBeNull(); - }); - - it('should render a reinstate button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.reinstate-link')); - const link = a.nativeElement.href; - expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_REINSTATE_PATH).toString()); - }); - }); - - describe('when the item is not private', () => { - beforeEach(() => { - component.item.isDiscoverable = true; - fixture.detectChanges(); - }); - - it('should render a make private button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.private-link')); - const link = a.nativeElement.href; - expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_PRIVATE_PATH).toString()); - }); - - it('should not render a make public button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.public-link')); - expect(a).toBeNull(); - }); - }); - - describe('when the item is private', () => { - beforeEach(() => { - component.item.isDiscoverable = false; - fixture.detectChanges(); - }); - - it('should not render a make private button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.private-link')); - expect(a).toBeNull(); - }); - - it('should render a make private button with the correct link', () => { - const a = fixture.debugElement.query(By.css('a.public-link')); - const link = a.nativeElement.href; - expect(link).toContain(new URLCombiner(getItemEditPath(id), ITEM_EDIT_PUBLIC_PATH).toString()); - }); - }) }); diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts index ba293845d9..e76e01b7f3 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { WorkflowItemSendBackComponent } from './workflow-item-send-back.component'; -import { WorkflowItemDeleteComponent } from './workflow-item-send-back.component'; -describe('WorkflowItemDeleteComponent', () => { - let component: WorkflowItemDeleteComponent; - let fixture: ComponentFixture; +describe('WorkflowItemSendBackComponent', () => { + let component: WorkflowItemSendBackComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ WorkflowItemDeleteComponent ] + declarations: [ WorkflowItemSendBackComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(WorkflowItemDeleteComponent); + fixture = TestBed.createComponent(WorkflowItemSendBackComponent); component = fixture.componentInstance; fixture.detectChanges(); }); From e43f04e56487c77d731026b6da854e5a44c5bf32 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 8 Apr 2020 15:41:55 +0200 Subject: [PATCH 06/14] finished tests --- .../admin-workflow-page.component.ts | 2 +- ...arch-result-grid-element.component.spec.ts | 5 + ...ow-search-result-grid-element.component.ts | 8 +- ...in-workflow-grid-element.component.spec.ts | 23 +++- ...m-admin-workflow-grid-element.component.ts | 18 ++- ...arch-result-list-element.component.spec.ts | 5 + ...ow-search-result-list-element.component.ts | 8 +- ...in-workflow-list-element.component.spec.ts | 14 +- ...m-admin-workflow-list-element.component.ts | 9 +- ...w-item-admin-workflow-actions.component.ts | 4 +- ...orkflow-item-action-page.component.spec.ts | 124 ++++++++++++++++++ .../workflow-item-action-page.component.ts | 23 +++- .../workflow-item-delete.component.spec.ts | 52 +++++++- .../workflow-item-delete.component.ts | 10 ++ .../workflow-item-page.resolver.spec.ts | 29 ++++ .../workflow-item-page.resolver.ts | 8 +- .../workflow-item-send-back.component.spec.ts | 54 +++++++- .../workflow-item-send-back.component.ts | 10 ++ 18 files changed, 383 insertions(+), 23 deletions(-) create mode 100644 src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts create mode 100644 src/app/+workflowitems-edit-page/workflow-item-page.resolver.spec.ts diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts index 37ddc70692..8c86c8ec98 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-page.component.ts @@ -8,7 +8,7 @@ import { Context } from '../../core/shared/context.model'; }) /** - * Component that represents a search page for administrators + * Component that represents a workflow item search page for administrators */ export class AdminWorkflowPageComponent { /** diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts index a2d88465d5..a2461bffda 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts @@ -21,6 +21,7 @@ import { SearchResult } from '../../../../../shared/search/search-result.model'; import { LinkService } from '../../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; describe('TaskAdminWorkflowSearchResultGridElementComponent', () => { let component: TaskAdminWorkflowSearchResultGridElementComponent; @@ -79,4 +80,8 @@ describe('TaskAdminWorkflowSearchResultGridElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should retrieve the workflow item using the link service', () => { + expect(linkService.resolveLink).toHaveBeenCalledWith(searchResult.indexableObject, followLink('workflowitem')); + }); }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts index 1f394fe134..cc002c87c0 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts @@ -24,15 +24,21 @@ import { BitstreamDataService } from '../../../../../core/data/bitstream-data.se templateUrl: './task-admin-workflow-search-result-grid-element.component.html' }) /** - * The component for displaying a list element for an pool task search result on the admin search page + * The component for displaying a list element for an task search result on the admin workflow search page */ export class TaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent, TaskObject> implements OnInit { + /** + * The workflow item linked to the task object + */ public wfi$: Observable; constructor(private linkService: LinkService, protected truncatableService: TruncatableService, protected bitstreamService: BitstreamDataService) { super(truncatableService, bitstreamService); } + /** + * Initialize the workflow item + */ ngOnInit(): void { super.ngOnInit(); this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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-admin-workflow-grid-element.component.spec.ts index 917d3770bb..4d064444e5 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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-admin-workflow-grid-element.component.spec.ts @@ -3,8 +3,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/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 { SharedModule } from '../../../../../shared/shared.module'; 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'; @@ -13,17 +11,25 @@ import { WorkflowItemAdminWorkflowGridElementComponent } from './workflow-item-a import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { LinkService } from '../../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { PublicationGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component'; +import { ListableObjectDirective } from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive'; describe('WorkflowItemAdminWorkflowGridElementComponent', () => { let component: WorkflowItemAdminWorkflowGridElementComponent; let fixture: ComponentFixture; let id; let wfi; + let itemRD$; let linkService; function init() { + itemRD$ = createSuccessfulRemoteDataObject$(new Item()); id = '780b2588-bda5-4112-a1cd-0b15000a5339'; wfi = new WorkflowItem(); + wfi.item = itemRD$; linkService = getMockLinkService(); } @@ -31,18 +37,23 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { init(); TestBed.configureTestingModule( { - declarations: [WorkflowItemAdminWorkflowGridElementComponent], + declarations: [WorkflowItemAdminWorkflowGridElementComponent, PublicationGridElementComponent, ListableObjectDirective], imports: [ NoopAnimationsModule, TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), - SharedModule ], providers: [ { provide: LinkService, useValue: linkService }, + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }) + .overrideComponent(WorkflowItemAdminWorkflowGridElementComponent, { + set: { + entryComponents: [PublicationGridElementComponent] + } + }) .compileComponents(); })); @@ -60,4 +71,8 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should retrieve the item using the link service', () => { + expect(linkService.resolveLink).toHaveBeenCalledWith(wfi, followLink('item')); + }); }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts index 2ee9f16f52..2139590e6e 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts @@ -36,12 +36,27 @@ import { take } from 'rxjs/operators'; templateUrl: './workflow-item-admin-workflow-grid-element.component.html' }) /** - * The component for displaying a list element for an workflow item on the admin search page + * The component for displaying a grid element for an workflow item on the admin workflow search page */ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractListableElementComponent { + /** + * 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; + + /** + * The item linked to the workflow item + */ public item$: Observable; constructor(private componentFactoryResolver: ComponentFactoryResolver, private linkService: LinkService) { @@ -50,6 +65,7 @@ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractLista /** * Setup the dynamic child component + * Initialize the item object from the workflow item */ ngOnInit(): void { this.object = this.linkService.resolveLink(this.object, followLink('item')); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts index 68ffe9e421..f67e653ea4 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts @@ -13,6 +13,7 @@ import { LinkService } from '../../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; describe('TaskAdminWorkflowSearchResultListElementComponent', () => { let component: TaskAdminWorkflowSearchResultListElementComponent; @@ -60,4 +61,8 @@ describe('TaskAdminWorkflowSearchResultListElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should retrieve the workflow item using the link service', () => { + expect(linkService.resolveLink).toHaveBeenCalledWith(searchResult.indexableObject, followLink('workflowitem')); + }); }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts index 2de768b747..04951f59eb 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts +++ b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts @@ -23,15 +23,21 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl templateUrl: './task-admin-workflow-search-result-list-element.component.html' }) /** - * The component for displaying a list element for an pool task search result on the admin search page + * The component for displaying a grid element for an task search result on the admin workflow search page */ export class TaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent, TaskObject> { + /** + * The workflow item linked to the task object + */ public wfi$: Observable; constructor(private linkService: LinkService, protected truncatableService: TruncatableService) { super(truncatableService); } + /** + * Initialize the workflow item + */ ngOnInit(): void { super.ngOnInit(); this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.spec.ts index af9bbbc70f..10a05a8b30 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.spec.ts @@ -13,16 +13,25 @@ import { WorkflowItem } from '../../../../../core/submission/models/workflowitem import { WorkflowItemAdminWorkflowListElementComponent } from './workflow-item-admin-workflow-list-element.component'; import { LinkService } from '../../../../../core/cache/builders/link.service'; import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { PublicationGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component'; +import { AdminSidebarSectionComponent } from '../../../../admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; describe('WorkflowItemAdminWorkflowListElementComponent', () => { let component: WorkflowItemAdminWorkflowListElementComponent; let fixture: ComponentFixture; let id; let wfi; + let itemRD$; let linkService; + function init() { + itemRD$ = createSuccessfulRemoteDataObject$(new Item()); id = '780b2588-bda5-4112-a1cd-0b15000a5339'; wfi = new WorkflowItem(); + wfi.item = itemRD$; linkService = getMockLinkService(); } @@ -35,7 +44,6 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { NoopAnimationsModule, TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), - SharedModule ], providers: [ { provide: TruncatableService, useValue: mockTruncatableService }, @@ -60,4 +68,8 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should retrieve the item using the link service', () => { + expect(linkService.resolveLink).toHaveBeenCalledWith(wfi, followLink('item')); + }); }); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.ts index 7681d7e75d..835d6acfbb 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.ts @@ -18,15 +18,22 @@ import { Item } from '../../../../../core/shared/item.model'; templateUrl: './workflow-item-admin-workflow-list-element.component.html' }) /** - * The component for displaying a list element for an workflow item on the admin search page + * The component for displaying a list element for an workflow item on the admin workflow search page */ export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent implements OnInit { + + /** + * The item linked to the workflow item + */ public item$: Observable; constructor(private linkService: LinkService) { super(); } + /** + * Initialize the item object from the workflow item + */ ngOnInit(): void { this.object = this.linkService.resolveLink(this.object, followLink('item')); this.item$ = (this.object.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); 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 index 58f89e31e6..2109357b81 100644 --- 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 @@ -8,11 +8,11 @@ import { getWorkflowItemDeletePath, getWorkflowItemSendBackPath } from '../../.. 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 page + * The component for displaying the actions for a list element for an item on the admin workflow search page */ export class WorkflowItemAdminWorkflowActionsComponent { /** - * The item to perform the actions on + * The workflow item to perform the actions on */ @Input() public wfi: WorkflowItem; diff --git a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts new file mode 100644 index 0000000000..71d9346b29 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts @@ -0,0 +1,124 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { WorkflowItemActionPageComponent } from './workflow-item-action-page.component'; +import { MockTranslateLoader } from '../shared/mocks/mock-translate-loader'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/testing/utils'; +import { ActivatedRouteStub } from '../shared/testing/active-router-stub'; +import { NotificationsServiceStub } from '../shared/testing/notifications-service-stub'; +import { NotificationsService } from '../shared/notifications/notifications.service'; +import { RouteService } from '../core/services/route.service'; +import { RouterStub } from '../shared/testing/router-stub'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { WorkflowItem } from '../core/submission/models/workflowitem.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { VarDirective } from '../shared/utils/var.directive'; +import { By } from '@angular/platform-browser'; + +const type = 'testType'; +describe('WorkflowItemActionPageComponent', () => { + let component: WorkflowItemActionPageComponent; + let fixture: ComponentFixture; + let wfiService; + let wfi; + let itemRD$; + let id; + + function init() { + wfiService = jasmine.createSpyObj('workflowItemService', { + sendBack: observableOf(true) + }); + itemRD$ = createSuccessfulRemoteDataObject$(itemRD$); + wfi = new WorkflowItem(); + wfi.item = itemRD$; + id = 'de11b5e5-064a-4e98-a7ac-a1a6a65ddf80'; + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: MockTranslateLoader + } + })], + declarations: [TestComponent, VarDirective], + providers: [ + { provide: ActivatedRoute, useValue: new ActivatedRouteStub({}, { wfi: createSuccessfulRemoteDataObject(wfi) }) }, + { provide: Router, useClass: RouterStub }, + { provide: RouteService, useValue: {} }, + { provide: NotificationsService, useClass: NotificationsServiceStub }, + { provide: WorkflowItemDataService, useValue: wfiService }, + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should set the initial type correctly', () => { + expect(component.type).toEqual(type); + }); + + describe('clicking the button with class btn-danger', () => { + beforeEach(() => { + spyOn(component, 'performAction'); + }); + + it('should call performAction on clicking the btn-danger', () => { + const button = fixture.debugElement.query(By.css('.btn-danger')).nativeElement; + button.click(); + fixture.detectChanges(); + expect(component.performAction).toHaveBeenCalled(); + }); + }); + + describe('clicking the button with class btn-default', () => { + beforeEach(() => { + spyOn(component, 'previousPage'); + }); + + it('should call performAction on clicking the btn-default', () => { + const button = fixture.debugElement.query(By.css('.btn-default')).nativeElement; + button.click(); + fixture.detectChanges(); + expect(component.previousPage).toHaveBeenCalled(); + }); + }); +}); + +@Component({ + selector: 'ds-workflow-item-test-action-page', + templateUrl: 'workflow-item-action-page.component.html' + } +) +class TestComponent extends WorkflowItemActionPageComponent { + constructor(protected route: ActivatedRoute, + protected workflowItemService: WorkflowItemDataService, + protected router: Router, + protected routeService: RouteService, + protected notificationsService: NotificationsService, + protected translationService: TranslateService) { + super(route, workflowItemService, router, routeService, notificationsService, translationService); + } + + getType(): string { + return type; + } + + sendRequest(id: string): Observable { + return observableOf(true); + } +} diff --git a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts index fcc943a741..2859ca3e44 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.ts @@ -12,6 +12,9 @@ import { RemoteData } from '../core/data/remote-data'; import { getAllSucceededRemoteData, getRemoteDataPayload } from '../core/shared/operators'; import { isEmpty } from '../shared/empty.util'; +/** + * Abstract component representing a page to perform an action on a workflow item + */ export abstract class WorkflowItemActionPageComponent implements OnInit { public type; public wfi$: Observable; @@ -25,12 +28,18 @@ export abstract class WorkflowItemActionPageComponent implements OnInit { protected translationService: TranslateService) { } + /** + * Sets up the type, workflow item and its item object + */ ngOnInit() { this.type = this.getType(); this.wfi$ = this.route.data.pipe(map((data: Data) => data.wfi as RemoteData), getRemoteDataPayload()); this.item$ = this.wfi$.pipe(switchMap((wfi: WorkflowItem) => (wfi.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()))); } + /** + * Performs the action and shows a notification based on the outcome of the action + */ performAction() { this.wfi$.pipe( take(1), @@ -49,6 +58,10 @@ export abstract class WorkflowItemActionPageComponent implements OnInit { }) } + /** + * Navigates to the previous url + * If there's not previous url, it continues to the mydspace page instead + */ previousPage() { this.routeService.getPreviousUrl().pipe(take(1)) .subscribe((url) => { @@ -56,10 +69,18 @@ export abstract class WorkflowItemActionPageComponent implements OnInit { url = '/mydspace'; } this.router.navigateByUrl(url); - } ); } + + /** + * Performs the action of this workflow item action page + * @param id The id of the WorkflowItem + */ abstract sendRequest(id: string): Observable; + + /** + * Returns the type of page + */ abstract getType(): string; } diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts index b42fe965c1..d2c093ff4b 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts @@ -1,16 +1,59 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { WorkflowItemDeleteComponent } from './workflow-item-delete.component'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { MockTranslateLoader } from '../../shared/mocks/mock-translate-loader'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterStub } from '../../shared/testing/router-stub'; +import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; +import { RouteService } from '../../core/services/route.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; +import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { of as observableOf } from 'rxjs'; describe('WorkflowItemDeleteComponent', () => { let component: WorkflowItemDeleteComponent; let fixture: ComponentFixture; + let wfiService; + let wfi; + let itemRD$; + let id; + + function init() { + wfiService = jasmine.createSpyObj('workflowItemService', { + delete: observableOf(true) + }); + itemRD$ = createSuccessfulRemoteDataObject$(itemRD$); + wfi = new WorkflowItem(); + wfi.item = itemRD$; + id = 'de11b5e5-064a-4e98-a7ac-a1a6a65ddf80'; + } beforeEach(async(() => { + init(); TestBed.configureTestingModule({ - declarations: [ WorkflowItemDeleteComponent ] + imports: [TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: MockTranslateLoader + } + })], + declarations: [WorkflowItemDeleteComponent, VarDirective], + providers: [ + { provide: ActivatedRoute, useValue: new ActivatedRouteStub({}, { wfi: createSuccessfulRemoteDataObject(wfi) }) }, + { provide: Router, useClass: RouterStub }, + { provide: RouteService, useValue: {} }, + { provide: NotificationsService, useClass: NotificationsServiceStub }, + { provide: WorkflowItemDataService, useValue: wfiService }, + ], + schemas: [NO_ERRORS_SCHEMA] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +65,9 @@ describe('WorkflowItemDeleteComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should call delete on the workflow-item service when sendRequest is called', () => { + component.sendRequest(id); + expect(wfiService.delete).toHaveBeenCalledWith(id); + }); }); diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts index 171aeb27d1..73111bdf2b 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts @@ -11,6 +11,9 @@ import { TranslateService } from '@ngx-translate/core'; selector: 'ds-workflow-item-delete', templateUrl: '../workflow-item-action-page.component.html' }) +/** + * Component representing a page to delete a workflow item + */ export class WorkflowItemDeleteComponent extends WorkflowItemActionPageComponent { constructor(protected route: ActivatedRoute, protected workflowItemService: WorkflowItemDataService, @@ -21,10 +24,17 @@ export class WorkflowItemDeleteComponent extends WorkflowItemActionPageComponent super(route, workflowItemService, router, routeService, notificationsService, translationService); } + /** + * Returns the type of page + */ getType(): string { return 'delete'; } + /** + * Performs the action of this workflow item action page + * @param id The id of the WorkflowItem + */ sendRequest(id: string): Observable { return this.workflowItemService.delete(id); } diff --git a/src/app/+workflowitems-edit-page/workflow-item-page.resolver.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.spec.ts new file mode 100644 index 0000000000..792c642ec7 --- /dev/null +++ b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.spec.ts @@ -0,0 +1,29 @@ +import { first } from 'rxjs/operators'; +import { of as observableOf } from 'rxjs'; +import { WorkflowItemPageResolver } from './workflow-item-page.resolver'; +import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; + +describe('WorkflowItemPageResolver', () => { + describe('resolve', () => { + let resolver: WorkflowItemPageResolver; + let wfiService: WorkflowItemDataService; + const uuid = '1234-65487-12354-1235'; + + beforeEach(() => { + wfiService = { + findById: (id: string) => observableOf({ payload: { id }, hasSucceeded: true }) as any + } as any; + resolver = new WorkflowItemPageResolver(wfiService); + }); + + it('should resolve a workflow item with the correct id', () => { + resolver.resolve({ params: { id: uuid } } as any, undefined) + .pipe(first()) + .subscribe( + (resolved) => { + expect(resolved.payload.id).toEqual(uuid); + } + ); + }); + }); +}); diff --git a/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts index 5ae11efff6..19cc4b4914 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-page.resolver.ts @@ -2,8 +2,6 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { RemoteData } from '../core/data/remote-data'; -import { ItemDataService } from '../core/data/item-data.service'; -import { Item } from '../core/shared/item.model'; import { hasValue } from '../shared/empty.util'; import { find } from 'rxjs/operators'; import { followLink } from '../shared/utils/follow-link-config.model'; @@ -11,7 +9,7 @@ import { WorkflowItemDataService } from '../core/submission/workflowitem-data.se import { WorkflowItem } from '../core/submission/models/workflowitem.model'; /** - * This class represents a resolver that requests a specific item before the route is activated + * This class represents a resolver that requests a specific workflow item before the route is activated */ @Injectable() export class WorkflowItemPageResolver implements Resolve> { @@ -19,10 +17,10 @@ export class WorkflowItemPageResolver implements Resolve> Emits the found item based on the parameters in the current route, + * @returns Observable<> Emits the found workflow item based on the parameters in the current route, * or an error if something went wrong */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts index e76e01b7f3..daf58450e4 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts @@ -1,16 +1,59 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { WorkflowItemSendBackComponent } from './workflow-item-send-back.component'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { MockTranslateLoader } from '../../shared/mocks/mock-translate-loader'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterStub } from '../../shared/testing/router-stub'; +import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; +import { RouteService } from '../../core/services/route.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; +import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { of as observableOf } from 'rxjs'; +import { WorkflowItemSendBackComponent } from './workflow-item-send-back.component'; describe('WorkflowItemSendBackComponent', () => { let component: WorkflowItemSendBackComponent; let fixture: ComponentFixture; + let wfiService; + let wfi; + let itemRD$; + let id; + + function init() { + wfiService = jasmine.createSpyObj('workflowItemService', { + sendBack: observableOf(true) + }); + itemRD$ = createSuccessfulRemoteDataObject$(itemRD$); + wfi = new WorkflowItem(); + wfi.item = itemRD$; + id = 'de11b5e5-064a-4e98-a7ac-a1a6a65ddf80'; + } beforeEach(async(() => { + init(); TestBed.configureTestingModule({ - declarations: [ WorkflowItemSendBackComponent ] + imports: [TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: MockTranslateLoader + } + })], + declarations: [WorkflowItemSendBackComponent, VarDirective], + providers: [ + { provide: ActivatedRoute, useValue: new ActivatedRouteStub({}, { wfi: createSuccessfulRemoteDataObject(wfi) }) }, + { provide: Router, useClass: RouterStub }, + { provide: RouteService, useValue: {} }, + { provide: NotificationsService, useClass: NotificationsServiceStub }, + { provide: WorkflowItemDataService, useValue: wfiService }, + ], + schemas: [NO_ERRORS_SCHEMA] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { @@ -22,4 +65,9 @@ describe('WorkflowItemSendBackComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should call sendBack on the workflow-item service when sendRequest is called', () => { + component.sendRequest(id); + expect(wfiService.sendBack).toHaveBeenCalledWith(id); + }); }); diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts index c4006811d9..6e9a2e841e 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts @@ -11,6 +11,9 @@ import { TranslateService } from '@ngx-translate/core'; selector: 'ds-workflow-item-send-back', templateUrl: '../workflow-item-action-page.component.html' }) +/** + * Component representing a page to send back a workflow item to the submitter + */ export class WorkflowItemSendBackComponent extends WorkflowItemActionPageComponent { constructor(protected route: ActivatedRoute, protected workflowItemService: WorkflowItemDataService, @@ -21,10 +24,17 @@ export class WorkflowItemSendBackComponent extends WorkflowItemActionPageCompone super(route, workflowItemService, router, routeService, notificationsService, translationService); } + /** + * Returns the type of page + */ getType(): string { return 'send-back'; } + /** + * Performs the action of this workflow item action page + * @param id The id of the WorkflowItem + */ sendRequest(id: string): Observable { return this.workflowItemService.sendBack(id); } From 9cfed06784db4f7aee998dd9e2d54efb3fc663a0 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 9 Apr 2020 10:20:42 +0200 Subject: [PATCH 07/14] fixed caching issue --- .../workflow-item-admin-workflow-actions.component.ts | 2 ++ .../workflow-item-delete.component.spec.ts | 3 +++ .../workflow-item-delete/workflow-item-delete.component.ts | 5 ++++- .../workflow-item-send-back.component.spec.ts | 3 +++ .../workflow-item-send-back.component.ts | 5 ++++- 5 files changed, 16 insertions(+), 2 deletions(-) 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 index 2109357b81..d44f870b14 100644 --- 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 @@ -11,6 +11,7 @@ import { getWorkflowItemDeletePath, getWorkflowItemSendBackPath } from '../../.. * 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 */ @@ -25,6 +26,7 @@ export class WorkflowItemAdminWorkflowActionsComponent { * Returns the path to the delete page of this workflow item */ getDeletePath(): string { + return getWorkflowItemDeletePath(this.wfi.id) } diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts index d2c093ff4b..c11cdc1d15 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts @@ -15,6 +15,8 @@ import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { VarDirective } from '../../shared/utils/var.directive'; import { of as observableOf } from 'rxjs'; +import { RequestService } from '../../core/data/request.service'; +import { getMockRequestService } from '../../shared/mocks/mock-request.service'; describe('WorkflowItemDeleteComponent', () => { let component: WorkflowItemDeleteComponent; @@ -50,6 +52,7 @@ describe('WorkflowItemDeleteComponent', () => { { provide: RouteService, useValue: {} }, { provide: NotificationsService, useClass: NotificationsServiceStub }, { provide: WorkflowItemDataService, useValue: wfiService }, + { provide: RequestService, useValue: getMockRequestService() }, ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts index 73111bdf2b..43c3e90152 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.ts @@ -6,6 +6,7 @@ import { WorkflowItemDataService } from '../../core/submission/workflowitem-data import { RouteService } from '../../core/services/route.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; +import { RequestService } from '../../core/data/request.service'; @Component({ selector: 'ds-workflow-item-delete', @@ -20,7 +21,8 @@ export class WorkflowItemDeleteComponent extends WorkflowItemActionPageComponent protected router: Router, protected routeService: RouteService, protected notificationsService: NotificationsService, - protected translationService: TranslateService) { + protected translationService: TranslateService, + protected requestService: RequestService) { super(route, workflowItemService, router, routeService, notificationsService, translationService); } @@ -36,6 +38,7 @@ export class WorkflowItemDeleteComponent extends WorkflowItemActionPageComponent * @param id The id of the WorkflowItem */ sendRequest(id: string): Observable { + this.requestService.removeByHrefSubstring('/discover'); return this.workflowItemService.delete(id); } } diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts index daf58450e4..0332a6b9ee 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts @@ -15,6 +15,8 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { VarDirective } from '../../shared/utils/var.directive'; import { of as observableOf } from 'rxjs'; import { WorkflowItemSendBackComponent } from './workflow-item-send-back.component'; +import { RequestService } from '../../core/data/request.service'; +import { getMockRequestService } from '../../shared/mocks/mock-request.service'; describe('WorkflowItemSendBackComponent', () => { let component: WorkflowItemSendBackComponent; @@ -50,6 +52,7 @@ describe('WorkflowItemSendBackComponent', () => { { provide: RouteService, useValue: {} }, { provide: NotificationsService, useClass: NotificationsServiceStub }, { provide: WorkflowItemDataService, useValue: wfiService }, + { provide: RequestService, useValue: getMockRequestService() }, ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts index 6e9a2e841e..002e5dcc9a 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.ts @@ -6,6 +6,7 @@ import { WorkflowItemDataService } from '../../core/submission/workflowitem-data import { RouteService } from '../../core/services/route.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; +import { RequestService } from '../../core/data/request.service'; @Component({ selector: 'ds-workflow-item-send-back', @@ -20,7 +21,8 @@ export class WorkflowItemSendBackComponent extends WorkflowItemActionPageCompone protected router: Router, protected routeService: RouteService, protected notificationsService: NotificationsService, - protected translationService: TranslateService) { + protected translationService: TranslateService, + protected requestService: RequestService) { super(route, workflowItemService, router, routeService, notificationsService, translationService); } @@ -36,6 +38,7 @@ export class WorkflowItemSendBackComponent extends WorkflowItemActionPageCompone * @param id The id of the WorkflowItem */ sendRequest(id: string): Observable { + this.requestService.removeByHrefSubstring('/discover'); return this.workflowItemService.sendBack(id); } } From 3ac575c3604a4d8ea3eb47024b1c2d0668bbb767 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 9 Apr 2020 11:29:39 +0200 Subject: [PATCH 08/14] fixed messages for Admin Workflow --- resources/i18n/en.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5 index a515113445..20c7b05ec6 100644 --- a/resources/i18n/en.json5 +++ b/resources/i18n/en.json5 @@ -263,9 +263,9 @@ - "admin.workflow.breadcrumbs": "Admin Workflow", + "admin.workflow.breadcrumbs": "Administer Workflow", - "admin.workflow.title": "Admin Workflow", + "admin.workflow.title": "Administer Workflow", "admin.workflow.item.workflow": "Workflow", @@ -1399,7 +1399,7 @@ "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - "menu.section.workflow": "Active Workflows", + "menu.section.workflow": "Administer Workflow", "mydspace.description": "", @@ -2232,7 +2232,7 @@ - "workflowAdmin.search.results.head": "Active Workflows", + "workflowAdmin.search.results.head": "Administer Workflow", From 3d482aed26f902b04b76d898d6a7512272e929a1 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 9 Apr 2020 16:17:27 +0200 Subject: [PATCH 09/14] removed unnecessary import --- src/app/+item-page/edit-item-page/edit-item-page.module.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/+item-page/edit-item-page/edit-item-page.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.module.ts index d02aafcfa1..ac6125fb1c 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.module.ts @@ -5,7 +5,6 @@ import { EditItemPageRoutingModule } from './edit-item-page.routing.module'; import { EditItemPageComponent } from './edit-item-page.component'; import { ItemStatusComponent } from './item-status/item-status.component'; import { ItemOperationComponent } from './item-operation/item-operation.component'; -import { ModifyItemOverviewComponent } from './modify-item-overview/modify-item-overview.component'; import { ItemWithdrawComponent } from './item-withdraw/item-withdraw.component'; import { ItemReinstateComponent } from './item-reinstate/item-reinstate.component'; import { AbstractSimpleItemActionComponent } from './simple-item-action/abstract-simple-item-action.component'; @@ -47,7 +46,6 @@ import { ItemVersionHistoryComponent } from './item-version-history/item-version ItemOperationComponent, AbstractSimpleItemActionComponent, AbstractItemUpdateComponent, - ModifyItemOverviewComponent, ItemWithdrawComponent, ItemReinstateComponent, ItemPrivateComponent, From 42740809c0419081f23e8e3f958deaa160ac868c Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 21 Apr 2020 16:27:26 +0200 Subject: [PATCH 10/14] changed tasks into wfi's --- ...-search-result-grid-element.component.html | 7 -- ...arch-result-grid-element.component.spec.ts | 87 ------------------- ...ow-search-result-grid-element.component.ts | 47 ---------- ...dmin-workflow-grid-element.component.html} | 2 +- ...dmin-workflow-grid-element.component.scss} | 0 ...n-workflow-grid-element.component.spec.ts} | 12 +-- ...-admin-workflow-grid-element.component.ts} | 40 ++++----- ...-search-result-list-element.component.html | 7 -- ...-search-result-list-element.component.scss | 0 ...arch-result-list-element.component.spec.ts | 68 --------------- ...ow-search-result-list-element.component.ts | 46 ---------- ...admin-workflow-list-element.component.scss | 0 ...m-admin-workflow-list-element.component.ts | 41 --------- ...dmin-workflow-list-element.component.html} | 2 +- ...dmin-workflow-list-element.component.scss} | 0 ...n-workflow-list-element.component.spec.ts} | 10 +-- ...t-admin-workflow-list-element.component.ts | 44 ++++++++++ src/app/+admin/admin.module.ts | 23 ++--- 18 files changed, 82 insertions(+), 354 deletions(-) delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/{workflow-item-admin-workflow-grid-element.component.html => workflow-item-search-result-admin-workflow-grid-element.component.html} (75%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/{task-search-result/task-admin-workflow-search-result-grid-element.component.scss => workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/{workflow-item-admin-workflow-grid-element.component.spec.ts => workflow-item-search-result-admin-workflow-grid-element.component.spec.ts} (81%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/{workflow-item-admin-workflow-grid-element.component.ts => workflow-item-search-result-admin-workflow-grid-element.component.ts} (69%) delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.scss delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss delete mode 100644 src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.ts rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/{workflow-item-admin-workflow-list-element.component.html => workflow-item-search-result-admin-workflow-list-element.component.html} (80%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/{admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.scss => admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.scss} (100%) rename src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/{workflow-item-admin-workflow-list-element.component.spec.ts => workflow-item-search-result-admin-workflow-list-element.component.spec.ts} (85%) create mode 100644 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 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html deleted file mode 100644 index 8403e632db..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts deleted file mode 100644 index a2461bffda..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TranslateModule } from '@ngx-translate/core'; -import { Observable } from 'rxjs/internal/Observable'; -import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; -import { RemoteData } from '../../../../../core/data/remote-data'; -import { Bitstream } from '../../../../../core/shared/bitstream.model'; -import { Item } from '../../../../../core/shared/item.model'; -import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service'; -import { SharedModule } from '../../../../../shared/shared.module'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; -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 { RouterTestingModule } from '@angular/router/testing'; -import { TaskAdminWorkflowSearchResultGridElementComponent } from './task-admin-workflow-search-result-grid-element.component'; -import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; -import { SearchResult } from '../../../../../shared/search/search-result.model'; -import { LinkService } from '../../../../../core/cache/builders/link.service'; -import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; - -describe('TaskAdminWorkflowSearchResultGridElementComponent', () => { - let component: TaskAdminWorkflowSearchResultGridElementComponent; - let fixture: ComponentFixture; - let id; - let searchResult; - let linkService; - - const mockBitstreamDataService = { - getThumbnailFor(item: Item): Observable> { - return createSuccessfulRemoteDataObject$(new Bitstream()); - } - }; - - function init() { - id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new SearchResult(); - searchResult.indexableObject = new TaskObject(); - searchResult.indexableObject.workflowitem = createSuccessfulRemoteDataObject$(new WorkflowItem()); - searchResult.indexableObject.uuid = id; - linkService = getMockLinkService(); - } - - beforeEach(async(() => { - init(); - TestBed.configureTestingModule( - { - declarations: [TaskAdminWorkflowSearchResultGridElementComponent], - imports: [ - NoopAnimationsModule, - TranslateModule.forRoot(), - RouterTestingModule.withRoutes([]), - SharedModule - ], - providers: [ - { provide: TruncatableService, useValue: mockTruncatableService }, - { provide: BitstreamDataService, useValue: mockBitstreamDataService }, - { provide: LinkService, useValue: linkService }, - ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - linkService.resolveLink.and.callFake((a) => a); - fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultGridElementComponent); - component = fixture.componentInstance; - component.object = searchResult; - component.linkTypes = CollectionElementLinkType; - component.index = 0; - component.viewModes = ViewMode; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should retrieve the workflow item using the link service', () => { - expect(linkService.resolveLink).toHaveBeenCalledWith(searchResult.indexableObject, followLink('workflowitem')); - }); -}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts deleted file mode 100644 index cc002c87c0..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, OnInit } from '@angular/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 { SearchResultGridElementComponent } from '../../../../../shared/object-grid/search-result-grid-element/search-result-grid-element.component'; -import { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; -import { Observable } from 'rxjs'; -import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { RemoteData } from '../../../../../core/data/remote-data'; -import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; -import { SearchResult } from '../../../../../shared/search/search-result.model'; -import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; -import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model'; -import { LinkService } from '../../../../../core/cache/builders/link.service'; -import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; -import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; - -@listableObjectComponent(PoolTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) -@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) -@Component({ - selector: 'ds-task-admin-workflow-search-result-grid-element', - styleUrls: ['./task-admin-workflow-search-result-grid-element.component.scss'], - templateUrl: './task-admin-workflow-search-result-grid-element.component.html' -}) -/** - * The component for displaying a list element for an task search result on the admin workflow search page - */ -export class TaskAdminWorkflowSearchResultGridElementComponent extends SearchResultGridElementComponent, TaskObject> implements OnInit { - /** - * The workflow item linked to the task object - */ - public wfi$: Observable; - - constructor(private linkService: LinkService, protected truncatableService: TruncatableService, protected bitstreamService: BitstreamDataService) { - super(truncatableService, bitstreamService); - } - - /** - * Initialize the workflow item - */ - ngOnInit(): void { - super.ngOnInit(); - this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); - this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); - } -} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html 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.html similarity index 75% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html rename to 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.html index d6b76c0a8d..87bae0c261 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.html +++ 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.html @@ -7,6 +7,6 @@
  • - +
diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.scss 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.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component.scss rename to 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.scss diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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 similarity index 81% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.spec.ts rename to 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 4d064444e5..e27a35654b 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-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,7 +7,7 @@ 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 { WorkflowItemAdminWorkflowGridElementComponent } from './workflow-item-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 { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; @@ -18,8 +18,8 @@ import { PublicationGridElementComponent } from '../../../../../shared/object-gr import { ListableObjectDirective } from '../../../../../shared/object-collection/shared/listable-object/listable-object.directive'; describe('WorkflowItemAdminWorkflowGridElementComponent', () => { - let component: WorkflowItemAdminWorkflowGridElementComponent; - let fixture: ComponentFixture; + let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent; + let fixture: ComponentFixture; let id; let wfi; let itemRD$; @@ -37,7 +37,7 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { init(); TestBed.configureTestingModule( { - declarations: [WorkflowItemAdminWorkflowGridElementComponent, PublicationGridElementComponent, ListableObjectDirective], + declarations: [WorkflowItemSearchResultAdminWorkflowGridElementComponent, PublicationGridElementComponent, ListableObjectDirective], imports: [ NoopAnimationsModule, TranslateModule.forRoot(), @@ -49,7 +49,7 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { ], schemas: [NO_ERRORS_SCHEMA] }) - .overrideComponent(WorkflowItemAdminWorkflowGridElementComponent, { + .overrideComponent(WorkflowItemSearchResultAdminWorkflowGridElementComponent, { set: { entryComponents: [PublicationGridElementComponent] } @@ -59,7 +59,7 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { beforeEach(() => { linkService.resolveLink.and.callFake((a) => a); - fixture = TestBed.createComponent(WorkflowItemAdminWorkflowGridElementComponent); + fixture = TestBed.createComponent(WorkflowItemSearchResultAdminWorkflowGridElementComponent); component = fixture.componentInstance; component.object = wfi; component.linkTypes = CollectionElementLinkType; diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.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.ts similarity index 69% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.ts rename to 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.ts index 2139590e6e..7abe99cf52 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.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.ts @@ -1,44 +1,32 @@ -import { Component, ComponentFactoryResolver, ElementRef, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; +import { Component, ComponentFactoryResolver, ElementRef, ViewChild } from '@angular/core'; 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 { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; -import { getItemEditPath } from '../../../../../+item-page/item-page-routing.module'; -import { URLCombiner } from '../../../../../core/url-combiner/url-combiner'; -import { - ITEM_EDIT_DELETE_PATH, - ITEM_EDIT_MOVE_PATH, - ITEM_EDIT_PRIVATE_PATH, - ITEM_EDIT_PUBLIC_PATH, - ITEM_EDIT_REINSTATE_PATH, - ITEM_EDIT_WITHDRAW_PATH -} from '../../../../../+item-page/edit-item-page/edit-item-page.routing.module'; 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 { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; 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, getRemoteDataPayload } from '../../../../../core/shared/operators'; import { take } from 'rxjs/operators'; +import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; -@listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) +@listableObjectComponent(WorkflowItemSearchResult, ViewMode.GridElement, Context.AdminWorkflowSearch) @Component({ - selector: 'ds-workflow-item-admin-workflow-grid-element', - styleUrls: ['./workflow-item-admin-workflow-grid-element.component.scss'], - templateUrl: './workflow-item-admin-workflow-grid-element.component.html' + selector: 'ds-workflow-item-search-result-admin-workflow-grid-element', + styleUrls: ['./workflow-item-search-result-admin-workflow-grid-element.component.scss'], + templateUrl: './workflow-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 WorkflowItemAdminWorkflowGridElementComponent extends AbstractListableElementComponent { +export class WorkflowItemSearchResultAdminWorkflowGridElementComponent extends SearchResultGridElementComponent { /** * Directive used to render the dynamic component in */ @@ -59,8 +47,13 @@ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractLista */ public item$: Observable; - constructor(private componentFactoryResolver: ComponentFactoryResolver, private linkService: LinkService) { - super(); + constructor( + private componentFactoryResolver: ComponentFactoryResolver, + private linkService: LinkService, + protected truncatableService: TruncatableService, + protected bitstreamDataService: BitstreamDataService + ) { + super(truncatableService, bitstreamDataService); } /** @@ -68,8 +61,9 @@ export class WorkflowItemAdminWorkflowGridElementComponent extends AbstractLista * Initialize the item object from the workflow item */ ngOnInit(): void { - this.object = this.linkService.resolveLink(this.object, followLink('item')); - this.item$ = (this.object.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); + 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)); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html deleted file mode 100644 index c60347b08a..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts deleted file mode 100644 index f67e653ea4..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { TranslateModule } from '@ngx-translate/core'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; -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 { RouterTestingModule } from '@angular/router/testing'; -import { TaskAdminWorkflowSearchResultListElementComponent } from './task-admin-workflow-search-result-list-element.component'; -import { SearchResult } from '../../../../../shared/search/search-result.model'; -import { LinkService } from '../../../../../core/cache/builders/link.service'; -import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; - -describe('TaskAdminWorkflowSearchResultListElementComponent', () => { - let component: TaskAdminWorkflowSearchResultListElementComponent; - let fixture: ComponentFixture; - let id; - let searchResult; - let linkService; - - function init() { - id = '780b2588-bda5-4112-a1cd-0b15000a5339'; - searchResult = new SearchResult(); - searchResult.indexableObject = new TaskObject(); - searchResult.indexableObject.workflowitem = createSuccessfulRemoteDataObject$(new WorkflowItem()); - searchResult.indexableObject.uuid = id; - linkService = getMockLinkService(); - } - - beforeEach(async(() => { - init(); - TestBed.configureTestingModule({ - imports: [ - TranslateModule.forRoot(), - RouterTestingModule.withRoutes([]) - ], - declarations: [TaskAdminWorkflowSearchResultListElementComponent], - providers: [{ provide: TruncatableService, useValue: {} }, - { provide: LinkService, useValue: linkService } - ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - linkService.resolveLink.and.callFake((a) => a); - fixture = TestBed.createComponent(TaskAdminWorkflowSearchResultListElementComponent); - component = fixture.componentInstance; - component.object = searchResult; - component.linkTypes = CollectionElementLinkType; - component.index = 0; - component.viewModes = ViewMode; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should retrieve the workflow item using the link service', () => { - expect(linkService.resolveLink).toHaveBeenCalledWith(searchResult.indexableObject, followLink('workflowitem')); - }); -}); diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts deleted file mode 100644 index 04951f59eb..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component } from '@angular/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 { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; -import { PoolTaskSearchResult } from '../../../../../shared/object-collection/shared/pool-task-search-result.model'; -import { Observable, pipe } from 'rxjs'; -import { RemoteData } from '../../../../../core/data/remote-data'; -import { WorkflowItem } from '../../../../../core/submission/models/workflowitem.model'; -import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../../../core/shared/operators'; -import { ClaimedTaskSearchResult } from '../../../../../shared/object-collection/shared/claimed-task-search-result.model'; -import { TaskObject } from '../../../../../core/tasks/models/task-object.model'; -import { SearchResult } from '../../../../../shared/search/search-result.model'; -import { followLink } from '../../../../../shared/utils/follow-link-config.model'; -import { LinkService } from '../../../../../core/cache/builders/link.service'; -import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; - -@listableObjectComponent(PoolTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) -@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) -@Component({ - selector: 'ds-task-admin-workflow-search-result-list-element', - styleUrls: ['./task-admin-workflow-search-result-list-element.component.scss'], - templateUrl: './task-admin-workflow-search-result-list-element.component.html' -}) -/** - * The component for displaying a grid element for an task search result on the admin workflow search page - */ -export class TaskAdminWorkflowSearchResultListElementComponent extends SearchResultListElementComponent, TaskObject> { - /** - * The workflow item linked to the task object - */ - public wfi$: Observable; - - constructor(private linkService: LinkService, protected truncatableService: TruncatableService) { - super(truncatableService); - } - - /** - * Initialize the workflow item - */ - ngOnInit(): void { - super.ngOnInit(); - this.dso = this.linkService.resolveLink(this.dso, followLink('workflowitem')); - this.wfi$ = (this.dso.workflowitem as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); - } -} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss b/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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-admin-workflow-list-element.component.ts deleted file mode 100644 index 835d6acfbb..0000000000 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, OnInit } from '@angular/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 { AbstractListableElementComponent } from '../../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; -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, getRemoteDataPayload } from '../../../../../core/shared/operators'; -import { Item } from '../../../../../core/shared/item.model'; - -@listableObjectComponent(WorkflowItem, ViewMode.ListElement, Context.AdminWorkflowSearch) -@Component({ - selector: 'ds-workflow-item-admin-workflow-list-element', - styleUrls: ['./workflow-item-admin-workflow-list-element.component.scss'], - templateUrl: './workflow-item-admin-workflow-list-element.component.html' -}) -/** - * The component for displaying a list element for an workflow item on the admin workflow search page - */ -export class WorkflowItemAdminWorkflowListElementComponent extends AbstractListableElementComponent implements OnInit { - - /** - * The item linked to the workflow item - */ - public item$: Observable; - - constructor(private linkService: LinkService) { - super(); - } - - /** - * Initialize the item object from the workflow item - */ - ngOnInit(): void { - this.object = this.linkService.resolveLink(this.object, followLink('item')); - this.item$ = (this.object.item as Observable>).pipe(getAllSucceededRemoteData(), getRemoteDataPayload()); - } -} diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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 similarity index 80% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.html rename to 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 f3502fe0ab..192cc751f2 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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 @@ -7,4 +7,4 @@ [index]="index" [linkType]="linkType" [listID]="listID">
- + diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.scss 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.scss similarity index 100% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component.scss rename to 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.scss diff --git a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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 similarity index 85% rename from src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component.spec.ts rename to 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 10a05a8b30..5fb736c1fd 100644 --- a/src/app/+admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-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 @@ -10,7 +10,7 @@ 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 { WorkflowItemAdminWorkflowListElementComponent } from './workflow-item-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 { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; @@ -20,8 +20,8 @@ import { PublicationGridElementComponent } from '../../../../../shared/object-gr import { AdminSidebarSectionComponent } from '../../../../admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; describe('WorkflowItemAdminWorkflowListElementComponent', () => { - let component: WorkflowItemAdminWorkflowListElementComponent; - let fixture: ComponentFixture; + let component: WorkflowItemSearchResultAdminWorkflowListElementComponent; + let fixture: ComponentFixture; let id; let wfi; let itemRD$; @@ -39,7 +39,7 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { init(); TestBed.configureTestingModule( { - declarations: [WorkflowItemAdminWorkflowListElementComponent], + declarations: [WorkflowItemSearchResultAdminWorkflowListElementComponent], imports: [ NoopAnimationsModule, TranslateModule.forRoot(), @@ -56,7 +56,7 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { beforeEach(() => { linkService.resolveLink.and.callFake((a) => a); - fixture = TestBed.createComponent(WorkflowItemAdminWorkflowListElementComponent); + fixture = TestBed.createComponent(WorkflowItemSearchResultAdminWorkflowListElementComponent); component = fixture.componentInstance; component.object = wfi; component.linkTypes = CollectionElementLinkType; 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 new file mode 100644 index 0000000000..80225db09f --- /dev/null +++ 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 @@ -0,0 +1,44 @@ +import { Component, OnInit } from '@angular/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, 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 { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; + +@listableObjectComponent(WorkflowItemSearchResult, 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'], + templateUrl: './workflow-item-search-result-admin-workflow-list-element.component.html' +}) +/** + * The component for displaying a list element for an workflow item on the admin workflow search page + */ +export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends SearchResultListElementComponent implements OnInit { + + /** + * The item linked to the workflow item + */ + public item$: Observable; + + constructor(private linkService: LinkService, protected truncatableService: TruncatableService) { + super(truncatableService); + } + + /** + * 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()); + } +} diff --git a/src/app/+admin/admin.module.ts b/src/app/+admin/admin.module.ts index cd10aad1ca..25b8bd4648 100644 --- a/src/app/+admin/admin.module.ts +++ b/src/app/+admin/admin.module.ts @@ -12,12 +12,10 @@ import { ItemAdminSearchResultGridElementComponent } from './admin-search-page/a import { CommunityAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component'; import { CollectionAdminSearchResultGridElementComponent } from './admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component'; import { ItemAdminSearchResultActionsComponent } from './admin-search-page/admin-search-results/item-admin-search-result-actions.component'; -import { WorkflowItemAdminWorkflowGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-admin-workflow-grid-element.component'; +import { WorkflowItemSearchResultAdminWorkflowGridElementComponent } from './admin-workflow-page/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-page/admin-workflow-search-results/workflow-item-admin-workflow-actions.component'; -import { WorkflowItemAdminWorkflowListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-admin-workflow-list-element.component'; +import { WorkflowItemSearchResultAdminWorkflowListElementComponent } from './admin-workflow-page/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/admin-workflow-page.component'; -import { TaskAdminWorkflowSearchResultGridElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/task-search-result/task-admin-workflow-search-result-grid-element.component'; -import { TaskAdminWorkflowSearchResultListElementComponent } from './admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/task-item-search-result/task-admin-workflow-search-result-list-element.component'; @NgModule({ imports: [ @@ -38,12 +36,10 @@ import { TaskAdminWorkflowSearchResultListElementComponent } from './admin-workf CollectionAdminSearchResultGridElementComponent, ItemAdminSearchResultActionsComponent, - WorkflowItemAdminWorkflowListElementComponent, - WorkflowItemAdminWorkflowGridElementComponent, - WorkflowItemAdminWorkflowActionsComponent, + WorkflowItemSearchResultAdminWorkflowListElementComponent, + WorkflowItemSearchResultAdminWorkflowGridElementComponent, + WorkflowItemAdminWorkflowActionsComponent - TaskAdminWorkflowSearchResultGridElementComponent, - TaskAdminWorkflowSearchResultListElementComponent, ], entryComponents: [ ItemAdminSearchResultListElementComponent, @@ -54,12 +50,9 @@ import { TaskAdminWorkflowSearchResultListElementComponent } from './admin-workf CollectionAdminSearchResultGridElementComponent, ItemAdminSearchResultActionsComponent, - WorkflowItemAdminWorkflowListElementComponent, - WorkflowItemAdminWorkflowGridElementComponent, - WorkflowItemAdminWorkflowActionsComponent, - - TaskAdminWorkflowSearchResultGridElementComponent, - TaskAdminWorkflowSearchResultListElementComponent, + WorkflowItemSearchResultAdminWorkflowListElementComponent, + WorkflowItemSearchResultAdminWorkflowGridElementComponent, + WorkflowItemAdminWorkflowActionsComponent ] }) export class AdminModule { From 6196a99a989c148a260ccd2e957c9f5aeaeea7c8 Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 21 Apr 2020 18:41:38 +0200 Subject: [PATCH 11/14] fixed tests --- ...-result-admin-workflow-grid-element.component.spec.ts | 8 +++++++- ...-result-admin-workflow-list-element.component.spec.ts | 9 +++++---- 2 files changed, 12 insertions(+), 5 deletions(-) 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 e27a35654b..0fe52373ec 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 @@ -16,6 +16,8 @@ import { followLink } from '../../../../../shared/utils/follow-link-config.model import { Item } from '../../../../../core/shared/item.model'; import { PublicationGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/publication/publication-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'; describe('WorkflowItemAdminWorkflowGridElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent; @@ -24,12 +26,15 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { let wfi; let itemRD$; let linkService; + let object; 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(); } @@ -46,6 +51,7 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { providers: [ { provide: LinkService, useValue: linkService }, { provide: TruncatableService, useValue: {} }, + { provide: BitstreamDataService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }) @@ -61,7 +67,7 @@ describe('WorkflowItemAdminWorkflowGridElementComponent', () => { linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(WorkflowItemSearchResultAdminWorkflowGridElementComponent); component = fixture.componentInstance; - component.object = wfi; + component.object = object; component.linkTypes = CollectionElementLinkType; component.index = 0; component.viewModes = ViewMode; 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 5fb736c1fd..c38915940c 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 @@ -4,7 +4,6 @@ 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 { SharedModule } from '../../../../../shared/shared.module'; 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'; @@ -16,8 +15,7 @@ import { getMockLinkService } from '../../../../../shared/mocks/mock-link-servic import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; import { followLink } from '../../../../../shared/utils/follow-link-config.model'; import { Item } from '../../../../../core/shared/item.model'; -import { PublicationGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component'; -import { AdminSidebarSectionComponent } from '../../../../admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; +import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; describe('WorkflowItemAdminWorkflowListElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowListElementComponent; @@ -26,12 +24,15 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { let wfi; let itemRD$; let linkService; + let object; 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(); } @@ -58,7 +59,7 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { linkService.resolveLink.and.callFake((a) => a); fixture = TestBed.createComponent(WorkflowItemSearchResultAdminWorkflowListElementComponent); component = fixture.componentInstance; - component.object = wfi; + component.object = object; component.linkTypes = CollectionElementLinkType; component.index = 0; component.viewModes = ViewMode; From 6220c51aa612b19325900b5ad73d37e7cbb9a8d8 Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 11 May 2020 13:28:02 +0200 Subject: [PATCH 12/14] fixed tests --- ...t-admin-workflow-grid-element.component.spec.ts | 4 ++-- ...t-admin-workflow-list-element.component.spec.ts | 4 ++-- .../workflow-item-action-page.component.spec.ts | 12 ++++++------ .../workflow-item-delete.component.spec.ts | 14 +++++++------- .../workflow-item-send-back.component.spec.ts | 14 +++++++------- 5 files changed, 24 insertions(+), 24 deletions(-) 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 0fe52373ec..2f3f88fa70 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 @@ -10,14 +10,14 @@ import { RouterTestingModule } from '@angular/router/testing'; 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 { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; import { followLink } from '../../../../../shared/utils/follow-link-config.model'; import { Item } from '../../../../../core/shared/item.model'; import { PublicationGridElementComponent } from '../../../../../shared/object-grid/item-grid-element/item-types/publication/publication-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'; describe('WorkflowItemAdminWorkflowGridElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowGridElementComponent; 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 c38915940c..53f81f96db 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 @@ -11,11 +11,11 @@ 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 { LinkService } from '../../../../../core/cache/builders/link.service'; -import { getMockLinkService } from '../../../../../shared/mocks/mock-link-service'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/testing/utils'; 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'; describe('WorkflowItemAdminWorkflowListElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowListElementComponent; diff --git a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts index 71d9346b29..979476bf03 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-action-page.component.spec.ts @@ -2,13 +2,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { WorkflowItemActionPageComponent } from './workflow-item-action-page.component'; -import { MockTranslateLoader } from '../shared/mocks/mock-translate-loader'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/testing/utils'; -import { ActivatedRouteStub } from '../shared/testing/active-router-stub'; -import { NotificationsServiceStub } from '../shared/testing/notifications-service-stub'; import { NotificationsService } from '../shared/notifications/notifications.service'; import { RouteService } from '../core/services/route.service'; -import { RouterStub } from '../shared/testing/router-stub'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; import { ActivatedRoute, Router } from '@angular/router'; @@ -16,6 +11,11 @@ import { WorkflowItem } from '../core/submission/models/workflowitem.model'; import { Observable, of as observableOf } from 'rxjs'; import { VarDirective } from '../shared/utils/var.directive'; import { By } from '@angular/platform-browser'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; +import { ActivatedRouteStub } from '../shared/testing/active-router.stub'; +import { RouterStub } from '../shared/testing/router.stub'; +import { NotificationsServiceStub } from '../shared/testing/notifications-service.stub'; const type = 'testType'; describe('WorkflowItemActionPageComponent', () => { @@ -42,7 +42,7 @@ describe('WorkflowItemActionPageComponent', () => { imports: [TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: MockTranslateLoader + useClass: TranslateLoaderMock } })], declarations: [TestComponent, VarDirective], diff --git a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts index c11cdc1d15..a70005776b 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component.spec.ts @@ -2,21 +2,21 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { WorkflowItemDeleteComponent } from './workflow-item-delete.component'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { MockTranslateLoader } from '../../shared/mocks/mock-translate-loader'; import { ActivatedRoute, Router } from '@angular/router'; -import { RouterStub } from '../../shared/testing/router-stub'; -import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; import { RouteService } from '../../core/services/route.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; -import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { VarDirective } from '../../shared/utils/var.directive'; import { of as observableOf } from 'rxjs'; import { RequestService } from '../../core/data/request.service'; -import { getMockRequestService } from '../../shared/mocks/mock-request.service'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; +import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; +import { RouterStub } from '../../shared/testing/router.stub'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { getMockRequestService } from '../../shared/mocks/request.service.mock'; describe('WorkflowItemDeleteComponent', () => { let component: WorkflowItemDeleteComponent; @@ -42,7 +42,7 @@ describe('WorkflowItemDeleteComponent', () => { imports: [TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: MockTranslateLoader + useClass: TranslateLoaderMock } })], declarations: [WorkflowItemDeleteComponent, VarDirective], diff --git a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts index 0332a6b9ee..fde48b59e4 100644 --- a/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts +++ b/src/app/+workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component.spec.ts @@ -1,22 +1,22 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { MockTranslateLoader } from '../../shared/mocks/mock-translate-loader'; import { ActivatedRoute, Router } from '@angular/router'; -import { RouterStub } from '../../shared/testing/router-stub'; -import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; import { RouteService } from '../../core/services/route.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service'; -import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { WorkflowItem } from '../../core/submission/models/workflowitem.model'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { VarDirective } from '../../shared/utils/var.directive'; import { of as observableOf } from 'rxjs'; import { WorkflowItemSendBackComponent } from './workflow-item-send-back.component'; import { RequestService } from '../../core/data/request.service'; -import { getMockRequestService } from '../../shared/mocks/mock-request.service'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; +import { RouterStub } from '../../shared/testing/router.stub'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; +import { getMockRequestService } from '../../shared/mocks/request.service.mock'; describe('WorkflowItemSendBackComponent', () => { let component: WorkflowItemSendBackComponent; @@ -42,7 +42,7 @@ describe('WorkflowItemSendBackComponent', () => { imports: [TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useClass: MockTranslateLoader + useClass: TranslateLoaderMock } })], declarations: [WorkflowItemSendBackComponent, VarDirective], From 03668e347e1c425d7113daf0803eacea0ac98cfb Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 12 May 2020 17:03:48 +0200 Subject: [PATCH 13/14] added missing typedoc --- .../submission/workflowitem-data.service.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/app/core/submission/workflowitem-data.service.ts b/src/app/core/submission/workflowitem-data.service.ts index 370b2df6dd..c82f7bf0b5 100644 --- a/src/app/core/submission/workflowitem-data.service.ts +++ b/src/app/core/submission/workflowitem-data.service.ts @@ -19,7 +19,7 @@ import { hasValue } from '../../shared/empty.util'; import { RequestEntry } from '../data/request.reducer'; /** - * A service that provides methods to make REST requests with workflowitems endpoint. + * A service that provides methods to make REST requests with workflow items endpoint. */ @Injectable() @dataService(WorkflowItem.type) @@ -40,18 +40,30 @@ export class WorkflowItemDataService extends DataService { } /** - * Delete an existing Workspace Item on the server - * @param id The Workspace Item's id to be removed + * Delete an existing Workflow Item on the server + * @param id The Workflow Item's id to be removed * @return an observable that emits true when the deletion was successful, false when it failed */ delete(id: string): Observable { return this.deleteWFI(id, true) } + /** + * Send an existing Workflow Item back to the workflow on the server + * @param id The Workspace Item's id to be sent back + * @return an observable that emits true when sending back the item was successful, false when it failed + */ sendBack(id: string): Observable { return this.deleteWFI(id, false) } + /** + * Method to delete a workflow item from the server + * @param id The identifier of the server + * @param expunge Whether or not to expunge: + * When true, the workflow item and its item will be permanently expunged on the server + * When false, the workflow item will be removed, but the item will still be available as a workspace item + */ private deleteWFI(id: string, expunge: boolean): Observable { const requestId = this.requestService.generateRequestId(); From 03f910b45dde663920bfa029599c91d1398a3edb Mon Sep 17 00:00:00 2001 From: Bram Luyten Date: Mon, 18 May 2020 15:52:16 +0200 Subject: [PATCH 14/14] Ensuring environment.ts is present before sync-i18n-files invocation --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6fd39420b5..4c6bd31cac 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "clean:prod": "yarn run clean:coverage && yarn run clean:doc && yarn run clean:dist && yarn run clean:log && yarn run clean:json && yarn run clean:bld", "clean": "yarn run clean:prod && yarn run clean:node && yarn run clean:env", "clean:env": "rimraf src/environments/environment.ts", - "sync-i18n": "ts-node --project ./tsconfig.ts-node.json scripts/sync-i18n-files.ts" + "sync-i18n": "yarn run config:dev && ts-node --project ./tsconfig.ts-node.json scripts/sync-i18n-files.ts" }, "browser": { "fs": false,