@mui/x-charts
Version:
The community edition of MUI X Charts components.
135 lines (134 loc) • 5.68 kB
JavaScript
;
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)
};
}