;
+
/**
* Route to the item page
*/
@@ -38,12 +51,33 @@ export class ItemComponent implements OnInit {
mediaViewer;
- constructor(protected routeService: RouteService) {
+ constructor(protected routeService: RouteService,
+ protected router: Router) {
this.mediaViewer = environment.mediaViewer;
}
+ /**
+ * The function used to return to list from the item.
+ */
+ back = () => {
+ this.routeService.getPreviousUrl().pipe(
+ take(1)
+ ).subscribe(
+ (url => {
+ this.router.navigateByUrl(url);
+ })
+ );
+ };
+
ngOnInit(): void {
+
this.itemPageRoute = getItemPageRoute(this.object);
+ // hide/show the back button
+ this.showBackButton = this.routeService.getPreviousUrl().pipe(
+ filter(url => this.previousRoute.test(url)),
+ take(1),
+ map(() => true)
+ );
// check to see if iiif viewer is required.
this.iiifEnabled = isIiifEnabled(this.object);
this.iiifSearchEnabled = isIiifSearchEnabled(this.object);
diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
index 89ac02eb16..fcbc46422d 100644
--- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
+++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
@@ -1,3 +1,4 @@
+
+
@@ -61,7 +63,7 @@
{
{ provide: SearchService, useValue: {} },
{ provide: ItemDataService, useValue: {} },
{ provide: ItemVersionsSharedService, useValue: {} },
- { provide: RouteService, useValue: mockRouteService }
+ { provide: RouteService, useValue: mockRouteService },
+ { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
],
schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(UntypedItemComponent, {
@@ -169,13 +174,12 @@ describe('UntypedItemComponent', () => {
});
describe('with IIIF viewer and search', () => {
-
+ const localMockRouteService = {
+ getPreviousUrl(): Observable {
+ return of('/search?query=test%20query&fakeParam=true');
+ }
+ };
beforeEach(waitForAsync(() => {
- const localMockRouteService = {
- getPreviousUrl(): Observable {
- return of('/search?query=test%20query&fakeParam=true');
- }
- };
const iiifEnabledMap: MetadataMap = {
'dspace.iiif.enabled': [getIIIFEnabled(true)],
'iiif.search.enabled': [getIIIFSearchEnabled(true)],
@@ -183,6 +187,7 @@ describe('UntypedItemComponent', () => {
TestBed.overrideProvider(RouteService, {useValue: localMockRouteService});
TestBed.compileComponents();
fixture = TestBed.createComponent(UntypedItemComponent);
+ spyOn(localMockRouteService, 'getPreviousUrl').and.callThrough();
comp = fixture.componentInstance;
comp.object = getItem(iiifEnabledMap);
fixture.detectChanges();
@@ -196,17 +201,16 @@ describe('UntypedItemComponent', () => {
it('should retrieve the query term for previous route', (): void => {
expect(comp.iiifQuery$.subscribe(result => expect(result).toEqual('test query')));
});
-
});
describe('with IIIF viewer and search but no previous search query', () => {
+ const localMockRouteService = {
+ getPreviousUrl(): Observable {
+ return of('/item');
+ }
+ };
beforeEach(waitForAsync(() => {
- const localMockRouteService = {
- getPreviousUrl(): Observable {
- return of('/item');
- }
- };
const iiifEnabledMap: MetadataMap = {
'dspace.iiif.enabled': [getIIIFEnabled(true)],
'iiif.search.enabled': [getIIIFSearchEnabled(true)],
@@ -214,6 +218,7 @@ describe('UntypedItemComponent', () => {
TestBed.overrideProvider(RouteService, {useValue: localMockRouteService});
TestBed.compileComponents();
fixture = TestBed.createComponent(UntypedItemComponent);
+
comp = fixture.componentInstance;
comp.object = getItem(iiifEnabledMap);
fixture.detectChanges();
diff --git a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.spec.ts b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.spec.ts
index 9aeea8b11e..b29c7e58f3 100644
--- a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.spec.ts
+++ b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.spec.ts
@@ -5,7 +5,7 @@ import { VersionHistoryDataService } from '../../../../core/data/version-history
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { VersionDataService } from '../../../../core/data/version-data.service';
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
-import { ItemVersionsSharedService } from '../../../../shared/item/item-versions/item-versions-shared.service';
+import { ItemVersionsSharedService } from '../../../versions/item-versions-shared.service';
import { Item } from '../../../../core/shared/item.model';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
import { buildPaginatedList } from '../../../../core/data/paginated-list.model';
@@ -20,6 +20,7 @@ import { ItemDataService } from '../../../../core/data/item-data.service';
import { Version } from '../../../../core/shared/version.model';
import { RouteService } from '../../../../core/services/route.service';
import { TranslateLoaderMock } from '../../../../shared/testing/translate-loader.mock';
+import { ItemSharedModule } from '../../../item-shared.module';
const mockItem: Item = Object.assign(new Item(), {
bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])),
@@ -66,6 +67,7 @@ describe('VersionedItemComponent', () => {
useClass: TranslateLoaderMock,
}
}),
+ ItemSharedModule,
],
providers: [
{ provide: VersionHistoryDataService, useValue: versionHistoryServiceSpy },
@@ -75,7 +77,7 @@ describe('VersionedItemComponent', () => {
{ provide: WorkspaceitemDataService, useValue: {} },
{ provide: SearchService, useValue: {} },
{ provide: ItemDataService, useValue: {} },
- { provide: RouteService, useValue: mockRouteService }
+ { provide: RouteService, useValue: mockRouteService },
]
}).compileComponents();
versionService = TestBed.inject(VersionDataService);
diff --git a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts
index 7f61cee10b..6855d9c4dc 100644
--- a/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts
+++ b/src/app/item-page/simple/item-types/versioned-item/versioned-item.component.ts
@@ -1,6 +1,6 @@
import { Component } from '@angular/core';
import { ItemComponent } from '../shared/item.component';
-import { ItemVersionsSummaryModalComponent } from '../../../../shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component';
+import { ItemVersionsSummaryModalComponent } from '../../../versions/item-versions-summary-modal/item-versions-summary-modal.component';
import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators';
import { RemoteData } from '../../../../core/data/remote-data';
import { Version } from '../../../../core/shared/version.model';
@@ -9,7 +9,7 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
import { TranslateService } from '@ngx-translate/core';
import { VersionDataService } from '../../../../core/data/version-data.service';
-import { ItemVersionsSharedService } from '../../../../shared/item/item-versions/item-versions-shared.service';
+import { ItemVersionsSharedService } from '../../../versions/item-versions-shared.service';
import { Router } from '@angular/router';
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
import { SearchService } from '../../../../core/shared/search/search.service';
@@ -31,13 +31,13 @@ export class VersionedItemComponent extends ItemComponent {
private translateService: TranslateService,
private versionService: VersionDataService,
private itemVersionShared: ItemVersionsSharedService,
- private router: Router,
+ protected router: Router,
private workspaceItemDataService: WorkspaceitemDataService,
private searchService: SearchService,
private itemService: ItemDataService,
protected routeService: RouteService
) {
- super(routeService);
+ super(routeService, router);
}
/**
diff --git a/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts b/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
index fafb5314b3..180eaaa2be 100644
--- a/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
+++ b/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts
@@ -4,11 +4,15 @@ import { By } from '@angular/platform-browser';
import { MetadataRepresentationListComponent } from './metadata-representation-list.component';
import { RelationshipDataService } from '../../../core/data/relationship-data.service';
import { Item } from '../../../core/shared/item.model';
-import { Relationship } from '../../../core/shared/item-relationships/relationship.model';
-import { createSuccessfulRemoteDataObject$, createFailedRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { TranslateModule } from '@ngx-translate/core';
import { VarDirective } from '../../../shared/utils/var.directive';
import { of as observableOf } from 'rxjs';
+import { MetadataValue } from '../../../core/shared/metadata.models';
+import { DSpaceObject } from '../../../core/shared/dspace-object.model';
+import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
+import { MetadatumRepresentation } from '../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
+import { BrowseDefinitionDataService } from '../../../core/browse/browse-definition-data.service';
+import { BrowseDefinitionDataServiceStub } from '../../../shared/testing/browse-definition-data-service.stub';
const itemType = 'Person';
const metadataFields = ['dc.contributor.author', 'dc.creator'];
@@ -73,44 +77,37 @@ const relatedCreator: Item = Object.assign(new Item(), {
'dspace.entity.type': 'Person',
}
});
-const authorRelation: Relationship = Object.assign(new Relationship(), {
- leftItem: createSuccessfulRemoteDataObject$(parentItem),
- rightItem: createSuccessfulRemoteDataObject$(relatedAuthor)
-});
-const creatorRelation: Relationship = Object.assign(new Relationship(), {
- leftItem: createSuccessfulRemoteDataObject$(parentItem),
- rightItem: createSuccessfulRemoteDataObject$(relatedCreator),
-});
-const creatorRelationUnauthorized: Relationship = Object.assign(new Relationship(), {
- leftItem: createSuccessfulRemoteDataObject$(parentItem),
- rightItem: createFailedRemoteDataObject$('Unauthorized', 401),
-});
-let relationshipService;
describe('MetadataRepresentationListComponent', () => {
let comp: MetadataRepresentationListComponent;
let fixture: ComponentFixture;
- relationshipService = {
- findById: (id: string) => {
- if (id === 'related-author') {
- return createSuccessfulRemoteDataObject$(authorRelation);
- }
- if (id === 'related-creator') {
- return createSuccessfulRemoteDataObject$(creatorRelation);
- }
- if (id === 'related-creator-unauthorized') {
- return createSuccessfulRemoteDataObject$(creatorRelationUnauthorized);
- }
- },
- };
+ let relationshipService;
beforeEach(waitForAsync(() => {
+ relationshipService = {
+ resolveMetadataRepresentation: (metadatum: MetadataValue, parent: DSpaceObject, type: string) => {
+ if (metadatum.value === 'Related Author with authority') {
+ return observableOf(Object.assign(new ItemMetadataRepresentation(metadatum), relatedAuthor));
+ }
+ if (metadatum.value === 'Author without authority') {
+ return observableOf(Object.assign(new MetadatumRepresentation(type), metadatum));
+ }
+ if (metadatum.value === 'Related Creator with authority') {
+ return observableOf(Object.assign(new ItemMetadataRepresentation(metadatum), relatedCreator));
+ }
+ if (metadatum.value === 'Related Creator with authority - unauthorized') {
+ return observableOf(Object.assign(new MetadatumRepresentation(type), metadatum));
+ }
+ },
+ };
+
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot()],
declarations: [MetadataRepresentationListComponent, VarDirective],
providers: [
- { provide: RelationshipDataService, useValue: relationshipService }
+ { provide: RelationshipDataService, useValue: relationshipService },
+ { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
],
schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(MetadataRepresentationListComponent, {
diff --git a/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.ts b/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
index 5d2d0d0208..d5e6547778 100644
--- a/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
+++ b/src/app/item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
@@ -1,22 +1,20 @@
import { Component, Input } from '@angular/core';
import { MetadataRepresentation } from '../../../core/shared/metadata-representation/metadata-representation.model';
import {
- combineLatest as observableCombineLatest,
Observable,
- of as observableOf,
zip as observableZip
} from 'rxjs';
import { RelationshipDataService } from '../../../core/data/relationship-data.service';
import { MetadataValue } from '../../../core/shared/metadata.models';
-import { getFirstSucceededRemoteData } from '../../../core/shared/operators';
-import { filter, map, switchMap } from 'rxjs/operators';
-import { RemoteData } from '../../../core/data/remote-data';
-import { Relationship } from '../../../core/shared/item-relationships/relationship.model';
import { Item } from '../../../core/shared/item.model';
-import { MetadatumRepresentation } from '../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
-import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
-import { followLink } from '../../../shared/utils/follow-link-config.model';
import { AbstractIncrementalListComponent } from '../abstract-incremental-list/abstract-incremental-list.component';
+import { map } from 'rxjs/operators';
+import { getRemoteDataPayload } from '../../../core/shared/operators';
+import {
+ MetadatumRepresentation
+} from '../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
+import { BrowseService } from '../../../core/browse/browse.service';
+import { BrowseDefinitionDataService } from '../../../core/browse/browse-definition-data.service';
@Component({
selector: 'ds-metadata-representation-list',
@@ -61,7 +59,8 @@ export class MetadataRepresentationListComponent extends AbstractIncrementalList
*/
total: number;
- constructor(public relationshipService: RelationshipDataService) {
+ constructor(public relationshipService: RelationshipDataService,
+ private browseDefinitionDataService: BrowseDefinitionDataService) {
super();
}
@@ -87,27 +86,19 @@ export class MetadataRepresentationListComponent extends AbstractIncrementalList
.map((metadatum: any) => Object.assign(new MetadataValue(), metadatum))
.map((metadatum: MetadataValue) => {
if (metadatum.isVirtual) {
- return this.relationshipService.findById(metadatum.virtualValue, true, false, followLink('leftItem'), followLink('rightItem')).pipe(
- getFirstSucceededRemoteData(),
- switchMap((relRD: RemoteData) =>
- observableCombineLatest(relRD.payload.leftItem, relRD.payload.rightItem).pipe(
- filter(([leftItem, rightItem]) => leftItem.hasCompleted && rightItem.hasCompleted),
- map(([leftItem, rightItem]) => {
- if (!leftItem.hasSucceeded || !rightItem.hasSucceeded) {
- return observableOf(Object.assign(new MetadatumRepresentation(this.itemType), metadatum));
- } else if (rightItem.hasSucceeded && leftItem.payload.id === this.parentItem.id) {
- return rightItem.payload;
- } else if (rightItem.payload.id === this.parentItem.id) {
- return leftItem.payload;
- }
- }),
- map((item: Item) => Object.assign(new ItemMetadataRepresentation(metadatum), item))
- )
- ));
+ return this.relationshipService.resolveMetadataRepresentation(metadatum, this.parentItem, this.itemType);
} else {
- return observableOf(Object.assign(new MetadatumRepresentation(this.itemType), metadatum));
+ // Check for a configured browse link and return a standard metadata representation
+ let searchKeyArray: string[] = [];
+ this.metadataFields.forEach((field: string) => {
+ searchKeyArray = searchKeyArray.concat(BrowseService.toSearchKeyArray(field));
+ });
+ return this.browseDefinitionDataService.findByFields(this.metadataFields).pipe(
+ getRemoteDataPayload(),
+ map((def) => Object.assign(new MetadatumRepresentation(this.itemType, def), metadatum))
+ );
}
- })
+ }),
);
}
}
diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.html b/src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.html
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.html
rename to src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.html
diff --git a/src/app/shared/log-in/methods/shibboleth/log-in-shibboleth.component.scss b/src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.scss
similarity index 100%
rename from src/app/shared/log-in/methods/shibboleth/log-in-shibboleth.component.scss
rename to src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.scss
diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts b/src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts
rename to src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.spec.ts
diff --git a/src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.ts b/src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.ts
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component.ts
rename to src/app/item-page/versions/item-versions-delete-modal/item-versions-delete-modal.component.ts
diff --git a/src/app/shared/item/item-versions/item-versions-shared.service.spec.ts b/src/app/item-page/versions/item-versions-shared.service.spec.ts
similarity index 75%
rename from src/app/shared/item/item-versions/item-versions-shared.service.spec.ts
rename to src/app/item-page/versions/item-versions-shared.service.spec.ts
index a9f9596548..d4adbf681f 100644
--- a/src/app/shared/item/item-versions/item-versions-shared.service.spec.ts
+++ b/src/app/item-page/versions/item-versions-shared.service.spec.ts
@@ -2,15 +2,15 @@ import { TestBed } from '@angular/core/testing';
import { ItemVersionsSharedService } from './item-versions-shared.service';
import { ActivatedRoute } from '@angular/router';
-import { VersionDataService } from '../../../core/data/version-data.service';
-import { AuthService } from '../../../core/auth/auth.service';
-import { NotificationsService } from '../../notifications/notifications.service';
+import { VersionDataService } from '../../core/data/version-data.service';
+import { AuthService } from '../../core/auth/auth.service';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core';
-import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
-import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service';
-import { WorkflowItemDataService } from '../../../core/submission/workflowitem-data.service';
-import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject } from '../../remote-data.utils';
-import { Version } from '../../../core/shared/version.model';
+import { VersionHistoryDataService } from '../../core/data/version-history-data.service';
+import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
+import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
+import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils';
+import { Version } from '../../core/shared/version.model';
describe('ItemVersionsSharedService', () => {
let service: ItemVersionsSharedService;
diff --git a/src/app/shared/item/item-versions/item-versions-shared.service.ts b/src/app/item-page/versions/item-versions-shared.service.ts
similarity index 84%
rename from src/app/shared/item/item-versions/item-versions-shared.service.ts
rename to src/app/item-page/versions/item-versions-shared.service.ts
index 996623509c..09104f5ddc 100644
--- a/src/app/shared/item/item-versions/item-versions-shared.service.ts
+++ b/src/app/item-page/versions/item-versions-shared.service.ts
@@ -1,8 +1,8 @@
import { Injectable } from '@angular/core';
-import { NotificationsService } from '../../notifications/notifications.service';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core';
-import { RemoteData } from '../../../core/data/remote-data';
-import { Version } from '../../../core/shared/version.model';
+import { RemoteData } from '../../core/data/remote-data';
+import { Version } from '../../core/shared/version.model';
@Injectable({
providedIn: 'root'
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html b/src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.html
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html
rename to src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.html
diff --git a/src/themes/custom/app/item-page/edit-item-page/item-metadata/item-metadata.component.html b/src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.scss
similarity index 100%
rename from src/themes/custom/app/item-page/edit-item-page/item-metadata/item-metadata.component.html
rename to src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.scss
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.spec.ts b/src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.spec.ts
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.spec.ts
rename to src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.spec.ts
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts b/src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
similarity index 93%
rename from src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
rename to src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
index 23ee62e628..8f2c7bd62e 100644
--- a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
+++ b/src/app/item-page/versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
@@ -1,7 +1,7 @@
import { Component, EventEmitter, OnInit, Output } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { BehaviorSubject } from 'rxjs';
-import { ModalBeforeDismiss } from '../../../interfaces/modal-before-dismiss.interface';
+import { ModalBeforeDismiss } from '../../../shared/interfaces/modal-before-dismiss.interface';
@Component({
selector: 'ds-item-versions-summary-modal',
diff --git a/src/app/shared/item/item-versions/item-versions.component.html b/src/app/item-page/versions/item-versions.component.html
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions.component.html
rename to src/app/item-page/versions/item-versions.component.html
diff --git a/src/app/shared/item/item-versions/item-versions.component.scss b/src/app/item-page/versions/item-versions.component.scss
similarity index 100%
rename from src/app/shared/item/item-versions/item-versions.component.scss
rename to src/app/item-page/versions/item-versions.component.scss
diff --git a/src/app/shared/item/item-versions/item-versions.component.spec.ts b/src/app/item-page/versions/item-versions.component.spec.ts
similarity index 87%
rename from src/app/shared/item/item-versions/item-versions.component.spec.ts
rename to src/app/item-page/versions/item-versions.component.spec.ts
index d4dbc336ab..999176d996 100644
--- a/src/app/shared/item/item-versions/item-versions.component.spec.ts
+++ b/src/app/item-page/versions/item-versions.component.spec.ts
@@ -2,33 +2,33 @@ import { ItemVersionsComponent } from './item-versions.component';
import {
ComponentFixture, TestBed, waitForAsync
} from '@angular/core/testing';
-import { VarDirective } from '../../utils/var.directive';
+import { VarDirective } from '../../shared/utils/var.directive';
import { TranslateModule } from '@ngx-translate/core';
import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { Item } from '../../../core/shared/item.model';
-import { Version } from '../../../core/shared/version.model';
-import { VersionHistory } from '../../../core/shared/version-history.model';
-import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
+import { Item } from '../../core/shared/item.model';
+import { Version } from '../../core/shared/version.model';
+import { VersionHistory } from '../../core/shared/version-history.model';
+import { VersionHistoryDataService } from '../../core/data/version-history-data.service';
import { BrowserModule, By } from '@angular/platform-browser';
-import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils';
-import { createPaginatedList } from '../../testing/utils.test';
+import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
+import { createPaginatedList } from '../../shared/testing/utils.test';
import { EMPTY, of, of as observableOf } from 'rxjs';
-import { PaginationService } from '../../../core/pagination/pagination.service';
-import { PaginationServiceStub } from '../../testing/pagination-service.stub';
-import { AuthService } from '../../../core/auth/auth.service';
-import { VersionDataService } from '../../../core/data/version-data.service';
-import { ItemDataService } from '../../../core/data/item-data.service';
+import { PaginationService } from '../../core/pagination/pagination.service';
+import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
+import { AuthService } from '../../core/auth/auth.service';
+import { VersionDataService } from '../../core/data/version-data.service';
+import { ItemDataService } from '../../core/data/item-data.service';
import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { NotificationsService } from '../../notifications/notifications.service';
-import { NotificationsServiceStub } from '../../testing/notifications-service.stub';
-import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
-import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
-import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service';
-import { WorkflowItemDataService } from '../../../core/submission/workflowitem-data.service';
-import { ConfigurationDataService } from '../../../core/data/configuration-data.service';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
+import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';
+import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
+import { FeatureID } from '../../core/data/feature-authorization/feature-id';
+import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
+import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
+import { ConfigurationDataService } from '../../core/data/configuration-data.service';
import { Router } from '@angular/router';
-import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { CommonModule } from '@angular/common';
+import { ItemSharedModule } from '../item-shared.module';
describe('ItemVersionsComponent', () => {
let component: ItemVersionsComponent;
@@ -137,7 +137,7 @@ describe('ItemVersionsComponent', () => {
TestBed.configureTestingModule({
declarations: [ItemVersionsComponent, VarDirective],
- imports: [TranslateModule.forRoot(), CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule],
+ imports: [TranslateModule.forRoot(), CommonModule, FormsModule, ReactiveFormsModule, BrowserModule, ItemSharedModule],
providers: [
{provide: PaginationService, useValue: new PaginationServiceStub()},
{provide: FormBuilder, useValue: new FormBuilder()},
diff --git a/src/app/shared/item/item-versions/item-versions.component.ts b/src/app/item-page/versions/item-versions.component.ts
similarity index 91%
rename from src/app/shared/item/item-versions/item-versions.component.ts
rename to src/app/item-page/versions/item-versions.component.ts
index b7b8182658..e0fc623f49 100644
--- a/src/app/shared/item/item-versions/item-versions.component.ts
+++ b/src/app/item-page/versions/item-versions.component.ts
@@ -1,7 +1,7 @@
import { Component, Input, OnInit } from '@angular/core';
-import { Item } from '../../../core/shared/item.model';
-import { Version } from '../../../core/shared/version.model';
-import { RemoteData } from '../../../core/data/remote-data';
+import { Item } from '../../core/shared/item.model';
+import { Version } from '../../core/shared/version.model';
+import { RemoteData } from '../../core/data/remote-data';
import {
BehaviorSubject,
combineLatest,
@@ -9,7 +9,7 @@ import {
of,
Subscription,
} from 'rxjs';
-import { VersionHistory } from '../../../core/shared/version-history.model';
+import { VersionHistory } from '../../core/shared/version-history.model';
import {
getAllSucceededRemoteData,
getAllSucceededRemoteDataPayload,
@@ -17,37 +17,37 @@ import {
getFirstSucceededRemoteData,
getFirstSucceededRemoteDataPayload,
getRemoteDataPayload
-} from '../../../core/shared/operators';
+} from '../../core/shared/operators';
import { map, mergeMap, startWith, switchMap, take, tap } from 'rxjs/operators';
-import { PaginatedList } from '../../../core/data/paginated-list.model';
-import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model';
-import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
-import { PaginatedSearchOptions } from '../../search/models/paginated-search-options.model';
-import { AlertType } from '../../alert/aletr-type';
-import { followLink } from '../../utils/follow-link-config.model';
-import { hasValue, hasValueOperator } from '../../empty.util';
-import { PaginationService } from '../../../core/pagination/pagination.service';
+import { PaginatedList } from '../../core/data/paginated-list.model';
+import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
+import { VersionHistoryDataService } from '../../core/data/version-history-data.service';
+import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model';
+import { AlertType } from '../../shared/alert/aletr-type';
+import { followLink } from '../../shared/utils/follow-link-config.model';
+import { hasValue, hasValueOperator } from '../../shared/empty.util';
+import { PaginationService } from '../../core/pagination/pagination.service';
import {
getItemEditVersionhistoryRoute,
getItemPageRoute,
getItemVersionRoute
-} from '../../../item-page/item-page-routing-paths';
+} from '../item-page-routing-paths';
import { FormBuilder } from '@angular/forms';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { ItemVersionsSummaryModalComponent } from './item-versions-summary-modal/item-versions-summary-modal.component';
-import { NotificationsService } from '../../notifications/notifications.service';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core';
import { ItemVersionsDeleteModalComponent } from './item-versions-delete-modal/item-versions-delete-modal.component';
-import { VersionDataService } from '../../../core/data/version-data.service';
-import { ItemDataService } from '../../../core/data/item-data.service';
+import { VersionDataService } from '../../core/data/version-data.service';
+import { ItemDataService } from '../../core/data/item-data.service';
import { Router } from '@angular/router';
-import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
-import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
+import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
+import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { ItemVersionsSharedService } from './item-versions-shared.service';
-import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model';
-import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service';
-import { WorkflowItemDataService } from '../../../core/submission/workflowitem-data.service';
-import { ConfigurationDataService } from '../../../core/data/configuration-data.service';
+import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model';
+import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
+import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
+import { ConfigurationDataService } from '../../core/data/configuration-data.service';
@Component({
selector: 'ds-item-versions',
diff --git a/src/app/item-page/versions/item-versions.module.ts b/src/app/item-page/versions/item-versions.module.ts
new file mode 100644
index 0000000000..577844488d
--- /dev/null
+++ b/src/app/item-page/versions/item-versions.module.ts
@@ -0,0 +1,32 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+
+import { NgModule } from '@angular/core';
+import { SharedModule } from '../../shared/shared.module';
+import { ItemVersionsComponent } from './item-versions.component';
+import { ItemVersionsNoticeComponent } from './notice/item-versions-notice.component';
+
+const DECLARATIONS = [
+ ItemVersionsComponent,
+ ItemVersionsNoticeComponent,
+];
+
+@NgModule({
+ imports: [
+ SharedModule,
+ ],
+ declarations: [
+ ...DECLARATIONS,
+ ],
+ exports: [
+ ...DECLARATIONS,
+ ],
+})
+export class ItemVersionsModule {
+
+}
diff --git a/src/app/shared/item/item-versions/notice/item-versions-notice.component.html b/src/app/item-page/versions/notice/item-versions-notice.component.html
similarity index 100%
rename from src/app/shared/item/item-versions/notice/item-versions-notice.component.html
rename to src/app/item-page/versions/notice/item-versions-notice.component.html
diff --git a/src/app/shared/item/item-versions/notice/item-versions-notice.component.spec.ts b/src/app/item-page/versions/notice/item-versions-notice.component.spec.ts
similarity index 90%
rename from src/app/shared/item/item-versions/notice/item-versions-notice.component.spec.ts
rename to src/app/item-page/versions/notice/item-versions-notice.component.spec.ts
index 2849ba4909..fb29e54a21 100644
--- a/src/app/shared/item/item-versions/notice/item-versions-notice.component.spec.ts
+++ b/src/app/item-page/versions/notice/item-versions-notice.component.spec.ts
@@ -3,13 +3,13 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { RouterTestingModule } from '@angular/router/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { VersionHistory } from '../../../../core/shared/version-history.model';
-import { Version } from '../../../../core/shared/version.model';
-import { Item } from '../../../../core/shared/item.model';
-import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
+import { VersionHistory } from '../../../core/shared/version-history.model';
+import { Version } from '../../../core/shared/version.model';
+import { Item } from '../../../core/shared/item.model';
+import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
import { By } from '@angular/platform-browser';
-import { createSuccessfulRemoteDataObject$ } from '../../../remote-data.utils';
-import { createPaginatedList } from '../../../testing/utils.test';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
+import { createPaginatedList } from '../../../shared/testing/utils.test';
import { of } from 'rxjs';
import { take } from 'rxjs/operators';
diff --git a/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts b/src/app/item-page/versions/notice/item-versions-notice.component.ts
similarity index 81%
rename from src/app/shared/item/item-versions/notice/item-versions-notice.component.ts
rename to src/app/item-page/versions/notice/item-versions-notice.component.ts
index a292ea65c6..8a8f5ff76f 100644
--- a/src/app/shared/item/item-versions/notice/item-versions-notice.component.ts
+++ b/src/app/item-page/versions/notice/item-versions-notice.component.ts
@@ -1,19 +1,19 @@
import { Component, Input, OnInit } from '@angular/core';
-import { Item } from '../../../../core/shared/item.model';
+import { Item } from '../../../core/shared/item.model';
import { Observable } from 'rxjs';
-import { RemoteData } from '../../../../core/data/remote-data';
-import { VersionHistory } from '../../../../core/shared/version-history.model';
-import { Version } from '../../../../core/shared/version.model';
-import { hasValue, hasValueOperator } from '../../../empty.util';
+import { RemoteData } from '../../../core/data/remote-data';
+import { VersionHistory } from '../../../core/shared/version-history.model';
+import { Version } from '../../../core/shared/version.model';
+import { hasValue, hasValueOperator } from '../../../shared/empty.util';
import {
getAllSucceededRemoteData,
getFirstSucceededRemoteDataPayload,
getRemoteDataPayload
-} from '../../../../core/shared/operators';
+} from '../../../core/shared/operators';
import { map, startWith, switchMap } from 'rxjs/operators';
-import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
-import { AlertType } from '../../../alert/aletr-type';
-import { getItemPageRoute } from '../../../../item-page/item-page-routing-paths';
+import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
+import { AlertType } from '../../../shared/alert/aletr-type';
+import { getItemPageRoute } from '../../item-page-routing-paths';
@Component({
selector: 'ds-item-versions-notice',
diff --git a/src/app/menu.resolver.spec.ts b/src/app/menu.resolver.spec.ts
index 4fd44efe66..eef5c2d5af 100644
--- a/src/app/menu.resolver.spec.ts
+++ b/src/app/menu.resolver.spec.ts
@@ -142,29 +142,7 @@ describe('MenuResolver', () => {
});
describe('createAdminMenu$', () => {
- it('should retrieve the menu by ID return an Observable that emits true as soon as it is created', () => {
- (menuService as any).getMenu.and.returnValue(cold('--u--m', {
- u: undefined,
- m: MENU_STATE,
- }));
-
- expect(resolver.createAdminMenu$()).toBeObservable(cold('-----(t|)', BOOLEAN));
- expect(menuService.getMenu).toHaveBeenCalledOnceWith(MenuID.ADMIN);
- });
-
- describe('for regular user', () => {
- beforeEach(() => {
- authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake(() => {
- return observableOf(false);
- });
- });
-
- beforeEach((done) => {
- resolver.createAdminMenu$().subscribe((_) => {
- done();
- });
- });
-
+ const dontShowAdminSections = () => {
it('should not show site admin section', () => {
expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
id: 'admin_search', visible: false,
@@ -183,19 +161,6 @@ describe('MenuResolver', () => {
}));
});
- it('should not show edit_community', () => {
- expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
- id: 'edit_community', visible: false,
- }));
-
- });
-
- it('should not show edit_collection', () => {
- expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
- id: 'edit_collection', visible: false,
- }));
- });
-
it('should not show access control section', () => {
expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
id: 'access_control', visible: false,
@@ -222,6 +187,122 @@ describe('MenuResolver', () => {
id: 'export', visible: true,
}));
});
+ };
+
+ const dontShowNewSection = () => {
+ it('should not show the "New" section', () => {
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new_community', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new_collection', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new_item', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new', visible: false,
+ }));
+ });
+ };
+
+ const dontShowEditSection = () => {
+ it('should not show the "Edit" section', () => {
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit_community', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit_collection', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit_item', visible: false,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit', visible: false,
+ }));
+ });
+ };
+
+ it('should retrieve the menu by ID return an Observable that emits true as soon as it is created', () => {
+ (menuService as any).getMenu.and.returnValue(cold('--u--m', {
+ u: undefined,
+ m: MENU_STATE,
+ }));
+
+ expect(resolver.createAdminMenu$()).toBeObservable(cold('-----(t|)', BOOLEAN));
+ expect(menuService.getMenu).toHaveBeenCalledOnceWith(MenuID.ADMIN);
+ });
+
+ describe('for regular user', () => {
+ beforeEach(() => {
+ authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID) => {
+ return observableOf(false);
+ });
+ });
+
+ beforeEach((done) => {
+ resolver.createAdminMenu$().subscribe((_) => {
+ done();
+ });
+ });
+
+ dontShowAdminSections();
+ dontShowNewSection();
+ dontShowEditSection();
+ });
+
+ describe('regular user who can submit', () => {
+ beforeEach(() => {
+ authorizationService.isAuthorized = createSpy('isAuthorized')
+ .and.callFake((featureID: FeatureID) => {
+ return observableOf(featureID === FeatureID.CanSubmit);
+ });
+ });
+
+ beforeEach((done) => {
+ resolver.createAdminMenu$().subscribe((_) => {
+ done();
+ });
+ });
+
+ it('should show "New Item" section', () => {
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new_item', visible: true,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new', visible: true,
+ }));
+ });
+
+ dontShowAdminSections();
+ dontShowEditSection();
+ });
+
+ describe('regular user who can edit items', () => {
+ beforeEach(() => {
+ authorizationService.isAuthorized = createSpy('isAuthorized')
+ .and.callFake((featureID: FeatureID) => {
+ return observableOf(featureID === FeatureID.CanEditItem);
+ });
+ });
+
+ beforeEach((done) => {
+ resolver.createAdminMenu$().subscribe((_) => {
+ done();
+ });
+ });
+
+ it('should show "Edit Item" section', () => {
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit_item', visible: true,
+ }));
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'edit', visible: true,
+ }));
+ });
+
+ dontShowAdminSections();
+ dontShowNewSection();
});
describe('for site admin', () => {
@@ -237,6 +318,12 @@ describe('MenuResolver', () => {
});
});
+ it('should show new_process', () => {
+ expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
+ id: 'new_process', visible: true,
+ }));
+ });
+
it('should contain site admin section', () => {
expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({
id: 'admin_search', visible: true,
diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts
index 8630150c58..3ec1df85fd 100644
--- a/src/app/menu.resolver.ts
+++ b/src/app/menu.resolver.ts
@@ -167,21 +167,11 @@ export class MenuResolver implements Resolve {
combineLatest([
this.authorizationService.isAuthorized(FeatureID.IsCollectionAdmin),
this.authorizationService.isAuthorized(FeatureID.IsCommunityAdmin),
- this.authorizationService.isAuthorized(FeatureID.AdministratorOf)
- ]).subscribe(([isCollectionAdmin, isCommunityAdmin, isSiteAdmin]) => {
- const menuList = [
- /* News */
- {
- id: 'new',
- active: false,
- visible: true,
- model: {
- type: MenuItemType.TEXT,
- text: 'menu.section.new'
- } as TextMenuItemModel,
- icon: 'plus',
- index: 0
- },
+ this.authorizationService.isAuthorized(FeatureID.AdministratorOf),
+ this.authorizationService.isAuthorized(FeatureID.CanSubmit),
+ this.authorizationService.isAuthorized(FeatureID.CanEditItem),
+ ]).subscribe(([isCollectionAdmin, isCommunityAdmin, isSiteAdmin, canSubmit, canEditItem]) => {
+ const newSubMenuList = [
{
id: 'new_community',
parentID: 'new',
@@ -212,7 +202,7 @@ export class MenuResolver implements Resolve {
id: 'new_item',
parentID: 'new',
active: false,
- visible: true,
+ visible: canSubmit,
model: {
type: MenuItemType.ONCLICK,
text: 'menu.section.new_item',
@@ -225,38 +215,16 @@ export class MenuResolver implements Resolve {
id: 'new_process',
parentID: 'new',
active: false,
- visible: isCollectionAdmin,
+ visible: isSiteAdmin,
model: {
type: MenuItemType.LINK,
text: 'menu.section.new_process',
link: '/processes/new'
} as LinkMenuItemModel,
},
- // TODO: enable this menu item once the feature has been implemented
- // {
- // id: 'new_item_version',
- // parentID: 'new',
- // active: false,
- // visible: true,
- // model: {
- // type: MenuItemType.LINK,
- // text: 'menu.section.new_item_version',
- // link: ''
- // } as LinkMenuItemModel,
- // },
-
+ ];
+ const editSubMenuList = [
/* Edit */
- {
- id: 'edit',
- active: false,
- visible: true,
- model: {
- type: MenuItemType.TEXT,
- text: 'menu.section.edit'
- } as TextMenuItemModel,
- icon: 'pencil-alt',
- index: 1
- },
{
id: 'edit_community',
parentID: 'edit',
@@ -287,7 +255,7 @@ export class MenuResolver implements Resolve {
id: 'edit_item',
parentID: 'edit',
active: false,
- visible: true,
+ visible: canEditItem,
model: {
type: MenuItemType.ONCLICK,
text: 'menu.section.edit_item',
@@ -296,6 +264,47 @@ export class MenuResolver implements Resolve {
}
} as OnClickMenuItemModel,
},
+ ];
+ const newSubMenu = {
+ id: 'new',
+ active: false,
+ visible: newSubMenuList.some(subMenu => subMenu.visible),
+ model: {
+ type: MenuItemType.TEXT,
+ text: 'menu.section.new'
+ } as TextMenuItemModel,
+ icon: 'plus',
+ index: 0
+ };
+ const editSubMenu = {
+ id: 'edit',
+ active: false,
+ visible: editSubMenuList.some(subMenu => subMenu.visible),
+ model: {
+ type: MenuItemType.TEXT,
+ text: 'menu.section.edit'
+ } as TextMenuItemModel,
+ icon: 'pencil-alt',
+ index: 1
+ };
+
+ const menuList = [
+ ...newSubMenuList,
+ newSubMenu,
+ ...editSubMenuList,
+ editSubMenu,
+ // TODO: enable this menu item once the feature has been implemented
+ // {
+ // id: 'new_item_version',
+ // parentID: 'new',
+ // active: false,
+ // visible: true,
+ // model: {
+ // type: MenuItemType.LINK,
+ // text: 'menu.section.new_item_version',
+ // link: ''
+ // } as LinkMenuItemModel,
+ // },
/* Statistics */
// TODO: enable this menu item once the feature has been implemented
@@ -598,6 +607,18 @@ export class MenuResolver implements Resolve {
icon: 'user-check',
index: 11
},
+ {
+ id: 'system_wide_alert',
+ active: false,
+ visible: authorized,
+ model: {
+ type: MenuItemType.LINK,
+ text: 'menu.section.system-wide-alert',
+ link: '/admin/system-wide-alert'
+ } as LinkMenuItemModel,
+ icon: 'exclamation-circle',
+ index: 12
+ },
];
menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, {
diff --git a/src/app/my-dspace-page/collection-selector/collection-selector.component.html b/src/app/my-dspace-page/collection-selector/collection-selector.component.html
index a87118fc4e..6e2a1925c5 100644
--- a/src/app/my-dspace-page/collection-selector/collection-selector.component.html
+++ b/src/app/my-dspace-page/collection-selector/collection-selector.component.html
@@ -5,7 +5,7 @@
-
-
+
+