From 052dbdaf1e09b1853169a93d5984ce277120670e Mon Sep 17 00:00:00 2001 From: Alessandro Martelli Date: Wed, 31 Mar 2021 12:10:57 +0200 Subject: [PATCH] [CST-3782] patch add full array in case of DynamicRowArrayModel --- .../dynamic-form-array.component.ts | 2 +- .../form/builder/form-builder.service.ts | 6 +++ .../form/section-form-operations.service.ts | 42 +++++++++++-------- 3 files changed, 32 insertions(+), 18 deletions(-) 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 d349d553a2..8ab38454a7 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 @@ -3,7 +3,6 @@ import { Component, EventEmitter, Input, Output, QueryList } from '@angular/core import { FormGroup } from '@angular/forms'; import { DynamicFormArrayComponent, - DynamicFormArrayModel, DynamicFormControlCustomEvent, DynamicFormControlEvent, DynamicFormControlLayout, @@ -58,6 +57,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent { this.onCustomEvent({ previousIndex: prevIndex, index, + arrayModel: this.model, model: this.model.groups[index].group[0], control: (this.control as any).controls[index] }, 'move'); diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index a7979bde94..85d70f20dc 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -31,6 +31,7 @@ import { FormFieldMetadataValueObject } from './models/form-field-metadata-value import { dateToString, isNgbDateStruct } from '../../date.util'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-ui/ds-dynamic-form-constants'; import { CONCAT_GROUP_SUFFIX, DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model'; +import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; @Injectable() export class FormBuilderService extends DynamicFormService { @@ -121,6 +122,11 @@ export class FormBuilderService extends DynamicFormService { const normalizeValue = (controlModel, controlValue, controlModelIndex) => { const controlLanguage = (controlModel as DsDynamicInputModel).hasLanguages ? (controlModel as DsDynamicInputModel).language : null; + + if (controlModel?.metadataValue?.authority?.includes(VIRTUAL_METADATA_PREFIX)) { + return controlModel.metadataValue; + } + if (isString(controlValue)) { return new FormFieldMetadataValueObject(controlValue, controlLanguage, null, null, controlModelIndex); } else if (isNgbDateStruct(controlValue)) { diff --git a/src/app/submission/sections/form/section-form-operations.service.ts b/src/app/submission/sections/form/section-form-operations.service.ts index be0e397ddb..57ac7e1d7e 100644 --- a/src/app/submission/sections/form/section-form-operations.service.ts +++ b/src/app/submission/sections/form/section-form-operations.service.ts @@ -23,6 +23,7 @@ import { DynamicRelationGroupModel } from '../../../shared/form/builder/ds-dynam import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { deepClone } from 'fast-json-patch'; import { dateToString, isNgbDateStruct } from '../../../shared/date.util'; +import { DynamicRowArrayModel } from '../../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-row-array-model'; /** * The service handling all form section operations @@ -357,6 +358,13 @@ export class SectionFormOperationsService { event: DynamicFormControlEvent, previousValue: FormFieldPreviousValueObject, hasStoredValue: boolean): void { + + if (event.context && event.context instanceof DynamicFormArrayGroupModel) { + // Model is a DynamicRowArrayModel + this.handleArrayGroupPatch(pathCombiner, event, (event as any).context.context); + return; + } + const path = this.getFieldPathFromEvent(event); const segmentedPath = this.getFieldPathSegmentedFromChangeEvent(event); const value = this.getFieldValueFromChangeEvent(event); @@ -483,23 +491,23 @@ export class SectionFormOperationsService { event: DynamicFormControlEvent, previousValue: FormFieldPreviousValueObject) { - const customEvent = event.$event; + return this.handleArrayGroupPatch(pathCombiner, event.$event, (event as any).$event.arrayModel); + } - if (this.formBuilder.isQualdropGroup(customEvent.model.parent as DynamicFormControlModel) - || this.formBuilder.isQualdropGroup(customEvent.model as DynamicFormControlModel)) { - // It's a qualdrup model - this.dispatchOperationsFromMap(this.getQualdropValueMap(customEvent), pathCombiner, customEvent, previousValue); - return; - } - const path = this.getFieldPathFromEvent(customEvent); - const segmentedPath = this.getFieldPathSegmentedFromChangeEvent(customEvent); - const moveTo = pathCombiner.getPath(path); - const moveFrom = pathCombiner.getPath(segmentedPath + '/' + customEvent.previousIndex); - if (isNotEmpty(moveFrom.path) && isNotEmpty(moveTo.path) && moveFrom.path !== moveTo.path) { - this.operationsBuilder.move( - moveTo, - moveFrom.path - ); - } + /** + * Specific patch handler for a DynamicRowArrayModel. + * Configure a Patch ADD with the current array value. + * @param pathCombiner + * @param event + * @param model + */ + private handleArrayGroupPatch(pathCombiner: JsonPatchOperationPathCombiner, + event, + model: DynamicRowArrayModel) { + const arrayValue = this.formBuilder.getValueFromModel([model]); + const segmentedPath2 = this.getFieldPathSegmentedFromChangeEvent(event); + this.operationsBuilder.add( + pathCombiner.getPath(segmentedPath2), + arrayValue[segmentedPath2], false); } }