@visactor/react-vtable
Version:
The react version of VTable
260 lines (230 loc) • 7.13 kB
JavaScript
import { isValid, merge } from "@visactor/vutils";
import React, { useCallback, useEffect, useState } from "react";
import { Group } from "../../table-components";
const defaultProps = {
defaultPopupVisible: !1,
position: "top"
}, defaultPoptipPanelStyle = {
backgroundColor: "rgb(255, 255, 255)",
boxShadow: "0 4px 10px rgba(0, 0, 0, .1)",
fontSize: "14px",
borderRadius: "4px",
lineHeight: "1.5715",
boxSizing: "border-box",
color: "rgb(78, 89, 105)",
border: "1px solid rgb(229, 230, 235)",
padding: "12px 16px"
}, Tooltip = props => {
const arrowStyle = Object.assign(Object.assign({
content: "",
height: "8px",
width: "8px",
position: "absolute",
display: "block",
boxSizing: "border-box",
transform: "rotate(45deg)",
transformOrigin: "50% 50% 0",
backgroundColor: "rgb(255, 255, 255)",
border: "1px solid rgb(229, 230, 235)"
}, getArrowStyle(props.position)), props.arrowStyle);
return props.visible ? React.createElement(React.Fragment, null, React.createElement("div", {
style: merge({}, defaultPoptipPanelStyle, props.panelStyle)
}, props.content), React.createElement("div", {
style: arrowStyle
})) : React.createElement(React.Fragment, null);
};
function PopoverComponent(baseProps, ref) {
const props = merge({}, defaultProps, baseProps), {content: content, position: position, popupVisible: popupVisible, defaultPopupVisible: defaultPopupVisible, panelStyle: panelStyle, arrowStyle: arrowStyle, children: children} = props;
let popoverRef = React.useRef(null);
popoverRef = ref || popoverRef;
const [popupOpen, setPopupOpen] = useState(!1);
useEffect((() => {
setPopupOpen(!!popupVisible), popoverRef.current.stage.renderNextFrame();
}), [ popupVisible ]), useEffect((() => {
var _a;
setPopupOpen(null !== (_a = null != popupVisible ? popupVisible : defaultPopupVisible) && void 0 !== _a && _a);
}), []);
const {transform: transform, anchorType: anchorType} = getTransform(position), groupAttribute = {
react: {
style: {
transform: transform
},
element: React.createElement(Tooltip, {
visible: popupOpen,
content: content,
position: position,
panelStyle: panelStyle,
arrowStyle: arrowStyle
}),
container: null,
visible: !0,
pointerEvents: !1,
anchorType: anchorType
}
}, groupMouseEnter = useCallback((event => {
isValid(popupVisible) || (setPopupOpen(!0), event.currentTarget.stage.renderNextFrame());
}), []), groupMouseLeave = useCallback((event => {
isValid(popupVisible) || (setPopupOpen(!1), event.currentTarget.stage.renderNextFrame());
}), []);
return React.createElement(Group, {
ref: popoverRef,
attribute: groupAttribute,
onMouseEnter: groupMouseEnter,
onMouseLeave: groupMouseLeave
}, children);
}
function getTransform(position) {
switch (position) {
case "top":
return {
anchorType: "top",
transform: "translate(-50%, calc(-100% - 10px))"
};
case "tl":
return {
anchorType: "top-left",
transform: "translate(0, calc(-100% - 10px))"
};
case "tr":
return {
anchorType: "top-right",
transform: "translate(-100%, calc(-100% - 10px))"
};
case "bottom":
return {
anchorType: "bottom",
transform: "translate(-50%, 10px)"
};
case "bl":
return {
anchorType: "bottom-left",
transform: "translate(0, 10px)"
};
case "br":
return {
anchorType: "bottom-right",
transform: "translate(-100%, 10px)"
};
case "left":
return {
anchorType: "left",
transform: "translate(calc(-100% - 10px), -50%)"
};
case "lt":
return {
anchorType: "top-left",
transform: "translate(calc(-100% - 10px), 0)"
};
case "lb":
return {
anchorType: "bottom-left",
transform: "translate(calc(-100% - 10px), -100%)"
};
case "right":
return {
anchorType: "right",
transform: "translate(10px, -50%)"
};
case "rt":
return {
anchorType: "top-right",
transform: "translate(10px, 0)"
};
case "rb":
return {
anchorType: "bottom-right",
transform: "translate(10px, -100%)"
};
}
}
function getArrowStyle(position) {
switch (position) {
case "top":
return {
top: "calc(100% - 5px)",
left: "calc(50% - 5px)",
borderTop: "none",
borderLeft: "none"
};
case "tl":
return {
top: "calc(100% - 4px)",
left: "14px",
borderTop: "none",
borderLeft: "none"
};
case "tr":
return {
top: "calc(100% - 4px)",
left: "calc(100% - 24px)",
borderTop: "none",
borderLeft: "none"
};
case "bottom":
return {
top: "-4px",
left: "calc(50% - 4px)",
borderRight: "none",
borderBottom: "none"
};
case "bl":
return {
top: "-4px",
left: "14px",
borderRight: "none",
borderBottom: "none"
};
case "br":
return {
top: "-4px",
left: "calc(100% - 24px)",
borderRight: "none",
borderBottom: "none"
};
case "left":
return {
top: "calc(50% - 4px)",
left: "calc(100% - 5px)",
borderLeft: "none",
borderBottom: "none"
};
case "lt":
return {
top: "14px",
left: "calc(100% - 5px)",
borderLeft: "none",
borderBottom: "none"
};
case "lb":
return {
top: "calc(100% - 24px)",
left: "calc(100% - 5px)",
borderLeft: "none",
borderBottom: "none"
};
case "right":
return {
top: "calc(50% - 4px)",
left: "-4px",
borderRight: "none",
borderTop: "none"
};
case "rt":
return {
top: "14px",
left: "-4px",
borderRight: "none",
borderTop: "none"
};
case "rb":
return {
top: "calc(100% - 24px)",
left: "-4px",
borderRight: "none",
borderTop: "none"
};
}
}
export const Popover = React.forwardRef(PopoverComponent);
Popover.displayName = "Popover";
//# sourceMappingURL=popover.js.map