UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

101 lines (99 loc) 3.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getBandIndex = getBandIndex; exports.selectorBarItemAtPosition = void 0; var _store = require("@mui/x-internals/store"); var _useChartCartesianAxisRendering = require("./useChartCartesianAxisRendering.selectors"); var _useChartSeries = require("../../corePlugins/useChartSeries"); var _getBandSize = require("../../../../internals/getBandSize"); var _scaleGuards = require("../../../../internals/scaleGuards"); var _invertScale = require("../../../../internals/invertScale"); function getBandIndex(bandAxis, stackConfig, coordinate) { if (!(0, _scaleGuards.isBandScale)(bandAxis.scale)) { return -1; } const dataIndex = (0, _invertScale.getDataIndexForOrdinalScaleValue)(bandAxis.scale, coordinate); const { barWidth, offset } = (0, _getBandSize.getBandSize)(bandAxis.scale.bandwidth(), stackConfig.groupNumber, bandAxis.barGapRatio); const barOffset = stackConfig.groupIndex * (barWidth + offset); const bandValue = bandAxis.data?.[dataIndex]; if (bandValue == null) { return -1; } const bandStart = bandAxis.scale(bandValue); if (bandStart == null) { return -1; } const bandBarStart = bandStart + barOffset; const bandBarEnd = bandBarStart + barWidth; const bandBarMin = Math.min(bandBarStart, bandBarEnd); const bandBarMax = Math.max(bandBarStart, bandBarEnd); if (coordinate >= bandBarMin && coordinate <= bandBarMax) { return dataIndex; } return -1; } const selectorBarItemAtPosition = exports.selectorBarItemAtPosition = (0, _store.createSelector)(_useChartCartesianAxisRendering.selectorChartXAxis, _useChartCartesianAxisRendering.selectorChartYAxis, _useChartSeries.selectorChartSeriesProcessed, function selectorBarItemAtPosition({ axis: xAxes, axisIds: xAxisIds }, { axis: yAxes, axisIds: yAxisIds }, processedSeries, svgPoint) { const { series, stackingGroups = [] } = processedSeries?.bar ?? {}; const defaultXAxisId = xAxisIds[0]; const defaultYAxisId = yAxisIds[0]; let item = undefined; for (let stackIndex = 0; stackIndex < stackingGroups.length; stackIndex += 1) { const group = stackingGroups[stackIndex]; const seriesIds = group.ids; for (const seriesId of seriesIds) { const aSeries = (series ?? {})[seriesId]; const xAxisId = aSeries.xAxisId ?? defaultXAxisId; const yAxisId = aSeries.yAxisId ?? defaultYAxisId; const xAxis = xAxes[xAxisId]; const yAxis = yAxes[yAxisId]; const bandAxis = aSeries.layout === 'horizontal' ? yAxis : xAxis; const continuousAxis = aSeries.layout === 'horizontal' ? xAxis : yAxis; const svgBandCoordinate = aSeries.layout === 'horizontal' ? svgPoint.y : svgPoint.x; const svgValueCoordinate = aSeries.layout === 'horizontal' ? svgPoint.x : svgPoint.y; const dataIndex = getBandIndex(bandAxis, { groupNumber: stackingGroups.length, groupIndex: stackIndex }, svgBandCoordinate); if (dataIndex === -1) { continue; } // The point is inside the band for this series const bar = aSeries.visibleStackedData[dataIndex]; const start = continuousAxis.scale(bar[0]); const end = continuousAxis.scale(bar[1]); if (start == null || end == null) { continue; } const continuousMin = Math.min(start, end); const continuousMax = Math.max(start, end); if (svgValueCoordinate >= continuousMin && svgValueCoordinate <= continuousMax) { item = { seriesId, dataIndex }; } } } if (item) { return { type: 'bar', seriesId: item.seriesId, dataIndex: item.dataIndex }; } return undefined; });