Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

352 строки
11 KiB

  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 _keycode = require('keycode');
  26. var _keycode2 = _interopRequireDefault(_keycode);
  27. var _colorManipulator = require('../utils/colorManipulator');
  28. var _EnhancedButton = require('../internal/EnhancedButton');
  29. var _EnhancedButton2 = _interopRequireDefault(_EnhancedButton);
  30. var _cancel = require('../svg-icons/navigation/cancel');
  31. var _cancel2 = _interopRequireDefault(_cancel);
  32. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  33. function getStyles(props, context, state) {
  34. var chip = context.muiTheme.chip;
  35. var backgroundColor = props.backgroundColor || chip.backgroundColor;
  36. var focusColor = (0, _colorManipulator.emphasize)(backgroundColor, 0.08);
  37. var pressedColor = (0, _colorManipulator.emphasize)(backgroundColor, 0.12);
  38. return {
  39. avatar: {
  40. marginRight: -4
  41. },
  42. deleteIcon: {
  43. color: state.deleteHovered ? (0, _colorManipulator.fade)(chip.deleteIconColor, 0.4) : chip.deleteIconColor,
  44. cursor: 'pointer',
  45. margin: '4px 4px 0px -8px'
  46. },
  47. label: {
  48. color: props.labelColor || chip.textColor,
  49. fontSize: chip.fontSize,
  50. fontWeight: chip.fontWeight,
  51. lineHeight: '32px',
  52. paddingLeft: 12,
  53. paddingRight: 12,
  54. userSelect: 'none',
  55. whiteSpace: 'nowrap'
  56. },
  57. root: {
  58. backgroundColor: state.clicked ? pressedColor : state.focused || state.hovered ? focusColor : backgroundColor,
  59. borderRadius: 16,
  60. boxShadow: state.clicked ? chip.shadow : null,
  61. cursor: props.onClick ? 'pointer' : 'default',
  62. display: 'flex',
  63. whiteSpace: 'nowrap',
  64. width: 'fit-content'
  65. }
  66. };
  67. }
  68. var Chip = function (_Component) {
  69. (0, _inherits3.default)(Chip, _Component);
  70. function Chip() {
  71. var _ref;
  72. var _temp, _this, _ret;
  73. (0, _classCallCheck3.default)(this, Chip);
  74. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  75. args[_key] = arguments[_key];
  76. }
  77. return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Chip.__proto__ || (0, _getPrototypeOf2.default)(Chip)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
  78. clicked: false,
  79. deleteHovered: false,
  80. focused: false,
  81. hovered: false
  82. }, _this.handleBlur = function (event) {
  83. _this.setState({ clicked: false, focused: false });
  84. _this.props.onBlur(event);
  85. }, _this.handleFocus = function (event) {
  86. if (_this.props.onClick || _this.props.onRequestDelete) {
  87. _this.setState({ focused: true });
  88. }
  89. _this.props.onFocus(event);
  90. }, _this.handleKeyboardFocus = function (event, keyboardFocused) {
  91. if (keyboardFocused) {
  92. _this.handleFocus();
  93. _this.props.onFocus(event);
  94. } else {
  95. _this.handleBlur();
  96. }
  97. _this.props.onKeyboardFocus(event, keyboardFocused);
  98. }, _this.handleKeyDown = function (event) {
  99. if ((0, _keycode2.default)(event) === 'backspace') {
  100. event.preventDefault();
  101. if (_this.props.onRequestDelete) {
  102. _this.props.onRequestDelete(event);
  103. }
  104. }
  105. _this.props.onKeyDown(event);
  106. }, _this.handleMouseDown = function (event) {
  107. // Only listen to left clicks
  108. if (event.button === 0) {
  109. event.stopPropagation();
  110. if (_this.props.onClick) {
  111. _this.setState({ clicked: true });
  112. }
  113. }
  114. _this.props.onMouseDown(event);
  115. }, _this.handleMouseEnter = function (event) {
  116. if (_this.props.onClick) {
  117. _this.setState({ hovered: true });
  118. }
  119. _this.props.onMouseEnter(event);
  120. }, _this.handleMouseEnterDeleteIcon = function () {
  121. _this.setState({ deleteHovered: true });
  122. }, _this.handleMouseLeave = function (event) {
  123. _this.setState({
  124. clicked: false,
  125. hovered: false
  126. });
  127. _this.props.onMouseLeave(event);
  128. }, _this.handleMouseLeaveDeleteIcon = function () {
  129. _this.setState({ deleteHovered: false });
  130. }, _this.handleMouseUp = function (event) {
  131. _this.setState({ clicked: false });
  132. _this.props.onMouseUp(event);
  133. }, _this.handleClickDeleteIcon = function (event) {
  134. // Stop the event from bubbling up to the `Chip`
  135. event.stopPropagation();
  136. _this.props.onRequestDelete(event);
  137. }, _this.handleTouchEnd = function (event) {
  138. _this.setState({ clicked: false });
  139. _this.props.onTouchEnd(event);
  140. }, _this.handleTouchStart = function (event) {
  141. event.stopPropagation();
  142. if (_this.props.onClick) {
  143. _this.setState({ clicked: true });
  144. }
  145. _this.props.onTouchStart(event);
  146. }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
  147. }
  148. (0, _createClass3.default)(Chip, [{
  149. key: 'render',
  150. value: function render() {
  151. var buttonEventHandlers = {
  152. onBlur: this.handleBlur,
  153. onFocus: this.handleFocus,
  154. onKeyDown: this.handleKeyDown,
  155. onMouseDown: this.handleMouseDown,
  156. onMouseEnter: this.handleMouseEnter,
  157. onMouseLeave: this.handleMouseLeave,
  158. onMouseUp: this.handleMouseUp,
  159. onTouchEnd: this.handleTouchEnd,
  160. onTouchStart: this.handleTouchStart,
  161. onKeyboardFocus: this.handleKeyboardFocus
  162. };
  163. var prepareStyles = this.context.muiTheme.prepareStyles;
  164. var styles = getStyles(this.props, this.context, this.state);
  165. var _props = this.props,
  166. childrenProp = _props.children,
  167. containerElement = _props.containerElement,
  168. style = _props.style,
  169. className = _props.className,
  170. deleteIconStyle = _props.deleteIconStyle,
  171. labelStyle = _props.labelStyle,
  172. labelColor = _props.labelColor,
  173. backgroundColor = _props.backgroundColor,
  174. onRequestDelete = _props.onRequestDelete,
  175. other = (0, _objectWithoutProperties3.default)(_props, ['children', 'containerElement', 'style', 'className', 'deleteIconStyle', 'labelStyle', 'labelColor', 'backgroundColor', 'onRequestDelete']);
  176. var deletable = this.props.onRequestDelete;
  177. var avatar = null;
  178. var deleteIcon = deletable ? _react2.default.createElement(_cancel2.default, {
  179. color: styles.deleteIcon.color,
  180. style: (0, _simpleAssign2.default)(styles.deleteIcon, deleteIconStyle),
  181. onClick: this.handleClickDeleteIcon,
  182. onMouseEnter: this.handleMouseEnterDeleteIcon,
  183. onMouseLeave: this.handleMouseLeaveDeleteIcon
  184. }) : null;
  185. var children = childrenProp;
  186. var childCount = _react2.default.Children.count(children);
  187. // If the first child is an avatar, extract it and style it
  188. if (childCount > 1) {
  189. children = _react2.default.Children.toArray(children);
  190. if (_react2.default.isValidElement(children[0]) && children[0].type.muiName === 'Avatar') {
  191. avatar = children.shift();
  192. avatar = _react2.default.cloneElement(avatar, {
  193. style: (0, _simpleAssign2.default)(styles.avatar, avatar.props.style),
  194. size: 32
  195. });
  196. }
  197. }
  198. return _react2.default.createElement(
  199. _EnhancedButton2.default,
  200. (0, _extends3.default)({}, other, buttonEventHandlers, {
  201. className: className,
  202. containerElement: containerElement,
  203. disableTouchRipple: true,
  204. disableFocusRipple: true,
  205. style: (0, _simpleAssign2.default)(styles.root, style)
  206. }),
  207. avatar,
  208. _react2.default.createElement(
  209. 'span',
  210. { style: prepareStyles((0, _simpleAssign2.default)(styles.label, labelStyle)) },
  211. children
  212. ),
  213. deleteIcon
  214. );
  215. }
  216. }]);
  217. return Chip;
  218. }(_react.Component);
  219. Chip.defaultProps = {
  220. containerElement: 'div', // Firefox doesn't support nested buttons
  221. onBlur: function onBlur() {},
  222. onFocus: function onFocus() {},
  223. onKeyDown: function onKeyDown() {},
  224. onKeyboardFocus: function onKeyboardFocus() {},
  225. onMouseDown: function onMouseDown() {},
  226. onMouseEnter: function onMouseEnter() {},
  227. onMouseLeave: function onMouseLeave() {},
  228. onMouseUp: function onMouseUp() {},
  229. onTouchEnd: function onTouchEnd() {},
  230. onTouchStart: function onTouchStart() {}
  231. };
  232. Chip.contextTypes = { muiTheme: _propTypes2.default.object.isRequired };
  233. Chip.propTypes = process.env.NODE_ENV !== "production" ? {
  234. /**
  235. * Override the background color of the chip.
  236. */
  237. backgroundColor: _propTypes2.default.string,
  238. /**
  239. * Used to render elements inside the Chip.
  240. */
  241. children: _propTypes2.default.node,
  242. /**
  243. * CSS `className` of the root element.
  244. */
  245. className: _propTypes2.default.node,
  246. /**
  247. * The element to use as the container for the Chip. Either a string to
  248. * use a DOM element or a ReactElement.
  249. */
  250. containerElement: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]),
  251. /**
  252. * Override the inline-styles of the delete icon.
  253. */
  254. deleteIconStyle: _propTypes2.default.object,
  255. /**
  256. * Override the label color.
  257. */
  258. labelColor: _propTypes2.default.string,
  259. /**
  260. * Override the inline-styles of the label.
  261. */
  262. labelStyle: _propTypes2.default.object,
  263. /** @ignore */
  264. onBlur: _propTypes2.default.func,
  265. /**
  266. * Callback function fired when the `Chip` element is clicked.
  267. *
  268. * @param {object} event Click event targeting the element.
  269. */
  270. onClick: _propTypes2.default.func,
  271. /** @ignore */
  272. onFocus: _propTypes2.default.func,
  273. /** @ignore */
  274. onKeyDown: _propTypes2.default.func,
  275. /** @ignore */
  276. onKeyboardFocus: _propTypes2.default.func,
  277. /** @ignore */
  278. onMouseDown: _propTypes2.default.func,
  279. /** @ignore */
  280. onMouseEnter: _propTypes2.default.func,
  281. /** @ignore */
  282. onMouseLeave: _propTypes2.default.func,
  283. /** @ignore */
  284. onMouseUp: _propTypes2.default.func,
  285. /**
  286. * Callback function fired when the delete icon is clicked. If set, the delete icon will be shown.
  287. * @param {object} event `click` event targeting the element.
  288. */
  289. onRequestDelete: _propTypes2.default.func,
  290. /** @ignore */
  291. onTouchEnd: _propTypes2.default.func,
  292. /** @ignore */
  293. onTouchStart: _propTypes2.default.func,
  294. /**
  295. * Override the inline-styles of the root element.
  296. */
  297. style: _propTypes2.default.object
  298. } : {};
  299. exports.default = Chip;