|
@@ -21,7 +21,7 @@
|
|
|
*/
|
|
|
|
|
|
import { FormBuilder, FormGroup, FormArray, FormControl, AbstractControlOptions } from '@angular/forms';
|
|
|
-import { reduce, cloneDeep } from 'lodash/fp';
|
|
|
+import { cloneDeep, omit, reduce } from 'lodash/fp';
|
|
|
import * as fmdModels from '../models/field.model';
|
|
|
|
|
|
|
|
@@ -48,11 +48,10 @@ const arrayMemberAutoName = (val, i) => {
|
|
|
}
|
|
|
*/
|
|
|
const arrayToMeta = array => array.map((val, i) => {
|
|
|
- const name = (i + 1).toString();
|
|
|
if (isScalar(val)) {
|
|
|
- return { name, 'value' : val };
|
|
|
+ return { name: `item${i + 1}`, 'value' : val };
|
|
|
} else {
|
|
|
- return { name, meta: autoMeta(val) };
|
|
|
+ return { name: `group${i + 1}`, meta: autoMeta(val) };
|
|
|
}
|
|
|
});
|
|
|
|
|
@@ -68,7 +67,9 @@ const autoMeta = model => Object.entries(model)
|
|
|
|
|
|
// containerSeed = Metadata from container which seeds all contained fields
|
|
|
|
|
|
+
|
|
|
const combineMetaForField = (metaF, containerSeed, extraMetaF) => ({ ...metaF, ...containerSeed, ...extraMetaF });
|
|
|
+
|
|
|
const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSeed = {}) => {
|
|
|
const combinedMeta = {};
|
|
|
Object.entries(extraMeta).forEach(([key, val]) => {
|
|
@@ -79,7 +80,7 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
|
|
|
const seed = isCon ? {} : containerSeed; // Container's don't seed themselves, only their children
|
|
|
|
|
|
// Have we got a repeating container?
|
|
|
- if (isRepeating) {
|
|
|
+ if (isCon && isRepeating) {
|
|
|
const repeatInAutoMeta = Array.isArray(metaFoG.meta) ? metaFoG.meta.length : 0;
|
|
|
const repeatInExtraMeta = val['initialRepeat'] || val['minRepeat'];
|
|
|
const repeat = Math.max(repeatInAutoMeta, repeatInExtraMeta);
|
|
@@ -91,7 +92,10 @@ const combineExtraMeta = (metaG, extraMeta, createFromExtra = false, containerSe
|
|
|
:
|
|
|
Array(repeat).fill({});
|
|
|
console.log('repeatingGroup is', repeatingGroup);
|
|
|
- combinedMeta[key] = repeatingGroup.map(metaG => combineExtraMeta(metaG, val['meta'][0], createFromExtra, val['seed']));
|
|
|
+ metaFoG.meta = repeatingGroup.map(metaG => combineExtraMeta(metaG.meta, val['meta'][0], createFromExtra, val['seed']));
|
|
|
+ const extra = omit(['meta', 'seed'], val);
|
|
|
+ console.log(val, extra);
|
|
|
+ combinedMeta[key] = combineMetaForField(metaFoG, {}, extra);
|
|
|
console.log('combinedMeta is', combinedMeta[key]);
|
|
|
}
|
|
|
else
|
|
@@ -125,14 +129,14 @@ const combineModelWithMeta = (model, extraMeta, createFromExtra = false) => comb
|
|
|
|
|
|
const buildFieldClassName = (t = 'text') => {
|
|
|
const start = t[0].toUpperCase() + t.slice(1);
|
|
|
- if (start === 'Container' || start === 'Heading' || t.slice(-5) === 'Group') {
|
|
|
+ if (start === 'Container' || start === 'RepeatingContainer' || start === 'Heading' || t.slice(-5) === 'Group') {
|
|
|
return start;
|
|
|
}
|
|
|
return start + 'Field';
|
|
|
};
|
|
|
|
|
|
const buildModeledField = metaFoG => {
|
|
|
- const type = isContainer(metaFoG) ? 'container' : metaFoG.type;
|
|
|
+ const type = isContainer(metaFoG) ? (isRepeatingContainer(metaFoG) ? 'repeatingContainer' : 'container') : metaFoG.type;
|
|
|
const className = buildFieldClassName(type);
|
|
|
if (!fmdModels[className]) {
|
|
|
throw new Error(`No metadata model "${className}" for type "${type}"`);
|
|
@@ -372,7 +376,8 @@ const _execMetaReorderingInstructions = (metaG: StringMap) => {
|
|
|
};
|
|
|
|
|
|
const execMetaReorderingInstructions = (metaG: StringMap) => {
|
|
|
- return _execMetaReorderingInstructions(cloneDeep(metaG));
|
|
|
+ // Repeating Containers (which have array meta *at this point*) can't be reordered, but other types of containers can
|
|
|
+ return Array.isArray(metaG) ? cloneDeep(metaG) : _execMetaReorderingInstructions(cloneDeep(metaG));
|
|
|
};
|
|
|
|
|
|
|
|
@@ -449,9 +454,7 @@ const isContainer = (metaFoG): boolean => isGroup(metaFoG) && (!metaFoG.type ||
|
|
|
|
|
|
// Is Repeating Container
|
|
|
// Helper function to distinguish a repeating container group (a group of child fields that can be repeated 1...N times)
|
|
|
-const isRepeatingContainer = (metaFoG): boolean => isContainer(metaFoG)
|
|
|
- && Array.isArray(metaFoG.meta)
|
|
|
- && !!(metaFoG.minRepeat || metaFoG.maxRepeat || metaFoG.initialRepeat);
|
|
|
+const isRepeatingContainer = (metaFoG): boolean => Array.isArray(metaFoG.meta);
|
|
|
|
|
|
// Add Missing Names
|
|
|
// Helper function to add any missing 'name' properties to Fields and Groups using property's key, recursively
|