Add FormField component with required field support
This commit is contained in:
parent
b4fb4b3a5c
commit
e4f439c12c
1 changed files with 71 additions and 0 deletions
|
@ -169,6 +169,77 @@ var WatchLink = React.createClass({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var requiredFieldWarningStyle = {
|
||||||
|
color: '#cc0000',
|
||||||
|
transition: 'opacity 400ms ease-in',
|
||||||
|
};
|
||||||
|
var FormField = React.createClass({
|
||||||
|
_type: null,
|
||||||
|
_element: null,
|
||||||
|
|
||||||
|
propTypes: {
|
||||||
|
type: React.PropTypes.string.isRequired,
|
||||||
|
hidden: React.PropTypes.bool,
|
||||||
|
},
|
||||||
|
getInitialState: function() {
|
||||||
|
return {
|
||||||
|
warningState: 'hidden',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
componentWillMount: function() {
|
||||||
|
if (['text', 'radio', 'file'].indexOf(this.props.type) != -1) {
|
||||||
|
this._element = 'input';
|
||||||
|
this._type = this.props.type;
|
||||||
|
} else {
|
||||||
|
// Non <input> field, e.g. <select>, <textarea>
|
||||||
|
this._element = this.props.type;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
warnRequired: function() {
|
||||||
|
this.setState({
|
||||||
|
warningState: 'shown',
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState({
|
||||||
|
warningState: 'fading',
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState({
|
||||||
|
warningState: 'hidden',
|
||||||
|
});
|
||||||
|
}, 450);
|
||||||
|
}, 5000);
|
||||||
|
},
|
||||||
|
focus: function() {
|
||||||
|
this.refs.field.focus();
|
||||||
|
},
|
||||||
|
getValue: function() {
|
||||||
|
return this.refs.field.value;
|
||||||
|
},
|
||||||
|
render: function() {
|
||||||
|
var warningStyle = Object.assign({}, requiredFieldWarningStyle);
|
||||||
|
if (this.state.warningState == 'fading') {
|
||||||
|
warningStyle.opacity = '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pass all unhandled props to the field element
|
||||||
|
var otherProps = Object.assign({}, this.props);
|
||||||
|
delete otherProps.type;
|
||||||
|
delete otherProps.hidden;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span className={this.props.hidden ? 'hidden' : ''}>
|
||||||
|
<this._element type={this._type} name={this.props.name} ref="field" placeholder={this.props.placeholder}
|
||||||
|
{...otherProps}>
|
||||||
|
{this.props.children}
|
||||||
|
</this._element>
|
||||||
|
<span className={this.state.warningState == 'hidden' ? 'hidden' : ''} style={warningStyle}> This field is required</span>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Generic menu styles
|
// Generic menu styles
|
||||||
var menuStyle = {
|
var menuStyle = {
|
||||||
border: '1px solid #aaa',
|
border: '1px solid #aaa',
|
||||||
|
|
Loading…
Add table
Reference in a new issue