d2-ui
Version:
249 lines (216 loc) • 6.72 kB
JSX
import React from 'react';
import StylePropable from '../mixins/style-propable';
import FontIcon from '../font-icon';
import Toggle from '../toggle';
import getMuiTheme from '../styles/getMuiTheme';
import warning from 'warning';
/*eslint-disable */
const Types = {
LINK: 'LINK',
SUBHEADER: 'SUBHEADER',
NESTED: 'NESTED',
};
const MenuItem = React.createClass({
propTypes: {
active: React.PropTypes.bool,
attribute: React.PropTypes.string,
children: React.PropTypes.node,
className: React.PropTypes.string,
data: React.PropTypes.string,
disabled: React.PropTypes.bool,
icon: React.PropTypes.node,
iconClassName: React.PropTypes.string,
iconRightClassName: React.PropTypes.string,
iconRightStyle: React.PropTypes.object,
iconStyle: React.PropTypes.object,
index: React.PropTypes.number.isRequired,
number: React.PropTypes.string,
onMouseEnter: React.PropTypes.func,
onMouseLeave: React.PropTypes.func,
onToggle: React.PropTypes.func,
onTouchTap: React.PropTypes.func,
selected: React.PropTypes.bool,
style: React.PropTypes.object,
toggle: React.PropTypes.bool,
},
contextTypes: {
muiTheme: React.PropTypes.object,
},
//for passing default theme context to children
childContextTypes: {
muiTheme: React.PropTypes.object,
},
mixins: [StylePropable],
statics: {
Types: Types,
},
getDefaultProps() {
return {
toggle: false,
disabled: false,
active: false,
};
},
getInitialState() {
warning(false, 'This menu item component is deprecated use menus/menu-item instead.');
return {
muiTheme: this.context.muiTheme || getMuiTheme(),
};
},
getChildContext() {
return {
muiTheme: this.state.muiTheme,
};
},
//to update theme inside state whenever a new theme is passed down
//from the parent / owner using context
componentWillReceiveProps(nextProps, nextContext) {
let newMuiTheme = nextContext.muiTheme ? nextContext.muiTheme : this.state.muiTheme;
this.setState({muiTheme: newMuiTheme});
},
getTheme() {
return this.state.muiTheme.menuItem;
},
getSpacing() {
return this.state.muiTheme.rawTheme.spacing;
},
getStyles() {
const isRtl = this.context.muiTheme.isRtl;
const right = isRtl ? 'left' : 'right';
const left = isRtl ? 'right' : 'left';
const marginRight = isRtl ? 'marginLeft' : 'marginRight';
const paddingLeft = isRtl ? 'paddingRight' : 'paddingLeft';
let styles = {
root: {
userSelect: 'none',
cursor: 'pointer',
lineHeight: this.getTheme().height + 'px',
paddingLeft: this.getTheme().padding,
paddingRight: this.getTheme().padding,
color: this.state.muiTheme.rawTheme.palette.textColor,
},
number: {
float: right,
width: 24,
textAlign: 'center',
},
attribute: {
float: right,
},
iconRight: {
lineHeight: this.getTheme().height + 'px',
float: right,
},
icon: {
float: left,
lineHeight: this.getTheme().height + 'px',
[marginRight]: this.getSpacing().desktopGutter,
},
data: {
display: 'block',
[paddingLeft]: this.getSpacing().desktopGutter * 2,
lineHeight: this.getTheme().dataHeight + 'px',
height: this.getTheme().dataHeight + 'px',
verticalAlign: 'top',
top: -12,
position: 'relative',
fontWeight: 300,
color: this.state.muiTheme.rawTheme.palette.textColor,
},
toggle: {
marginTop: ((this.getTheme().height - this.state.muiTheme.radioButton.size) / 2),
float: right,
width: 42,
},
rootWhenHovered: {
backgroundColor: this.getTheme().hoverColor,
},
rootWhenSelected: {
color: this.getTheme().selectedTextColor,
},
rootWhenDisabled: {
cursor: 'default',
color: this.state.muiTheme.rawTheme.palette.disabledColor,
},
};
return styles;
},
_handleTouchTap(e) {
if (!this.props.disabled && this.props.onTouchTap) this.props.onTouchTap(e, this.props.index);
},
_handleToggle(e, toggled) {
if (!this.props.disabled && this.props.onToggle) this.props.onToggle(e, this.props.index, toggled);
},
_handleMouseEnter(e) {
if (!this.props.disabled && this.props.onMouseEnter) this.props.onMouseEnter(e, this.props.index);
},
_handleMouseLeave(e) {
if (!this.props.disabled && this.props.onMouseLeave) this.props.onMouseLeave(e, this.props.index);
},
render() {
let icon;
let data;
let iconRight;
let attribute;
let number;
let toggleElement;
let styles = this.getStyles();
if (this.props.iconClassName) {
icon = (
<FontIcon style={this.mergeStyles(styles.icon, this.props.iconStyle,
this.props.selected && styles.rootWhenSelected)}
className={this.props.iconClassName} />
);
}
if (this.props.iconRightClassName) {
iconRight = (
<FontIcon style={this.mergeStyles(styles.iconRight, this.props.iconRightStyle)}
className={this.props.iconRightClassName} />
);
}
if (this.props.data) data = <span style={this.prepareStyles(styles.data)}>{this.props.data}</span>;
if (this.props.number !== undefined) {
number = <span style={this.prepareStyles(styles.number)}>{this.props.number}</span>;
}
if (this.props.attribute !== undefined) {
attribute = <span style={this.prepareStyles(styles.style)}>{this.props.attribute}</span>;
}
if (this.props.icon) icon = this.props.icon;
if (this.props.toggle) {
let {
toggle,
onTouchTap,
onToggle,
onMouseEnter,
onMouseLeave,
children,
style,
...other,
} = this.props;
toggleElement = <Toggle {...other} onToggle={this._handleToggle} style={styles.toggle}/>;
}
return (
<div
key={this.props.index}
className={this.props.className}
onTouchTap={this._handleTouchTap}
onMouseEnter={this._handleMouseEnter}
onMouseLeave={this._handleMouseLeave}
style={this.prepareStyles(
styles.root,
this.props.selected && styles.rootWhenSelected,
(this.props.active && !this.props.disabled) && styles.rootWhenHovered,
this.props.style,
this.props.disabled && styles.rootWhenDisabled)}>
{icon}
{this.props.children}
{number}
{attribute}
{data}
{toggleElement}
{iconRight}
</div>
);
},
});
export default MenuItem;