@zohodesk/components
Version:
In this Package, we Provide Some Basic Components to Build Web App
1,010 lines (886 loc) • 45.2 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _hoistNonReactStatics = _interopRequireDefault(require("hoist-non-react-statics"));
var _propTypes = require("./props/propTypes");
var _Common = require("../utils/Common.js");
var _viewPort = _interopRequireDefault(require("./viewPort"));
var _PositionMapping = require("./PositionMapping.js");
var _ResizeObserver = _interopRequireDefault(require("@zohodesk/virtualizer/lib/commons/ResizeObserver.js"));
var _intersectionObserver = require("./intersectionObserver");
var _DropBoxPositionMapping = require("../DropBox/DropBoxPositionMapping.js");
var _isMobilePopover = _interopRequireDefault(require("../DropBox/utils/isMobilePopover.js"));
var _selectn = _interopRequireDefault(require("selectn"));
var _excluded = ["isMobile"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _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); }
function _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; }
function _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; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
var lastOpenedGroup = [];
var popups = {};
global.closeGroupPopups = function (groupName) {
var groupPopups = popups[groupName] || [];
groupPopups.forEach(function (popup) {
popup.state.isPopupOpen && popup.setState({
isPopupOpen: false,
isPopupReady: false
});
});
};
var defaultState = {
position: 'bottomCenter',
height: '0px',
positions: {},
//{bottomCenter: true, bottomLeft: false, ...}
positionsOffset: {},
//{bottomCenter: {left: ‘’,top: ‘’ }, .....}
targetOffset: {},
//{height: ‘’, width: ‘’,}
popupOffset: {},
//{height: ‘’, width: ‘’,}
isAbsolutePositioningNeeded: true
};
/* eslint-disable react/no-deprecated */
/* eslint-disable react/prop-types */
var Popup = function Popup(Component) {
var group = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'global';
var needResizeHandling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
_ref$isAbsolutePositi = _ref.isAbsolutePositioningNeeded,
isAbsolutePopup = _ref$isAbsolutePositi === void 0 ? true : _ref$isAbsolutePositi,
_ref$isArrow = _ref.isArrow,
needPopupArrow = _ref$isArrow === void 0 ? false : _ref$isArrow,
_ref$customOrder = _ref.customOrder,
customPositionOrder = _ref$customOrder === void 0 ? [] : _ref$customOrder,
_ref$scrollDebounceTi = _ref.scrollDebounceTime,
popupScrollDebounceTime = _ref$scrollDebounceTi === void 0 ? 0 : _ref$scrollDebounceTi,
_ref$closeOnScroll = _ref.closeOnScroll,
closeOnScrollPopup = _ref$closeOnScroll === void 0 ? false : _ref$closeOnScroll,
_ref$isOutsideScrollB = _ref.isOutsideScrollBlocked,
isOutsideScrollBlock = _ref$isOutsideScrollB === void 0 ? false : _ref$isOutsideScrollB;
var Popup = /*#__PURE__*/function (_React$Component) {
_inherits(Popup, _React$Component);
var _super = _createSuper(Popup);
function Popup(props) {
var _this;
_classCallCheck(this, Popup);
_this = _super.call(this, props);
_this.state = {
isPopupOpen: props.isPopupOpen || false,
position: 'bottomCenter',
height: '0px',
isPopupReady: props.isPopupOpen || false,
positions: {},
//{bottomCenter: true, bottomLeft: false, ...}
positionsOffset: {},
//{bottomCenter: {left: ‘’,top: ‘’ }, .....}
targetOffset: {},
//{height: ‘’, width: ‘’,}
popupOffset: {},
//{height: ‘’, width: ‘’,}
isAbsolutePositioningNeeded: true,
isMobile: false
};
_this.togglePopup = _this.togglePopup.bind(_assertThisInitialized(_this));
_this.documentClickHandler = _this.documentClickHandler.bind(_assertThisInitialized(_this));
_this.documentClickHandler1 = _this.documentClickHandler1.bind(_assertThisInitialized(_this));
_this.removeClose = _this.removeClose.bind(_assertThisInitialized(_this));
_this.documentKeyupHandler = _this.documentKeyupHandler.bind(_assertThisInitialized(_this));
_this.openPopupOnly = _this.openPopupOnly.bind(_assertThisInitialized(_this));
_this.closePopupOnly = _this.closePopupOnly.bind(_assertThisInitialized(_this));
_this.getTargetRef = _this.getTargetRef.bind(_assertThisInitialized(_this));
_this.getContainerRef = _this.getContainerRef.bind(_assertThisInitialized(_this));
_this.handlePopupPosition = _this.handlePopupPosition.bind(_assertThisInitialized(_this));
_this.handleResize = (0, _Common.debounce)(_this.handleResize.bind(_assertThisInitialized(_this)), 300);
_this.handlePopupResize = _this.handlePopupResize.bind(_assertThisInitialized(_this));
_this.getIsAbsolutePopup = _this.getIsAbsolutePopup.bind(_assertThisInitialized(_this));
_this.getIsOutsideScrollBlocked = _this.getIsOutsideScrollBlocked.bind(_assertThisInitialized(_this));
_this.getNeedArrow = _this.getNeedArrow.bind(_assertThisInitialized(_this));
_this.getCustomPositionOrder = _this.getCustomPositionOrder.bind(_assertThisInitialized(_this));
_this.handleOpenPopupPositionChange = _this.handleOpenPopupPositionChange.bind(_assertThisInitialized(_this)); // this.getScrollDebounceTime = this.getScrollDebounceTime.bind(this);
_this.getCloseOnScrollPopup = _this.getCloseOnScrollPopup.bind(_assertThisInitialized(_this));
_this.handleCloseLastOpenedGroup = _this.handleCloseLastOpenedGroup.bind(_assertThisInitialized(_this));
_this.handleDocumentMouseDown = _this.handleDocumentMouseDown.bind(_assertThisInitialized(_this));
_this.handleDocumentFocus = _this.handleDocumentFocus.bind(_assertThisInitialized(_this));
_this.handleGetNeedPrevent = _this.handleGetNeedPrevent.bind(_assertThisInitialized(_this));
_this.handleBlockScroll = _this.handleBlockScroll.bind(_assertThisInitialized(_this));
_this.handlePositionChange = _this.handlePositionChange.bind(_assertThisInitialized(_this));
_this.preventKeyboardScroll = _this.preventKeyboardScroll.bind(_assertThisInitialized(_this));
_this.addScrollBlockListeners = _this.addScrollBlockListeners.bind(_assertThisInitialized(_this));
_this.removeScrollBlockListeners = _this.removeScrollBlockListeners.bind(_assertThisInitialized(_this));
_this.handleAddingScrollBlock = _this.handleAddingScrollBlock.bind(_assertThisInitialized(_this));
_this.handleRemovingScrollBlock = _this.handleRemovingScrollBlock.bind(_assertThisInitialized(_this));
_this.handleIntersectionObserver = _this.handleIntersectionObserver.bind(_assertThisInitialized(_this));
_this.updateVisibilityOnIntersection = _this.updateVisibilityOnIntersection.bind(_assertThisInitialized(_this));
_this.handleAddingScrollToUpdatePosition = _this.handleAddingScrollToUpdatePosition.bind(_assertThisInitialized(_this));
_this.handleRemovingScrollToUpdatePosition = _this.handleRemovingScrollToUpdatePosition.bind(_assertThisInitialized(_this));
_this.updatePositionOnScroll = _this.updatePositionOnScroll.bind(_assertThisInitialized(_this));
_this.setContainerDynamicPositioning = _this.setContainerDynamicPositioning.bind(_assertThisInitialized(_this));
_this.updatePopupState = _this.updatePopupState.bind(_assertThisInitialized(_this));
_this.handleScrollAndBlockEvents = _this.handleScrollAndBlockEvents.bind(_assertThisInitialized(_this));
_this.handleDropElementStyleUpdate = _this.handleDropElementStyleUpdate.bind(_assertThisInitialized(_this));
_this.positionRef = /*#__PURE__*/_react["default"].createRef();
_this.popupObserver = new _ResizeObserver["default"](_this.handlePopupResize); //dropBoxSize
_this.size = null;
_this.isTargetElementVisible = false;
_this.isAbsolutePopup = isAbsolutePopup;
_this.needPopupArrow = needPopupArrow;
_this.customPositionOrder = customPositionOrder;
_this.scrollDebounceTime = popupScrollDebounceTime;
_this.closeOnScroll = closeOnScrollPopup;
_this.isOutsideScrollBlock = isOutsideScrollBlock; // const { scrollDebounceTime } = this.getScrollDebounceTime(this);
// this.handleScroll = debounce(this.handleScroll.bind(this), scrollDebounceTime);
return _this;
}
_createClass(Popup, [{
key: "componentDidMount",
value: function componentDidMount() {
var group = this.getGroup();
var groupPopups = popups[group] || [];
groupPopups.push(this);
popups[group] = groupPopups;
if (Object.keys(popups).length === 1 && groupPopups.length === 1) {
document.addEventListener('click', this.documentClickHandler, false);
document.addEventListener('keyup', this.documentKeyupHandler, false); // document.addEventListener('scroll', this.handleScroll, true);
window.addEventListener('resize', this.handleResize);
document.addEventListener('click', this.documentClickHandler1, true);
document.addEventListener('mousedown', this.handleDocumentMouseDown, true);
document.addEventListener('focus', this.handleDocumentFocus, true);
}
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var isPopupOpen = this.state.isPopupOpen;
if (typeof nextProps.isPopupOpen !== 'undefined' && nextProps.isPopupOpen !== isPopupOpen) {
this.setState({
isPopupOpen: nextProps.isPopupOpen,
isPopupReady: nextProps.isPopupOpen
});
}
}
}, {
key: "handleScrollAndBlockEvents",
value: function handleScrollAndBlockEvents(isPopupReady, isMobile) {
if (isPopupReady && !isMobile) {
this.handleAddingScrollBlock();
this.handleAddingScrollToUpdatePosition();
} else {
this.handleRemovingScrollBlock();
this.handleRemovingScrollToUpdatePosition();
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState) {
var _this$state = this.state,
isPopupReady = _this$state.isPopupReady,
isMobile = _this$state.isMobile;
var _ref2 = prevState || {},
_ref2$isPopupReady = _ref2.isPopupReady,
oldStateOpen = _ref2$isPopupReady === void 0 ? false : _ref2$isPopupReady,
oldIsMobileState = _ref2.isMobile;
var dropElement = this.dropElement;
var propResizeHandling = this.props.needResizeHandling;
if (oldStateOpen !== isPopupReady) {
if (isPopupReady && dropElement && (propResizeHandling !== undefined ? propResizeHandling : needResizeHandling)) {
this.popupObserver.replaceObservationElement(dropElement);
} else if (!isPopupReady) {
this.size = null;
this.popupObserver.disconnect();
}
}
if (oldStateOpen !== isPopupReady && !isMobile || oldIsMobileState !== isMobile) {
this.handleScrollAndBlockEvents(isPopupReady, isMobile);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
var _this2 = this;
var group = this.getGroup();
popups = Object.keys(popups).reduce(function (res, groupName) {
if (groupName === group) {
var groupPopups = popups[group];
var newGroupPopups = groupPopups.filter(function (popup) {
return popup !== _this2;
});
newGroupPopups.length === 0 && lastOpenedGroup.indexOf(group) >= 0 && lastOpenedGroup.splice(lastOpenedGroup.indexOf(group), 1);
res[group] = newGroupPopups;
}
return res;
}, popups);
this.handleRemovingScrollBlock();
this.handleRemovingScrollToUpdatePosition();
var noPopups = true;
for (var i in popups) {
if (popups[i].length >= 1) {
noPopups = false;
break;
}
}
if (this.popupObserver) {
this.popupObserver.disconnect();
}
if (noPopups) {
document.removeEventListener('click', this.documentClickHandler);
document.removeEventListener('keyup', this.documentKeyupHandler); // document.removeEventListener('scroll', this.handleScroll);
window.removeEventListener('resize', this.handleResize);
document.removeEventListener('click', this.documentClickHandler1, true);
document.removeEventListener('mousedown', this.handleDocumentMouseDown, true);
document.removeEventListener('focus', this.handleDocumentFocus, true);
}
}
}, {
key: "handleAddingScrollBlock",
value: function handleAddingScrollBlock() {
var isAbsolutePositioningNeeded = this.getIsAbsolutePopup(this);
var isOutsideScrollBlocked = this.getIsOutsideScrollBlocked(this);
if (isOutsideScrollBlocked && !isAbsolutePositioningNeeded) {
(0, _intersectionObserver.addIntersectionObserver)(this.placeHolderElement, this.handleIntersectionObserver);
this.addScrollBlockListeners();
}
}
}, {
key: "handleRemovingScrollBlock",
value: function handleRemovingScrollBlock() {
var isAbsolutePositioningNeeded = this.getIsAbsolutePopup(this);
var isOutsideScrollBlocked = this.getIsOutsideScrollBlocked(this);
if (isOutsideScrollBlocked && !isAbsolutePositioningNeeded) {
(0, _intersectionObserver.removeIntersectionObserver)(this.placeHolderElement, this.handleIntersectionObserver);
this.removeScrollBlockListeners();
}
}
}, {
key: "handleAddingScrollToUpdatePosition",
value: function handleAddingScrollToUpdatePosition() {
var isAbsolutePositioningNeeded = this.getIsAbsolutePopup(this);
var isOutsideScrollBlocked = this.getIsOutsideScrollBlocked(this);
if (!isOutsideScrollBlocked && !isAbsolutePositioningNeeded) {
(0, _intersectionObserver.addIntersectionObserver)(this.placeHolderElement, this.updateVisibilityOnIntersection);
document.addEventListener('scroll', this.updatePositionOnScroll, {
capture: true,
passive: false
});
}
}
}, {
key: "handleRemovingScrollToUpdatePosition",
value: function handleRemovingScrollToUpdatePosition() {
var isAbsolutePositioningNeeded = this.getIsAbsolutePopup(this);
var isOutsideScrollBlocked = this.getIsOutsideScrollBlocked(this);
if (!isOutsideScrollBlocked && !isAbsolutePositioningNeeded) {
(0, _intersectionObserver.removeIntersectionObserver)(this.placeHolderElement, this.updateVisibilityOnIntersection);
document.removeEventListener('scroll', this.updatePositionOnScroll, {
capture: true,
passive: false
});
}
}
}, {
key: "handleDropElementStyleUpdate",
value: function handleDropElementStyleUpdate(_ref3) {
var _ref3$top = _ref3.top,
top = _ref3$top === void 0 ? '' : _ref3$top,
_ref3$left = _ref3.left,
left = _ref3$left === void 0 ? '' : _ref3$left,
_ref3$bottom = _ref3.bottom,
bottom = _ref3$bottom === void 0 ? '' : _ref3$bottom,
_ref3$right = _ref3.right,
right = _ref3$right === void 0 ? '' : _ref3$right;
var dropElement = this.dropElement;
Object.assign(dropElement.style, {
top: top ? "".concat(top, "px") : '',
left: left ? "".concat(left, "px") : '',
right: right ? "".concat(right, "px") : '',
bottom: bottom ? "".concat(bottom, "px") : ''
});
}
}, {
key: "setContainerDynamicPositioning",
value: function setContainerDynamicPositioning(betterPosition, needArrow) {
var dropElement = this.dropElement;
var isMobile = this.state.isMobile;
var _ref4 = betterPosition || _Common.DUMMY_OBJECT,
view = _ref4.view,
viewsOffset = _ref4.viewsOffset;
var styleToApply = (0, _selectn["default"])("".concat(view), viewsOffset);
if (isMobile) {
this.handleDropElementStyleUpdate({
top: '',
left: '',
right: '',
bottom: ''
});
} else {
this.handleDropElementStyleUpdate(styleToApply);
if (this.positionRef.current !== view) {
dropElement.setAttribute('data-position', "".concat(view));
dropElement.setAttribute('data-box-direction', (0, _selectn["default"])("".concat(view, ".direction"), _DropBoxPositionMapping.positionMapping));
if (needArrow) {
dropElement.setAttribute('data-arrow-position', (0, _selectn["default"])("".concat(view, ".arrowPosition"), _DropBoxPositionMapping.positionMapping));
}
this.positionRef.current = view;
}
}
}
}, {
key: "updatePositionOnScroll",
value: function updatePositionOnScroll(e) {
var placeHolderElement = this.placeHolderElement,
defaultPosition = this.defaultPosition,
isTargetElementVisible = this.isTargetElementVisible;
if (e.target.contains(placeHolderElement) && isTargetElementVisible) {
this.handlePopupPosition(defaultPosition, true);
}
}
}, {
key: "addScrollBlockListeners",
value: function addScrollBlockListeners() {
document.addEventListener('wheel', this.handleBlockScroll, {
capture: true,
passive: false
});
document.addEventListener('touchmove', this.handleBlockScroll, {
capture: true,
passive: false
});
document.addEventListener('scroll', this.handlePositionChange, {
capture: true,
passive: false
});
document.addEventListener('keydown', this.preventKeyboardScroll, {
capture: true,
passive: false
});
}
}, {
key: "removeScrollBlockListeners",
value: function removeScrollBlockListeners() {
document.removeEventListener('wheel', this.handleBlockScroll, {
capture: true,
passive: false
});
document.removeEventListener('touchmove', this.handleBlockScroll, {
capture: true,
passive: false
});
document.removeEventListener('scroll', this.handlePositionChange, {
capture: true,
passive: false
});
document.removeEventListener('keydown', this.preventKeyboardScroll, {
capture: true,
passive: false
});
}
}, {
key: "handleBlockScroll",
value: function handleBlockScroll(event) {
// const targetElement = this.placeHolderElement;
var containerElement = this.dropElement;
if (containerElement && containerElement !== event.target && !containerElement.contains(event.target)) {
// --- Scroll exclude Target & Container elements --- For reference. Will adopt in future
// if(
// (containerElement && (containerElement !== event.target && !containerElement.contains(event.target)))
// && (targetElement && (targetElement !== event.target && !targetElement.contains(event.target)))
// ) {
event.preventDefault();
}
}
}, {
key: "handlePositionChange",
value: function handlePositionChange(event) {
var targetElement = this.placeHolderElement;
var containerElement = this.dropElement;
if (containerElement && containerElement !== event.target && !containerElement.contains(event.target) && targetElement && targetElement !== event.target && !targetElement.contains(event.target) && event.target.contains(targetElement)) {
this.handlePopupPosition(this.state.position, true); // this.closePopupOnly(event);
}
}
}, {
key: "preventKeyboardScroll",
value: function preventKeyboardScroll(event) {
var containerElement = this.dropElement;
var keys = [32, 37, 38, 39, 40]; // Space, Arrow keys
if (containerElement && containerElement !== event.target && !containerElement.contains(event.target) && keys.includes(event.keyCode)) {
event.preventDefault();
}
}
}, {
key: "handleIntersectionObserver",
value: function handleIntersectionObserver(entry) {
if (entry.intersectionRatio === 0 && entry.isIntersecting === false) {
this.closePopupOnly();
}
}
}, {
key: "updateVisibilityOnIntersection",
value: function updateVisibilityOnIntersection(entry) {
var dropElement = this.dropElement;
if (entry.isIntersecting === true) {
this.isTargetElementVisible = true;
dropElement.setAttribute('data-visible', 'visible');
} else if (entry.intersectionRatio === 0 && entry.isIntersecting === false) {
this.isTargetElementVisible = false;
dropElement.setAttribute('data-visible', 'hidden');
}
}
}, {
key: "getGroup",
value: function getGroup() {
var popupGroup = this.props.popupGroup;
return popupGroup || group;
}
}, {
key: "getNeedArrow",
value: function getNeedArrow(popup) {
var isArrow = popup.props.isArrow;
var needPopupArrow = popup.needPopupArrow;
return isArrow !== undefined ? isArrow : needPopupArrow;
} // getScrollDebounceTime(popup) {
// const { scrollDebounceTime } = popup.props;
// const { scrollDebounceTime: popupScrollDebounceTime } = popup;
// return scrollDebounceTime !== undefined ? scrollDebounceTime : popupScrollDebounceTime;
// }
}, {
key: "getCloseOnScrollPopup",
value: function getCloseOnScrollPopup(popup) {
var closeOnScroll = popup.props.closeOnScroll;
var closeOnScrollPopup = popup.closeOnScroll;
return closeOnScroll !== undefined ? closeOnScroll : closeOnScrollPopup;
}
}, {
key: "getIsAbsolutePopup",
value: function getIsAbsolutePopup(popup) {
var isAbsolutePositioningNeeded = popup.props.isAbsolutePositioningNeeded;
var isAbsolutePopup = popup.isAbsolutePopup;
return isAbsolutePositioningNeeded !== undefined ? isAbsolutePositioningNeeded : isAbsolutePopup;
}
}, {
key: "getIsOutsideScrollBlocked",
value: function getIsOutsideScrollBlocked(popup) {
var isOutsideScrollBlocked = popup.props.isOutsideScrollBlocked;
var isOutsideScrollBlock = popup.isOutsideScrollBlock;
return isOutsideScrollBlocked !== undefined ? isOutsideScrollBlocked : isOutsideScrollBlock;
}
}, {
key: "getCustomPositionOrder",
value: function getCustomPositionOrder(popup) {
var _popup$props$customOr = popup.props.customOrder,
customOrder = _popup$props$customOr === void 0 ? [] : _popup$props$customOr;
var customPositionOrder = popup.customPositionOrder;
return customOrder.length !== 0 ? customOrder : customPositionOrder;
}
}, {
key: "togglePopup",
value: function togglePopup(e, defaultPosition) {
var _this3 = this;
var group = this.getGroup();
this.removeClose(e);
var isPopupOpen = this.state.isPopupOpen;
var groupPopups = popups[group] || [];
lastOpenedGroup = !isPopupOpen && lastOpenedGroup.indexOf(group) === -1 ? [group].concat(_toConsumableArray(lastOpenedGroup)) : lastOpenedGroup;
isPopupOpen && lastOpenedGroup.splice(0, 1);
groupPopups.forEach(function (popup) {
if (popup !== _this3 && popup.state.isPopupOpen) {
popup.setState({
isPopupOpen: false,
isPopupReady: false
});
}
});
if (isPopupOpen) {
this.setState({
isPopupOpen: false,
isPopupReady: false
});
} else {
this.handlePopupPosition(defaultPosition);
}
}
}, {
key: "openPopupOnly",
value: function openPopupOnly(e, defaultPosition) {
var group = this.getGroup();
this.removeClose(e);
lastOpenedGroup = lastOpenedGroup.indexOf(group) === -1 ? [group].concat(_toConsumableArray(lastOpenedGroup)) : lastOpenedGroup;
this.handlePopupPosition(defaultPosition);
}
}, {
key: "closePopupOnly",
value: function closePopupOnly(e) {
this.removeClose(e);
lastOpenedGroup.splice(0, 1);
var isPopupOpen = this.state.isPopupOpen;
if (isPopupOpen) {
this.setState({
isPopupOpen: false,
isPopupReady: false
});
}
}
}, {
key: "handleCloseLastOpenedGroup",
value: function handleCloseLastOpenedGroup() {
var groupPopups = lastOpenedGroup.length ? popups[lastOpenedGroup[0]] || [] : [];
lastOpenedGroup.splice(0, 1);
groupPopups.forEach(function (popup) {
popup.state.isPopupOpen && popup.setState({
isPopupOpen: false,
isPopupReady: false
});
});
}
}, {
key: "handleDocumentMouseDown",
value: function handleDocumentMouseDown(e) {
var needPrevent = this.handleGetNeedPrevent(e);
if (needPrevent) {
this.removeClose(e);
}
}
}, {
key: "handleDocumentFocus",
value: function handleDocumentFocus(e) {
var needPrevent = this.handleGetNeedPrevent(e);
if (needPrevent) {
this.removeClose(e);
}
}
}, {
key: "handleGetNeedPrevent",
value: function handleGetNeedPrevent(e) {
var needPrevent = false;
if (lastOpenedGroup.length > 1) {
var target = e.target;
var groupPopups = lastOpenedGroup.length ? popups[lastOpenedGroup[0]] : [];
var openedPopup = null; // eslint-disable-next-line guard-for-in
for (var i in groupPopups) {
var isPopupOpen = groupPopups[i].state.isPopupOpen;
if (isPopupOpen) {
openedPopup = groupPopups[i];
break;
}
}
if (openedPopup) {
var _openedPopup = openedPopup,
dropElement = _openedPopup.dropElement,
placeHolderElement = _openedPopup.placeHolderElement;
var isDropBoxChild = (0, _Common.isDescendant)(dropElement, target);
var isTargetChild = (0, _Common.isDescendant)(placeHolderElement, target); // const isPopupMassUpdateChild = isDescendant(
// massUpdateParent,
// dropElement
// );
if (!isDropBoxChild && !isTargetChild // && isPopupMassUpdateChild
) {
needPrevent = true;
}
}
}
return needPrevent;
}
}, {
key: "documentClickHandler1",
value: function documentClickHandler1(e) {
var needPrevent = this.handleGetNeedPrevent(e);
if (needPrevent) {
this.removeClose(e);
this.handleCloseLastOpenedGroup();
}
}
}, {
key: "documentClickHandler",
value: function documentClickHandler() {
try {
Object.keys(popups).forEach(function (groupName) {
var groupPopups = popups[groupName] || [];
groupPopups.forEach(function (popup) {
popup.state.isPopupOpen && (!popup.props.checkBeforeClose || popup.props.checkBeforeClose && popup.props.checkBeforeClose()) && !(0, _Common.isTextSelected)() && popup.setState({
isPopupOpen: false,
isPopupReady: false
});
});
});
lastOpenedGroup = [];
} catch (e) {// eslint-disable-next-line no-console
//console.error('popup component not unmounted properly', e);
}
}
}, {
key: "documentKeyupHandler",
value: function documentKeyupHandler(e) {
try {
if (e.keyCode === 27) {
this.handleCloseLastOpenedGroup();
}
} catch (e) {// eslint-disable-next-line no-console
//console.log('error', e);
}
}
}, {
key: "removeClose",
value: function removeClose(e) {
// e && e.preventDefault && e.preventDefault();
(0, _Common.cancelBubblingEffect)(e);
}
}, {
key: "updatePopupState",
value: function updatePopupState(view, views, viewsOffset, targetOffset, popupOffset, isAbsolute) {
var isMobile = (0, _isMobilePopover["default"])(true);
this.setState({
isPopupReady: true,
position: view,
positions: views,
positionsOffset: viewsOffset,
targetOffset: targetOffset,
popupOffset: popupOffset,
isAbsolutePositioningNeeded: isAbsolute,
isMobile: isMobile
});
}
}, {
key: "handlePopupPosition",
value: function handlePopupPosition() {
var _this4 = this;
var defaultPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'bottomCenter';
var isUpdatePosition = arguments.length > 1 ? arguments[1] : undefined;
// isUpdatePosition --->>> Window resize and dropBox resize and to update the position
var _ref5 = this.context || {},
direction = _ref5.direction;
var placeHolderElement = this.placeHolderElement,
dropElement = this.dropElement;
var needArrow = this.getNeedArrow(this);
var isAbsolute = this.getIsAbsolutePopup(this);
var customOrder = this.getCustomPositionOrder(this);
if (direction === 'rtl') {
defaultPosition = isAbsolute ? _PositionMapping.rtlAbsolutePositionMapping[defaultPosition] : _PositionMapping.rtlFixedPositionMapping[defaultPosition];
} else {
defaultPosition = isAbsolute ? _PositionMapping.absolutePositionMapping[defaultPosition] : defaultPosition;
}
if (!placeHolderElement && !dropElement) {
var isMobile = (0, _isMobilePopover["default"])(true);
this.setState({
isPopupOpen: true,
isPopupReady: true,
isMobile: isMobile
});
return;
}
var setPosition = function setPosition() {
requestAnimationFrame(function () {
var placeHolderElement = _this4.placeHolderElement,
dropElement = _this4.dropElement;
var _this4$state = _this4.state,
position = _this4$state.position,
isPopupReady = _this4$state.isPopupReady;
var scrollContainer = placeHolderElement.closest('[data-scroll=true]') || document.body;
var betterPosition = _viewPort["default"].betterView(dropElement, placeHolderElement, defaultPosition, scrollContainer, {
needArrow: needArrow,
isAbsolute: isAbsolute,
customOrder: customOrder
});
var _ref6 = betterPosition || _Common.DUMMY_OBJECT,
view = _ref6.view,
views = _ref6.views,
viewsOffset = _ref6.viewsOffset,
targetOffset = _ref6.targetOffset,
popupOffset = _ref6.popupOffset;
if (!isAbsolute) {
if (!isPopupReady) {
_this4.updatePopupState(view, views, viewsOffset, targetOffset, popupOffset, isAbsolute);
}
if (!dropElement) {
return;
}
_this4.setContainerDynamicPositioning(betterPosition, needArrow);
} else {
if (position !== view || !isPopupReady) {
_this4.updatePopupState(view, views, viewsOffset, targetOffset, popupOffset, isAbsolute);
}
}
});
};
if (isUpdatePosition) {
setPosition();
} else {
this.defaultPosition = defaultPosition;
this.setState({
isPopupOpen: true,
isPopupReady: false
}, setPosition);
}
}
}, {
key: "handleOpenPopupPositionChange",
value: function handleOpenPopupPositionChange() {
var _this5 = this;
Object.keys(popups).forEach(function (groupName) {
var groupPopups = popups[groupName] || [];
groupPopups.forEach(function (popup) {
if (popup.state.isPopupOpen) {
var placeHolderElement = popup.placeHolderElement,
dropElement = popup.dropElement,
defaultPosition = popup.defaultPosition;
var _popup$state = popup.state,
position = _popup$state.position,
_popup$state$position = _popup$state.positionsOffset,
positionsOffset = _popup$state$position === void 0 ? {} : _popup$state$position;
if (placeHolderElement && dropElement) {
var scrollContainer = placeHolderElement.closest('[data-scroll=true]') || document.body;
requestAnimationFrame(function () {
var needArrow = _this5.getNeedArrow(popup);
var isAbsolute = _this5.getIsAbsolutePopup(popup);
var customOrder = _this5.getCustomPositionOrder(popup);
var isMobile = (0, _isMobilePopover["default"])(true);
var betterPosition = _viewPort["default"].betterView(dropElement, placeHolderElement, defaultPosition, scrollContainer, {
needArrow: needArrow,
isAbsolute: isAbsolute,
customOrder: customOrder
});
var _ref7 = betterPosition || {},
view = _ref7.view,
views = _ref7.views,
_ref7$viewsOffset = _ref7.viewsOffset,
viewsOffset = _ref7$viewsOffset === void 0 ? {} : _ref7$viewsOffset,
targetOffset = _ref7.targetOffset,
popupOffset = _ref7.popupOffset;
var _ref8 = positionsOffset[position] || {},
_ref8$left = _ref8.left,
oldLeft = _ref8$left === void 0 ? '' : _ref8$left,
_ref8$top = _ref8.top,
oldTop = _ref8$top === void 0 ? '' : _ref8$top,
_ref8$bottom = _ref8.bottom,
oldBottom = _ref8$bottom === void 0 ? '' : _ref8$bottom,
_ref8$right = _ref8.right,
oldRight = _ref8$right === void 0 ? '' : _ref8$right;
var _ref9 = viewsOffset[view] || {},
_ref9$left = _ref9.left,
left = _ref9$left === void 0 ? '' : _ref9$left,
_ref9$top = _ref9.top,
top = _ref9$top === void 0 ? '' : _ref9$top,
_ref9$bottom = _ref9.bottom,
bottom = _ref9$bottom === void 0 ? '' : _ref9$bottom,
_ref9$right = _ref9.right,
right = _ref9$right === void 0 ? '' : _ref9$right;
var changeState = isAbsolute ? position !== view : oldLeft !== left || oldTop !== top || oldBottom !== bottom || oldRight !== right; // let isInViewPort = viewPort.isInViewPort(
// placeHolderElement,
// scrollContainer
// );
if (changeState) {
popup.setState({
position: view,
positions: views,
positionsOffset: viewsOffset,
targetOffset: targetOffset,
popupOffset: popupOffset,
isAbsolutePositioningNeeded: isAbsolute,
isMobile: isMobile
});
} // if (!isInViewPort && !isAbsolute) {
// popup.setState({ isPopupOpen: false, isPopupReady: false });
// } else if (view && changeState) {
// popup.setState({
// position: view,
// positions: views,
// positionsOffset: viewsOffset,
// targetOffset,
// popupOffset,
// isAbsolutePositioningNeeded: isAbsolute
// });
// }
});
}
}
});
});
}
}, {
key: "handleResize",
value: function handleResize() {
this.handleOpenPopupPositionChange();
} // handleScroll(e) {
// // this.handleOpenPopupPositionChange();
// const { closeOnScroll } = this.getCloseOnScrollPopup(this);
// const { isPopupReady } = this.state;
// if (isPopupReady) {
// console.log('onscrollPopupREady');
// }
// if (isPopupReady && closeOnScroll) {
// console.log(this, 'handle Scroll');
// this.togglePopup(e);
// }
// }
}, {
key: "handlePopupResize",
value: function handlePopupResize(popupSize) {
var height = popupSize.height,
width = popupSize.width;
var _ref10 = this.size || {},
_ref10$height = _ref10.height,
oldHeight = _ref10$height === void 0 ? 0 : _ref10$height,
_ref10$width = _ref10.width,
oldWidth = _ref10$width === void 0 ? 0 : _ref10$width;
var _this$state2 = this.state,
isPopupReady = _this$state2.isPopupReady,
position = _this$state2.position;
if (isPopupReady && this.size && (oldHeight !== height || width !== oldWidth)) {
this.handlePopupPosition(position, true);
}
this.size = popupSize;
}
}, {
key: "getTargetRef",
value: function getTargetRef(el) {
this.placeHolderElement = el;
}
}, {
key: "getContainerRef",
value: function getContainerRef(el) {
this.dropElement = el;
}
}, {
key: "render",
value: function render() {
// const { isPopupReady, isPopupOpen } = this.state;
var _this$state3 = this.state,
isMobile = _this$state3.isMobile,
restState = _objectWithoutProperties(_this$state3, _excluded); // const localState = isPopupReady ? this.state : {};
return /*#__PURE__*/_react["default"].createElement(Component, _extends({}, this.props, restState, {
openPopupOnly: this.openPopupOnly,
closePopupOnly: this.closePopupOnly,
togglePopup: this.togglePopup,
removeClose: this.removeClose,
getTargetRef: this.getTargetRef,
getContainerRef: this.getContainerRef
}));
}
}]);
return Popup;
}(_react["default"].Component);
Popup.displayName = Component.displayName || Component.name || Popup.name;
Popup.contextTypes = _propTypes.ContextTypes;
Popup.propTypes = _propTypes.PopupPropTypes;
return (0, _hoistNonReactStatics["default"])(Popup, Component);
};
var _default = Popup;
exports["default"] = _default;