UNPKG

8.53 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7var _react = _interopRequireDefault(require("react"));
8var _propTypes = _interopRequireDefault(require("prop-types"));
9var _reactDom = _interopRequireDefault(require("react-dom"));
10var _classnames = _interopRequireDefault(require("classnames"));
11var _reactPopper = require("react-popper");
12var _utils = require("./utils");
13var _Fade = _interopRequireDefault(require("./Fade"));
14const _excluded = ["cssModule", "children", "isOpen", "flip", "target", "offset", "fallbackPlacements", "placementPrefix", "arrowClassName", "hideArrow", "popperClassName", "tag", "container", "modifiers", "strategy", "boundariesElement", "onClosed", "fade", "transition", "placement"];
15function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16function _extends() { _extends = Object.assign ? Object.assign.bind() : 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; }; return _extends.apply(this, arguments); }
17function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
18function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
19function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
20function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
22function noop() {}
23const propTypes = {
24 children: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]).isRequired,
25 popperClassName: _propTypes.default.string,
26 placement: _propTypes.default.string,
27 placementPrefix: _propTypes.default.string,
28 arrowClassName: _propTypes.default.string,
29 hideArrow: _propTypes.default.bool,
30 tag: _utils.tagPropType,
31 isOpen: _propTypes.default.bool,
32 cssModule: _propTypes.default.object,
33 offset: _propTypes.default.arrayOf(_propTypes.default.number),
34 fallbackPlacements: _propTypes.default.array,
35 flip: _propTypes.default.bool,
36 container: _utils.targetPropType,
37 target: _utils.targetPropType.isRequired,
38 modifiers: _propTypes.default.array,
39 strategy: _propTypes.default.string,
40 boundariesElement: _propTypes.default.oneOfType([_propTypes.default.string, _utils.DOMElement]),
41 onClosed: _propTypes.default.func,
42 fade: _propTypes.default.bool,
43 transition: _propTypes.default.shape(_Fade.default.propTypes)
44};
45const defaultProps = {
46 boundariesElement: 'scrollParent',
47 placement: 'auto',
48 hideArrow: false,
49 isOpen: false,
50 offset: [0, 0],
51 flip: true,
52 container: 'body',
53 modifiers: [],
54 onClosed: noop,
55 fade: true,
56 transition: _objectSpread({}, _Fade.default.defaultProps)
57};
58class PopperContent extends _react.default.Component {
59 constructor(props) {
60 super(props);
61 this.setTargetNode = this.setTargetNode.bind(this);
62 this.getTargetNode = this.getTargetNode.bind(this);
63 this.getRef = this.getRef.bind(this);
64 this.onClosed = this.onClosed.bind(this);
65 this.state = {
66 isOpen: props.isOpen
67 };
68 }
69 static getDerivedStateFromProps(props, state) {
70 if (props.isOpen && !state.isOpen) {
71 return {
72 isOpen: props.isOpen
73 };
74 }
75 return null;
76 }
77 componentDidUpdate() {
78 if (this._element && this._element.childNodes && this._element.childNodes[0] && this._element.childNodes[0].focus) {
79 this._element.childNodes[0].focus();
80 }
81 }
82 onClosed() {
83 this.props.onClosed();
84 this.setState({
85 isOpen: false
86 });
87 }
88 getTargetNode() {
89 return this.targetNode;
90 }
91 getContainerNode() {
92 return (0, _utils.getTarget)(this.props.container);
93 }
94 getRef(ref) {
95 this._element = ref;
96 }
97 setTargetNode(node) {
98 this.targetNode = typeof node === 'string' ? (0, _utils.getTarget)(node) : node;
99 }
100 renderChildren() {
101 const _this$props = this.props,
102 {
103 cssModule,
104 children,
105 isOpen,
106 flip,
107 target,
108 offset,
109 fallbackPlacements,
110 placementPrefix,
111 arrowClassName: _arrowClassName,
112 hideArrow,
113 popperClassName: _popperClassName,
114 tag,
115 container,
116 modifiers,
117 strategy,
118 boundariesElement,
119 onClosed,
120 fade,
121 transition,
122 placement
123 } = _this$props,
124 attrs = _objectWithoutProperties(_this$props, _excluded);
125 const arrowClassName = (0, _utils.mapToCssModules)((0, _classnames.default)('arrow', _arrowClassName), cssModule);
126 const popperClassName = (0, _utils.mapToCssModules)((0, _classnames.default)(_popperClassName, placementPrefix ? `${placementPrefix}-auto` : ''), this.props.cssModule);
127 const modifierNames = modifiers.map(m => m.name);
128 const baseModifiers = [{
129 name: 'offset',
130 options: {
131 offset
132 }
133 }, {
134 name: 'flip',
135 enabled: flip,
136 options: {
137 fallbackPlacements
138 }
139 }, {
140 name: 'preventOverflow',
141 options: {
142 boundary: boundariesElement
143 }
144 }].filter(m => !modifierNames.includes(m.name));
145 const extendedModifiers = [...baseModifiers, ...modifiers];
146 const popperTransition = _objectSpread(_objectSpread(_objectSpread({}, _Fade.default.defaultProps), transition), {}, {
147 baseClass: fade ? transition.baseClass : '',
148 timeout: fade ? transition.timeout : 0
149 });
150 return /*#__PURE__*/_react.default.createElement(_Fade.default, _extends({}, popperTransition, attrs, {
151 in: isOpen,
152 onExited: this.onClosed,
153 tag: tag
154 }), /*#__PURE__*/_react.default.createElement(_reactPopper.Popper, {
155 referenceElement: this.targetNode,
156 modifiers: extendedModifiers,
157 placement: placement,
158 strategy: strategy
159 }, ({
160 ref,
161 style,
162 placement: popperPlacement,
163 isReferenceHidden,
164 arrowProps,
165 update
166 }) => /*#__PURE__*/_react.default.createElement("div", {
167 ref: ref,
168 style: style,
169 className: popperClassName,
170 "data-popper-placement": popperPlacement,
171 "data-popper-reference-hidden": isReferenceHidden ? 'true' : undefined
172 }, typeof children === 'function' ? children({
173 update
174 }) : children, !hideArrow && /*#__PURE__*/_react.default.createElement("span", {
175 ref: arrowProps.ref,
176 className: arrowClassName,
177 style: arrowProps.style
178 }))));
179 }
180 render() {
181 this.setTargetNode(this.props.target);
182 if (this.state.isOpen) {
183 return this.props.container === 'inline' ? this.renderChildren() : /*#__PURE__*/_reactDom.default.createPortal( /*#__PURE__*/_react.default.createElement("div", {
184 ref: this.getRef
185 }, this.renderChildren()), this.getContainerNode());
186 }
187 return null;
188 }
189}
190PopperContent.propTypes = propTypes;
191PopperContent.defaultProps = defaultProps;
192var _default = PopperContent;
193exports.default = _default;
\No newline at end of file