UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

309 lines (302 loc) 17.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectorDefaultYAxisTickNumber = exports.selectorDefaultXAxisTickNumber = exports.selectorChartZoomOptionsLookup = exports.selectorChartZoomMap = exports.selectorChartZoomIsInteracting = exports.selectorChartZoomAxisFilters = exports.selectorChartYScales = exports.selectorChartYAxisWithDomains = exports.selectorChartYAxis = exports.selectorChartXScales = exports.selectorChartXAxisWithDomains = exports.selectorChartXAxis = exports.selectorChartSeriesFlatbushMap = exports.selectorChartSeriesEmptyFlatbushMap = exports.selectorChartRawAxis = exports.selectorChartNormalizedYScales = exports.selectorChartNormalizedXScales = exports.selectorChartFilteredYDomains = exports.selectorChartFilteredXDomains = exports.selectorChartDefaultYAxisId = exports.selectorChartDefaultXAxisId = exports.selectorChartAxisZoomOptionsLookup = exports.selectorChartAxisZoomData = exports.selectorChartAxis = exports.createZoomMap = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _store = require("@mui/x-internals/store"); var _useChartDimensions = require("../../corePlugins/useChartDimensions"); var _useChartSeries = require("../../corePlugins/useChartSeries"); var _computeAxisValue = require("./computeAxisValue"); var _createAxisFilterMapper = require("./createAxisFilterMapper"); var _createZoomLookup = require("./createZoomLookup"); var _axis = require("../../../../models/axis"); var _useChartCartesianAxisLayout = require("./useChartCartesianAxisLayout.selectors"); var _useChartExperimentalFeature = require("../../corePlugins/useChartExperimentalFeature"); var _ticks = require("../../../ticks"); var _getAxisScale = require("./getAxisScale"); var _scaleGuards = require("../../../scaleGuards"); var _zoom = require("./zoom"); var _getAxisExtrema = require("./getAxisExtrema"); var _domain = require("./domain"); var _Flatbush = require("../../../Flatbush"); const createZoomMap = zoom => { const zoomItemMap = new Map(); zoom.forEach(zoomItem => { zoomItemMap.set(zoomItem.axisId, zoomItem); }); return zoomItemMap; }; exports.createZoomMap = createZoomMap; const selectorChartZoomState = state => state.zoom; /** * Following selectors are not exported because they exist in the MIT chart only to ba able to reuse the Zoom state from the pro. */ const selectorChartZoomIsInteracting = exports.selectorChartZoomIsInteracting = (0, _store.createSelector)(selectorChartZoomState, zoom => zoom?.isInteracting); const selectorChartZoomMap = exports.selectorChartZoomMap = (0, _store.createSelectorMemoized)(selectorChartZoomState, function selectorChartZoomMap(zoom) { return zoom?.zoomData && createZoomMap(zoom?.zoomData); }); const selectorChartAxisZoomData = exports.selectorChartAxisZoomData = (0, _store.createSelector)(selectorChartZoomMap, (zoomMap, axisId) => zoomMap?.get(axisId)); const selectorChartZoomOptionsLookup = exports.selectorChartZoomOptionsLookup = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawXAxis, _useChartCartesianAxisLayout.selectorChartRawYAxis, function selectorChartZoomOptionsLookup(xAxis, yAxis) { return (0, _extends2.default)({}, (0, _createZoomLookup.createZoomLookup)('x')(xAxis), (0, _createZoomLookup.createZoomLookup)('y')(yAxis)); }); const selectorChartAxisZoomOptionsLookup = exports.selectorChartAxisZoomOptionsLookup = (0, _store.createSelector)(selectorChartZoomOptionsLookup, (axisLookup, axisId) => axisLookup[axisId]); const selectorDefaultXAxisTickNumber = exports.selectorDefaultXAxisTickNumber = (0, _store.createSelector)(_useChartDimensions.selectorChartDrawingArea, function selectorDefaultXAxisTickNumber(drawingArea) { return (0, _ticks.getDefaultTickNumber)(drawingArea.width); }); const selectorDefaultYAxisTickNumber = exports.selectorDefaultYAxisTickNumber = (0, _store.createSelector)(_useChartDimensions.selectorChartDrawingArea, function selectorDefaultYAxisTickNumber(drawingArea) { return (0, _ticks.getDefaultTickNumber)(drawingArea.height); }); const selectorChartXAxisWithDomains = exports.selectorChartXAxisWithDomains = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawXAxis, _useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, _useChartExperimentalFeature.selectorPreferStrictDomainInLineCharts, selectorDefaultXAxisTickNumber, function selectorChartXAxisWithDomains(axes, formattedSeries, seriesConfig, preferStrictDomainInLineCharts, defaultTickNumber) { const axisDirection = 'x'; 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 axisExtrema = (0, _getAxisExtrema.getAxisExtrema)(axis, axisDirection, seriesConfig, axisIndex, formattedSeries); domains[axis.id] = (0, _domain.calculateInitialDomainAndTickNumber)(axis, 'x', axisIndex, formattedSeries, axisExtrema, defaultTickNumber, preferStrictDomainInLineCharts); }); return { axes, domains }; }); const selectorChartYAxisWithDomains = exports.selectorChartYAxisWithDomains = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawYAxis, _useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, _useChartExperimentalFeature.selectorPreferStrictDomainInLineCharts, selectorDefaultYAxisTickNumber, function selectorChartYAxisWithDomains(axes, formattedSeries, seriesConfig, preferStrictDomainInLineCharts, defaultTickNumber) { const axisDirection = 'y'; 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 axisExtrema = (0, _getAxisExtrema.getAxisExtrema)(axis, axisDirection, seriesConfig, axisIndex, formattedSeries); domains[axis.id] = (0, _domain.calculateInitialDomainAndTickNumber)(axis, 'y', axisIndex, formattedSeries, axisExtrema, defaultTickNumber, preferStrictDomainInLineCharts); }); return { axes, domains }; }); const selectorChartZoomAxisFilters = exports.selectorChartZoomAxisFilters = (0, _store.createSelectorMemoized)(selectorChartZoomMap, selectorChartZoomOptionsLookup, selectorChartXAxisWithDomains, selectorChartYAxisWithDomains, function selectorChartZoomAxisFilters(zoomMap, zoomOptions, { axes: xAxis, domains: xDomains }, { axes: yAxis, domains: yDomains }) { if (!zoomMap || !zoomOptions) { return undefined; } let hasFilter = false; const filters = {}; const axes = [...(xAxis ?? []), ...(yAxis ?? [])]; for (let i = 0; i < axes.length; i += 1) { const axis = axes[i]; if (!zoomOptions[axis.id] || zoomOptions[axis.id].filterMode !== 'discard') { continue; } const zoom = zoomMap.get(axis.id); if (zoom === undefined || zoom.start <= 0 && zoom.end >= 100) { // No zoom, or zoom with all data visible continue; } const axisDirection = i < (xAxis?.length ?? 0) ? 'x' : 'y'; if (axis.scaleType === 'band' || axis.scaleType === 'point') { filters[axis.id] = (0, _createAxisFilterMapper.createDiscreteScaleGetAxisFilter)(axis.data, zoom.start, zoom.end, axisDirection); } else { const { domain } = axisDirection === 'x' ? xDomains[axis.id] : yDomains[axis.id]; filters[axis.id] = (0, _createAxisFilterMapper.createContinuousScaleGetAxisFilter)( // For continuous scales, the domain is always a two-value array. domain, zoom.start, zoom.end, axisDirection, axis.data); } hasFilter = true; } if (!hasFilter) { return undefined; } return (0, _createAxisFilterMapper.createGetAxisFilters)(filters); }); const selectorChartFilteredXDomains = exports.selectorChartFilteredXDomains = (0, _store.createSelectorMemoized)(_useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, selectorChartZoomMap, selectorChartZoomOptionsLookup, selectorChartZoomAxisFilters, _useChartExperimentalFeature.selectorPreferStrictDomainInLineCharts, selectorChartXAxisWithDomains, function selectorChartFilteredXDomains(formattedSeries, seriesConfig, zoomMap, zoomOptions, getFilters, preferStrictDomainInLineCharts, { axes, domains }) { const filteredDomains = {}; axes?.forEach((axis, axisIndex) => { const domain = domains[axis.id].domain; if ((0, _axis.isBandScaleConfig)(axis) || (0, _axis.isPointScaleConfig)(axis)) { filteredDomains[axis.id] = domain; return; } const zoom = zoomMap?.get(axis.id); const zoomOption = zoomOptions?.[axis.id]; const filter = zoom === undefined && !zoomOption ? getFilters : undefined; // Do not apply filtering if zoom is already defined. if (!filter) { filteredDomains[axis.id] = domain; return; } const rawTickNumber = domains[axis.id].tickNumber; const axisExtrema = (0, _getAxisExtrema.getAxisExtrema)(axis, 'x', seriesConfig, axisIndex, formattedSeries, filter); filteredDomains[axis.id] = (0, _domain.calculateFinalDomain)(axis, 'x', axisIndex, formattedSeries, axisExtrema, rawTickNumber, preferStrictDomainInLineCharts); }); return filteredDomains; }); const selectorChartFilteredYDomains = exports.selectorChartFilteredYDomains = (0, _store.createSelectorMemoized)(_useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, selectorChartZoomMap, selectorChartZoomOptionsLookup, selectorChartZoomAxisFilters, _useChartExperimentalFeature.selectorPreferStrictDomainInLineCharts, selectorChartYAxisWithDomains, function selectorChartFilteredYDomains(formattedSeries, seriesConfig, zoomMap, zoomOptions, getFilters, preferStrictDomainInLineCharts, { axes, domains }) { const filteredDomains = {}; axes?.forEach((axis, axisIndex) => { const domain = domains[axis.id].domain; if ((0, _axis.isBandScaleConfig)(axis) || (0, _axis.isPointScaleConfig)(axis)) { filteredDomains[axis.id] = domain; return; } const zoom = zoomMap?.get(axis.id); const zoomOption = zoomOptions?.[axis.id]; const filter = zoom === undefined && !zoomOption ? getFilters : undefined; // Do not apply filtering if zoom is already defined. if (!filter) { filteredDomains[axis.id] = domain; return; } const rawTickNumber = domains[axis.id].tickNumber; const axisExtrema = (0, _getAxisExtrema.getAxisExtrema)(axis, 'y', seriesConfig, axisIndex, formattedSeries, filter); filteredDomains[axis.id] = (0, _domain.calculateFinalDomain)(axis, 'y', axisIndex, formattedSeries, axisExtrema, rawTickNumber, preferStrictDomainInLineCharts); }); return filteredDomains; }); const selectorChartNormalizedXScales = exports.selectorChartNormalizedXScales = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawXAxis, selectorChartFilteredXDomains, function selectorChartNormalizedXScales(axes, filteredDomains) { const scales = {}; axes?.forEach(eachAxis => { const axis = eachAxis; const domain = filteredDomains[axis.id]; scales[axis.id] = (0, _getAxisScale.getNormalizedAxisScale)(axis, domain); }); return scales; }); const selectorChartNormalizedYScales = exports.selectorChartNormalizedYScales = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawYAxis, selectorChartFilteredYDomains, function selectorChartNormalizedYScales(axes, filteredDomains) { const scales = {}; axes?.forEach(eachAxis => { const axis = eachAxis; const domain = filteredDomains[axis.id]; scales[axis.id] = (0, _getAxisScale.getNormalizedAxisScale)(axis, domain); }); return scales; }); const selectorChartXScales = exports.selectorChartXScales = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawXAxis, selectorChartNormalizedXScales, _useChartDimensions.selectorChartDrawingArea, selectorChartZoomMap, function selectorChartXScales(axes, normalizedScales, drawingArea, zoomMap) { const scales = {}; axes?.forEach(eachAxis => { const axis = eachAxis; const zoom = zoomMap?.get(axis.id); const zoomRange = zoom ? [zoom.start, zoom.end] : [0, 100]; const range = (0, _getAxisScale.getRange)(drawingArea, 'x', axis); const scale = normalizedScales[axis.id].copy(); const zoomedRange = (0, _zoom.zoomScaleRange)(range, zoomRange); scale.range(zoomedRange); scales[axis.id] = scale; }); return scales; }); const selectorChartYScales = exports.selectorChartYScales = (0, _store.createSelectorMemoized)(_useChartCartesianAxisLayout.selectorChartRawYAxis, selectorChartNormalizedYScales, _useChartDimensions.selectorChartDrawingArea, selectorChartZoomMap, function selectorChartYScales(axes, normalizedScales, drawingArea, zoomMap) { const scales = {}; axes?.forEach(eachAxis => { const axis = eachAxis; const zoom = zoomMap?.get(axis.id); const zoomRange = zoom ? [zoom.start, zoom.end] : [0, 100]; const range = (0, _getAxisScale.getRange)(drawingArea, 'y', axis); const scale = normalizedScales[axis.id].copy(); const scaleRange = (0, _scaleGuards.isOrdinalScale)(scale) ? range.reverse() : range; const zoomedRange = (0, _zoom.zoomScaleRange)(scaleRange, zoomRange); scale.range(zoomedRange); scales[axis.id] = scale; }); return scales; }); /** * The only interesting selectors that merge axis data and zoom if provided. */ const selectorChartXAxis = exports.selectorChartXAxis = (0, _store.createSelectorMemoized)(_useChartDimensions.selectorChartDrawingArea, _useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, selectorChartZoomMap, selectorChartXAxisWithDomains, selectorChartXScales, function selectorChartXAxis(drawingArea, formattedSeries, seriesConfig, zoomMap, { axes, domains }, scales) { return (0, _computeAxisValue.computeAxisValue)({ scales, drawingArea, formattedSeries, axis: axes, seriesConfig, axisDirection: 'x', zoomMap, domains }); }); const selectorChartYAxis = exports.selectorChartYAxis = (0, _store.createSelectorMemoized)(_useChartDimensions.selectorChartDrawingArea, _useChartSeries.selectorChartSeriesProcessed, _useChartSeries.selectorChartSeriesConfig, selectorChartZoomMap, selectorChartYAxisWithDomains, selectorChartYScales, function selectorChartYAxis(drawingArea, formattedSeries, seriesConfig, zoomMap, { axes, domains }, scales) { return (0, _computeAxisValue.computeAxisValue)({ scales, drawingArea, formattedSeries, axis: axes, seriesConfig, axisDirection: 'y', zoomMap, domains }); }); const selectorChartAxis = exports.selectorChartAxis = (0, _store.createSelector)(selectorChartXAxis, selectorChartYAxis, (xAxes, yAxes, axisId) => xAxes?.axis[axisId] ?? yAxes?.axis[axisId]); const selectorChartRawAxis = exports.selectorChartRawAxis = (0, _store.createSelector)(_useChartCartesianAxisLayout.selectorChartRawXAxis, _useChartCartesianAxisLayout.selectorChartRawYAxis, (xAxes, yAxes, axisId) => { const axis = xAxes?.find(a => a.id === axisId) ?? yAxes?.find(a => a.id === axisId) ?? null; if (!axis) { return undefined; } return axis; }); const selectorChartDefaultXAxisId = exports.selectorChartDefaultXAxisId = (0, _store.createSelector)(_useChartCartesianAxisLayout.selectorChartRawXAxis, xAxes => xAxes[0].id); const selectorChartDefaultYAxisId = exports.selectorChartDefaultYAxisId = (0, _store.createSelector)(_useChartCartesianAxisLayout.selectorChartRawYAxis, yAxes => yAxes[0].id); const EMPTY_MAP = new Map(); const selectorChartSeriesEmptyFlatbushMap = () => EMPTY_MAP; exports.selectorChartSeriesEmptyFlatbushMap = selectorChartSeriesEmptyFlatbushMap; const selectorChartSeriesFlatbushMap = exports.selectorChartSeriesFlatbushMap = (0, _store.createSelectorMemoized)(_useChartSeries.selectorChartSeriesProcessed, selectorChartNormalizedXScales, selectorChartNormalizedYScales, selectorChartDefaultXAxisId, selectorChartDefaultYAxisId, function selectChartSeriesFlatbushMap(allSeries, xAxesScaleMap, yAxesScaleMap, defaultXAxisId, defaultYAxisId) { // FIXME: Do we want to support non-scatter series here? const validSeries = allSeries.scatter; const flatbushMap = new Map(); if (!validSeries) { return flatbushMap; } validSeries.seriesOrder.forEach(seriesId => { const { data, xAxisId = defaultXAxisId, yAxisId = defaultYAxisId } = validSeries.series[seriesId]; const flatbush = new _Flatbush.Flatbush(data.length); const originalXScale = xAxesScaleMap[xAxisId]; const originalYScale = yAxesScaleMap[yAxisId]; for (const datum of data) { // Add the points using a [0, 1] range so that we don't need to recreate the Flatbush structure when zooming. // This doesn't happen in practice, though, because currently the scales depend on the drawing area. flatbush.add(originalXScale(datum.x), originalYScale(datum.y)); } flatbush.finish(); flatbushMap.set(seriesId, flatbush); }); return flatbushMap; });