UNPKG

d2-ui

Version:
249 lines (216 loc) 6.72 kB
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;