Skip to content

Commit

Permalink
Merge pull request #54 from redux-autoform/v1-development
Browse files Browse the repository at this point in the history
V1 development
  • Loading branch information
Jonatan E. Salas committed Jul 26, 2016
2 parents a6f9553 + 784e8ec commit dfacb0a
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 49 deletions.
4 changes: 1 addition & 3 deletions package.json
Expand Up @@ -29,7 +29,6 @@
"homepage": "https://github.com/redux-autoform/redux-autoform#readme",
"dependencies": {
"bootstrap": "^3.3.5",
"clone": "^1.0.2",
"font-awesome": "^4.6.3",
"react": "^15.1.0",
"react-addons-update": "^15.2.1",
Expand All @@ -39,8 +38,7 @@
"redux": "^3.4.0",
"redux-autoform-bootstrap-ui": "^1.0.1",
"redux-autoform-utils": "^1.0.3",
"redux-form": "^5.2.5",
"underscore": "^1.8.3"
"redux-form": "^5.2.5"
},
"devDependencies": {
"babel-cli": "^6.6.5",
Expand Down
68 changes: 40 additions & 28 deletions src/metadata/MetadataProvider.js
@@ -1,6 +1,3 @@
import _ from 'underscore';
import clone from 'clone';

export default class MetadataProvider {

/**
Expand Down Expand Up @@ -38,23 +35,37 @@ export default class MetadataProvider {
});
}

schema = clone(schema);
schema.entities = MetadataProvider.canonizeArray(schema.entities);
_.each(schema.entities, entity => {
entity.fields = MetadataProvider.canonizeArray(entity.fields);
entity.layouts = MetadataProvider.canonizeArray(entity.layouts);
_.each(entity.layouts, layout => {
layout.fields = MetadataProvider.canonizeArray(layout.fields);
layout.groups = MetadataProvider.canonizeArray(layout.groups);
_.each(layout.groups, group => {
group.fields = MetadataProvider.canonizeArray(group.fields);
})
});
});
schema = {...schema};
this._canonizeArrays(schema, ["entities", "layouts", "groups"])

//schema.entities = MetadataProvider.canonizeArray(schema.entities);
//_.each(schema.entities, entity => {
// entity.fields = MetadataProvider.canonizeArray(entity.fields);
// entity.layouts = MetadataProvider.canonizeArray(entity.layouts);
// _.each(entity.layouts, layout => {
// layout.fields = MetadataProvider.canonizeArray(layout.fields);
// layout.groups = MetadataProvider.canonizeArray(layout.groups);
// _.each(layout.groups, group => {
// group.fields = MetadataProvider.canonizeArray(group.fields);
// })
// });
//});


return schema;
}

static _canonizeArrays(dataArray, keys, id = 0) {
dataArray[keys[id]] = MetadataProvider.canonizeArray(dataArray[keys[id]]);
if(dataArray[keys[id]]) {
dataArray[keys[id]].forEach(elem => {
elem.fields = MetadataProvider.canonizeArray(elem.fields);
if(id + 1 < keys.length)
this._canonizeArrays(elem, keys, id + 1);
})
}

}
/**
* Ensures the object passed in is an array. If it is, it is returned, otherwise, this function
* converts the target object into an array.
Expand All @@ -67,14 +78,15 @@ export default class MetadataProvider {
static canonizeArray(obj) {
if (!obj) return obj; // this is so the canonizeSchema method doesn't have to check every property for undefined

if (_.isArray(obj))
if (Array.isArray(obj))
return obj;

// let's create an array
return _.map(_.keys(obj), (property) => {
if (!_.isObject(obj[property]))
return Object.keys(obj).map((property) => {
let isObject = obj[property] && typeof obj[property] === "object";
if (!isObject)
throw Error('cannot generate canonical array. Every field should be an object');
return _.extend({name: property}, obj[property]);
return {name: property, ...obj[property]};
});
}

Expand All @@ -101,7 +113,7 @@ export default class MetadataProvider {

let entity;
if(entityName)
entity = _.find(schema.entities, e => e.name === entityName);
entity = schema.entities.find(e => e.name === entityName);
else {
if(schema.entities.length != 1)
throw Error('When an entityName is not specified, there must be one and only one entity');
Expand All @@ -123,7 +135,7 @@ export default class MetadataProvider {
let layout;

if(layoutName)
layout = _.find(entity.layouts, l => l.name === layoutName);
layout = entity.layouts? entity.layouts.find(l => l.name === layoutName) : layout;
else {
if(entity.layouts.length != 1)
throw Error('When the layoutName is not specified, there must be one and only one layout');
Expand Down Expand Up @@ -170,8 +182,8 @@ export default class MetadataProvider {
let thisGroupFields = [];

if (layout.groups) {
_.each(layout.groups, g => {
thisGroupFields = _.union(thisGroupFields, this.getFieldsInternal(schema, entity, g, partialResult, callback))
layout.groups.forEach(g => {
thisGroupFields = [... new Set(thisGroupFields.concat(this.getFieldsInternal(schema, entity, g, partialResult, callback)))];
});
}

Expand All @@ -180,9 +192,9 @@ export default class MetadataProvider {
for (let i = 0; i < layout.fields.length; i++) {

let groupField = layout.fields[i];
let existingEntityProperty = _.find(entity.fields, field => field.name == groupField.name);
let existingEntityProperty = entity.fields.find(field => field.name == groupField.name);

let field = _.extend({}, existingEntityProperty || {}, groupField);
let field = {...existingEntityProperty || {}, ...groupField};
this.validateFieldMetadata(field);

thisGroupFields.push(field);
Expand Down Expand Up @@ -222,7 +234,7 @@ export default class MetadataProvider {
}
}

return _.union(partialResult, thisGroupFields);
return [...new Set(partialResult.concat(thisGroupFields))];
}

/**
Expand Down Expand Up @@ -306,7 +318,7 @@ export default class MetadataProvider {
if (!fieldMetadata) throw Error('fieldMetadata should be truthy');
let result = [];

_.each(fieldMetadata, f => {
fieldMetadata.forEach(f => {
if (f.fields) {
// if a field has fields, it's either an array or a complex object
let fieldPrefix = f.type == 'array' ? `${f.name}[]` : f.name;
Expand Down
6 changes: 2 additions & 4 deletions src/metadata/evaluator/filter/arrayMetadataFilter.js
@@ -1,5 +1,3 @@
import _ from 'underscore';

export default {
filter: function(propertyMetadata, model, keyPrefix, metadataEvaluator, reduxProps, onChange) {

Expand All @@ -11,7 +9,7 @@ export default {
throw Error('when metadata is of type \'array\' and arrayType is \'entity\', it must have a fields property');
}

if (!_.has(model, propertyMetadata.name) || model[propertyMetadata.name] === null || model[propertyMetadata.name] === undefined) {
if (!model.hasOwnProperty(propertyMetadata.name) || model[propertyMetadata.name] === null || model[propertyMetadata.name] === undefined) {
// if the property does not exist, create it
model[propertyMetadata.name] = [];
} else {
Expand All @@ -24,7 +22,7 @@ export default {
// returns the reduxProps for a particular array item
let getReduxPropsForItem = (index) => {
if(!reduxProps) return undefined;
if(!_.has(reduxProps, propertyMetadata.name)) throw Error('reduxProps is defined but it does not have the required property metadata');
if(reduxProps && !reduxProps.hasOwnProperty(propertyMetadata.name)) throw Error('reduxProps is defined but it does not have the required property metadata');
return reduxProps[propertyMetadata.name][index];
};

Expand Down
4 changes: 1 addition & 3 deletions src/metadata/evaluator/filter/defaultMetadataFilter.js
@@ -1,5 +1,3 @@
import _ from 'underscore';

export default {
filter: function(propertyMetadata, model, keyPrefix, metadataEvaluator, reduxProps, onChange) {

Expand All @@ -9,7 +7,7 @@ export default {
propertyMetadata.key = keyPrefix;

// set redux properties
if(_.has(reduxProps, propertyMetadata.name)) {
if(reduxProps && reduxProps.hasOwnProperty(propertyMetadata.name)) {
propertyMetadata.reduxFormProps = reduxProps[propertyMetadata.name];
}

Expand Down
4 changes: 1 addition & 3 deletions src/metadata/evaluator/filter/entityMetadataFilter.js
@@ -1,5 +1,3 @@
import _ from 'underscore';

export default {
filter: function(propertyMetadata, model, keyPrefix, metadataEvaluator, reduxProps, onChange) {
if(!propertyMetadata) {
Expand All @@ -13,7 +11,7 @@ export default {
throw Error('when metadata is of type entity, it must have a fields property');
}

if(!_.has(model, propertyMetadata.name) || model[propertyMetadata.name] === null || model[propertyMetadata.name] === undefined) {
if(model && !model.hasOwnProperty(propertyMetadata.name) || model[propertyMetadata.name] === null || model[propertyMetadata.name] === undefined) {
// if the property does not exist, create it
model[propertyMetadata.name] = {};
} else {
Expand Down
3 changes: 1 addition & 2 deletions src/metadata/evaluator/metadataEvaluator.js
Expand Up @@ -5,7 +5,6 @@ import arrayMetadataFilter from './filter/arrayMetadataFilter.js';

// property filters
import defaultPropertyMetadataFilter from './property-filter/defaultMetadataPropertyFilter.js';
import _ from 'underscore';

class MetadataEvaluator {

Expand Down Expand Up @@ -33,7 +32,7 @@ class MetadataEvaluator {
if (propertyMetadata.constructor === Array) return propertyMetadata.map(i => this.evaluate(i, model, keyPrefix, reduxFieldProps, onChange));

let result = {};
_.each(_.keys(propertyMetadata), (fieldName) => {
Object.keys(propertyMetadata).forEach((fieldName) => {
result[fieldName] = this.filterPropertyField(fieldName, propertyMetadata[fieldName], model);
});
let newPrefix = keyPrefix ? `${keyPrefix}.${propertyMetadata.name}` : propertyMetadata.name;
Expand Down
6 changes: 2 additions & 4 deletions src/metadata/model/modelParser.js
@@ -1,5 +1,3 @@
import _ from 'underscore';

import dateTimeParser from './parsers/dateTimeParser';
import numberParser from './parsers/numberParser';
import entityParser from './parsers/entityParser';
Expand All @@ -23,7 +21,7 @@ class ModelProcessor {

let result = {};

_.each(propertyMetadata, (eachPropertyMetadata) => {
propertyMetadata.forEach((eachPropertyMetadata) => {
result[eachPropertyMetadata.name] = this.processProperty(eachPropertyMetadata, model);
});

Expand All @@ -38,7 +36,7 @@ class ModelProcessor {
if (!types) throw Error('\'type\' should be truthy');
if (!(types instanceof Array)) throw Error('type should be an array');

_.each(types, type => {
types.forEach(type => {
this.parsers[type] = parser;
});
}
Expand Down
3 changes: 1 addition & 2 deletions src/metadata/validator/metadataValidator.js
@@ -1,4 +1,3 @@
import _ from 'underscore';
import defaultValidator from './validators/defaultMetadataValidator';
import arrayValidator from './validators/arrayValidator';
import entityValidator from './validators/entityValidator';
Expand All @@ -21,7 +20,7 @@ var validator = {
if (propertyMetadata.constructor !== Array) throw Error('ApropertyMetadata should be an array');

let validationResult = {};
_.each(propertyMetadata, m => {
propertyMetadata.forEach(m => {
let propertyValidation;
for(let i = 0; i < this.validators.length; i++) {
let validate = this.validators[i];
Expand Down

0 comments on commit dfacb0a

Please sign in to comment.