|
@@ -42,14 +42,49 @@ const addMissingNames = metaG => Object.entries(metaG)
|
|
|
.map(addNameToSelfAndChildren)
|
|
|
.reduce((res, [key, val]) => addProp(res, key, val), {});
|
|
|
|
|
|
+// ---------------------------------------------------------------------------------------------------------------------
|
|
|
+// Raw Model (or Mapped Raw Model) to Automatic Metadata
|
|
|
+
|
|
|
+const isScalar = val => typeof val === 'boolean' || typeof val === 'number' || typeof val === 'string';
|
|
|
+
|
|
|
+const keyValPairToMeta = (val, key) => ({ name: key, [isScalar(val) ? 'value' : 'meta']: val });
|
|
|
+const keyValPairToMetaRecursive = ( [key, val] ) => {
|
|
|
+ const innerVal = isScalar(val) ? val : rawModelAutoMeta(val);
|
|
|
+ const metaVal = keyValPairToMeta(innerVal, key);
|
|
|
+ return [key, metaVal];
|
|
|
+};
|
|
|
+const rawModelAutoMeta = model => Object.entries(model)
|
|
|
+ .map(keyValPairToMetaRecursive)
|
|
|
+ .reduce((res, [key, val]) => addProp(res, key, val), {});
|
|
|
+
|
|
|
+
|
|
|
+// If value is complex, should we make name & meta, not name & value,
|
|
|
+// as form fields can't generally express complex values
|
|
|
+
|
|
|
+// ---------------------------------------------------------------------------------------------------------------------
|
|
|
+// Combine automatically generated metadata with overrides
|
|
|
+
|
|
|
+const combineMetaForField = (metaF, metaFextra) => Object.assign(metaF, metaFextra);
|
|
|
+const combineExtraMeta = (metaG, metaExtra) => {
|
|
|
+ let combinedMeta = {};
|
|
|
+ Object.entries(metaExtra).forEach(([key, val]) => {
|
|
|
+ if (typeof metaG[key] === 'object') {
|
|
|
+ combinedMeta[key] = val.meta ?
|
|
|
+ combineExtraMeta(metaG[key].meta, val.meta) :
|
|
|
+ combineMetaForField(metaG[key], val);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return {...metaG, ...combinedMeta};
|
|
|
+};
|
|
|
+
|
|
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
|
// Form Metadata Factory
|
|
|
|
|
|
const buildModeledField = metaF => {
|
|
|
// TODO: Add validity check
|
|
|
- const modeledMetaF= new fmdModels[metaF.type](metaF);
|
|
|
+ const modeledMetaF = new fmdModels[metaF.type](metaF);
|
|
|
return modeledMetaF;
|
|
|
-}
|
|
|
+};
|
|
|
|
|
|
// Build Form Group Member
|
|
|
const buildModeledGroupMember = metaFoG => isGroup(metaFoG) ? _buildModeledGroup(metaFoG.meta) : buildModeledField(metaFoG);
|