UNPKG

ukelli-ui

Version:

Base on React's UI lib. Make frontend's dev simpler and faster.

184 lines (183 loc) 7.69 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import React, { Component } from 'react'; import { TransitionGroup, CSSTransition } from 'react-transition-group'; import { getElementOffset } from '../utils/get-elem-offset'; import { getLeft, getRight, getTop, getBottom } from '../utils/position'; var ESC_KEY = 27; function getChildrenKeys(children) { if (!children) return []; var _children = Array.isArray(children) ? children : [children]; var childrenKeys = _children.map(function (item) { return item.key; }); return childrenKeys; } var Popover = /** @class */ (function (_super) { __extends(Popover, _super); function Popover(props) { var _this = _super.call(this, props) || this; _this.readPosition = ''; _this.shouldComponentUpdate = function (nextProps) { var shouldUpdate = typeof nextProps.update === 'undefined' ? true : nextProps.update; return shouldUpdate; }; _this.handleKeyDown = function (event) { if (event.keyCode === ESC_KEY) { event.preventDefault(); event.stopPropagation(); _this.props.onClose(event); } }; _this.setContentFocus = function () { _this.popoverDOM && _this.popoverDOM.focus && _this.popoverDOM.focus(); }; _this.setSelfPosition = function (elem) { if (!elem) return; var position = _this.props.position; _this.popoverDOM = elem; var popoverScale = { width: elem.offsetWidth, height: elem.offsetHeight, }; var nextPositionStyle = _this.calaStyle(position, popoverScale); var positionStyle = _this.state.positionStyle; if (JSON.stringify(nextPositionStyle) !== JSON.stringify(positionStyle)) { _this.setState({ positionStyle: nextPositionStyle }); } }; _this.state = { positionStyle: { position: 'bottom', top: 0, left: 0, }, prevProps: props, childrenChange: false }; return _this; } Popover.getDerivedStateFromProps = function (nextProps, _a) { var prevProps = _a.prevProps; var hasChangeChildren = JSON.stringify(getChildrenKeys(nextProps.children)) !== JSON.stringify(getChildrenKeys(prevProps.children)); if (hasChangeChildren) { return { childrenChange: true, prevProps: nextProps }; } return null; }; Popover.prototype.componentDidMount = function () { this.setContentFocus(); // this.setPopoverOffset(); }; Popover.prototype.componentDidUpdate = function (prevProps, prevState) { this.setContentFocus(); if (prevState.childrenChange) { this.__isMounted && this.setState({ childrenChange: false }); } }; Popover.prototype.getRelativeElemOffset = function () { var relativeElem = this.props.relativeElem; var _a = relativeElem, _b = _a.offsetWidth, offsetWidth = _b === void 0 ? 0 : _b, _c = _a.offsetHeight, offsetHeight = _c === void 0 ? 0 : _c; var _d = getElementOffset(relativeElem) || {}, _e = _d.offsetTop, offsetTop = _e === void 0 ? 0 : _e, _f = _d.offsetLeft, offsetLeft = _f === void 0 ? 0 : _f; return { offsetWidth: offsetWidth, offsetHeight: offsetHeight, offsetTop: offsetTop, offsetLeft: offsetLeft }; }; Popover.prototype.calaStyle = function (position, popoverScale) { var _a = this.getRelativeElemOffset(), offsetTop = _a.offsetTop, offsetLeft = _a.offsetLeft, offsetWidth = _a.offsetWidth, offsetHeight = _a.offsetHeight; var height = popoverScale.height, width = popoverScale.width; var positionStyle = { left: 0, top: 0, position: 'top' }; var args = { offsetTop: offsetTop, offsetLeft: offsetLeft, offsetWidth: offsetWidth, offsetHeight: offsetHeight, elemWidth: width, verticalOffset: 8, elemHeight: height }; switch (position) { case 'left': positionStyle = getLeft(args); break; case 'bottom': positionStyle = getBottom(args); break; case 'top': positionStyle = getTop(args); break; case 'right': positionStyle = getRight(args); break; } return positionStyle; }; Popover.prototype.render = function () { var _this = this; var _a = this.props, open = _a.open, children = _a.children, relativeElem = _a.relativeElem, _b = _a.className, className = _b === void 0 ? '' : _b, onClose = _a.onClose, fixed = _a.fixed, type = _a.type, style = _a.style, showCloseBtn = _a.showCloseBtn, enableTabIndex = _a.enableTabIndex; if (!relativeElem) return React.createElement("span", null); var positionStyle = this.state.positionStyle; var top = positionStyle.top, left = positionStyle.left, position = positionStyle.position; var _style = Object.assign({}, style, { top: top, left: left, }); var container = (React.createElement("span", null)); var transitionKey = open ? 'popover' : 'popover-close'; if (open) { var closeBtn = showCloseBtn && (React.createElement("div", { className: "_close-btn", onClick: function (e) { return onClose(); } }, "x")); var obj = enableTabIndex ? { tabIndex: -1, onKeyDown: this.handleKeyDown } : {}; container = (React.createElement("div", __assign({}, obj, { className: "__popover" + (fixed ? ' fixed' : '') + (showCloseBtn ? ' has-close' : '') + " " + position + " " + className + " " + type, style: _style, ref: function (e) { return _this.setSelfPosition(e); } }), React.createElement("span", { className: "caret" }), children, closeBtn)); } return (React.createElement(TransitionGroup, null, React.createElement(CSSTransition, { key: transitionKey, classNames: "popover", timeout: 200 }, container))); }; Popover.defaultProps = { position: 'right', type: 'white', showCloseBtn: true, enableTabIndex: true, }; return Popover; }(Component)); export default Popover;