[CST-3782] patch add full array in case of DynamicRowArrayModel

This commit is contained in:
Alessandro Martelli
2021-03-31 12:10:57 +02:00
parent 8c60bd4280
commit 052dbdaf1e
3 changed files with 32 additions and 18 deletions

View File

@@ -3,7 +3,6 @@ import { Component, EventEmitter, Input, Output, QueryList } from '@angular/core
import { FormGroup } from '@angular/forms'; import { FormGroup } from '@angular/forms';
import { import {
DynamicFormArrayComponent, DynamicFormArrayComponent,
DynamicFormArrayModel,
DynamicFormControlCustomEvent, DynamicFormControlCustomEvent,
DynamicFormControlEvent, DynamicFormControlEvent,
DynamicFormControlLayout, DynamicFormControlLayout,
@@ -58,6 +57,7 @@ export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent {
this.onCustomEvent({ this.onCustomEvent({
previousIndex: prevIndex, previousIndex: prevIndex,
index, index,
arrayModel: this.model,
model: this.model.groups[index].group[0], model: this.model.groups[index].group[0],
control: (this.control as any).controls[index] control: (this.control as any).controls[index]
}, 'move'); }, 'move');

View File

@@ -31,6 +31,7 @@ import { FormFieldMetadataValueObject } from './models/form-field-metadata-value
import { dateToString, isNgbDateStruct } from '../../date.util'; import { dateToString, isNgbDateStruct } from '../../date.util';
import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-ui/ds-dynamic-form-constants'; 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 { CONCAT_GROUP_SUFFIX, DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model';
import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models';
@Injectable() @Injectable()
export class FormBuilderService extends DynamicFormService { export class FormBuilderService extends DynamicFormService {
@@ -121,6 +122,11 @@ export class FormBuilderService extends DynamicFormService {
const normalizeValue = (controlModel, controlValue, controlModelIndex) => { const normalizeValue = (controlModel, controlValue, controlModelIndex) => {
const controlLanguage = (controlModel as DsDynamicInputModel).hasLanguages ? (controlModel as DsDynamicInputModel).language : null; 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)) { if (isString(controlValue)) {
return new FormFieldMetadataValueObject(controlValue, controlLanguage, null, null, controlModelIndex); return new FormFieldMetadataValueObject(controlValue, controlLanguage, null, null, controlModelIndex);
} else if (isNgbDateStruct(controlValue)) { } else if (isNgbDateStruct(controlValue)) {

View File

@@ -23,6 +23,7 @@ import { DynamicRelationGroupModel } from '../../../shared/form/builder/ds-dynam
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model'; import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
import { deepClone } from 'fast-json-patch'; import { deepClone } from 'fast-json-patch';
import { dateToString, isNgbDateStruct } from '../../../shared/date.util'; 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 * The service handling all form section operations
@@ -357,6 +358,13 @@ export class SectionFormOperationsService {
event: DynamicFormControlEvent, event: DynamicFormControlEvent,
previousValue: FormFieldPreviousValueObject, previousValue: FormFieldPreviousValueObject,
hasStoredValue: boolean): void { 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 path = this.getFieldPathFromEvent(event);
const segmentedPath = this.getFieldPathSegmentedFromChangeEvent(event); const segmentedPath = this.getFieldPathSegmentedFromChangeEvent(event);
const value = this.getFieldValueFromChangeEvent(event); const value = this.getFieldValueFromChangeEvent(event);
@@ -483,23 +491,23 @@ export class SectionFormOperationsService {
event: DynamicFormControlEvent, event: DynamicFormControlEvent,
previousValue: FormFieldPreviousValueObject) { 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)) { * Specific patch handler for a DynamicRowArrayModel.
// It's a qualdrup model * Configure a Patch ADD with the current array value.
this.dispatchOperationsFromMap(this.getQualdropValueMap(customEvent), pathCombiner, customEvent, previousValue); * @param pathCombiner
return; * @param event
} * @param model
const path = this.getFieldPathFromEvent(customEvent); */
const segmentedPath = this.getFieldPathSegmentedFromChangeEvent(customEvent); private handleArrayGroupPatch(pathCombiner: JsonPatchOperationPathCombiner,
const moveTo = pathCombiner.getPath(path); event,
const moveFrom = pathCombiner.getPath(segmentedPath + '/' + customEvent.previousIndex); model: DynamicRowArrayModel) {
if (isNotEmpty(moveFrom.path) && isNotEmpty(moveTo.path) && moveFrom.path !== moveTo.path) { const arrayValue = this.formBuilder.getValueFromModel([model]);
this.operationsBuilder.move( const segmentedPath2 = this.getFieldPathSegmentedFromChangeEvent(event);
moveTo, this.operationsBuilder.add(
moveFrom.path pathCombiner.getPath(segmentedPath2),
); arrayValue[segmentedPath2], false);
}
} }
} }