You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 3 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _extends2 = require('babel-runtime/helpers/extends');
  6. var _extends3 = _interopRequireDefault(_extends2);
  7. var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
  8. var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
  9. var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
  10. var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
  11. var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
  12. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  13. var _createClass2 = require('babel-runtime/helpers/createClass');
  14. var _createClass3 = _interopRequireDefault(_createClass2);
  15. var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
  16. var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
  17. var _inherits2 = require('babel-runtime/helpers/inherits');
  18. var _inherits3 = _interopRequireDefault(_inherits2);
  19. var _simpleAssign = require('simple-assign');
  20. var _simpleAssign2 = _interopRequireDefault(_simpleAssign);
  21. var _react = require('react');
  22. var _react2 = _interopRequireDefault(_react);
  23. var _propTypes = require('prop-types');
  24. var _propTypes2 = _interopRequireDefault(_propTypes);
  25. var _reactDom = require('react-dom');
  26. var _reactDom2 = _interopRequireDefault(_reactDom);
  27. var _shallowEqual = require('recompose/shallowEqual');
  28. var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
  29. var _Popover = require('../Popover/Popover');
  30. var _Popover2 = _interopRequireDefault(_Popover);
  31. var _check = require('../svg-icons/navigation/check');
  32. var _check2 = _interopRequireDefault(_check);
  33. var _ListItem = require('../List/ListItem');
  34. var _ListItem2 = _interopRequireDefault(_ListItem);
  35. var _Menu = require('../Menu/Menu');
  36. var _Menu2 = _interopRequireDefault(_Menu);
  37. var _propTypes3 = require('../utils/propTypes');
  38. var _propTypes4 = _interopRequireDefault(_propTypes3);
  39. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  40. var nestedMenuStyle = {
  41. position: 'relative'
  42. };
  43. function getStyles(props, context) {
  44. var disabledColor = context.muiTheme.baseTheme.palette.disabledColor;
  45. var textColor = context.muiTheme.baseTheme.palette.textColor;
  46. var indent = props.desktop ? 64 : 72;
  47. var sidePadding = props.desktop ? 24 : 16;
  48. var styles = {
  49. root: {
  50. color: props.disabled ? disabledColor : textColor,
  51. cursor: props.disabled ? 'default' : 'pointer',
  52. minHeight: props.desktop ? '32px' : '48px',
  53. lineHeight: props.desktop ? '32px' : '48px',
  54. fontSize: props.desktop ? 15 : 16,
  55. whiteSpace: 'nowrap'
  56. },
  57. innerDivStyle: {
  58. paddingLeft: props.leftIcon || props.insetChildren || props.checked ? indent : sidePadding,
  59. paddingRight: props.rightIcon ? indent : sidePadding,
  60. paddingBottom: 0,
  61. paddingTop: 0
  62. },
  63. secondaryText: {
  64. float: 'right'
  65. },
  66. leftIconDesktop: {
  67. margin: 0,
  68. left: 24,
  69. top: 4
  70. },
  71. rightIconDesktop: {
  72. margin: 0,
  73. right: 24,
  74. top: 4,
  75. fill: context.muiTheme.menuItem.rightIconDesktopFill
  76. }
  77. };
  78. return styles;
  79. }
  80. var MenuItem = function (_Component) {
  81. (0, _inherits3.default)(MenuItem, _Component);
  82. function MenuItem() {
  83. var _ref;
  84. var _temp, _this, _ret;
  85. (0, _classCallCheck3.default)(this, MenuItem);
  86. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  87. args[_key] = arguments[_key];
  88. }
  89. return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = MenuItem.__proto__ || (0, _getPrototypeOf2.default)(MenuItem)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
  90. open: false
  91. }, _this.cloneMenuItem = function (item) {
  92. return _react2.default.cloneElement(item, {
  93. onClick: function onClick(event) {
  94. if (!item.props.menuItems) {
  95. _this.handleRequestClose();
  96. }
  97. if (item.props.onClick) {
  98. item.props.onClick(event);
  99. }
  100. }
  101. });
  102. }, _this.handleClick = function (event) {
  103. event.preventDefault();
  104. _this.setState({
  105. open: true,
  106. anchorEl: _reactDom2.default.findDOMNode(_this)
  107. });
  108. if (_this.props.onClick) {
  109. _this.props.onClick(event);
  110. }
  111. }, _this.handleRequestClose = function () {
  112. _this.setState({
  113. open: false,
  114. anchorEl: null
  115. });
  116. }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
  117. }
  118. (0, _createClass3.default)(MenuItem, [{
  119. key: 'componentDidMount',
  120. value: function componentDidMount() {
  121. this.applyFocusState();
  122. }
  123. }, {
  124. key: 'componentWillReceiveProps',
  125. value: function componentWillReceiveProps(nextProps) {
  126. if (this.state.open && nextProps.focusState === 'none') {
  127. this.handleRequestClose();
  128. }
  129. }
  130. }, {
  131. key: 'shouldComponentUpdate',
  132. value: function shouldComponentUpdate(nextProps, nextState, nextContext) {
  133. return !(0, _shallowEqual2.default)(this.props, nextProps) || !(0, _shallowEqual2.default)(this.state, nextState) || !(0, _shallowEqual2.default)(this.context, nextContext);
  134. }
  135. }, {
  136. key: 'componentDidUpdate',
  137. value: function componentDidUpdate() {
  138. this.applyFocusState();
  139. }
  140. }, {
  141. key: 'componentWillUnmount',
  142. value: function componentWillUnmount() {
  143. if (this.state.open) {
  144. this.setState({
  145. open: false
  146. });
  147. }
  148. }
  149. }, {
  150. key: 'applyFocusState',
  151. value: function applyFocusState() {
  152. this.refs.listItem.applyFocusState(this.props.focusState);
  153. }
  154. }, {
  155. key: 'render',
  156. value: function render() {
  157. var _props = this.props,
  158. checked = _props.checked,
  159. children = _props.children,
  160. desktop = _props.desktop,
  161. disabled = _props.disabled,
  162. focusState = _props.focusState,
  163. innerDivStyle = _props.innerDivStyle,
  164. insetChildren = _props.insetChildren,
  165. leftIcon = _props.leftIcon,
  166. menuItems = _props.menuItems,
  167. rightIcon = _props.rightIcon,
  168. secondaryText = _props.secondaryText,
  169. style = _props.style,
  170. animation = _props.animation,
  171. anchorOrigin = _props.anchorOrigin,
  172. targetOrigin = _props.targetOrigin,
  173. value = _props.value,
  174. other = (0, _objectWithoutProperties3.default)(_props, ['checked', 'children', 'desktop', 'disabled', 'focusState', 'innerDivStyle', 'insetChildren', 'leftIcon', 'menuItems', 'rightIcon', 'secondaryText', 'style', 'animation', 'anchorOrigin', 'targetOrigin', 'value']);
  175. var prepareStyles = this.context.muiTheme.prepareStyles;
  176. var styles = getStyles(this.props, this.context);
  177. var mergedRootStyles = (0, _simpleAssign2.default)(styles.root, style);
  178. var mergedInnerDivStyles = (0, _simpleAssign2.default)(styles.innerDivStyle, innerDivStyle);
  179. // Left Icon
  180. var leftIconElement = leftIcon ? leftIcon : checked ? _react2.default.createElement(_check2.default, null) : null;
  181. if (leftIconElement) {
  182. var mergedLeftIconStyles = desktop ? (0, _simpleAssign2.default)(styles.leftIconDesktop, leftIconElement.props.style) : leftIconElement.props.style;
  183. leftIconElement = _react2.default.cloneElement(leftIconElement, { style: mergedLeftIconStyles });
  184. }
  185. // Right Icon
  186. var rightIconElement = void 0;
  187. if (rightIcon) {
  188. var mergedRightIconStyles = desktop ? (0, _simpleAssign2.default)(styles.rightIconDesktop, rightIcon.props.style) : rightIcon.props.style;
  189. rightIconElement = _react2.default.cloneElement(rightIcon, { style: mergedRightIconStyles });
  190. }
  191. // Secondary Text
  192. var secondaryTextElement = void 0;
  193. if (secondaryText) {
  194. var secondaryTextIsAnElement = _react2.default.isValidElement(secondaryText);
  195. var mergedSecondaryTextStyles = secondaryTextIsAnElement ? (0, _simpleAssign2.default)(styles.secondaryText, secondaryText.props.style) : null;
  196. secondaryTextElement = secondaryTextIsAnElement ? _react2.default.cloneElement(secondaryText, { style: mergedSecondaryTextStyles }) : _react2.default.createElement(
  197. 'div',
  198. { style: prepareStyles(styles.secondaryText) },
  199. secondaryText
  200. );
  201. }
  202. var childMenuPopover = void 0;
  203. if (menuItems) {
  204. childMenuPopover = _react2.default.createElement(
  205. _Popover2.default,
  206. {
  207. animation: animation,
  208. anchorOrigin: anchorOrigin,
  209. anchorEl: this.state.anchorEl,
  210. open: this.state.open,
  211. targetOrigin: targetOrigin,
  212. useLayerForClickAway: false,
  213. onRequestClose: this.handleRequestClose
  214. },
  215. _react2.default.createElement(
  216. _Menu2.default,
  217. { desktop: desktop, disabled: disabled, style: nestedMenuStyle },
  218. _react2.default.Children.map(menuItems, this.cloneMenuItem)
  219. )
  220. );
  221. other.onClick = this.handleClick;
  222. }
  223. return _react2.default.createElement(
  224. _ListItem2.default,
  225. (0, _extends3.default)({}, other, {
  226. disabled: disabled,
  227. hoverColor: this.context.muiTheme.menuItem.hoverColor,
  228. innerDivStyle: mergedInnerDivStyles,
  229. insetChildren: insetChildren,
  230. leftIcon: leftIconElement,
  231. ref: 'listItem',
  232. rightIcon: rightIconElement,
  233. role: 'menuitem',
  234. style: mergedRootStyles
  235. }),
  236. children,
  237. secondaryTextElement,
  238. childMenuPopover
  239. );
  240. }
  241. }]);
  242. return MenuItem;
  243. }(_react.Component);
  244. MenuItem.muiName = 'MenuItem';
  245. MenuItem.defaultProps = {
  246. anchorOrigin: { horizontal: 'right', vertical: 'top' },
  247. checked: false,
  248. desktop: false,
  249. disabled: false,
  250. focusState: 'none',
  251. insetChildren: false,
  252. targetOrigin: { horizontal: 'left', vertical: 'top' }
  253. };
  254. MenuItem.contextTypes = {
  255. muiTheme: _propTypes2.default.object.isRequired
  256. };
  257. MenuItem.propTypes = process.env.NODE_ENV !== "production" ? {
  258. /**
  259. * Location of the anchor for the popover of nested `MenuItem`
  260. * elements.
  261. * Options:
  262. * horizontal: [left, middle, right]
  263. * vertical: [top, center, bottom].
  264. */
  265. anchorOrigin: _propTypes4.default.origin,
  266. /**
  267. * Override the default animation component used.
  268. */
  269. animation: _propTypes2.default.func,
  270. /**
  271. * If true, a left check mark will be rendered.
  272. */
  273. checked: _propTypes2.default.bool,
  274. /**
  275. * Elements passed as children to the underlying `ListItem`.
  276. */
  277. children: _propTypes2.default.node,
  278. /**
  279. * @ignore
  280. * If true, the menu item will render with compact desktop
  281. * styles.
  282. */
  283. desktop: _propTypes2.default.bool,
  284. /**
  285. * If true, the menu item will be disabled.
  286. */
  287. disabled: _propTypes2.default.bool,
  288. /**
  289. * The focus state of the menu item. This prop is used to set the focus
  290. * state of the underlying `ListItem`.
  291. */
  292. focusState: _propTypes2.default.oneOf(['none', 'focused', 'keyboard-focused']),
  293. /**
  294. * Override the inline-styles of the inner div.
  295. */
  296. innerDivStyle: _propTypes2.default.object,
  297. /**
  298. * If true, the children will be indented.
  299. * This is only needed when there is no `leftIcon`.
  300. */
  301. insetChildren: _propTypes2.default.bool,
  302. /**
  303. * The `SvgIcon` or `FontIcon` to be displayed on the left side.
  304. */
  305. leftIcon: _propTypes2.default.element,
  306. /**
  307. * `MenuItem` elements to nest within the menu item.
  308. */
  309. menuItems: _propTypes2.default.node,
  310. /**
  311. * Callback function fired when the menu item is clicked.
  312. *
  313. * @param {object} event Click event targeting the menu item.
  314. */
  315. onClick: _propTypes2.default.func,
  316. /**
  317. * Can be used to render primary text within the menu item.
  318. */
  319. primaryText: _propTypes2.default.node,
  320. /**
  321. * The `SvgIcon` or `FontIcon` to be displayed on the right side.
  322. */
  323. rightIcon: _propTypes2.default.element,
  324. /**
  325. * Can be used to render secondary text within the menu item.
  326. */
  327. secondaryText: _propTypes2.default.node,
  328. /**
  329. * Override the inline-styles of the root element.
  330. */
  331. style: _propTypes2.default.object,
  332. /**
  333. * Location on the popover of nested `MenuItem` elements that will attach
  334. * to the anchor's origin.
  335. * Options:
  336. * horizontal: [left, middle, right]
  337. * vertical: [top, center, bottom].
  338. */
  339. targetOrigin: _propTypes4.default.origin,
  340. /**
  341. * The value of the menu item.
  342. */
  343. value: _propTypes2.default.any
  344. } : {};
  345. exports.default = MenuItem;