Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

179 rader
5.2 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
  6. var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
  7. var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
  8. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  9. var _createClass2 = require('babel-runtime/helpers/createClass');
  10. var _createClass3 = _interopRequireDefault(_createClass2);
  11. var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
  12. var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
  13. var _inherits2 = require('babel-runtime/helpers/inherits');
  14. var _inherits3 = _interopRequireDefault(_inherits2);
  15. var _react = require('react');
  16. var _propTypes = require('prop-types');
  17. var _propTypes2 = _interopRequireDefault(_propTypes);
  18. var _reactDom = require('react-dom');
  19. var _dom = require('../utils/dom');
  20. var _dom2 = _interopRequireDefault(_dom);
  21. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  22. // heavily inspired by https://github.com/Khan/react-components/blob/master/js/layered-component-mixin.jsx
  23. var RenderToLayer = function (_Component) {
  24. (0, _inherits3.default)(RenderToLayer, _Component);
  25. function RenderToLayer() {
  26. var _ref;
  27. var _temp, _this, _ret;
  28. (0, _classCallCheck3.default)(this, RenderToLayer);
  29. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  30. args[_key] = arguments[_key];
  31. }
  32. return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = RenderToLayer.__proto__ || (0, _getPrototypeOf2.default)(RenderToLayer)).call.apply(_ref, [this].concat(args))), _this), _this.onClickAway = function (event) {
  33. if (event.defaultPrevented) {
  34. return;
  35. }
  36. if (!_this.props.componentClickAway) {
  37. return;
  38. }
  39. if (!_this.props.open) {
  40. return;
  41. }
  42. var el = _this.layer;
  43. if (event.target !== el && event.target === window || document.documentElement.contains(event.target) && !_dom2.default.isDescendant(el, event.target)) {
  44. _this.props.componentClickAway(event);
  45. }
  46. }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
  47. }
  48. (0, _createClass3.default)(RenderToLayer, [{
  49. key: 'componentDidMount',
  50. value: function componentDidMount() {
  51. this.renderLayer();
  52. }
  53. }, {
  54. key: 'componentDidUpdate',
  55. value: function componentDidUpdate() {
  56. this.renderLayer();
  57. }
  58. }, {
  59. key: 'componentWillUnmount',
  60. value: function componentWillUnmount() {
  61. this.unrenderLayer();
  62. }
  63. }, {
  64. key: 'getLayer',
  65. value: function getLayer() {
  66. return this.layer;
  67. }
  68. }, {
  69. key: 'unrenderLayer',
  70. value: function unrenderLayer() {
  71. if (!this.layer) {
  72. return;
  73. }
  74. if (this.props.useLayerForClickAway) {
  75. this.layer.style.position = 'relative';
  76. this.layer.removeEventListener('click', this.onClickAway);
  77. } else {
  78. window.removeEventListener('click', this.onClickAway);
  79. }
  80. (0, _reactDom.unmountComponentAtNode)(this.layer);
  81. document.body.removeChild(this.layer);
  82. this.layer = null;
  83. }
  84. /**
  85. * By calling this method in componentDidMount() and
  86. * componentDidUpdate(), you're effectively creating a "wormhole" that
  87. * funnels React's hierarchical updates through to a DOM node on an
  88. * entirely different part of the page.
  89. */
  90. }, {
  91. key: 'renderLayer',
  92. value: function renderLayer() {
  93. var _this2 = this;
  94. var _props = this.props,
  95. open = _props.open,
  96. render = _props.render;
  97. if (open) {
  98. if (!this.layer) {
  99. this.layer = document.createElement('div');
  100. document.body.appendChild(this.layer);
  101. if (this.props.useLayerForClickAway) {
  102. this.layer.addEventListener('click', this.onClickAway);
  103. this.layer.style.position = 'fixed';
  104. this.layer.style.top = 0;
  105. this.layer.style.bottom = 0;
  106. this.layer.style.left = 0;
  107. this.layer.style.right = 0;
  108. this.layer.style.zIndex = this.context.muiTheme.zIndex.layer;
  109. } else {
  110. setTimeout(function () {
  111. window.addEventListener('click', _this2.onClickAway);
  112. }, 0);
  113. }
  114. }
  115. var layerElement = render();
  116. this.layerElement = (0, _reactDom.unstable_renderSubtreeIntoContainer)(this, layerElement, this.layer);
  117. } else {
  118. this.unrenderLayer();
  119. }
  120. }
  121. }, {
  122. key: 'render',
  123. value: function render() {
  124. return null;
  125. }
  126. }]);
  127. return RenderToLayer;
  128. }(_react.Component);
  129. RenderToLayer.defaultProps = {
  130. useLayerForClickAway: true
  131. };
  132. RenderToLayer.contextTypes = {
  133. muiTheme: _propTypes2.default.object.isRequired
  134. };
  135. RenderToLayer.propTypes = process.env.NODE_ENV !== "production" ? {
  136. componentClickAway: _propTypes2.default.func,
  137. open: _propTypes2.default.bool.isRequired,
  138. render: _propTypes2.default.func.isRequired,
  139. useLayerForClickAway: _propTypes2.default.bool
  140. } : {};
  141. exports.default = RenderToLayer;