Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit 19798d7

Browse files
committed
Merge pull request #140 from asvetliakov/master
Allow to pass custom component into <Form>
2 parents 4a20aea + c3da624 commit 19798d7

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

src/components/form-component.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,20 @@ class Form extends Component {
109109
}
110110

111111
render() {
112-
return (
113-
<form
114-
{...this.props}
115-
onSubmit={this.handleSubmit}
116-
>
117-
{ this.props.children }
118-
</form>
119-
);
112+
const { component, children, ...other } = this.props;
113+
return React.createElement(component,
114+
{
115+
...other,
116+
onSubmit: this.handleSubmit,
117+
}, children);
120118
}
121119
}
122120

123121
Form.propTypes = {
122+
component: PropTypes.oneOfType([
123+
PropTypes.func,
124+
PropTypes.string,
125+
]),
124126
validators: PropTypes.object,
125127
errors: PropTypes.object,
126128
validateOn: PropTypes.oneOf([
@@ -137,6 +139,7 @@ Form.propTypes = {
137139

138140
Form.defaultProps = {
139141
validateOn: 'change',
142+
component: 'form',
140143
};
141144

142145
function selector(state, { model }) {

test/form-component-spec.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,56 @@ import thunk from 'redux-thunk';
99
import { Form, modelReducer, formReducer, Field } from '../src';
1010

1111
describe('<Form> component', () => {
12+
describe('wraps component if specified', () => {
13+
const store = applyMiddleware(thunk)(createStore)(combineReducers({
14+
testForm: formReducer('test', {}),
15+
test: modelReducer('test'),
16+
}));
17+
18+
it('should wrap children with specified component (string)', () => {
19+
const form = TestUtils.renderIntoDocument(
20+
<Provider store={store}>
21+
<Form model="test" component="section" />
22+
</Provider>
23+
);
24+
25+
const wrapper = TestUtils.findRenderedDOMComponentWithTag(form, 'section');
26+
27+
assert.ok(wrapper);
28+
});
29+
30+
it('should wrap children with specified component (class)', () => {
31+
class Wrapper extends React.Component {
32+
render() {
33+
const { children, ...other } = this.props;
34+
return <form className="wrapper" {...other}>{children}</form>;
35+
}
36+
}
37+
Wrapper.propTypes = {
38+
children: React.PropTypes.object,
39+
};
40+
const form = TestUtils.renderIntoDocument(
41+
<Provider store={store}>
42+
<Form model="test" component={Wrapper} />
43+
</Provider>
44+
);
45+
46+
const wrapper = TestUtils.findRenderedDOMComponentWithClass(form, 'wrapper');
47+
48+
assert.ok(wrapper);
49+
});
50+
it('Renders as <form> by default', () => {
51+
const field = TestUtils.renderIntoDocument(
52+
<Provider store={store}>
53+
<Form model="test" />
54+
</Provider>
55+
);
56+
57+
const wrapper = TestUtils.findRenderedDOMComponentWithTag(field, 'form');
58+
59+
assert.ok(wrapper);
60+
});
61+
});
1262
describe('validation on submit', () => {
1363
const store = applyMiddleware(thunk)(createStore)(combineReducers({
1464
testForm: formReducer('test', {}),

0 commit comments

Comments
 (0)