-
Notifications
You must be signed in to change notification settings - Fork 23
/
AutoFormInternal.js
107 lines (88 loc) · 3.04 KB
/
AutoFormInternal.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import React from 'react'
import { object, string, func, bool } from 'prop-types';
import { reduxForm } from 'redux-form';
import MetadataEvaluator from './metadata/evaluator/MetadataEvaluator';
import ModelParser from './metadata/model/ModelParser';
@reduxForm()
export default class AutoFormInternal extends React.Component {
static propTypes = {
uiType: string,
fields: object.isRequired,
handleSubmit: func.isRequired,
resetForm: func.isRequired,
submitting: bool.isRequired,
pristine: bool.isRequired,
componentFactory: object,
entity: object.isRequired,
layout: object,
buttonBar: func.isRequired,
fieldLayout: string
};
getFactory = () => this.props.componentFactory;
buildGroupComponent = () => {
//Fields: this is not the fields passed from AutoForm. This is generated by ReduxForm.
//This object has a property for each field. Each property contains all redux props for the given field
let { fields, fieldMetadata, layout, values } = this.props;
let modelProcessed = ModelParser.process(values, fieldMetadata);
let fieldMetadataEvaluated = MetadataEvaluator.evaluate(fieldMetadata, modelProcessed, '', fields);
let componentFactory = this.getFactory();
return componentFactory.buildGroupComponent({
component: layout.component,
layout: layout,
fields: fieldMetadataEvaluated,
componentFactory: componentFactory
});
};
getSubErrors = (fields) => {
let arr = fields.map(field => {
let result = null;
for (let key in field) {
if (field.hasOwnProperty(key)) {
if (field[key].error) {
result = {...result, ...{[field[key].name]: field[key].error}};
}
}
}
return result;
});
return arr.filter(field => {
return (field !== null)? true : false;
});
};
getErrors = (fields) => {
let arr = [];
for (let key in fields) {
if (fields.hasOwnProperty(key)) {
if (Array.isArray(fields[key])) {
let subArr = this.getSubErrors(fields[key]);
//Merge both arrays into one to get the values up to date
arr = [...arr, ...subArr];
}
else if (fields[key].error) {
arr.push({[fields[key].name]: fields[key].error});
}
}
}
return arr;
};
getButtonBar = () => {
//Because redux-form always force a re-render with different kinds of events,
//we got the errors up to date in fields object
const { buttonBar, submitting, pristine, fields } = this.props;
const errors = this.getErrors(fields);
const buttonBarProps = { submitting, pristine, errors };
return React.createElement(buttonBar, buttonBarProps);
};
render() {
let groupComponent = this.buildGroupComponent();
let componentFactory = this.getFactory();
let buttonBar = this.getButtonBar();
let Root = componentFactory.getRoot();
return (
<Root {...this.props}>
{ groupComponent }
{ buttonBar }
</Root>
)
}
}