UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

135 lines (134 loc) 5.68 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.processBarDataForPlot = processBarDataForPlot; exports.useBarPlotData = useBarPlotData; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _getColor = _interopRequireDefault(require("./seriesConfig/bar/getColor")); var _useAxis = require("../hooks/useAxis"); var _checkBarChartScaleErrors = require("./checkBarChartScaleErrors"); var _useBarSeries = require("../hooks/useBarSeries"); var _getBarDimensions = require("../internals/getBarDimensions"); var _useChartId = require("../hooks/useChartId"); function useBarPlotData(drawingArea, xAxes, yAxes) { const seriesData = (0, _useBarSeries.useBarSeriesContext)() ?? { series: {}, stackingGroups: [], seriesOrder: [] }; const defaultXAxisId = (0, _useAxis.useXAxes)().xAxisIds[0]; const defaultYAxisId = (0, _useAxis.useYAxes)().yAxisIds[0]; const chartId = (0, _useChartId.useChartId)(); return processBarDataForPlot(drawingArea, chartId, seriesData.stackingGroups, seriesData.series, xAxes, yAxes, defaultXAxisId, defaultYAxisId); } function processBarDataForPlot(drawingArea, chartId, stackingGroups, series, xAxes, yAxes, defaultXAxisId, defaultYAxisId) { const masks = {}; const data = stackingGroups.flatMap(({ ids: seriesIds }, groupIndex) => { const xMin = drawingArea.left; const xMax = drawingArea.left + drawingArea.width; const yMin = drawingArea.top; const yMax = drawingArea.top + drawingArea.height; const lastNegativePerIndex = new Map(); const lastPositivePerIndex = new Map(); return seriesIds.map(seriesId => { const xAxisId = series[seriesId].xAxisId ?? defaultXAxisId; const yAxisId = series[seriesId].yAxisId ?? defaultYAxisId; const layout = series[seriesId].layout; const xAxisConfig = xAxes[xAxisId]; const yAxisConfig = yAxes[yAxisId]; const verticalLayout = series[seriesId].layout === 'vertical'; const reverse = (verticalLayout ? yAxisConfig.reverse : xAxisConfig.reverse) ?? false; (0, _checkBarChartScaleErrors.checkBarChartScaleErrors)(verticalLayout, seriesId, series[seriesId].stackedData.length, xAxisId, xAxes, yAxisId, yAxes); const baseScaleConfig = verticalLayout ? xAxisConfig : yAxisConfig; const xScale = xAxisConfig.scale; const yScale = yAxisConfig.scale; const xOrigin = Math.round(xScale(0) ?? 0); const yOrigin = Math.round(yScale(0) ?? 0); const colorGetter = (0, _getColor.default)(series[seriesId], xAxes[xAxisId], yAxes[yAxisId]); const seriesDataPoints = []; for (let dataIndex = 0; dataIndex < baseScaleConfig.data.length; dataIndex += 1) { const barDimensions = (0, _getBarDimensions.getBarDimensions)({ verticalLayout, xAxisConfig, yAxisConfig, series: series[seriesId], dataIndex, numberOfGroups: stackingGroups.length, groupIndex }); if (barDimensions == null) { continue; } const stackId = series[seriesId].stack; const result = (0, _extends2.default)({ seriesId, dataIndex, hidden: series[seriesId].hidden }, barDimensions, { color: colorGetter(dataIndex), value: series[seriesId].data[dataIndex], maskId: `${chartId}_${stackId || seriesId}_${groupIndex}_${dataIndex}` }); if (result.x > xMax || result.x + result.width < xMin || result.y > yMax || result.y + result.height < yMin) { continue; } const lastNegative = lastNegativePerIndex.get(dataIndex); const lastPositive = lastPositivePerIndex.get(dataIndex); const sign = (reverse ? -1 : 1) * Math.sign(result.value ?? 0); if (sign > 0) { if (lastPositive) { delete lastPositive.borderRadiusSide; } result.borderRadiusSide = verticalLayout ? 'top' : 'right'; lastPositivePerIndex.set(dataIndex, result); } else if (sign < 0) { if (lastNegative) { delete lastNegative.borderRadiusSide; } result.borderRadiusSide = verticalLayout ? 'bottom' : 'left'; lastNegativePerIndex.set(dataIndex, result); } if (!masks[result.maskId]) { masks[result.maskId] = { id: result.maskId, width: 0, height: 0, hasNegative: false, hasPositive: false, layout, xOrigin, yOrigin, x: 0, y: 0 }; } const mask = masks[result.maskId]; mask.width = layout === 'vertical' ? result.width : mask.width + result.width; mask.height = layout === 'vertical' ? mask.height + result.height : result.height; mask.x = Math.min(mask.x === 0 ? Infinity : mask.x, result.x); mask.y = Math.min(mask.y === 0 ? Infinity : mask.y, result.y); const value = result.value ?? 0; mask.hasNegative = mask.hasNegative || (reverse ? value > 0 : value < 0); mask.hasPositive = mask.hasPositive || (reverse ? value < 0 : value > 0); seriesDataPoints.push(result); } return { seriesId, barLabel: series[seriesId].barLabel, barLabelPlacement: series[seriesId].barLabelPlacement, data: seriesDataPoints, layout, xOrigin, yOrigin }; }); }); return { completedData: data, masksData: Object.values(masks) }; }