Files
dspace-angular/src/app/submission/import-external/import-external-preview/submission-import-external-preview.component.ts

106 lines
3.7 KiB
TypeScript

import { Component, Input, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { NgbActiveModal, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { ExternalSourceEntry } from '../../../core/shared/external-source-entry.model';
import { MetadataValue } from '../../../core/shared/metadata.models';
import { Metadata } from '../../../core/shared/metadata.utils';
import { CollectionListEntry } from '../../../shared/collection-dropdown/collection-dropdown.component';
import { mergeMap } from 'rxjs/operators';
import { SubmissionService } from '../../submission.service';
import { SubmissionObject } from '../../../core/submission/models/submission-object.model';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { SubmissionImportExternalCollectionComponent } from '../import-external-collection/submission-import-external-collection.component';
/**
* This component display a preview of an external source item.
*/
@Component({
selector: 'ds-submission-import-external-preview',
styleUrls: ['./submission-import-external-preview.component.scss'],
templateUrl: './submission-import-external-preview.component.html'
})
export class SubmissionImportExternalPreviewComponent implements OnInit {
/**
* The external source entry
*/
@Input() public externalSourceEntry: ExternalSourceEntry;
/**
* The entry metadata list
*/
public metadataList: { key: string, value: MetadataValue }[];
/**
* The label prefix to use to generate the translation label
*/
public labelPrefix: string;
/**
* The modal for the entry preview
*/
modalRef: NgbModalRef;
/**
* Initialize the component variables.
* @param {NgbActiveModal} activeModal
* @param {SubmissionService} submissionService
* @param {NgbModal} modalService
* @param {Router} router
* @param {NotificationsService} notificationService
*/
constructor(
private activeModal: NgbActiveModal,
private submissionService: SubmissionService,
private modalService: NgbModal,
private router: Router,
private notificationService: NotificationsService
) { }
/**
* Metadata initialization for HTML display.
*/
ngOnInit(): void {
this.metadataList = [];
const metadataKeys = Object.keys(this.externalSourceEntry.metadata);
metadataKeys.forEach((key) => {
this.metadataList.push({
key: key,
value: Metadata.first(this.externalSourceEntry.metadata, key)
});
});
}
/**
* Closes the modal.
*/
public closeMetadataModal(): void {
this.activeModal.dismiss(false);
}
/**
* Start the import of an entry by opening up a collection choice modal window.
*/
public import(): void {
this.modalRef = this.modalService.open(SubmissionImportExternalCollectionComponent, {
size: 'lg',
});
this.modalRef.componentInstance.entityType = this.labelPrefix;
this.closeMetadataModal();
this.modalRef.componentInstance.selectedEvent.pipe(
mergeMap((collectionListEntry: CollectionListEntry) => {
return this.submissionService.createSubmissionFromExternalSource(this.externalSourceEntry._links.self.href, collectionListEntry.collection.id);
})
).subscribe((submissionObjects: SubmissionObject[]) => {
let isValid = false;
if (submissionObjects.length === 1) {
if (submissionObjects[0] !== null) {
isValid = true;
this.router.navigateByUrl('/workspaceitems/' + submissionObjects[0].id + '/edit');
}
}
if (!isValid) {
this.notificationService.error('submission.import-external.preview.error.import.title', 'submission.import-external.preview.error.import.body');
}
this.modalRef.close();
});
}
}