Bladeren bron

Working on combining model with extra meta for Repeating Containers

Richard Knight 6 jaren geleden
bovenliggende
commit
f8a1e99b07

+ 2 - 6
src/app/_mock/testfields.v12.ts

@@ -18,9 +18,8 @@ const model = {
 	standard: 9
 };
 
-/*
 const meta = {
-	container: {
+	repeating: {
 		label: 'Repating Group',
 		seed: { class: 'short-field' },
 		minRepeat: 1,
@@ -31,15 +30,12 @@ const meta = {
 		meta: [
 			{
 				a: {},
-				b: {},
+				b: { type: 'textarea', label: 'Bee' },
 				c: {},
 				d: {},
 			}
 		]
 	}
 };
-*/
-
-const meta = {};
 
 export { model, meta };

+ 3 - 2
src/app/app.component.ts

@@ -50,6 +50,7 @@ export class AppComponent implements OnInit, OnChanges {
 		console.log('Model', model);
 		console.log('Meta', meta);
 
+		/*
 		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 
 		// Test autoMeta
@@ -60,13 +61,13 @@ export class AppComponent implements OnInit, OnChanges {
 		const m2 = this.dynaform.combineModelWithMeta(model, meta);
 		console.log(m2);
 
-		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 
-		/*
 		// Test building Field-Specific-Meta
 		const fsm = this.dynaform.buildFieldSpecificMeta(m2);
 		console.log(fsm);
 
+		console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+
 		// Test building the FormGroup
 		const fg = this.dynaform.buildFormGroup(fsm);
 		console.log(fg);

+ 11 - 4
src/app/dynaform/models/field.model.ts

@@ -268,11 +268,17 @@ class Container {
 
 class RepeatingContainer extends Container {
 	minRepeat: number = 1;
-	maxRepeat: number = 5;
-	initialRepeat?: number;
+	maxRepeat: number = 10;
+	initialRepeat: number;
 	showAddControl:  boolean = true;
 	showDeleteControl: boolean = true;
-	meta: StringMap[];
+	meta: StringMap;
+	constructor(containerMeta: StringMap) {
+		super(containerMeta);
+		if (!containerMeta.initialRepeat) {
+			this.initialRepeat = containerMeta.meta.length;
+		}
+	}
 }
 
 // ---------------------------------------------------------------------------------------------------------------------
@@ -343,5 +349,6 @@ export {
 	CheckbuttonField, DropdownModifiedInputField, MultilineField,
 	CheckbuttonGroup,
 	TimepickerField, DatepickerField,
-	Container, ButtonGroup, Heading, DisplayField
+	Container, RepeatingContainer,
+	ButtonGroup, Heading, DisplayField
 };

+ 15 - 12
src/app/dynaform/services/_formdata-utils.ts

@@ -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