mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-08 02:24:11 +00:00
fix issue where the submission form wouldn't update after a relationship was added
This commit is contained in:
@@ -2,11 +2,11 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
|
||||
|
||||
import { Subscription } from 'rxjs';
|
||||
import { filter, switchMap } from 'rxjs/operators';
|
||||
import { filter, switchMap, debounceTime } from 'rxjs/operators';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { WorkspaceitemSectionsObject } from '../../core/submission/models/workspaceitem-sections.model';
|
||||
import { hasValue, isEmpty, isNotNull } from '../../shared/empty.util';
|
||||
import { hasValue, isEmpty, isNotNull, isNotEmptyOperator } from '../../shared/empty.util';
|
||||
import { SubmissionDefinitionsModel } from '../../core/config/models/config-submission-definitions.model';
|
||||
import { SubmissionService } from '../submission.service';
|
||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||
@@ -14,6 +14,9 @@ import { SubmissionObject } from '../../core/submission/models/submission-object
|
||||
import { Collection } from '../../core/shared/collection.model';
|
||||
import { RemoteData } from '../../core/data/remote-data';
|
||||
import { Item } from '../../core/shared/item.model';
|
||||
import { getAllSucceededRemoteData } from '../../core/shared/operators';
|
||||
import { ItemDataService } from '../../core/data/item-data.service';
|
||||
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
|
||||
|
||||
/**
|
||||
* This component allows to edit an existing workspaceitem/workflowitem.
|
||||
@@ -60,6 +63,16 @@ export class SubmissionEditComponent implements OnDestroy, OnInit {
|
||||
* @type {Array}
|
||||
*/
|
||||
private subs: Subscription[] = [];
|
||||
|
||||
/**
|
||||
* BehaviorSubject containing the self link to the item for this submission
|
||||
* @private
|
||||
*/
|
||||
private itemLink$: BehaviorSubject<string> = new BehaviorSubject(undefined);
|
||||
|
||||
/**
|
||||
* The item for this submission.
|
||||
*/
|
||||
public item: Item;
|
||||
|
||||
/**
|
||||
@@ -69,6 +82,7 @@ export class SubmissionEditComponent implements OnDestroy, OnInit {
|
||||
* @param {NotificationsService} notificationsService
|
||||
* @param {ActivatedRoute} route
|
||||
* @param {Router} router
|
||||
* @param {ItemDataService} itemDataService
|
||||
* @param {SubmissionService} submissionService
|
||||
* @param {TranslateService} translate
|
||||
*/
|
||||
@@ -76,6 +90,7 @@ export class SubmissionEditComponent implements OnDestroy, OnInit {
|
||||
private notificationsService: NotificationsService,
|
||||
private route: ActivatedRoute,
|
||||
private router: Router,
|
||||
private itemDataService: ItemDataService,
|
||||
private submissionService: SubmissionService,
|
||||
private translate: TranslateService) {
|
||||
}
|
||||
@@ -84,32 +99,47 @@ export class SubmissionEditComponent implements OnDestroy, OnInit {
|
||||
* Retrieve workspaceitem/workflowitem from server and initialize all instance variables
|
||||
*/
|
||||
ngOnInit() {
|
||||
this.subs.push(this.route.paramMap.pipe(
|
||||
switchMap((params: ParamMap) => this.submissionService.retrieveSubmission(params.get('id'))),
|
||||
// NOTE new submission is retrieved on the browser side only, so get null on server side rendering
|
||||
filter((submissionObjectRD: RemoteData<SubmissionObject>) => isNotNull(submissionObjectRD))
|
||||
).subscribe((submissionObjectRD: RemoteData<SubmissionObject>) => {
|
||||
if (submissionObjectRD.hasSucceeded) {
|
||||
if (isEmpty(submissionObjectRD.payload)) {
|
||||
this.notificationsService.info(null, this.translate.get('submission.general.cannot_submit'));
|
||||
this.router.navigate(['/mydspace']);
|
||||
this.subs.push(
|
||||
this.route.paramMap.pipe(
|
||||
switchMap((params: ParamMap) => this.submissionService.retrieveSubmission(params.get('id'))),
|
||||
// NOTE new submission is retrieved on the browser side only, so get null on server side rendering
|
||||
filter((submissionObjectRD: RemoteData<SubmissionObject>) => isNotNull(submissionObjectRD))
|
||||
).subscribe((submissionObjectRD: RemoteData<SubmissionObject>) => {
|
||||
if (submissionObjectRD.hasSucceeded) {
|
||||
if (isEmpty(submissionObjectRD.payload)) {
|
||||
this.notificationsService.info(null, this.translate.get('submission.general.cannot_submit'));
|
||||
this.router.navigate(['/mydspace']);
|
||||
} else {
|
||||
this.submissionId = submissionObjectRD.payload.id.toString();
|
||||
this.collectionId = (submissionObjectRD.payload.collection as Collection).id;
|
||||
this.selfUrl = submissionObjectRD.payload._links.self.href;
|
||||
this.sections = submissionObjectRD.payload.sections;
|
||||
this.itemLink$.next(submissionObjectRD.payload._links.item.href);
|
||||
this.item = submissionObjectRD.payload.item;
|
||||
this.submissionDefinition = (submissionObjectRD.payload.submissionDefinition as SubmissionDefinitionsModel);
|
||||
}
|
||||
} else {
|
||||
this.submissionId = submissionObjectRD.payload.id.toString();
|
||||
this.collectionId = (submissionObjectRD.payload.collection as Collection).id;
|
||||
this.selfUrl = submissionObjectRD.payload._links.self.href;
|
||||
this.sections = submissionObjectRD.payload.sections;
|
||||
this.item = submissionObjectRD.payload.item as Item;
|
||||
this.submissionDefinition = (submissionObjectRD.payload.submissionDefinition as SubmissionDefinitionsModel);
|
||||
this.changeDetectorRef.detectChanges();
|
||||
if (submissionObjectRD.statusCode === 404) {
|
||||
// redirect to not found page
|
||||
this.router.navigate(['/404'], { skipLocationChange: true });
|
||||
}
|
||||
// TODO handle generic error
|
||||
}
|
||||
} else {
|
||||
if (submissionObjectRD.statusCode === 404) {
|
||||
// redirect to not found page
|
||||
this.router.navigate(['/404'], { skipLocationChange: true });
|
||||
}
|
||||
// TODO handle generic error
|
||||
}
|
||||
}));
|
||||
}),
|
||||
this.itemLink$.pipe(
|
||||
isNotEmptyOperator(),
|
||||
switchMap((itemLink: string) =>
|
||||
this.itemDataService.findByHref(itemLink)
|
||||
),
|
||||
getAllSucceededRemoteData(),
|
||||
// Multiple sources can update the item in quick succession.
|
||||
// We only want to rerender the form if the item is unchanged for some time
|
||||
debounceTime(300),
|
||||
).subscribe((itemRd: RemoteData<Item>) => {
|
||||
this.item = itemRd.payload;
|
||||
this.changeDetectorRef.detectChanges();
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user