diff --git a/src/app/core/data/relationship.service.ts b/src/app/core/data/relationship.service.ts index 47d0f85620..c11132e47a 100644 --- a/src/app/core/data/relationship.service.ts +++ b/src/app/core/data/relationship.service.ts @@ -410,8 +410,8 @@ export class RelationshipService extends DataService { const update$ = this.update(updatedRelationship); update$.pipe( - filter((relationshipRD: RemoteData) => relationshipRD.state === RemoteDataState.ResponsePending), - take(1), + // filter((relationshipRD: RemoteData) => relationshipRD.state === RemoteDataState.ResponsePending), + // take(1), ).subscribe((relationshipRD: RemoteData) => { if (relationshipRD.state === RemoteDataState.ResponsePending) { this.refreshRelationshipItemsInCacheByRelationship(reoRel.relationship.id); diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts index 80398fe43c..5b5c30e22c 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/existing-metadata-list-element/existing-metadata-list-element.component.ts @@ -3,7 +3,7 @@ import { AbstractControl, FormControl } from '@angular/forms'; import { DynamicFormArrayGroupModel, DynamicFormControlEvent } from '@ng-dynamic-forms/core'; import { Store } from '@ngrx/store'; import { Observable, of as observableOf, Subject, Subscription } from 'rxjs'; -import { filter } from 'rxjs/operators'; +import { filter, switchMap } from 'rxjs/operators'; import { AppState } from '../../../../../app.reducer'; import { RelationshipService } from '../../../../../core/data/relationship.service'; import { RemoteData } from '../../../../../core/data/remote-data'; @@ -24,6 +24,7 @@ import { FormFieldMetadataValueObject } from '../../models/form-field-metadata-v import { RelationshipOptions } from '../../models/relationship-options.model'; import { DynamicConcatModel } from '../models/ds-dynamic-concat.model'; import { RemoveRelationshipAction } from '../relation-lookup-modal/relationship.actions'; +import { SubmissionObject } from '../../../../../core/submission/models/submission-object.model'; // tslint:disable:max-classes-per-file /** @@ -103,12 +104,13 @@ export class ReorderableRelationship extends Reorderable { } update(): Observable> { - const updatedRelationship$ = this.relationshipService.updatePlace(this); + const updatedRelationship$ = this.relationshipService.updatePlace(this).pipe( + getSucceededRemoteData(), + ); - updatedRelationship$.pipe( - getSucceededRemoteData() - ).subscribe(() => { + updatedRelationship$.subscribe(() => { this.oldIndex = this.newIndex; + }); return updatedRelationship$; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts index 72cde8573f..7115e67219 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts @@ -13,7 +13,7 @@ import { DynamicTemplateDirective } from '@ng-dynamic-forms/core'; import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; -import { map, switchMap, take } from 'rxjs/operators'; +import { filter, map, switchMap, take } from 'rxjs/operators'; import { RelationshipService } from '../../../../../../core/data/relationship.service'; import { RemoteData } from '../../../../../../core/data/remote-data'; import { Relationship } from '../../../../../../core/shared/item-relationships/relationship.model'; @@ -34,6 +34,11 @@ import { } from '../../existing-metadata-list-element/existing-metadata-list-element.component'; import { DynamicConcatModel } from '../ds-dynamic-concat.model'; import { DynamicRowArrayModel } from '../ds-dynamic-row-array-model'; +import { SaveSubmissionSectionFormSuccessAction } from '../../../../../../submission/objects/submission-objects.actions'; +import { Store } from '@ngrx/store'; +import { SubmissionState } from '../../../../../../submission/submission.reducers'; +import { ObjectCacheService } from '../../../../../../core/cache/object-cache.service'; +import { RequestService } from '../../../../../../core/data/request.service'; @Component({ selector: 'ds-dynamic-form-array', @@ -64,7 +69,10 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple protected relationshipService: RelationshipService, protected submissionObjectService: SubmissionObjectDataService, protected zone: NgZone, - protected formService: DynamicFormService + protected formService: DynamicFormService, + private store: Store, + private objectCache: ObjectCacheService, + private requestService: RequestService ) { super(layoutService, validationService); } @@ -154,16 +162,18 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple }) } this.reorderables = reorderables; - + const updatedReorderables: Array> = []; this.reorderables.forEach((reorderable: Reorderable, index: number) => { if (reorderable.hasMoved) { const prevIndex = reorderable.oldIndex; - reorderable.update().pipe(take(1)).subscribe((v) => { + const updatedReorderable = reorderable.update().pipe(take(1)); + updatedReorderables.push(updatedReorderable); + updatedReorderable.subscribe((v) => { if (reorderable instanceof ReorderableFormFieldMetadataValue) { const reoMD = reorderable as ReorderableFormFieldMetadataValue; const mdl = Object.assign({}, reoMD.model, { value: reoMD.metadataValue }); this.onChange({ - $event: { previousIndex: prevIndex }, + $event: { previousIndex: prevIndex }, context: { index }, control: reoMD.control, group: this.group, @@ -173,10 +183,29 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple } }); } - }) + }); + observableCombineLatest(...updatedReorderables).pipe( + switchMap(() => this.refreshWorkspaceItemInCache(this.model.submissionId)), + ).subscribe((submissionObject: SubmissionObject) => this.store.dispatch(new SaveSubmissionSectionFormSuccessAction(this.model.submissionId, [submissionObject], false))); }); }) } + refreshWorkspaceItemInCache(submissionId: string): Observable { + return this.submissionObjectService.getHrefByID(submissionId).pipe(take(1)).pipe( + switchMap((href: string) => { + this.objectCache.remove(href); + this.requestService.removeByHrefSubstring(submissionId); + return observableCombineLatest( + this.objectCache.hasBySelfLinkObservable(href), + this.requestService.hasByHrefObservable(href) + ).pipe( + filter(([existsInOC, existsInRC]) => !existsInOC && !existsInRC), + take(1), + switchMap(() => this.submissionObjectService.findById(submissionId).pipe(getSucceededRemoteData(), getRemoteDataPayload()) as Observable) + ) + }) + ); + } moveSelection(event: CdkDragDrop) { this.model.moveGroup(event.previousIndex, event.currentIndex - event.previousIndex);