|
@@ -25,7 +25,6 @@
|
|
|
import { FormBuilder, FormGroup, FormArray, FormControl, AbstractControlOptions } from '@angular/forms';
|
|
|
import { cloneDeep, omit, reduce } from 'lodash/fp';
|
|
|
import * as fmdModels from '../models/field.model';
|
|
|
-import { ComponentFactoryResolver } from '@angular/core/src/render3';
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -80,7 +79,8 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
|
|
|
if (isRepeating)
|
|
|
{
|
|
|
// We've got a Repeating Container
|
|
|
- metaFoG.meta = generateRepeatedGroup(metaFoG, val, createFromExtra);
|
|
|
+ const baseObjWithAllKeys = getRCBaseObjectWithAllKeys(metaFoG, val, createFromExtra);
|
|
|
+ metaFoG.meta = generateRepeatedGroup(metaFoG, val, baseObjWithAllKeys);
|
|
|
const extra = {
|
|
|
...omit(['meta', 'seed'], val),
|
|
|
meta: metaFoG.meta.map(
|
|
@@ -93,6 +93,7 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
|
|
|
)
|
|
|
};
|
|
|
combinedMeta[key] = combineMetaForField(metaFoG, {}, extra);
|
|
|
+ combinedMeta[key].__defaultContainer = cloneDeep(extra.meta[0]); // Stash for adding extra containers to the repeating container
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -121,17 +122,12 @@ const combineModelWithMeta = (model, extraMeta, createFromExtra = false) => comb
|
|
|
|
|
|
// <--- Utilities supporting Repreating Containers --->
|
|
|
|
|
|
-const generateRepeatedGroup = (metaFoG, extraMeta, createFromExtra = false): StringMap[] => {
|
|
|
+const generateRepeatedGroup = (metaFoG, extraMeta, baseObjWithAllKeys): StringMap[] => {
|
|
|
// Calculate the number of repeats
|
|
|
const repeatInAutoMeta = Array.isArray(metaFoG.meta) ? metaFoG.meta.length : 0;
|
|
|
const repeatInExtraMeta = extraMeta['initialRepeat'] || extraMeta['minRepeat'];
|
|
|
const repeat = Math.max(repeatInAutoMeta, repeatInExtraMeta);
|
|
|
|
|
|
- // If creating from extra, make sure all group members have all keys in both model and meta (as this is a repeating group)
|
|
|
- const keysFromModel = repeatInAutoMeta ? Object.keys(metaFoG.meta[0].meta) : [];
|
|
|
- const keysFromExtraMeta = extraMeta['meta'] && extraMeta['meta'][0] ? Object.keys(extraMeta['meta'][0]) : [];
|
|
|
- const keysToInclude = createFromExtra ? Array.from(new Set([...keysFromModel, ...keysFromExtraMeta])) : keysFromModel;
|
|
|
- const baseObjWithAllKeys = autoMeta(keysToInclude.reduce((acc, key) => addProp(acc, key, ''), {}));
|
|
|
metaFoG.meta = metaFoG.meta.map( rcMem => ({ ...rcMem, meta: { ...baseObjWithAllKeys, ...rcMem.meta } }) ); // Add extra keys to model meta
|
|
|
|
|
|
// Extend repeated group from model (if any) to correct length, and add any missing names
|
|
@@ -142,6 +138,17 @@ const generateRepeatedGroup = (metaFoG, extraMeta, createFromExtra = false): Str
|
|
|
return fullyNamedRepeatedGroup;
|
|
|
}
|
|
|
|
|
|
+// Get Repeating Container Base Object With All Keys
|
|
|
+const getRCBaseObjectWithAllKeys = (metaFoG, extraMeta, createFromExtra = false): StringMap => {
|
|
|
+ // If creating from extra, make sure all group members have all keys in both model and meta (as this is a repeating group)
|
|
|
+ const keysFromModel = isArray(metaFoG.meta) && metaFoG.meta.length ? Object.keys(metaFoG.meta[0].meta) : [];
|
|
|
+ const keysFromExtraMeta = extraMeta['meta'] && extraMeta['meta'][0] ? Object.keys(extraMeta['meta'][0]) : [];
|
|
|
+ const keysToInclude = createFromExtra ? Array.from(new Set([...keysFromModel, ...keysFromExtraMeta])) : keysFromModel;
|
|
|
+ const baseObjWithAllKeys = autoMeta(keysToInclude.reduce((acc, key) => addProp(acc, key, ''), {}));
|
|
|
+ return baseObjWithAllKeys;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
|
// Build Form-Field-Type-Specific Metadata (using the field models in dynaform/models)
|
|
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -183,6 +190,7 @@ const buildModeledFieldGroupMember = metaFoG => {
|
|
|
modeledGroupMember.meta = _buildFieldSpecificMeta(modeledGroupMember.meta);
|
|
|
} else if (isRepeatingContainer(metaFoG)) {
|
|
|
modeledGroupMember.meta = modeledGroupMember.meta.map(rcMem => ({ ...rcMem, meta: _buildFieldSpecificMeta(rcMem.meta) }));
|
|
|
+ modeledGroupMember.__defaultContainer = _buildFieldSpecificMeta(modeledGroupMember.__defaultContainer);
|
|
|
}
|
|
|
return modeledGroupMember;
|
|
|
};
|