@mui/x-charts
Version:
The community edition of MUI X Charts components.
109 lines (105 loc) • 4.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.calculateFinalDomain = calculateFinalDomain;
exports.calculateInitialDomainAndTickNumber = calculateInitialDomainAndTickNumber;
exports.computeAxisDomainsMap = computeAxisDomainsMap;
var _axis = require("../../../../models/axis");
var _getScale = require("../../../getScale");
var _getAxisDomainLimit = require("./getAxisDomainLimit");
var _ticks = require("../../../ticks");
function niceDomain(scaleType, domain, tickNumber) {
return (0, _getScale.getScale)(scaleType ?? 'linear', domain, [0, 1]).nice(tickNumber).domain();
}
/**
* Calculates the initial domain and tick number for a given axis.
* The domain should still run through the zoom filterMode after this step.
*/
function calculateInitialDomainAndTickNumber(axis, axisDirection, axisIndex, formattedSeries, [minData, maxData], defaultTickNumber) {
const domainLimit = (0, _getAxisDomainLimit.getAxisDomainLimit)(axis, axisDirection, axisIndex, formattedSeries);
let axisExtrema = getActualAxisExtrema(axis, minData, maxData);
if (typeof domainLimit === 'function') {
const {
min,
max
} = domainLimit(minData.valueOf(), maxData.valueOf());
axisExtrema[0] = min;
axisExtrema[1] = max;
}
const tickNumber = (0, _ticks.getTickNumber)(axis, axisExtrema, defaultTickNumber);
if (domainLimit === 'nice') {
axisExtrema = niceDomain(axis.scaleType, axisExtrema, tickNumber);
}
axisExtrema = ['min' in axis ? axis.min ?? axisExtrema[0] : axisExtrema[0], 'max' in axis ? axis.max ?? axisExtrema[1] : axisExtrema[1]];
return {
domain: axisExtrema,
tickNumber
};
}
/**
* Calculates the final domain for an axis.
* After this step, the domain can be used to create the axis scale.
*/
function calculateFinalDomain(axis, axisDirection, axisIndex, formattedSeries, [minData, maxData], tickNumber) {
const domainLimit = (0, _getAxisDomainLimit.getAxisDomainLimit)(axis, axisDirection, axisIndex, formattedSeries);
let axisExtrema = getActualAxisExtrema(axis, minData, maxData);
if (typeof domainLimit === 'function') {
const {
min,
max
} = domainLimit(minData.valueOf(), maxData.valueOf());
axisExtrema[0] = min;
axisExtrema[1] = max;
}
if (domainLimit === 'nice') {
axisExtrema = niceDomain(axis.scaleType, axisExtrema, tickNumber);
}
return [axis.min ?? axisExtrema[0], axis.max ?? axisExtrema[1]];
}
/**
* Get the actual axis extrema considering the user defined min and max values.
* @param axisExtrema User defined axis extrema.
* @param minData Minimum value from the data.
* @param maxData Maximum value from the data.
*/
function getActualAxisExtrema(axisExtrema, minData, maxData) {
let min = minData;
let max = maxData;
if ('max' in axisExtrema && axisExtrema.max != null && axisExtrema.max < minData) {
min = axisExtrema.max;
}
if ('min' in axisExtrema && axisExtrema.min != null && axisExtrema.min > minData) {
max = axisExtrema.min;
}
if (!('min' in axisExtrema) && !('max' in axisExtrema)) {
return [min, max];
}
return [axisExtrema.min ?? min, axisExtrema.max ?? max];
}
/**
* Computes the domain map for a list of axes.
* Shared between the rendering selectors and the auto-size domain selectors
* to ensure consistent domain computation logic.
*/
function computeAxisDomainsMap(axes, formattedSeries, defaultTickNumber, extremaMap, axisDirection) {
const domains = {};
axes?.forEach((eachAxis, axisIndex) => {
const axis = eachAxis;
if ((0, _axis.isBandScaleConfig)(axis) || (0, _axis.isPointScaleConfig)(axis)) {
domains[axis.id] = {
domain: axis.data
};
if (axis.ordinalTimeTicks !== undefined) {
domains[axis.id].tickNumber = (0, _ticks.getTickNumber)(axis, [axis.data?.find(d => d !== null), axis.data?.findLast(d => d !== null)], defaultTickNumber);
}
return;
}
const extrema = extremaMap[axis.id];
if (!extrema) {
return;
}
domains[axis.id] = calculateInitialDomainAndTickNumber(axis, axisDirection, axisIndex, formattedSeries, extrema, defaultTickNumber);
});
return domains;
}