@ysmood/material-ui
Version:
Material Design UI components built with React
137 lines (117 loc) • 3.5 kB
JSX
var React = require('react');
var StylePropable = require('./mixins/style-propable');
var Transitions = require('./styles/transitions');
var EnhancedSwitch = require('./enhanced-switch');
var RadioButtonOff = require('./svg-icons/toggle-radio-button-off');
var RadioButtonOn = require('./svg-icons/toggle-radio-button-on');
var RadioButton = React.createClass({
mixins: [StylePropable],
contextTypes: {
muiTheme: React.PropTypes.object
},
propTypes: {
iconStyle: React.PropTypes.object,
onCheck: React.PropTypes.func
},
getTheme: function() {
return this.context.muiTheme.component.radioButton;
},
getStyles: function() {
var styles = {
icon: {
height: this.getTheme().size,
width: this.getTheme().size
},
target: {
transition: Transitions.easeOut(),
position: 'absolute',
opacity: 1,
transform: 'scale(1)',
fill: this.getTheme().borderColor
},
fill: {
position: 'absolute',
opacity: 1,
transform: 'scale(0)',
transformOrigin: '50% 50%',
transition: Transitions.easeOut(),
fill: this.getTheme().checkedColor
},
targetWhenChecked: {
opacity: 0,
transform: 'scale(0)'
},
fillWhenChecked: {
opacity: 1,
transform: 'scale(1)'
},
targetWhenDisabled: {
fill: this.getTheme().disabledColor
},
fillWhenDisabled: {
fill: this.getTheme().disabledColor
},
};
return styles;
},
render: function() {
var {
onCheck,
...other
} = this.props;
var styles = this.getStyles();
var onStyles =
this.mergeAndPrefix(
styles.target,
this.props.checked && styles.targetWhenChecked,
this.props.iconStyle,
this.props.disabled && styles.targetWhenDisabled);
var offStyles =
this.mergeAndPrefix(
styles.fill,
this.props.checked && styles.fillWhenChecked,
this.props.iconStyle,
this.props.disabled && styles.fillWhenDisabled);
var radioButtonElement = (
<div>
<RadioButtonOff style={onStyles} />
<RadioButtonOn style={offStyles} />
</div>
);
var rippleColor = this.props.checked ? this.getTheme().checkedColor : this.getTheme().borderColor;
var enhancedSwitchProps = {
ref: "enhancedSwitch",
inputType: "radio",
switched: this.props.checked,
switchElement: radioButtonElement,
rippleColor: rippleColor,
iconStyle: styles.icon,
onSwitch: this._handleCheck,
onParentShouldUpdate: this._handleStateChange,
labelPosition: (this.props.labelPosition) ? this.props.labelPosition : "right"
};
return (
<EnhancedSwitch
{...other}
{...enhancedSwitchProps}/>
);
},
// Only called when selected, not when unselected.
_handleCheck: function(e) {
if (this.props.onCheck) this.props.onCheck(e, this.props.value);
},
_handleStateChange: function() {
},
isChecked: function() {
return this.refs.enhancedSwitch.isSwitched();
},
// Use RadioButtonGroup.setSelectedValue(newSelectionValue) to set a
// RadioButton's checked value.
setChecked: function(newCheckedValue) {
this.refs.enhancedSwitch.setSwitched(newCheckedValue);
},
getValue: function() {
return this.refs.enhancedSwitch.getValue();
}
});
module.exports = RadioButton;