fix adding of metadata only fields, and styling

This commit is contained in:
Art Lowel
2020-02-25 17:01:44 +01:00
parent 644dcf8ce6
commit a8d5ad9c37
11 changed files with 118 additions and 89 deletions

View File

@@ -1,7 +1,7 @@
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { MemoizedSelector, select, Store } from '@ngrx/store'; import { MemoizedSelector, select, Store } from '@ngrx/store';
import { combineLatest, combineLatest as observableCombineLatest } from 'rxjs'; import { combineLatest as observableCombineLatest } from 'rxjs';
import { Observable } from 'rxjs/internal/Observable'; import { Observable } from 'rxjs/internal/Observable';
import { distinctUntilChanged, filter, map, startWith, switchMap, take, tap } from 'rxjs/operators'; import { distinctUntilChanged, filter, map, startWith, switchMap, take, tap } from 'rxjs/operators';
import { import {
@@ -138,10 +138,10 @@ export class RelationshipService extends DataService<Relationship> {
* @param relationshipId The identifier of the relationship * @param relationshipId The identifier of the relationship
*/ */
private refreshRelationshipItemsInCacheByRelationship(relationshipId: string) { private refreshRelationshipItemsInCacheByRelationship(relationshipId: string) {
this.findById(relationshipId).pipe( this.findById(relationshipId, followLink('leftItem'), followLink('rightItem')).pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
switchMap((rel: Relationship) => combineLatest( switchMap((rel: Relationship) => observableCombineLatest(
rel.leftItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()), rel.leftItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()),
rel.rightItem.pipe(getSucceededRemoteData(), getRemoteDataPayload()) rel.rightItem.pipe(getSucceededRemoteData(), getRemoteDataPayload())
) )
@@ -160,7 +160,7 @@ export class RelationshipService extends DataService<Relationship> {
private refreshRelationshipItemsInCache(item) { private refreshRelationshipItemsInCache(item) {
this.objectCache.remove(item._links.self.href); this.objectCache.remove(item._links.self.href);
this.requestService.removeByHrefSubstring(item.uuid); this.requestService.removeByHrefSubstring(item.uuid);
combineLatest( observableCombineLatest(
this.objectCache.hasBySelfLinkObservable(item._links.self.href), this.objectCache.hasBySelfLinkObservable(item._links.self.href),
this.requestService.hasByHrefObservable(item.self) this.requestService.hasByHrefObservable(item.self)
).pipe( ).pipe(

View File

@@ -35,14 +35,12 @@ export class JsonPatchOperationsBuilder {
* A boolean representing if the value to be added is a plain text value * A boolean representing if the value to be added is a plain text value
*/ */
add(path: JsonPatchOperationPathObject, value, first = false, plain = false) { add(path: JsonPatchOperationPathObject, value, first = false, plain = false) {
if ((typeof value === 'object' && hasValue(value.value)) || hasValue(value)) {
this.store.dispatch( this.store.dispatch(
new NewPatchAddOperationAction( new NewPatchAddOperationAction(
path.rootElement, path.rootElement,
path.subRootElement, path.subRootElement,
path.path, this.prepareValue(value, plain, first))); path.path, this.prepareValue(value, plain, first)));
} }
}
/** /**
* Dispatches a new NewPatchReplaceOperationAction * Dispatches a new NewPatchReplaceOperationAction

View File

@@ -1,7 +1,7 @@
<div class="d-flex"> <div class="d-flex">
<div class="person-thumbnail pr-2"> <!-- <div class="person-thumbnail pr-2">-->
<ds-thumbnail [thumbnail]="getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail> <!-- <ds-thumbnail [thumbnail]="getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail>-->
</div> <!-- </div>-->
<div class="flex-grow-1"> <div class="flex-grow-1">
<ds-org-unit-input-suggestions [suggestions]="allSuggestions" [(ngModel)]="selectedName" (clickSuggestion)="select($event)" <ds-org-unit-input-suggestions [suggestions]="allSuggestions" [(ngModel)]="selectedName" (clickSuggestion)="select($event)"
(submitSuggestion)="selectCustom($event)"></ds-org-unit-input-suggestions> (submitSuggestion)="selectCustom($event)"></ds-org-unit-input-suggestions>

View File

@@ -1,7 +1,7 @@
<div class="d-flex"> <div class="d-flex">
<div class="person-thumbnail pr-2"> <!-- <div class="person-thumbnail pr-2">-->
<ds-thumbnail [thumbnail]="getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail> <!-- <ds-thumbnail [thumbnail]="getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail>-->
</div> <!-- </div>-->
<div class="flex-grow-1"> <div class="flex-grow-1">
<ds-person-input-suggestions [suggestions]="allSuggestions" [(ngModel)]="selectedName" (clickSuggestion)="select($event)" (submitSuggestion)="selectCustom($event)"></ds-person-input-suggestions> <ds-person-input-suggestions [suggestions]="allSuggestions" [(ngModel)]="selectedName" (clickSuggestion)="select($event)" (submitSuggestion)="selectCustom($event)"></ds-person-input-suggestions>
<span class="text-muted"> <span class="text-muted">

View File

@@ -9,9 +9,7 @@
<!-- Should be *ngIf instead of class d-none, but that breaks the #componentViewContainer reference--> <!-- Should be *ngIf instead of class d-none, but that breaks the #componentViewContainer reference-->
<div [ngClass]="{'form-row': model.hasLanguages || isRelationship, 'd-none': relationshipValue$ | async}"> <div [ngClass]="{'form-row': model.hasLanguages || isRelationship, 'd-none': relationshipValue$ | async}">
<div [ngClass]="getClass('grid', 'control')"> <div [ngClass]="getClass('grid', 'control')">
<ng-container #componentViewContainer></ng-container> <ng-container #componentViewContainer></ng-container>
<small *ngIf="hasHint && (!showErrorMessages || errorMessages.length === 0)" <small *ngIf="hasHint && (!showErrorMessages || errorMessages.length === 0)"
class="text-muted" [innerHTML]="model.hint | translate" [ngClass]="getClass('element', 'hint')"></small> class="text-muted" [innerHTML]="model.hint | translate" [ngClass]="getClass('element', 'hint')"></small>
@@ -20,7 +18,6 @@
</div> </div>
</div> </div>
<div *ngIf="model.languageCodes && model.languageCodes.length > 0" class="col-xs-2" > <div *ngIf="model.languageCodes && model.languageCodes.length > 0" class="col-xs-2" >
<select <select
#language="ngModel" #language="ngModel"
@@ -34,8 +31,7 @@
<option *ngFor="let lang of model.languageCodes" [value]="lang.code">{{lang.display}}</option> <option *ngFor="let lang of model.languageCodes" [value]="lang.code">{{lang.display}}</option>
</select> </select>
</div> </div>
<div *ngIf="isRelationship" class="col-auto text-center" [class.invisible]="context?.index > 0">
<div *ngIf="isRelationship && context?.index < 1" class="col-auto text-center">
<button class="btn btn-secondary" <button class="btn btn-secondary"
type="button" type="button"
ngbTooltip="{{'form.lookup-help' | translate}}" ngbTooltip="{{'form.lookup-help' | translate}}"
@@ -44,9 +40,7 @@
</button> </button>
</div> </div>
</div> </div>
<ng-container *ngTemplateOutlet="endTemplate?.templateRef; context: model"></ng-container> <ng-container *ngTemplateOutlet="endTemplate?.templateRef; context: model"></ng-container>
<ng-container *ngIf="value?.isVirtual"> <ng-container *ngIf="value?.isVirtual">
<ds-existing-metadata-list-element <ds-existing-metadata-list-element
[reoRel]="relationshipValue$ | async" [reoRel]="relationshipValue$ | async"

View File

@@ -35,8 +35,8 @@
[model]="_model" [model]="_model"
[templates]="templates" [templates]="templates"
[ngClass]="[getClass('element', 'host', _model), getClass('grid', 'host', _model)]" [ngClass]="[getClass('element', 'host', _model), getClass('grid', 'host', _model)]"
(dfBlur)="onBlur($event)" (dfBlur)="updateReorderables()"
(dfChange)="onChange($event)" (dfChange)="updateReorderables()"
(dfFocus)="onFocus($event)" (dfFocus)="onFocus($event)"
(ngbEvent)="onCustomEvent($event, null, true)"></ds-dynamic-form-control-container> (ngbEvent)="onCustomEvent($event, null, true)"></ds-dynamic-form-control-container>
</ng-template> </ng-template>

View File

@@ -1,5 +1,14 @@
import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { CdkDragDrop } from '@angular/cdk/drag-drop';
import { Component, EventEmitter, Input, NgZone, OnInit, Output, QueryList } from '@angular/core'; import {
ChangeDetectorRef,
Component,
EventEmitter,
Input,
NgZone,
OnInit,
Output,
QueryList
} from '@angular/core';
import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';
import { import {
DynamicFormArrayComponent, DynamicFormArrayComponent,
@@ -25,7 +34,7 @@ import {
} from '../../../../../../core/shared/operators'; } from '../../../../../../core/shared/operators';
import { SubmissionObject } from '../../../../../../core/submission/models/submission-object.model'; import { SubmissionObject } from '../../../../../../core/submission/models/submission-object.model';
import { SubmissionObjectDataService } from '../../../../../../core/submission/submission-object-data.service'; import { SubmissionObjectDataService } from '../../../../../../core/submission/submission-object-data.service';
import { hasNoValue, hasValue, isNotEmpty, isNull } from '../../../../../empty.util'; import { hasNoValue, hasValue, isEmpty, isNotEmpty, isNull } from '../../../../../empty.util';
import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model'; import { FormFieldMetadataValueObject } from '../../../models/form-field-metadata-value.model';
import { import {
Reorderable, Reorderable,
@@ -41,6 +50,7 @@ import { ObjectCacheService } from '../../../../../../core/cache/object-cache.se
import { RequestService } from '../../../../../../core/data/request.service'; import { RequestService } from '../../../../../../core/data/request.service';
import { SubmissionService } from '../../../../../../submission/submission.service'; import { SubmissionService } from '../../../../../../submission/submission.service';
import { AppState } from '../../../../../../app.reducer'; import { AppState } from '../../../../../../app.reducer';
import { followLink } from '../../../../../utils/follow-link-config.model';
@Component({ @Component({
selector: 'ds-dynamic-form-array', selector: 'ds-dynamic-form-array',
@@ -69,6 +79,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
constructor(protected layoutService: DynamicFormLayoutService, constructor(protected layoutService: DynamicFormLayoutService,
protected validationService: DynamicFormValidationService, protected validationService: DynamicFormValidationService,
protected relationshipService: RelationshipService, protected relationshipService: RelationshipService,
protected changeDetectorRef: ChangeDetectorRef,
protected submissionObjectService: SubmissionObjectDataService, protected submissionObjectService: SubmissionObjectDataService,
protected zone: NgZone, protected zone: NgZone,
protected formService: DynamicFormService, protected formService: DynamicFormService,
@@ -80,7 +91,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
ngOnInit(): void { ngOnInit(): void {
this.submissionObjectService this.submissionObjectService
.findById(this.model.submissionId).pipe( .findById(this.model.submissionId, followLink('item')).pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
switchMap((submissionObject: SubmissionObject) => (submissionObject.item as Observable<RemoteData<Item>>) switchMap((submissionObject: SubmissionObject) => (submissionObject.item as Observable<RemoteData<Item>>)
@@ -91,12 +102,12 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
) )
).subscribe((item) => { ).subscribe((item) => {
this.submissionItem = item; this.submissionItem = item;
this.updateReorderables(); this.updateReorderables(false);
}); });
} }
private updateReorderables(): void { private updateReorderables(shouldPropagateChanges = true): void {
this.zone.runOutsideAngular(() => { this.zone.runOutsideAngular(() => {
let groups = this.model.groups.map((group, index) => [group, (this.control as any).controls[index]]); let groups = this.model.groups.map((group, index) => [group, (this.control as any).controls[index]]);
groups = [...groups, groups[0]]; groups = [...groups, groups[0]];
@@ -114,7 +125,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
confidence: formFieldMetadataValue.confidence confidence: formFieldMetadataValue.confidence
}); });
if (metadataValue.isVirtual) { if (metadataValue.isVirtual) {
return this.relationshipService.findById(metadataValue.virtualValue) return this.relationshipService.findById(metadataValue.virtualValue, followLink('leftItem'))
.pipe( .pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
@@ -158,23 +169,28 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
observableCombineLatest(reorderable$arr) observableCombineLatest(reorderable$arr)
.subscribe((reorderables: Reorderable[]) => { .subscribe((reorderables: Reorderable[]) => {
if (isNotEmpty(this.reorderables)) {
reorderables.forEach((newReorderable: Reorderable) => { reorderables.forEach((newReorderable: Reorderable) => {
const match = this.reorderables.find((reo: Reorderable) => reo.getId() === newReorderable.getId()); const match = this.reorderables.find((reo: Reorderable) => reo.getId() === newReorderable.getId());
if (hasValue(match)) { if (hasValue(match)) {
newReorderable.oldIndex = match.newIndex; newReorderable.oldIndex = match.newIndex;
} else {
newReorderable.oldIndex = -1;
} }
}) });
}
this.reorderables = reorderables; this.reorderables = reorderables;
if (shouldPropagateChanges) {
const updatedReorderables: Array<Observable<any>> = []; const updatedReorderables: Array<Observable<any>> = [];
let hasMetadataField = false;
this.reorderables.forEach((reorderable: Reorderable, index: number) => { this.reorderables.forEach((reorderable: Reorderable, index: number) => {
if (reorderable.hasMoved) { if (reorderable.hasMoved) {
const prevIndex = reorderable.oldIndex; const prevIndex = reorderable.oldIndex;
const updatedReorderable = reorderable.update().pipe(take(1)); const updatedReorderable = reorderable.update().pipe(take(1));
updatedReorderables.push(updatedReorderable); updatedReorderables.push(updatedReorderable);
updatedReorderable.subscribe((v) => {
if (reorderable instanceof ReorderableFormFieldMetadataValue) { if (reorderable instanceof ReorderableFormFieldMetadataValue) {
hasMetadataField = true;
updatedReorderable.subscribe((v) => {
const reoMD = reorderable as ReorderableFormFieldMetadataValue; const reoMD = reorderable as ReorderableFormFieldMetadataValue;
const mdl = Object.assign({}, reoMD.model, { value: reoMD.metadataValue }); const mdl = Object.assign({}, reoMD.model, { value: reoMD.metadataValue });
this.onChange({ this.onChange({
@@ -185,12 +201,22 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
model: mdl, model: mdl,
type: DynamicFormControlEventType.Change type: DynamicFormControlEventType.Change
}); });
}
}); });
} }
}
}); });
observableCombineLatest(...updatedReorderables).pipe(
).subscribe(() => this.submissionService.dispatchSave(this.model.submissionId)); observableCombineLatest(updatedReorderables).pipe(
).subscribe(() => {
if (hasMetadataField && hasValue(this.model.relationshipConfig)) {
// if it's a mix between entities and regular metadata fields,
// we need to save after every operation, since they use different
// endpoints and otherwise they'll get out of sync.
this.submissionService.dispatchSave(this.model.submissionId);
}
this.changeDetectorRef.detectChanges();
});
}
}); });
}) })
} }
@@ -199,15 +225,4 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent imple
this.model.moveGroup(event.previousIndex, event.currentIndex - event.previousIndex); this.model.moveGroup(event.previousIndex, event.currentIndex - event.previousIndex);
this.updateReorderables(); this.updateReorderables();
} }
onChange($event) {
let event = $event;
if (hasValue($event) && hasNoValue($event.context)) {
const context = Object.assign({}, $event.context, { index: this.reorderables.length });
event = Object.assign({}, $event, { context });
} else {
this.updateReorderables();
}
super.onChange(event);
}
} }

View File

@@ -19,6 +19,7 @@ import { ObjectCacheService } from '../../../../../core/cache/object-cache.servi
import { RequestService } from '../../../../../core/data/request.service'; import { RequestService } from '../../../../../core/data/request.service';
import { ServerSyncBufferActionTypes } from '../../../../../core/cache/server-sync-buffer.actions'; import { ServerSyncBufferActionTypes } from '../../../../../core/cache/server-sync-buffer.actions';
import { CommitPatchOperationsAction, JsonPatchOperationsActionTypes, PatchOperationsActions } from '../../../../../core/json-patch/json-patch-operations.actions'; import { CommitPatchOperationsAction, JsonPatchOperationsActionTypes, PatchOperationsActions } from '../../../../../core/json-patch/json-patch-operations.actions';
import { followLink } from '../../../../utils/follow-link-config.model';
const DEBOUNCE_TIME = 5000; const DEBOUNCE_TIME = 5000;
@@ -162,10 +163,15 @@ export class RelationshipEffects {
this.relationshipService.getRelationshipByItemsAndLabel(item1, item2, relationshipType).pipe( this.relationshipService.getRelationshipByItemsAndLabel(item1, item2, relationshipType).pipe(
take(1), take(1),
hasValueOperator(), hasValueOperator(),
tap((v) => console.log('before delete', v)),
mergeMap((relationship: Relationship) => this.relationshipService.deleteRelationship(relationship.id, 'none')), mergeMap((relationship: Relationship) => this.relationshipService.deleteRelationship(relationship.id, 'none')),
take(1), take(1),
tap((v) => console.log('before refresh', v)),
switchMap(() => this.refreshWorkspaceItemInCache(submissionId)), switchMap(() => this.refreshWorkspaceItemInCache(submissionId)),
).subscribe((submissionObject: SubmissionObject) => this.store.dispatch(new SaveSubmissionSectionFormSuccessAction(submissionId, [submissionObject], false))); ).subscribe((submissionObject: SubmissionObject) => {
console.log('in subscribe', submissionObject);
this.store.dispatch(new SaveSubmissionSectionFormSuccessAction(submissionId, [submissionObject], false))
});
} }
refreshWorkspaceItemInCache(submissionId: string): Observable<SubmissionObject> { refreshWorkspaceItemInCache(submissionId: string): Observable<SubmissionObject> {
@@ -179,7 +185,7 @@ export class RelationshipEffects {
).pipe( ).pipe(
filter(([existsInOC, existsInRC]) => !existsInOC && !existsInRC), filter(([existsInOC, existsInRC]) => !existsInOC && !existsInRC),
take(1), take(1),
switchMap(() => this.submissionObjectService.findById(submissionId).pipe(getSucceededRemoteData(), getRemoteDataPayload()) as Observable<SubmissionObject>) switchMap(() => this.submissionObjectService.findById(submissionId, followLink('item')).pipe(getSucceededRemoteData(), getRemoteDataPayload()) as Observable<SubmissionObject>)
) )
}) })
); );

View File

@@ -80,6 +80,9 @@ export abstract class FieldParser {
model = this.modelFactory(fieldValue, false); model = this.modelFactory(fieldValue, false);
if (!isFirstModelInArray) { if (!isFirstModelInArray) {
model.hint = undefined; model.hint = undefined;
if (Array.isArray(model.group)) {
model.group.forEach((group) => group.hint = undefined);
}
} }
} }
setLayout(model, 'element', 'host', 'col'); setLayout(model, 'element', 'host', 'col');

View File

@@ -9,7 +9,15 @@ import {
DynamicFormControlModel DynamicFormControlModel
} from '@ng-dynamic-forms/core'; } from '@ng-dynamic-forms/core';
import { hasValue, isNotEmpty, isNotNull, isNotUndefined, isNull, isUndefined } from '../../../shared/empty.util'; import {
hasNoValue,
hasValue,
isNotEmpty,
isNotNull,
isNotUndefined,
isNull,
isUndefined
} from '../../../shared/empty.util';
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { FormFieldPreviousValueObject } from '../../../shared/form/builder/models/form-field-previous-value-object'; import { FormFieldPreviousValueObject } from '../../../shared/form/builder/models/form-field-previous-value-object';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
@@ -312,7 +320,7 @@ export class SectionFormOperationsService {
} else if (this.formBuilder.isRelationGroup(event.model)) { } else if (this.formBuilder.isRelationGroup(event.model)) {
// It's a relation model // It's a relation model
this.dispatchOperationsFromMap(this.getValueMap(value), pathCombiner, event, previousValue); this.dispatchOperationsFromMap(this.getValueMap(value), pathCombiner, event, previousValue);
} else if (this.formBuilder.hasArrayGroupValue(event.model)) { } else if (this.formBuilder.hasArrayGroupValue(event.model) && hasNoValue((event.model as any).relationshipConfig)) {
// Model has as value an array, so dispatch an add operation with entire block of values // Model has as value an array, so dispatch an add operation with entire block of values
this.operationsBuilder.add( this.operationsBuilder.add(
pathCombiner.getPath(segmentedPath), pathCombiner.getPath(segmentedPath),
@@ -327,10 +335,16 @@ export class SectionFormOperationsService {
this.operationsBuilder.remove(pathCombiner.getPath(path)); this.operationsBuilder.remove(pathCombiner.getPath(path));
} }
} else if (hasValue(event.$event) && hasValue(event.$event.previousIndex)) { } else if (hasValue(event.$event) && hasValue(event.$event.previousIndex)) {
if (event.$event.previousIndex < 0) {
this.operationsBuilder.add(
pathCombiner.getPath(segmentedPath),
value, true);
} else {
this.operationsBuilder.move( this.operationsBuilder.move(
pathCombiner.getPath(path), pathCombiner.getPath(path),
pathCombiner.getPath(segmentedPath + '/' + event.$event.previousIndex).path pathCombiner.getPath(segmentedPath + '/' + event.$event.previousIndex).path
) )
}
} else { } else {
// New value is not equal from the previous one, so dispatch a replace operation // New value is not equal from the previous one, so dispatch a replace operation
this.operationsBuilder.replace( this.operationsBuilder.replace(

View File

@@ -1,7 +1,7 @@
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
import { DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core'; import { DynamicFormControlEvent, DynamicFormControlModel } from '@ng-dynamic-forms/core';
import { combineLatest, Observable, Subscription } from 'rxjs'; import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs';
import { distinctUntilChanged, filter, find, flatMap, map, switchMap, take, tap } from 'rxjs/operators'; import { distinctUntilChanged, filter, find, flatMap, map, switchMap, take, tap } from 'rxjs/operators';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { isEqual } from 'lodash'; import { isEqual } from 'lodash';
@@ -32,13 +32,12 @@ import { SectionsService } from '../sections.service';
import { difference } from '../../../shared/object.util'; import { difference } from '../../../shared/object.util';
import { WorkspaceitemSectionFormObject } from '../../../core/submission/models/workspaceitem-section-form.model'; import { WorkspaceitemSectionFormObject } from '../../../core/submission/models/workspaceitem-section-form.model';
import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model'; import { WorkspaceItem } from '../../../core/submission/models/workspaceitem.model';
import { WorkspaceitemDataService } from '../../../core/submission/workspaceitem-data.service';
import { combineLatest as combineLatestObservable } from 'rxjs';
import { getRemoteDataPayload, getSucceededRemoteData } from '../../../core/shared/operators'; import { getRemoteDataPayload, getSucceededRemoteData } from '../../../core/shared/operators';
import { SubmissionObject } from '../../../core/submission/models/submission-object.model'; import { SubmissionObject } from '../../../core/submission/models/submission-object.model';
import { SubmissionObjectDataService } from '../../../core/submission/submission-object-data.service'; import { SubmissionObjectDataService } from '../../../core/submission/submission-object-data.service';
import { ObjectCacheService } from '../../../core/cache/object-cache.service'; import { ObjectCacheService } from '../../../core/cache/object-cache.service';
import { RequestService } from '../../../core/data/request.service'; import { RequestService } from '../../../core/data/request.service';
import { followLink } from '../../../shared/utils/follow-link-config.model';
/** /**
* This component represents a section that contains a Form. * This component represents a section that contains a Form.
@@ -166,19 +165,19 @@ export class SubmissionSectionformComponent extends SectionModelComponent {
map((configData: ConfigData) => configData.payload), map((configData: ConfigData) => configData.payload),
tap((config: SubmissionFormsModel) => this.formConfig = config), tap((config: SubmissionFormsModel) => this.formConfig = config),
flatMap(() => flatMap(() =>
combineLatestObservable( observableCombineLatest(
this.sectionService.getSectionData(this.submissionId, this.sectionData.id), this.sectionService.getSectionData(this.submissionId, this.sectionData.id),
this.submissionObjectService.getHrefByID(this.submissionId).pipe(take(1)).pipe( this.submissionObjectService.getHrefByID(this.submissionId).pipe(take(1)).pipe(
switchMap((href: string) => { switchMap((href: string) => {
this.objectCache.remove(href); this.objectCache.remove(href);
this.requestService.removeByHrefSubstring(this.submissionId); this.requestService.removeByHrefSubstring(this.submissionId);
return combineLatest( return observableCombineLatest(
this.objectCache.hasBySelfLinkObservable(href), this.objectCache.hasBySelfLinkObservable(href),
this.requestService.hasByHrefObservable(href) this.requestService.hasByHrefObservable(href)
).pipe( ).pipe(
filter(([existsInOC, existsInRC]) => !existsInOC && !existsInRC), filter(([existsInOC, existsInRC]) => !existsInOC && !existsInRC),
take(1), take(1),
switchMap(() => this.submissionObjectService.findById(this.submissionId).pipe(getSucceededRemoteData(), getRemoteDataPayload()) as Observable<SubmissionObject>) switchMap(() => this.submissionObjectService.findById(this.submissionId, followLink('item')).pipe(getSucceededRemoteData(), getRemoteDataPayload()) as Observable<SubmissionObject>)
) )
}) })
) )