UNPKG

elemental

Version:
129 lines (120 loc) 3.7 kB
'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 ); } });