@mui/x-charts
Version:
The community edition of MUI X Charts components.
126 lines (125 loc) • 4.64 kB
JavaScript
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["ownerState"];
import * as React from 'react';
import PropTypes from 'prop-types';
import useSlotProps from '@mui/utils/useSlotProps';
import { getValueToPositionMapper } from "../hooks/useScale.js";
import { useInteractionAllItemProps } from "../hooks/useInteractionItemProps.js";
import { useStore } from "../internals/store/useStore.js";
import { useSelector } from "../internals/store/useSelector.js";
import { useItemHighlightedGetter } from "../hooks/useItemHighlightedGetter.js";
import { selectorChartsVoronoiIsVoronoiEnabled } from "../internals/plugins/featurePlugins/useChartVoronoi/index.js";
import { useChartContext } from "../context/ChartProvider/index.js";
import { ScatterMarker } from "./ScatterMarker.js";
import { jsx as _jsx } from "react/jsx-runtime";
/**
* Demos:
*
* - [Scatter](https://mui.com/x/react-charts/scatter/)
* - [Scatter demonstration](https://mui.com/x/react-charts/scatter-demo/)
*
* API:
*
* - [Scatter API](https://mui.com/x/api/charts/scatter/)
*/
function Scatter(props) {
const {
series,
xScale,
yScale,
color,
colorGetter,
onItemClick,
slots,
slotProps
} = props;
const {
instance
} = useChartContext();
const store = useStore();
const isVoronoiEnabled = useSelector(store, selectorChartsVoronoiIsVoronoiEnabled);
const skipInteractionHandlers = isVoronoiEnabled || series.disableHover;
const {
isFaded,
isHighlighted
} = useItemHighlightedGetter();
const cleanData = React.useMemo(() => {
const getXPosition = getValueToPositionMapper(xScale);
const getYPosition = getValueToPositionMapper(yScale);
const temp = [];
for (let i = 0; i < series.data.length; i += 1) {
const scatterPoint = series.data[i];
const x = getXPosition(scatterPoint.x);
const y = getYPosition(scatterPoint.y);
const isInRange = instance.isPointInside(x, y);
if (isInRange) {
const currentItem = {
seriesId: series.id,
dataIndex: i
};
const isItemHighlighted = isHighlighted(currentItem);
temp.push({
x,
y,
isHighlighted: isItemHighlighted,
isFaded: !isItemHighlighted && isFaded(currentItem),
id: scatterPoint.id,
seriesId: series.id,
type: 'scatter',
dataIndex: i,
color: colorGetter ? colorGetter(i) : color
});
}
}
return temp;
}, [xScale, yScale, series.data, series.id, isHighlighted, isFaded, colorGetter, color, instance]);
const interactionItemProps = useInteractionAllItemProps(cleanData, skipInteractionHandlers);
const Marker = slots?.marker ?? ScatterMarker;
const _useSlotProps = useSlotProps({
elementType: Marker,
externalSlotProps: slotProps?.marker,
additionalProps: {
seriesId: series.id,
size: series.markerSize
},
ownerState: {}
}),
markerProps = _objectWithoutPropertiesLoose(_useSlotProps, _excluded);
return /*#__PURE__*/_jsx("g", {
children: cleanData.map((dataPoint, i) => /*#__PURE__*/_jsx(Marker, _extends({
dataIndex: dataPoint.dataIndex,
color: dataPoint.color,
isHighlighted: dataPoint.isHighlighted,
isFaded: dataPoint.isFaded,
x: dataPoint.x,
y: dataPoint.y,
onClick: onItemClick && (event => onItemClick(event, {
type: 'scatter',
seriesId: series.id,
dataIndex: dataPoint.dataIndex
}))
}, interactionItemProps[i], markerProps), dataPoint.id ?? dataPoint.dataIndex))
});
}
process.env.NODE_ENV !== "production" ? Scatter.propTypes = {
// ----------------------------- Warning --------------------------------
// | These PropTypes are generated from the TypeScript type definitions |
// | To update them edit the TypeScript types and run "pnpm proptypes" |
// ----------------------------------------------------------------------
color: PropTypes.string.isRequired,
colorGetter: PropTypes.func,
/**
* Callback fired when clicking on a scatter item.
* @param {MouseEvent} event Mouse event recorded on the `<svg/>` element.
* @param {ScatterItemIdentifier} scatterItemIdentifier The scatter item identifier.
*/
onItemClick: PropTypes.func,
series: PropTypes.object.isRequired,
slotProps: PropTypes.object,
slots: PropTypes.object,
xScale: PropTypes.func.isRequired,
yScale: PropTypes.func.isRequired
} : void 0;
export { Scatter };