material-ui
Version:
Material Design UI components built with React
155 lines (129 loc) • 5.17 kB
JavaScript
'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; };
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
var React = require('react/addons');
var PureRenderMixin = React.addons.PureRenderMixin;
var StylePropable = require('../mixins/style-propable');
var Colors = require('../styles/colors');
var CheckIcon = require('../svg-icons/navigation/check');
var ListItem = require('../lists/list-item');
var MenuItem = React.createClass({
displayName: 'MenuItem',
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: function getDefaultProps() {
return {
focusState: 'none'
};
},
componentDidMount: function componentDidMount() {
this._applyFocusState();
},
componentDidUpdate: function componentDidUpdate() {
this._applyFocusState();
},
render: function render() {
var _props = this.props;
var checked = _props.checked;
var children = _props.children;
var desktop = _props.desktop;
var disabled = _props.disabled;
var focusState = _props.focusState;
var innerDivStyle = _props.innerDivStyle;
var insetChildren = _props.insetChildren;
var leftIcon = _props.leftIcon;
var rightIcon = _props.rightIcon;
var secondaryText = _props.secondaryText;
var style = _props.style;
var value = _props.value;
var other = _objectWithoutProperties(_props, ['checked', 'children', 'desktop', 'disabled', 'focusState', 'innerDivStyle', 'insetChildren', 'leftIcon', 'rightIcon', 'secondaryText', 'style', 'value']);
var disabledColor = this.context.muiTheme.palette.disabledColor;
var textColor = this.context.muiTheme.palette.textColor;
var leftIndent = desktop ? 64 : 72;
var sidePadding = desktop ? 24 : 16;
var 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
}
};
var mergedRootStyles = this.mergeStyles(styles.root, style);
var mergedInnerDivStyles = this.mergeStyles(styles.innerDivStyle, innerDivStyle);
//Left Icon
var leftIconElement = leftIcon ? leftIcon : checked ? React.createElement(CheckIcon, null) : null;
if (leftIconElement && desktop) {
var mergedLeftIconStyles = this.mergeStyles(styles.leftIconDesktop, leftIconElement.props.style);
leftIconElement = React.cloneElement(leftIconElement, { style: mergedLeftIconStyles });
}
//Right Icon
var rightIconElement = undefined;
if (rightIcon) {
var mergedRightIconStyles = desktop ? this.mergeStyles(styles.rightIconDesktop, rightIcon.props.style) : null;
rightIconElement = React.cloneElement(rightIcon, { style: mergedRightIconStyles });
}
//Secondary Text
var secondaryTextElement = undefined;
if (secondaryText) {
var secondaryTextIsAnElement = React.isValidElement(secondaryText);
var mergedSecondaryTextStyles = secondaryTextIsAnElement ? this.mergeStyles(styles.secondaryText, secondaryText.props.style) : null;
secondaryTextElement = secondaryTextIsAnElement ? React.cloneElement(secondaryText, { style: mergedSecondaryTextStyles }) : React.createElement(
'div',
{ style: styles.secondaryText },
secondaryText
);
}
return React.createElement(
ListItem,
_extends({}, other, {
disabled: disabled,
innerDivStyle: mergedInnerDivStyles,
insetChildren: insetChildren,
leftIcon: leftIconElement,
ref: 'listItem',
rightIcon: rightIconElement,
style: mergedRootStyles }),
children,
secondaryTextElement
);
},
_applyFocusState: function _applyFocusState() {
this.refs.listItem.applyFocusState(this.props.focusState);
}
});
module.exports = MenuItem;