elemental
Version:
React UI Framework
129 lines (120 loc) • 3.7 kB
JavaScript
'use strict';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var React = require('react');
var blacklist = require('blacklist');
var classNames = require('classnames');
module.exports = React.createClass({
displayName: 'RadioGroup',
propTypes: {
alwaysValidate: React.PropTypes.bool,
className: React.PropTypes.string,
inline: React.PropTypes.bool,
label: React.PropTypes.string,
onChange: React.PropTypes.func.isRequired,
options: React.PropTypes.array.isRequired,
required: React.PropTypes.bool,
requiredMessage: React.PropTypes.string,
value: React.PropTypes.string
},
getDefaultProps: function getDefaultProps() {
return {
requiredMessage: 'This field is required'
};
},
getInitialState: function getInitialState() {
return {
isValid: true,
validationIsActive: this.props.alwaysValidate
};
},
componentDidMount: function componentDidMount() {
if (this.state.validationIsActive) {
this.validateInput(this.props.value);
}
},
componentWillReceiveProps: function componentWillReceiveProps(newProps) {
if (this.state.validationIsActive) {
if (newProps.value !== this.props.value && newProps.value !== this._lastChangeValue && !newProps.alwaysValidate) {
// reset validation state if the value was changed outside the component
return this.setState({
isValid: true,
validationIsActive: false
});
}
this.validateInput(newProps.value);
}
},
handleChange: function handleChange(e) {
this._lastChangeValue = e.target.value;
if (this.props.onChange) this.props.onChange(e.target.value);
},
handleBlur: function handleBlur() {
if (!this.props.alwaysValidate) {
this.setState({ validationIsActive: false });
}
this.validateInput(this.props.value);
},
validateInput: function validateInput(value) {
var newState = {
isValid: true
};
if (this.props.required && (!value || value && !value.length)) {
newState.isValid = false;
}
if (!newState.isValid) {
newState.validationIsActive = true;
}
this.setState(newState);
},
render: function render() {
var self = this;
// props
var props = blacklist(this.props, 'alwaysValidate', 'label', 'onChange', 'options', 'required', 'requiredMessage', 'value', 'inline');
// classes
var componentClass = classNames('FormField', {
'is-invalid': !this.state.isValid
}, this.props.className);
// validation message
var validationMessage;
if (!this.state.isValid) {
validationMessage = React.createElement(
'div',
{ className: 'form-validation is-invalid' },
this.props.requiredMessage
);
}
// dynamic elements
var componentLabel = this.props.label ? React.createElement(
'label',
{ className: 'FormLabel' },
this.props.label
) : null;
// options
var radios = this.props.options.map(function (radio, i) {
return React.createElement(
'label',
{ key: 'radio-' + i, className: 'Radio' },
React.createElement('input', { value: radio.value, type: 'radio', onChange: self.handleChange, onBlur: self.handleBlur, name: self.props.name, className: 'Radio__input' }),
React.createElement(
'span',
{ className: 'Radio__label' },
radio.label
)
);
});
if (this.props.inline) {
radios = React.createElement(
'div',
{ className: 'inline-controls' },
radios
);
}
return React.createElement(
'div',
_extends({ className: componentClass }, props),
componentLabel,
radios,
validationMessage
);
}
});