@mui/x-charts
Version:
The community edition of the Charts components (MUI X).
75 lines (74 loc) • 3.04 kB
JavaScript
import * as React from 'react';
import PropTypes from 'prop-types';
import { SvgContext } from '../context/DrawingProvider';
import { InteractionContext } from '../context/InteractionProvider';
import { CartesianContext } from '../context/CartesianContextProvider';
import { SeriesContext } from '../context/SeriesContextProvider';
import { jsx as _jsx } from "react/jsx-runtime";
function ChartsOnAxisClickHandler(props) {
const {
onAxisClick
} = props;
const svgRef = React.useContext(SvgContext);
const series = React.useContext(SeriesContext);
const {
axis
} = React.useContext(InteractionContext);
const {
xAxisIds,
xAxis,
yAxisIds,
yAxis
} = React.useContext(CartesianContext);
React.useEffect(() => {
const element = svgRef.current;
if (element === null || !onAxisClick) {
return () => {};
}
const handleMouseClick = event => {
event.preventDefault();
const isXaxis = (axis.x && axis.x.index) !== undefined;
const USED_AXIS_ID = isXaxis ? xAxisIds[0] : yAxisIds[0];
const dataIndex = isXaxis ? axis.x && axis.x.index : axis.y && axis.y.index;
if (dataIndex == null) {
return;
}
const seriesValues = {};
Object.keys(series).filter(seriesType => ['bar', 'line'].includes(seriesType)).forEach(seriesType => {
series[seriesType]?.seriesOrder.forEach(seriesId => {
const seriesItem = series[seriesType].series[seriesId];
const axisKey = isXaxis ? seriesItem.xAxisKey : seriesItem.yAxisKey;
if (axisKey === undefined || axisKey === USED_AXIS_ID) {
seriesValues[seriesId] = seriesItem.data[dataIndex];
}
});
});
const axisValue = (isXaxis ? xAxis : yAxis)[USED_AXIS_ID].data?.[dataIndex];
onAxisClick(event, {
dataIndex,
axisValue,
seriesValues
});
};
element.addEventListener('click', handleMouseClick);
return () => {
element.removeEventListener('click', handleMouseClick);
};
}, [axis.x, axis.y, onAxisClick, series, svgRef, xAxis, xAxisIds, yAxis, yAxisIds]);
// eslint-disable-next-line react/jsx-no-useless-fragment
return /*#__PURE__*/_jsx(React.Fragment, {});
}
process.env.NODE_ENV !== "production" ? ChartsOnAxisClickHandler.propTypes = {
// ----------------------------- Warning --------------------------------
// | These PropTypes are generated from the TypeScript type definitions |
// | To update them edit the TypeScript types and run "yarn proptypes" |
// ----------------------------------------------------------------------
/**
* The function called for onClick events.
* The second argument contains information about all line/bar elements at the current mouse position.
* @param {MouseEvent} event The mouse event recorded on the `<svg/>` element.
* @param {null | AxisData} data The data about the clicked axis and items associated with it.
*/
onAxisClick: PropTypes.func
} : void 0;
export { ChartsOnAxisClickHandler };