diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5
index 3369b76594..2e082f8a7e 100644
--- a/resources/i18n/en.json5
+++ b/resources/i18n/en.json5
@@ -980,9 +980,12 @@
"item.select.table.title": "Title",
+ "item.version.history.empty": "There are no other versions for this item yet.",
"item.version.history.head": "Version History",
+ "item.version.history.return": "Return",
+
"item.version.history.selected": "Selected version",
"item.version.history.table.version": "Version",
@@ -1155,6 +1158,8 @@
"menu.section.edit_item": "Item",
+ "menu.section.edit_item_version_history": "Item Version History",
+
"menu.section.export": "Export",
diff --git a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts
index 72eb306bf1..e50d976dc9 100644
--- a/src/app/+admin/admin-sidebar/admin-sidebar.component.ts
+++ b/src/app/+admin/admin-sidebar/admin-sidebar.component.ts
@@ -18,6 +18,7 @@ import { EditItemSelectorComponent } from '../../shared/dso-selector/modal-wrapp
import { EditCommunitySelectorComponent } from '../../shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component';
import { EditCollectionSelectorComponent } from '../../shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component';
import {CreateItemParentSelectorComponent} from '../../shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component';
+import { EditItemVersionHistorySelectorComponent } from '../../shared/dso-selector/modal-wrappers/edit-item-version-history-selector/edit-item-version-history-selector.component';
/**
* Component representing the admin sidebar
@@ -214,6 +215,19 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit {
}
} as OnClickMenuItemModel,
},
+ {
+ id: 'edit_item_version_history',
+ parentID: 'edit',
+ active: false,
+ visible: true,
+ model: {
+ type: MenuItemType.ONCLICK,
+ text: 'menu.section.edit_item_version_history',
+ function: () => {
+ this.modalService.open(EditItemVersionHistorySelectorComponent);
+ }
+ } as OnClickMenuItemModel,
+ },
/* Import */
{
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 71924cf6c8..2cbd0c57d1 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
@@ -22,6 +22,7 @@ import { EditRelationshipComponent } from './item-relationships/edit-relationshi
import { EditRelationshipListComponent } from './item-relationships/edit-relationship-list/edit-relationship-list.component';
import { ItemMoveComponent } from './item-move/item-move.component';
import { VirtualMetadataComponent } from './virtual-metadata/virtual-metadata.component';
+import { ItemVersionHistoryComponent } from './item-version-history/item-version-history.component';
/**
* Module that contains all components related to the Edit Item page administrator functionality
@@ -47,6 +48,7 @@ import { VirtualMetadataComponent } from './virtual-metadata/virtual-metadata.co
ItemMetadataComponent,
ItemRelationshipsComponent,
ItemBitstreamsComponent,
+ ItemVersionHistoryComponent,
EditInPlaceFieldComponent,
EditRelationshipComponent,
EditRelationshipListComponent,
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts
index 1b386440c0..4e69f01426 100644
--- a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts
+++ b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts
@@ -13,6 +13,11 @@ import { ItemBitstreamsComponent } from './item-bitstreams/item-bitstreams.compo
import { ItemCollectionMapperComponent } from './item-collection-mapper/item-collection-mapper.component';
import { ItemMoveComponent } from './item-move/item-move.component';
import { ItemRelationshipsComponent } from './item-relationships/item-relationships.component';
+import { ItemVersionHistoryComponent } from './item-version-history/item-version-history.component';
+
+export function getItemEditVersionHistoryPath() {
+ return ITEM_EDIT_VERSION_HISTORY;
+}
const ITEM_EDIT_WITHDRAW_PATH = 'withdraw';
const ITEM_EDIT_REINSTATE_PATH = 'reinstate';
@@ -20,6 +25,7 @@ const ITEM_EDIT_PRIVATE_PATH = 'private';
const ITEM_EDIT_PUBLIC_PATH = 'public';
const ITEM_EDIT_DELETE_PATH = 'delete';
const ITEM_EDIT_MOVE_PATH = 'move';
+const ITEM_EDIT_VERSION_HISTORY = 'versionhistory';
/**
* Routing module that handles the routing for the Edit Item page administrator functionality
@@ -122,7 +128,15 @@ const ITEM_EDIT_MOVE_PATH = 'move';
resolve: {
item: ItemPageResolver
}
- }])
+ },
+ {
+ path: ITEM_EDIT_VERSION_HISTORY,
+ component: ItemVersionHistoryComponent,
+ resolve: {
+ item: ItemPageResolver
+ }
+ }
+ ])
],
providers: [
ItemPageResolver,
diff --git a/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.html b/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.html
new file mode 100644
index 0000000000..8acd98d640
--- /dev/null
+++ b/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.html
@@ -0,0 +1,6 @@
+
diff --git a/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.ts b/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.ts
new file mode 100644
index 0000000000..d3415dd392
--- /dev/null
+++ b/src/app/+item-page/edit-item-page/item-version-history/item-version-history.component.ts
@@ -0,0 +1,25 @@
+import { Component } from '@angular/core';
+import { Observable } from 'rxjs/internal/Observable';
+import { RemoteData } from '../../../core/data/remote-data';
+import { Item } from '../../../core/shared/item.model';
+import { map } from 'rxjs/operators';
+import { getSucceededRemoteData } from '../../../core/shared/operators';
+import { ActivatedRoute } from '@angular/router';
+
+@Component({
+ selector: 'ds-item-version-history',
+ templateUrl: './item-version-history.component.html'
+})
+export class ItemVersionHistoryComponent {
+ /**
+ * The item to display the version history for
+ */
+ itemRD$: Observable>;
+
+ constructor(private route: ActivatedRoute) {
+ }
+
+ ngOnInit(): void {
+ this.itemRD$ = this.route.data.pipe(map((data) => data.item)).pipe(getSucceededRemoteData()) as Observable>;
+ }
+}
diff --git a/src/app/+item-page/item-page-routing.module.ts b/src/app/+item-page/item-page-routing.module.ts
index ec562842aa..68adcdc95f 100644
--- a/src/app/+item-page/item-page-routing.module.ts
+++ b/src/app/+item-page/item-page-routing.module.ts
@@ -7,6 +7,7 @@ import { ItemPageResolver } from './item-page.resolver';
import { URLCombiner } from '../core/url-combiner/url-combiner';
import { getItemModulePath } from '../app-routing.module';
import { AuthenticatedGuard } from '../core/auth/authenticated.guard';
+import { getItemEditVersionHistoryPath } from './edit-item-page/edit-item-page.routing.module';
export function getItemPageRoute(itemId: string) {
return new URLCombiner(getItemModulePath(), itemId).toString();
@@ -14,8 +15,12 @@ export function getItemPageRoute(itemId: string) {
export function getItemEditPath(id: string) {
return new URLCombiner(getItemModulePath(),ITEM_EDIT_PATH.replace(/:id/, id)).toString()
}
+export function getFullItemEditVersionHistoryPath(id: string) {
+ return new URLCombiner(getItemModulePath(),ITEM_EDIT_VERSION_HISTORY_PATH.replace(/:id/, id)).toString()
+}
const ITEM_EDIT_PATH = ':id/edit';
+const ITEM_EDIT_VERSION_HISTORY_PATH = `${ITEM_EDIT_PATH}/${getItemEditVersionHistoryPath()}`;
@NgModule({
imports: [
diff --git a/src/app/+item-page/item-page.module.ts b/src/app/+item-page/item-page.module.ts
index bb90d56ad9..8d5d78ddd1 100644
--- a/src/app/+item-page/item-page.module.ts
+++ b/src/app/+item-page/item-page.module.ts
@@ -29,7 +29,6 @@ import { MetadataFieldWrapperComponent } from './field-components/metadata-field
import { TabbedRelatedEntitiesSearchComponent } from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component';
import { StatisticsModule } from '../statistics/statistics.module';
import { AbstractIncrementalListComponent } from './simple/abstract-incremental-list/abstract-incremental-list.component';
-import { ItemVersionsComponent } from './item-versions/item-versions.component';
@NgModule({
imports: [
@@ -61,7 +60,6 @@ import { ItemVersionsComponent } from './item-versions/item-versions.component';
RelatedEntitiesSearchComponent,
TabbedRelatedEntitiesSearchComponent,
AbstractIncrementalListComponent,
- ItemVersionsComponent
],
exports: [
ItemComponent,
diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-item-version-history-selector/edit-item-version-history-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-item-version-history-selector/edit-item-version-history-selector.component.ts
new file mode 100644
index 0000000000..0c69c57c39
--- /dev/null
+++ b/src/app/shared/dso-selector/modal-wrappers/edit-item-version-history-selector/edit-item-version-history-selector.component.ts
@@ -0,0 +1,32 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
+import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { getFullItemEditVersionHistoryPath } from '../../../../+item-page/item-page-routing.module';
+import { DSOSelectorModalWrapperComponent, SelectorActionType } from '../dso-selector-modal-wrapper.component';
+
+/**
+ * Component to wrap a list of existing items inside a modal
+ * Used to choose an item from to edit its version history
+ */
+@Component({
+ selector: 'ds-edit-item-version-history-selector',
+ templateUrl: '../dso-selector-modal-wrapper.component.html',
+})
+export class EditItemVersionHistorySelectorComponent extends DSOSelectorModalWrapperComponent implements OnInit {
+ objectType = DSpaceObjectType.ITEM;
+ selectorType = DSpaceObjectType.ITEM;
+ action = SelectorActionType.EDIT;
+
+ constructor(protected activeModal: NgbActiveModal, protected route: ActivatedRoute, private router: Router) {
+ super(activeModal, route);
+ }
+
+ /**
+ * Navigate to the item edit version history page
+ */
+ navigate(dso: DSpaceObject) {
+ this.router.navigate([getFullItemEditVersionHistoryPath(dso.uuid)]);
+ }
+}
diff --git a/src/app/+item-page/item-versions/item-versions.component.html b/src/app/shared/item/item-versions/item-versions.component.html
similarity index 86%
rename from src/app/+item-page/item-versions/item-versions.component.html
rename to src/app/shared/item/item-versions/item-versions.component.html
index 0fb6bf08cc..debc9ae079 100644
--- a/src/app/+item-page/item-versions/item-versions.component.html
+++ b/src/app/shared/item/item-versions/item-versions.component.html
@@ -1,8 +1,9 @@
-
0">
+
0 || displayWhenEmpty">
{{"item.version.history.head" | translate}}
-
0"
+ [hideGear]="true"
[hidePagerWhenSinglePage]="true"
[paginationOptions]="options"
[pageInfoState]="versions"
@@ -40,6 +41,7 @@
* {{"item.version.history.selected" | translate}}
+
diff --git a/src/app/+item-page/item-versions/item-versions.component.ts b/src/app/shared/item/item-versions/item-versions.component.ts
similarity index 73%
rename from src/app/+item-page/item-versions/item-versions.component.ts
rename to src/app/shared/item/item-versions/item-versions.component.ts
index b493843be1..396e3f4727 100644
--- a/src/app/+item-page/item-versions/item-versions.component.ts
+++ b/src/app/shared/item/item-versions/item-versions.component.ts
@@ -1,17 +1,18 @@
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 { Observable } from 'rxjs/internal/Observable';
-import { VersionHistory } from '../../core/shared/version-history.model';
-import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators';
+import { VersionHistory } from '../../../core/shared/version-history.model';
+import { getAllSucceededRemoteData, getRemoteDataPayload } from '../../../core/shared/operators';
import { map, startWith, switchMap } from 'rxjs/operators';
import { combineLatest as observableCombineLatest } from 'rxjs';
-import { PaginatedList } from '../../core/data/paginated-list';
-import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
+import { PaginatedList } from '../../../core/data/paginated-list';
+import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
-import { VersionHistoryDataService } from '../../core/data/version-history-data.service';
-import { PaginatedSearchOptions } from '../../shared/search/paginated-search-options.model';
+import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
+import { PaginatedSearchOptions } from '../../search/paginated-search-options.model';
+import { AlertType } from '../../alert/aletr-type';
@Component({
selector: 'ds-item-versions',
@@ -26,6 +27,19 @@ export class ItemVersionsComponent implements OnInit {
*/
@Input() item: Item;
+ /**
+ * An option to display the list of versions, even when there aren't any.
+ * Instead of the table, an alert will be displayed, notifying the user there are no other versions present
+ * for the current item.
+ */
+ @Input() displayWhenEmpty = false;
+
+ /**
+ * The AlertType enumeration
+ * @type {AlertType}
+ */
+ AlertTypeEnum = AlertType;
+
/**
* The item's version
*/
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 685787c5a4..835c211572 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -177,6 +177,8 @@ import { ExternalSourceEntryImportModalComponent } from './form/builder/ds-dynam
import { ImportableListItemControlComponent } from './object-collection/shared/importable-list-item-control/importable-list-item-control.component';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { ExistingMetadataListElementComponent } from './form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component';
+import { EditItemVersionHistorySelectorComponent } from './dso-selector/modal-wrappers/edit-item-version-history-selector/edit-item-version-history-selector.component';
+import { ItemVersionsComponent } from './item/item-versions/item-versions.component';
const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here
@@ -297,6 +299,7 @@ const COMPONENTS = [
EditCommunitySelectorComponent,
EditCollectionSelectorComponent,
EditItemSelectorComponent,
+ EditItemVersionHistorySelectorComponent,
CommunitySearchResultListElementComponent,
CollectionSearchResultListElementComponent,
BrowseByComponent,
@@ -339,7 +342,8 @@ const COMPONENTS = [
SelectableListItemControlComponent,
ExternalSourceEntryImportModalComponent,
ImportableListItemControlComponent,
- ExistingMetadataListElementComponent
+ ExistingMetadataListElementComponent,
+ ItemVersionsComponent
];
const ENTRY_COMPONENTS = [
@@ -382,6 +386,7 @@ const ENTRY_COMPONENTS = [
EditCommunitySelectorComponent,
EditCollectionSelectorComponent,
EditItemSelectorComponent,
+ EditItemVersionHistorySelectorComponent,
StartsWithTextComponent,
PlainTextMetadataListElementComponent,
ItemMetadataListElementComponent,
@@ -402,7 +407,8 @@ const ENTRY_COMPONENTS = [
DsDynamicLookupRelationSearchTabComponent,
DsDynamicLookupRelationSelectionTabComponent,
DsDynamicLookupRelationExternalSourceTabComponent,
- ExternalSourceEntryImportModalComponent
+ ExternalSourceEntryImportModalComponent,
+ ItemVersionsComponent
];
const SHARED_ITEM_PAGE_COMPONENTS = [