317 lines
13 KiB
JavaScript
317 lines
13 KiB
JavaScript
"use strict";
|
|
'use client';
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ChartsTooltipContainer = ChartsTooltipContainer;
|
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
var React = _interopRequireWildcard(require("react"));
|
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
var _HTMLElementType = _interopRequireDefault(require("@mui/utils/HTMLElementType"));
|
|
var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
|
|
var _styles = require("@mui/material/styles");
|
|
var _Popper = _interopRequireDefault(require("@mui/material/Popper"));
|
|
var _NoSsr = _interopRequireDefault(require("@mui/material/NoSsr"));
|
|
var _rafThrottle = require("@mui/x-internals/rafThrottle");
|
|
var _utils = require("./utils");
|
|
var _chartsTooltipClasses = require("./chartsTooltipClasses");
|
|
var _useSelector = require("../internals/store/useSelector");
|
|
var _useStore = require("../internals/store/useStore");
|
|
var _useChartInteraction = require("../internals/plugins/featurePlugins/useChartInteraction");
|
|
var _useChartCartesianAxis = require("../internals/plugins/featurePlugins/useChartCartesianAxis");
|
|
var _useChartPolarInteraction = require("../internals/plugins/featurePlugins/useChartPolarAxis/useChartPolarInteraction.selectors");
|
|
var _useAxisSystem = require("../hooks/useAxisSystem");
|
|
var _hooks = require("../hooks");
|
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
const _excluded = ["trigger", "classes", "children"];
|
|
const noAxis = () => false;
|
|
const ChartsTooltipRoot = (0, _styles.styled)(_Popper.default, {
|
|
name: 'MuiChartsTooltip',
|
|
slot: 'Root'
|
|
})(({
|
|
theme
|
|
}) => ({
|
|
pointerEvents: 'none',
|
|
zIndex: theme.zIndex.modal
|
|
}));
|
|
|
|
/**
|
|
* Demos:
|
|
*
|
|
* - [ChartsTooltip](https://mui.com/x/react-charts/tooltip/)
|
|
*
|
|
* API:
|
|
*
|
|
* - [ChartsTooltip API](https://mui.com/x/api/charts/charts-tool-tip/)
|
|
*/
|
|
function ChartsTooltipContainer(inProps) {
|
|
const props = (0, _styles.useThemeProps)({
|
|
props: inProps,
|
|
name: 'MuiChartsTooltipContainer'
|
|
});
|
|
const {
|
|
trigger = 'axis',
|
|
classes: propClasses,
|
|
children
|
|
} = props,
|
|
other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
|
|
const svgRef = (0, _hooks.useSvgRef)();
|
|
const classes = (0, _chartsTooltipClasses.useUtilityClasses)(propClasses);
|
|
const pointerType = (0, _utils.usePointerType)();
|
|
const isFineMainPointer = (0, _utils.useIsFineMainPointer)();
|
|
const popperRef = React.useRef(null);
|
|
const positionRef = (0, _useLazyRef.default)(() => ({
|
|
x: 0,
|
|
y: 0
|
|
}));
|
|
const axisSystem = (0, _useAxisSystem.useAxisSystem)();
|
|
const store = (0, _useStore.useStore)();
|
|
const isOpen = (0, _useSelector.useSelector)(store, trigger === 'axis' ? axisSystem === 'polar' && _useChartPolarInteraction.selectorChartsInteractionPolarAxisTooltip || axisSystem === 'cartesian' && _useChartCartesianAxis.selectorChartsInteractionAxisTooltip || noAxis : _useChartInteraction.selectorChartsInteractionItemIsDefined);
|
|
React.useEffect(() => {
|
|
const element = svgRef.current;
|
|
if (element === null) {
|
|
return () => {};
|
|
}
|
|
const update = (0, _rafThrottle.rafThrottle)(() => popperRef.current?.update());
|
|
const handlePointerEvent = event => {
|
|
// eslint-disable-next-line react-compiler/react-compiler
|
|
positionRef.current = {
|
|
x: event.clientX,
|
|
y: event.clientY
|
|
};
|
|
update();
|
|
};
|
|
element.addEventListener('pointerdown', handlePointerEvent);
|
|
element.addEventListener('pointermove', handlePointerEvent);
|
|
return () => {
|
|
element.removeEventListener('pointerdown', handlePointerEvent);
|
|
element.removeEventListener('pointermove', handlePointerEvent);
|
|
update.clear();
|
|
};
|
|
}, [svgRef, positionRef]);
|
|
const anchorEl = React.useMemo(() => ({
|
|
getBoundingClientRect: () => ({
|
|
x: positionRef.current.x,
|
|
y: positionRef.current.y,
|
|
top: positionRef.current.y,
|
|
left: positionRef.current.x,
|
|
right: positionRef.current.x,
|
|
bottom: positionRef.current.y,
|
|
width: 0,
|
|
height: 0,
|
|
toJSON: () => ''
|
|
})
|
|
}), [positionRef]);
|
|
const isMouse = pointerType?.pointerType === 'mouse' || isFineMainPointer;
|
|
const isTouch = pointerType?.pointerType === 'touch' || !isFineMainPointer;
|
|
const modifiers = React.useMemo(() => [{
|
|
name: 'offset',
|
|
options: {
|
|
offset: () => {
|
|
if (isTouch) {
|
|
return [0, 64];
|
|
}
|
|
// The popper offset: [skidding, distance]
|
|
return [0, 8];
|
|
}
|
|
}
|
|
}, ...(!isMouse ? [{
|
|
name: 'flip',
|
|
options: {
|
|
fallbackPlacements: ['top-end', 'top-start', 'bottom-end', 'bottom']
|
|
}
|
|
}] : []),
|
|
// Keep default behavior
|
|
{
|
|
name: 'preventOverflow',
|
|
options: {
|
|
altAxis: true
|
|
}
|
|
}], [isMouse, isTouch]);
|
|
if (trigger === 'none') {
|
|
return null;
|
|
}
|
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_NoSsr.default, {
|
|
children: isOpen && /*#__PURE__*/(0, _jsxRuntime.jsx)(ChartsTooltipRoot, (0, _extends2.default)({
|
|
className: classes?.root,
|
|
open: isOpen,
|
|
placement: isMouse ? 'right-start' : 'top',
|
|
popperRef: popperRef,
|
|
anchorEl: anchorEl,
|
|
modifiers: modifiers
|
|
}, other, {
|
|
children: children
|
|
}))
|
|
});
|
|
}
|
|
process.env.NODE_ENV !== "production" ? ChartsTooltipContainer.propTypes = {
|
|
// ----------------------------- Warning --------------------------------
|
|
// | These PropTypes are generated from the TypeScript type definitions |
|
|
// | To update them edit the TypeScript types and run "pnpm proptypes" |
|
|
// ----------------------------------------------------------------------
|
|
/**
|
|
* An HTML element, [virtualElement](https://popper.js.org/docs/v2/virtual-elements/),
|
|
* or a function that returns either.
|
|
* It's used to set the position of the popper.
|
|
* The return value will passed as the reference object of the Popper instance.
|
|
*/
|
|
anchorEl: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_HTMLElementType.default, _propTypes.default.object, _propTypes.default.func]),
|
|
/**
|
|
* Popper render function or node.
|
|
*/
|
|
children: _propTypes.default.node,
|
|
/**
|
|
* Override or extend the styles applied to the component.
|
|
*/
|
|
classes: _propTypes.default.object,
|
|
/**
|
|
* The component used for the root node.
|
|
* Either a string to use a HTML element or a component.
|
|
*/
|
|
component: _propTypes.default.elementType,
|
|
/**
|
|
* The components used for each slot inside the Popper.
|
|
* Either a string to use a HTML element or a component.
|
|
*
|
|
* @deprecated use the `slots` prop instead. This prop will be removed in a future major release. [How to migrate](/material-ui/migration/migrating-from-deprecated-apis/).
|
|
* @default {}
|
|
*/
|
|
components: _propTypes.default.shape({
|
|
Root: _propTypes.default.elementType
|
|
}),
|
|
/**
|
|
* The props used for each slot inside the Popper.
|
|
*
|
|
* @deprecated use the `slotProps` prop instead. This prop will be removed in a future major release. [How to migrate](/material-ui/migration/migrating-from-deprecated-apis/).
|
|
* @default {}
|
|
*/
|
|
componentsProps: _propTypes.default.shape({
|
|
root: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])
|
|
}),
|
|
/**
|
|
* An HTML element or function that returns one.
|
|
* The `container` will have the portal children appended to it.
|
|
*
|
|
* You can also provide a callback, which is called in a React layout effect.
|
|
* This lets you set the container from a ref, and also makes server-side rendering possible.
|
|
*
|
|
* By default, it uses the body of the top-level document object,
|
|
* so it's simply `document.body` most of the time.
|
|
*/
|
|
container: _propTypes.default.oneOfType([(props, propName) => {
|
|
if (props[propName] == null) {
|
|
return new Error(`Prop '${propName}' is required but wasn't specified`);
|
|
}
|
|
if (typeof props[propName] !== 'object' || props[propName].nodeType !== 1) {
|
|
return new Error(`Expected prop '${propName}' to be of type Element`);
|
|
}
|
|
return null;
|
|
}, _propTypes.default.func]),
|
|
/**
|
|
* The `children` will be under the DOM hierarchy of the parent component.
|
|
* @default false
|
|
*/
|
|
disablePortal: _propTypes.default.bool,
|
|
/**
|
|
* Always keep the children in the DOM.
|
|
* This prop can be useful in SEO situation or
|
|
* when you want to maximize the responsiveness of the Popper.
|
|
* @default false
|
|
*/
|
|
keepMounted: _propTypes.default.bool,
|
|
/**
|
|
* Popper.js is based on a "plugin-like" architecture,
|
|
* most of its features are fully encapsulated "modifiers".
|
|
*
|
|
* A modifier is a function that is called each time Popper.js needs to
|
|
* compute the position of the popper.
|
|
* For this reason, modifiers should be very performant to avoid bottlenecks.
|
|
* To learn how to create a modifier, [read the modifiers documentation](https://popper.js.org/docs/v2/modifiers/).
|
|
*/
|
|
modifiers: _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
data: _propTypes.default.object,
|
|
effect: _propTypes.default.func,
|
|
enabled: _propTypes.default.bool,
|
|
fn: _propTypes.default.func,
|
|
name: _propTypes.default.any,
|
|
options: _propTypes.default.object,
|
|
phase: _propTypes.default.oneOf(['afterMain', 'afterRead', 'afterWrite', 'beforeMain', 'beforeRead', 'beforeWrite', 'main', 'read', 'write']),
|
|
requires: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
requiresIfExists: _propTypes.default.arrayOf(_propTypes.default.string)
|
|
})),
|
|
/**
|
|
* If `true`, the component is shown.
|
|
*/
|
|
open: _propTypes.default.bool,
|
|
/**
|
|
* Popper placement.
|
|
* @default 'bottom'
|
|
*/
|
|
placement: _propTypes.default.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
|
|
/**
|
|
* Options provided to the [`Popper.js`](https://popper.js.org/docs/v2/constructors/#options) instance.
|
|
* @default {}
|
|
*/
|
|
popperOptions: _propTypes.default.shape({
|
|
modifiers: _propTypes.default.array,
|
|
onFirstUpdate: _propTypes.default.func,
|
|
placement: _propTypes.default.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
|
|
strategy: _propTypes.default.oneOf(['absolute', 'fixed'])
|
|
}),
|
|
/**
|
|
* A ref that points to the used popper instance.
|
|
*/
|
|
popperRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.shape({
|
|
current: _propTypes.default.shape({
|
|
destroy: _propTypes.default.func.isRequired,
|
|
forceUpdate: _propTypes.default.func.isRequired,
|
|
setOptions: _propTypes.default.func.isRequired,
|
|
state: _propTypes.default.shape({
|
|
attributes: _propTypes.default.object.isRequired,
|
|
elements: _propTypes.default.object.isRequired,
|
|
modifiersData: _propTypes.default.object.isRequired,
|
|
options: _propTypes.default.object.isRequired,
|
|
orderedModifiers: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
|
|
placement: _propTypes.default.oneOf(['auto-end', 'auto-start', 'auto', 'bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']).isRequired,
|
|
rects: _propTypes.default.object.isRequired,
|
|
reset: _propTypes.default.bool.isRequired,
|
|
scrollParents: _propTypes.default.object.isRequired,
|
|
strategy: _propTypes.default.oneOf(['absolute', 'fixed']).isRequired,
|
|
styles: _propTypes.default.object.isRequired
|
|
}).isRequired,
|
|
update: _propTypes.default.func.isRequired
|
|
})
|
|
})]),
|
|
/**
|
|
* The props used for each slot inside the Popper.
|
|
* @default {}
|
|
*/
|
|
slotProps: _propTypes.default.object,
|
|
/**
|
|
* The components used for each slot inside the Popper.
|
|
* Either a string to use a HTML element or a component.
|
|
* @default {}
|
|
*/
|
|
slots: _propTypes.default.object,
|
|
/**
|
|
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
*/
|
|
sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
|
|
/**
|
|
* Help supporting a react-transition-group/Transition component.
|
|
* @default false
|
|
*/
|
|
transition: _propTypes.default.bool,
|
|
/**
|
|
* Select the kind of tooltip to display
|
|
* - 'item': Shows data about the item below the mouse;
|
|
* - 'axis': Shows values associated with the hovered x value;
|
|
* - 'none': Does not display tooltip.
|
|
* @default 'axis'
|
|
*/
|
|
trigger: _propTypes.default.oneOf(['axis', 'item', 'none'])
|
|
} : void 0; |