Pārlūkot izejas kodu

CheckbuttonGroup constructor now copes with groups being FormGroups or FormArrays

Richard Knight 6 gadi atpakaļ
vecāks
revīzija
1f65ded683

+ 4 - 4
src/app/_mock/testfields.v2.ts

@@ -105,13 +105,13 @@ const dropdownModifiedInput = {
 const checkbuttonGroup = {
 	type: 'CheckbuttonGroup',
 	firstEnablesRest: true,
-	meta: [{name: 'iMaskTheOthers'}, {name: 'groupMemberTwo'}, {name: 'groupMemberThree'}]
+	meta: { iMaskTheOthers: {}, groupMemberTwo: {}, groupMemberThree: {} }
 };
 
-const checkbuttonGroup2 = {
+const checkbuttonGroupArray = {
 	type: 'CheckbuttonGroup',
 	firstEnablesRest: true,
-	meta: [{name: 'One'}, {name: 'Two'}, {name: 'Three'}]
+	meta: [{name: 'One', value: 111}, {name: 'Two', value: 222}, {name: 'Three', value: 333}]
 };
 
 // ---------------------------------------------------------------------------------------------------------------------
@@ -132,7 +132,7 @@ const container = {
 	type: 'Container',
 	meta: {
 		basicTextField,
-		checkbuttonGroup2,
+		checkbuttonGroupArray,
 	}
 };
 

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

@@ -166,7 +166,7 @@ class CheckbuttonGroup {
 	label?: string;
 	groupName: string;
 	firstEnablesRest?;
-	meta: CheckbuttonField[];
+	meta: CheckbuttonField[] | { [key: string]: CheckbuttonField };
 	constructor(groupmeta: any) {
 		Object.assign(this, groupmeta);
 		if (!this.label) {
@@ -174,8 +174,16 @@ class CheckbuttonGroup {
 			// e.g. supervisorCardNumber --> Supervisor Card Number
 			this.label = unCamelCase(this.name);
 		}
-		const groupMembers = Array.isArray(groupmeta.meta) ? groupmeta.meta : Object.values(groupmeta.meta);
-		this.meta = groupMembers.map(cb => new CheckbuttonField(cb));
+		// Can render as a FormArray or FormGroup depending on input data
+		if (Array.isArray(groupmeta.meta)) {
+			const arrayMembers = groupmeta.meta;
+			this.meta = arrayMembers.map(cb => new CheckbuttonField(cb));
+		} else {
+			const groupMembers = groupmeta.meta;
+			this.meta = Object.entries(groupMembers)
+				.map( ([key, cb]) => [key, new CheckbuttonField(cb as SimpleFieldMetaData)] )
+				.reduce((res, [key, cbf]) => { res[<string>key] = cbf; return res; }, {});
+		}
 	}
 }
 

+ 2 - 2
src/app/dynaform/services/_formdata-utils.ts

@@ -31,7 +31,7 @@ interface AbstractControlOptions {
 
 
 // ---------------------------------------------------------------------------------------------------------------------
-// AutoMeta: Raw Model (or Mapped Raw Model) to Automatic Metadata
+// AutoMeta: Generate Autimatic Metadata from a raw model (or mapped raw model)
 // ---------------------------------------------------------------------------------------------------------------------
 
 const isScalar = val => typeof val === 'boolean' || typeof val === 'number' || typeof val === 'string';
@@ -43,7 +43,7 @@ const keyValPairToMetaRecursive = ( [key, val] ) => {
 	const metaVal = keyValPairToMeta(innerVal, key);
 	return [key, metaVal];
 };
-const arrayToMeta = arrVals => arrVals.map(val => ({ name: val, 'value' : val }));
+const arrayToMeta = array => array.map(val => ({ name: val, 'value' : val }));
 
 const autoMeta = model => Object.entries(model)
 	.map(keyValPairToMetaRecursive)