UNPKG

material-ui

Version:

Material Design UI components built with React

155 lines (131 loc) 4.07 kB
const React = require('react/addons'); const PureRenderMixin = React.addons.PureRenderMixin; const StylePropable = require('../mixins/style-propable'); const Colors = require('../styles/colors'); const CheckIcon = require('../svg-icons/navigation/check'); const ListItem = require('../lists/list-item'); const MenuItem = React.createClass({ mixins: [PureRenderMixin, StylePropable], contextTypes: { muiTheme: React.PropTypes.object, }, propTypes: { checked: React.PropTypes.bool, desktop: React.PropTypes.bool, disabled: React.PropTypes.bool, innerDivStyle: React.PropTypes.object, insetChildren: React.PropTypes.bool, focusState: React.PropTypes.oneOf([ 'none', 'focused', 'keyboard-focused', ]), leftIcon: React.PropTypes.element, rightIcon: React.PropTypes.element, secondaryText: React.PropTypes.node, value: React.PropTypes.string, }, getDefaultProps() { return { focusState: 'none', }; }, componentDidMount() { this._applyFocusState(); }, componentDidUpdate() { this._applyFocusState(); }, render() { const { checked, children, desktop, disabled, focusState, innerDivStyle, insetChildren, leftIcon, rightIcon, secondaryText, style, value, ...other, } = this.props; const disabledColor = this.context.muiTheme.palette.disabledColor; const textColor = this.context.muiTheme.palette.textColor; const leftIndent = desktop ? 64 : 72; const sidePadding = desktop ? 24 : 16; const styles = { root: { color: disabled ? disabledColor : textColor, lineHeight: desktop ? '32px' : '48px', fontSize: desktop ? 15 : 16, whiteSpace: 'nowrap', }, innerDivStyle: { paddingLeft: leftIcon || insetChildren || checked ? leftIndent : sidePadding, paddingRight: sidePadding, paddingBottom: 0, paddingTop: 0, }, secondaryText: { float: 'right', }, leftIconDesktop: { padding: 0, left: 24, top: 4, }, rightIconDesktop: { padding: 0, right: 24, top: 4, fill: Colors.grey600, }, }; let mergedRootStyles = this.mergeStyles(styles.root, style); let mergedInnerDivStyles = this.mergeStyles(styles.innerDivStyle, innerDivStyle); //Left Icon let leftIconElement = leftIcon ? leftIcon : checked ? <CheckIcon /> : null; if (leftIconElement && desktop) { const mergedLeftIconStyles = this.mergeStyles(styles.leftIconDesktop, leftIconElement.props.style); leftIconElement = React.cloneElement(leftIconElement, {style: mergedLeftIconStyles}); } //Right Icon let rightIconElement; if (rightIcon) { const mergedRightIconStyles = desktop ? this.mergeStyles(styles.rightIconDesktop, rightIcon.props.style) : null; rightIconElement = React.cloneElement(rightIcon, {style: mergedRightIconStyles}); } //Secondary Text let secondaryTextElement; if (secondaryText) { const secondaryTextIsAnElement = React.isValidElement(secondaryText); const mergedSecondaryTextStyles = secondaryTextIsAnElement ? this.mergeStyles(styles.secondaryText, secondaryText.props.style) : null; secondaryTextElement = secondaryTextIsAnElement ? React.cloneElement(secondaryText, {style: mergedSecondaryTextStyles}) : <div style={styles.secondaryText}>{secondaryText}</div>; } return ( <ListItem {...other} disabled={disabled} innerDivStyle={mergedInnerDivStyles} insetChildren={insetChildren} leftIcon={leftIconElement} ref="listItem" rightIcon={rightIconElement} style={mergedRootStyles}> {children} {secondaryTextElement} </ListItem> ); }, _applyFocusState() { this.refs.listItem.applyFocusState(this.props.focusState); }, }); module.exports = MenuItem;