@mui/x-charts
Version:
The community edition of MUI X Charts components.
82 lines (81 loc) • 3.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createAxisFilterMapper = createAxisFilterMapper;
exports.createContinuousScaleGetAxisFilter = createContinuousScaleGetAxisFilter;
exports.createDiscreteScaleGetAxisFilter = createDiscreteScaleGetAxisFilter;
exports.createGetAxisFilters = void 0;
var _isDefined = require("../../../isDefined");
var _getAxisExtremum = require("./getAxisExtremum");
var _getScale = require("../../../getScale");
function createAxisFilterMapper({
zoomMap,
zoomOptions,
seriesConfig,
formattedSeries,
direction
}) {
return (axis, axisIndex) => {
const zoomOption = zoomOptions[axis.id];
if (!zoomOption || zoomOption.filterMode !== 'discard') {
return null;
}
const zoom = zoomMap?.get(axis.id);
if (zoom === undefined || zoom.start <= 0 && zoom.end >= 100) {
// No zoom, or zoom with all data visible
return null;
}
const scaleType = axis.scaleType;
if (scaleType === 'point' || scaleType === 'band') {
return createDiscreteScaleGetAxisFilter(axis.data, zoom.start, zoom.end, direction);
}
return createContinuousScaleGetAxisFilter(scaleType, (0, _getAxisExtremum.getAxisExtremum)(axis, direction, seriesConfig, axisIndex, formattedSeries), zoom.start, zoom.end, direction, axis.data);
};
}
function createDiscreteScaleGetAxisFilter(axisData, zoomStart, zoomEnd, direction) {
const maxIndex = axisData?.length ?? 0;
const minVal = Math.floor(zoomStart * maxIndex / 100);
const maxVal = Math.ceil(zoomEnd * maxIndex / 100);
return function filterAxis(value, dataIndex) {
const val = value[direction] ?? axisData?.[dataIndex];
if (val == null) {
// If the value does not exist because of missing data point, or out of range index, we just ignore.
return true;
}
return dataIndex >= minVal && dataIndex < maxVal;
};
}
function createContinuousScaleGetAxisFilter(scaleType, extrema, zoomStart, zoomEnd, direction, axisData) {
let min;
let max;
[min, max] = (0, _getScale.getScale)(scaleType ?? 'linear', extrema, [0, 100]).nice().domain();
min = min instanceof Date ? min.getTime() : min;
max = max instanceof Date ? max.getTime() : max;
const minVal = min + zoomStart * (max - min) / 100;
const maxVal = min + zoomEnd * (max - min) / 100;
return function filterAxis(value, dataIndex) {
const val = value[direction] ?? axisData?.[dataIndex];
if (val == null) {
// If the value does not exist because of missing data point, or out of range index, we just ignore.
return true;
}
return val >= minVal && val <= maxVal;
};
}
const createGetAxisFilters = filters => ({
currentAxisId,
seriesXAxisId,
seriesYAxisId,
isDefaultAxis
}) => {
return (value, dataIndex) => {
const axisId = currentAxisId === seriesXAxisId ? seriesYAxisId : seriesXAxisId;
if (!axisId || isDefaultAxis) {
return Object.values(filters ?? {})[0]?.(value, dataIndex) ?? true;
}
const data = [seriesYAxisId, seriesXAxisId].filter(id => id !== currentAxisId).map(id => filters[id ?? '']).filter(_isDefined.isDefined);
return data.every(f => f(value, dataIndex));
};
};
exports.createGetAxisFilters = createGetAxisFilters;