diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 2c743e219d..ee8c4d685f 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -22,7 +22,7 @@ import {
import { isEqual } from 'lodash';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { select, Store } from '@ngrx/store';
-import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+import { NgbModal, NgbModalConfig } from '@ng-bootstrap/ng-bootstrap';
import { TranslateService } from '@ngx-translate/core';
import { Angulartics2GoogleAnalytics } from 'angulartics2';
@@ -49,6 +49,7 @@ import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service';
import { IdleModalComponent } from './shared/idle-modal/idle-modal.component';
import { getDefaultThemeConfig } from '../config/config.util';
import { AppConfig, APP_CONFIG } from 'src/config/app-config.interface';
+import { ModalBeforeDismiss } from './shared/interfaces/modal-before-dismiss.interface';
@Component({
selector: 'ds-app',
@@ -106,6 +107,7 @@ export class AppComponent implements OnInit, AfterViewInit {
private localeService: LocaleService,
private breadcrumbsService: BreadcrumbsService,
private modalService: NgbModal,
+ private modalConfig: NgbModalConfig,
@Optional() private cookiesService: KlaroService,
@Optional() private googleAnalyticsService: GoogleAnalyticsService,
) {
@@ -166,6 +168,16 @@ export class AppComponent implements OnInit, AfterViewInit {
}
ngOnInit() {
+ /** Implement behavior for interface {@link ModalBeforeDismiss} */
+ this.modalConfig.beforeDismiss = async function () {
+ if (typeof this?.componentInstance?.beforeDismiss === 'function') {
+ return this.componentInstance.beforeDismiss();
+ }
+
+ // fall back to default behavior
+ return true;
+ };
+
this.isAuthBlocking$ = this.store.pipe(select(isAuthenticationBlocking)).pipe(
distinctUntilChanged()
);
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
index 6e73935672..dbd9d03994 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
@@ -3,6 +3,9 @@
{{'journalissue.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
index f96379dafd..f5e9dc9b2b 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
@listableObjectComponent('JournalIssue', ViewMode.StandalonePage)
@Component({
@@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
/**
* The component for displaying metadata and relations of an item of the type Journal Issue
*/
-export class JournalIssueComponent extends ItemComponent {
+export class JournalIssueComponent extends VersionedItemComponent {
}
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
index 5d4d8d06ce..8b19c37033 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
@@ -3,6 +3,9 @@
{{'journalvolume.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
index eeb93e7070..cc09be7959 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
@listableObjectComponent('JournalVolume', ViewMode.StandalonePage)
@Component({
@@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
/**
* The component for displaying metadata and relations of an item of the type Journal Volume
*/
-export class JournalVolumeComponent extends ItemComponent {
+export class JournalVolumeComponent extends VersionedItemComponent {
}
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
index d51c55e5d6..45cbc1f839 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
@@ -3,6 +3,9 @@
{{'journal.page.titleprefix' | translate}}
+
@@ -44,7 +47,8 @@
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
index 0e756b7dc9..3ed73e7891 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts
@@ -29,6 +29,11 @@ import { TruncatableService } from '../../../../shared/truncatable/truncatable.s
import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
import { JournalComponent } from './journal.component';
import { RouteService } from '../../../../core/services/route.service';
+import { RouterTestingModule } from '@angular/router/testing';
+import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
+import { VersionDataService } from '../../../../core/data/version-data.service';
+import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
+import { SearchService } from '../../../../core/shared/search/search.service';
let comp: JournalComponent;
let fixture: ComponentFixture;
@@ -65,12 +70,15 @@ describe('JournalComponent', () => {
};
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
- imports: [TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: TranslateLoaderMock
- }
- })],
+ imports: [
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: TranslateLoaderMock
+ }
+ }),
+ RouterTestingModule,
+ ],
declarations: [JournalComponent, GenericItemPageFieldComponent, TruncatePipe],
providers: [
{ provide: ItemDataService, useValue: {} },
@@ -86,7 +94,11 @@ describe('JournalComponent', () => {
{ provide: DSOChangeAnalyzer, useValue: {} },
{ provide: NotificationsService, useValue: {} },
{ provide: DefaultChangeAnalyzer, useValue: {} },
+ { provide: VersionHistoryDataService, useValue: {} },
+ { provide: VersionDataService, useValue: {} },
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
+ { provide: WorkspaceitemDataService, useValue: {} },
+ { provide: SearchService, useValue: {} },
{ provide: RouteService, useValue: {} }
],
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
index 3fe0903145..acfd31d8f6 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
@listableObjectComponent('Journal', ViewMode.StandalonePage)
@Component({
@@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
/**
* The component for displaying metadata and relations of an item of the type Journal
*/
-export class JournalComponent extends ItemComponent {
+export class JournalComponent extends VersionedItemComponent {
}
diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html
index 4315d2a91c..ff4bc4d226 100644
--- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html
@@ -3,6 +3,9 @@
{{'orgunit.page.titleprefix' | translate}}
+
@@ -54,12 +57,12 @@
[relationTypes]="[{
label: 'isOrgUnitOfPerson',
filter: 'isOrgUnitOfPerson',
- configuration: 'person'
+ configuration: 'person-relationships'
},
{
label: 'isOrgUnitOfProject',
filter: 'isOrgUnitOfProject',
- configuration: 'project'
+ configuration: 'project-relationships'
}]">
diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts
index ab756db562..cbf8497f35 100644
--- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
@listableObjectComponent('OrgUnit', ViewMode.StandalonePage)
@Component({
@@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
/**
* The component for displaying metadata and relations of an item of the type Organisation Unit
*/
-export class OrgUnitComponent extends ItemComponent {
+export class OrgUnitComponent extends VersionedItemComponent {
}
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html
index 8523f398cb..ace42f844e 100644
--- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html
@@ -2,8 +2,11 @@
{{'person.page.titleprefix' | translate}}
-
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
index 27fdd2ab15..8fde5ee69a 100644
--- a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
@@ -1,9 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
-import {
- listableObjectComponent
-} from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
import { MetadataValue } from '../../../../core/shared/metadata.models';
@listableObjectComponent('Person', ViewMode.StandalonePage)
@@ -15,7 +13,7 @@ import { MetadataValue } from '../../../../core/shared/metadata.models';
/**
* The component for displaying metadata and relations of an item of the type Person
*/
-export class PersonComponent extends ItemComponent {
+export class PersonComponent extends VersionedItemComponent {
/**
* Returns the metadata values to be used for the page title.
@@ -36,4 +34,5 @@ export class PersonComponent extends ItemComponent {
}
return metadataValues;
}
+
}
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.html b/src/app/entity-groups/research-entities/item-pages/project/project.component.html
index 7960631f3d..a068878fb4 100644
--- a/src/app/entity-groups/research-entities/item-pages/project/project.component.html
+++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.html
@@ -3,6 +3,9 @@
{{'project.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
index e53d8afd69..066427fc0d 100644
--- a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
-import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component';
@listableObjectComponent('Project', ViewMode.StandalonePage)
@Component({
@@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
/**
* The component for displaying metadata and relations of an item of the type Project
*/
-export class ProjectComponent extends ItemComponent {
+export class ProjectComponent extends VersionedItemComponent {
}
diff --git a/src/app/item-page/simple/item-types/publication/publication.component.html b/src/app/item-page/simple/item-types/publication/publication.component.html
index 96454914cd..d83202ce12 100644
--- a/src/app/item-page/simple/item-types/publication/publication.component.html
+++ b/src/app/item-page/simple/item-types/publication/publication.component.html
@@ -12,6 +12,9 @@
{{'publication.page.titleprefix' | translate}}
+
diff --git a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts
index 761849f232..404890e36d 100644
--- a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts
+++ b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts
@@ -33,6 +33,11 @@ import {
import { PublicationComponent } from './publication.component';
import { createPaginatedList } from '../../../../shared/testing/utils.test';
import { RouteService } from '../../../../core/services/route.service';
+import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
+import { VersionDataService } from '../../../../core/data/version-data.service';
+import { RouterTestingModule } from '@angular/router/testing';
+import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
+import { SearchService } from '../../../../core/shared/search/search.service';
const iiifEnabledMap: MetadataMap = {
'dspace.iiif.enabled': [iiifEnabled],
@@ -64,12 +69,15 @@ describe('PublicationComponent', () => {
}
};
TestBed.configureTestingModule({
- imports: [TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: TranslateLoaderMock
- }
- })],
+ imports: [
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: TranslateLoaderMock
+ }
+ }),
+ RouterTestingModule,
+ ],
declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe],
providers: [
{ provide: ItemDataService, useValue: {} },
@@ -85,7 +93,11 @@ describe('PublicationComponent', () => {
{ provide: HttpClient, useValue: {} },
{ provide: DSOChangeAnalyzer, useValue: {} },
{ provide: DefaultChangeAnalyzer, useValue: {} },
+ { provide: VersionHistoryDataService, useValue: {} },
+ { provide: VersionDataService, useValue: {} },
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
+ { provide: WorkspaceitemDataService, useValue: {} },
+ { provide: SearchService, useValue: {} },
{ provide: RouteService, useValue: mockRouteService }
],
diff --git a/src/app/item-page/simple/item-types/publication/publication.component.ts b/src/app/item-page/simple/item-types/publication/publication.component.ts
index 5ace8d0473..ba5037a104 100644
--- a/src/app/item-page/simple/item-types/publication/publication.component.ts
+++ b/src/app/item-page/simple/item-types/publication/publication.component.ts
@@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
-import { ItemComponent } from '../shared/item.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { VersionedItemComponent } from '../versioned-item/versioned-item.component';
/**
* Component that represents a publication Item page
@@ -14,6 +14,6 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
templateUrl: './publication.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
-export class PublicationComponent extends ItemComponent {
+export class PublicationComponent extends VersionedItemComponent {
}
diff --git a/src/app/item-page/simple/item-types/shared/item.component.spec.ts b/src/app/item-page/simple/item-types/shared/item.component.spec.ts
index 6f7684b896..e5287f674d 100644
--- a/src/app/item-page/simple/item-types/shared/item.component.spec.ts
+++ b/src/app/item-page/simple/item-types/shared/item.component.spec.ts
@@ -4,7 +4,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { Store } from '@ngrx/store';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
-import {Observable, of as observableOf} from 'rxjs';
+import { Observable, of as observableOf } from 'rxjs';
import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service';
import { ObjectCacheService } from '../../../../core/cache/object-cache.service';
import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
@@ -32,8 +32,13 @@ import { ItemComponent } from './item.component';
import { createPaginatedList } from '../../../../shared/testing/utils.test';
import { RouteService } from '../../../../core/services/route.service';
import { MetadataValue } from '../../../../core/shared/metadata.models';
-import {AuthorizationDataService} from '../../../../core/data/feature-authorization/authorization-data.service';
-import {ResearcherProfileService} from '../../../../core/profile/researcher-profile.service';
+import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
+import { SearchService } from '../../../../core/shared/search/search.service';
+import { VersionDataService } from '../../../../core/data/version-data.service';
+import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service';
+import { RouterTestingModule } from '@angular/router/testing';
+import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service';
+import { ResearcherProfileService } from '../../../../core/profile/researcher-profile.service';
export const iiifEnabled = Object.assign(new MetadataValue(),{
'value': 'true',
@@ -77,12 +82,15 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
});
TestBed.configureTestingModule({
- imports: [TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useClass: TranslateLoaderMock
- }
- })],
+ imports: [
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: TranslateLoaderMock
+ }
+ }),
+ RouterTestingModule,
+ ],
declarations: [component, GenericItemPageFieldComponent, TruncatePipe],
providers: [
{ provide: ItemDataService, useValue: {} },
@@ -96,9 +104,13 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
{ provide: HALEndpointService, useValue: {} },
{ provide: HttpClient, useValue: {} },
{ provide: DSOChangeAnalyzer, useValue: {} },
+ { provide: VersionHistoryDataService, useValue: {} },
+ { provide: VersionDataService, useValue: {} },
{ provide: NotificationsService, useValue: {} },
{ provide: DefaultChangeAnalyzer, useValue: {} },
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
+ { provide: WorkspaceitemDataService, useValue: {} },
+ { provide: SearchService, useValue: {} },
{ provide: RouteService, useValue: {} },
{ provide: AuthorizationDataService, useValue: authorizationService },
{ provide: ResearcherProfileService, useValue: {} }
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 cd2eb3a19b..7f61cee10b 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
@@ -62,6 +62,8 @@ export class VersionedItemComponent extends ItemComponent {
activeModal.componentInstance.createVersionEvent.pipe(
switchMap((summary: string) => this.versionHistoryService.createVersion(item._links.self.href, summary)),
getFirstCompletedRemoteData(),
+ // close model (should be displaying loading/waiting indicator) when version creation failed/succeeded
+ tap(() => activeModal.close()),
// show success/failure notification
tap((res: RemoteData) => { this.itemVersionShared.notifyCreateNewVersion(res); }),
// get workspace item
diff --git a/src/app/shared/interfaces/modal-before-dismiss.interface.ts b/src/app/shared/interfaces/modal-before-dismiss.interface.ts
new file mode 100644
index 0000000000..fca28e1cff
--- /dev/null
+++ b/src/app/shared/interfaces/modal-before-dismiss.interface.ts
@@ -0,0 +1,25 @@
+import { NgbModalConfig, NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+/**
+ * If a component implementing this interface is used to create a modal (i.e. it is passed to {@link NgbModal#open}),
+ * and that modal is dismissed, then {@link #beforeDismiss} will be called.
+ *
+ * This behavior is implemented for the whole app, by setting a default value for {@link NgbModalConfig#beforeDismiss}
+ * in {@link AppComponent}.
+ *
+ * Docs: https://ng-bootstrap.github.io/#/components/modal/api
+ */
+export interface ModalBeforeDismiss {
+
+ /**
+ * Callback right before the modal will be dismissed.
+ * If this function returns:
+ * - false
+ * - a promise resolved with false
+ * - a promise that is rejected
+ * then the modal won't be dismissed.
+ * Docs: https://ng-bootstrap.github.io/#/components/modal/api#NgbModalOptions
+ */
+ beforeDismiss(): boolean | Promise;
+
+}
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html
index a083679108..0aa22f80cf 100644
--- a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html
+++ b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.html
@@ -1,4 +1,4 @@
-
+
+
+
+
+
+
{{'item.version.create.modal.submitted.text' | translate}}
+
+
+
+
+
diff --git a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
index 31bb3078c0..23ee62e628 100644
--- a/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
+++ b/src/app/shared/item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component.ts
@@ -1,16 +1,19 @@
-import { Component, EventEmitter, Output } from '@angular/core';
+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';
@Component({
selector: 'ds-item-versions-summary-modal',
templateUrl: './item-versions-summary-modal.component.html',
styleUrls: ['./item-versions-summary-modal.component.scss']
})
-export class ItemVersionsSummaryModalComponent {
+export class ItemVersionsSummaryModalComponent implements OnInit, ModalBeforeDismiss {
versionNumber: number;
newVersionSummary: string;
firstVersion = true;
+ submitted$: BehaviorSubject
;
@Output() createVersionEvent: EventEmitter = new EventEmitter();
@@ -19,13 +22,24 @@ export class ItemVersionsSummaryModalComponent {
) {
}
+ ngOnInit() {
+ this.submitted$ = new BehaviorSubject(false);
+ }
+
onModalClose() {
this.activeModal.dismiss();
}
+ beforeDismiss(): boolean | Promise {
+ // prevent the modal from being dismissed after version creation is initiated
+ return !this.submitted$.getValue();
+ }
+
onModalSubmit() {
this.createVersionEvent.emit(this.newVersionSummary);
- this.activeModal.close();
+ this.submitted$.next(true);
+ // NOTE: the caller of this modal is responsible for closing it,
+ // e.g. after the version creation POST request completed.
}
}
diff --git a/src/app/shared/item/item-versions/item-versions.component.ts b/src/app/shared/item/item-versions/item-versions.component.ts
index abd21e6f4f..b7b8182658 100644
--- a/src/app/shared/item/item-versions/item-versions.component.ts
+++ b/src/app/shared/item/item-versions/item-versions.component.ts
@@ -340,6 +340,9 @@ export class ItemVersionsComponent implements OnInit {
version.item.pipe(getFirstSucceededRemoteDataPayload())
])),
mergeMap(([summary, item]: [string, Item]) => this.versionHistoryService.createVersion(item._links.self.href, summary)),
+ getFirstCompletedRemoteData(),
+ // close model (should be displaying loading/waiting indicator) when version creation failed/succeeded
+ tap(() => activeModal.close()),
// show success/failure notification
tap((newVersionRD: RemoteData) => {
this.itemVersionShared.notifyCreateNewVersion(newVersionRD);
diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5
index cff21118fc..cb664e19f7 100644
--- a/src/assets/i18n/en.json5
+++ b/src/assets/i18n/en.json5
@@ -2361,6 +2361,10 @@
"item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version",
+ "item.version.create.modal.submitted.header": "Creating new version...",
+
+ "item.version.create.modal.submitted.text": "The new version is being created. This may take some time if the item has a lot of relationships.",
+
"item.version.create.notification.success" : "New version has been created with version number {{version}}",
"item.version.create.notification.failure" : "New version has not been created",
@@ -2407,6 +2411,8 @@
"journal.search.results.head": "Journal Search Results",
+ "journal-relationships.search.results.head": "Journal Search Results",
+
"journal.search.title": "Journal Search",
@@ -2897,6 +2903,8 @@
"person.search.results.head": "Person Search Results",
+ "person-relationships.search.results.head": "Person Search Results",
+
"person.search.title": "Person Search",
@@ -3074,6 +3082,8 @@
"project.search.results.head": "Project Search Results",
+ "project-relationships.search.results.head": "Project Search Results",
+
"publication.listelement.badge": "Publication",
@@ -3094,6 +3104,8 @@
"publication.search.results.head": "Publication Search Results",
+ "publication-relationships.search.results.head": "Publication Search Results",
+
"publication.search.title": "Publication Search",
@@ -3570,6 +3582,8 @@
"default.search.results.head": "Search Results",
+ "default-relationships.search.results.head": "Search Results",
+
"search.sidebar.close": "Back to results",