@mui/x-charts
Version:
The community edition of MUI X Charts components.
95 lines (91 loc) • 4.96 kB
JavaScript
import { createSelector, createSelectorMemoized } from '@mui/x-internals/store';
import { getSeriesHighlightedDataIndex, getSeriesUnfadedDataIndex, isSeriesFaded, isSeriesHighlighted } from "./highlightStates.mjs";
import { selectorChartsKeyboardItem } from "../useChartKeyboardNavigation/index.mjs";
import { selectorChartSeriesProcessed } from "../../corePlugins/useChartSeries/useChartSeries.selectors.mjs";
import { selectorChartSeriesConfig } from "../../corePlugins/useChartSeriesConfig/index.mjs";
const selectHighlight = state => state.highlight;
export const selectorChartsHighlightScopePerSeriesId = createSelectorMemoized(selectorChartSeriesProcessed, processedSeries => {
const map = {};
Object.keys(processedSeries).forEach(seriesType => {
map[seriesType] = new Map();
const seriesData = processedSeries[seriesType];
seriesData?.seriesOrder?.forEach(seriesId => {
const seriesItem = seriesData?.series[seriesId];
if (seriesItem?.highlightScope !== undefined) {
map[seriesType]?.set(seriesId, seriesItem.highlightScope);
}
});
});
return map;
});
export const selectorChartsHighlightedItem = createSelectorMemoized(selectHighlight, selectorChartsKeyboardItem, function selectorChartsHighlightedItem(highlight, keyboardItem) {
return highlight.isControlled || highlight.lastUpdate === 'pointer' ? highlight.item : keyboardItem;
});
export const selectorChartsHighlightScope = createSelector(selectorChartsHighlightScopePerSeriesId, selectorChartsHighlightedItem, function selectorChartsHighlightScope(seriesIdToHighlightScope, highlightedItem) {
if (!highlightedItem) {
return null;
}
const highlightScope = seriesIdToHighlightScope[highlightedItem.type]?.get(highlightedItem.seriesId);
if (highlightScope === undefined) {
return null;
}
return highlightScope;
});
const alwaysNone = () => 'none';
const selectorChartsHighlightStateCallbackImpl = createSelectorMemoized(selectorChartsHighlightScope, selectorChartsHighlightedItem, selectorChartSeriesConfig, function selectorChartsHighlightStateCallbackCombiner(highlightScope, highlightedItem, seriesConfig) {
if (highlightedItem === null || highlightScope === null) {
return alwaysNone;
}
const config = seriesConfig[highlightedItem.type];
const isHighlighted = config.isHighlightedCreator(highlightScope, highlightedItem);
const isFaded = config.isFadedCreator(highlightScope, highlightedItem);
return item => {
if (isHighlighted(item)) {
return 'highlighted';
}
if (isFaded(item)) {
return 'faded';
}
return 'none';
};
});
/**
* Returns a callback to get the highlight state of an item.
* Uses an explicit function declaration so that TypeScript preserves
* the `HighlightItemIdentifier<ChartSeriesType>` reference in `.d.ts` output,
* allowing module augmentation from pro/premium packages to extend the accepted types.
*/
export function selectorChartsHighlightStateCallback(state) {
return selectorChartsHighlightStateCallbackImpl(state);
}
const selectorChartsHighlightStateImpl = createSelectorMemoized(selectorChartsHighlightStateCallback, function selectorChartsHighlightStateCombiner(getHighlightState, item) {
return getHighlightState(item);
});
/**
* Returns the highlight state of an item.
* Uses an explicit function declaration so that TypeScript preserves
* the `HighlightItemIdentifier<ChartSeriesType>` reference in `.d.ts` output,
* allowing module augmentation from pro/premium packages to extend the accepted types.
*/
export function selectorChartsHighlightState(state, item) {
return selectorChartsHighlightStateImpl(state, item);
}
// ==========================================================================================
//
// Selectors for a specific series
//
// Those selectors are for series with batch rendering (e.g., Scatter, Bar, Line)
//
// ==========================================================================================
export const selectorChartIsSeriesHighlighted = createSelector(selectorChartsHighlightScope, selectorChartsHighlightedItem, function selectorChartIsSeriesHighlighted(scope, item, seriesId) {
return isSeriesHighlighted(scope, item, seriesId);
});
export const selectorChartIsSeriesFaded = createSelector(selectorChartsHighlightScope, selectorChartsHighlightedItem, function selectorChartIsSeriesFaded(scope, item, seriesId) {
return isSeriesFaded(scope, item, seriesId);
});
export const selectorChartSeriesUnfadedItem = createSelector(selectorChartsHighlightScope, selectorChartsHighlightedItem, function selectorChartSeriesUnfadedItem(scope, item, seriesId) {
return getSeriesUnfadedDataIndex(scope, item, seriesId);
});
export const selectorChartSeriesHighlightedItem = createSelector(selectorChartsHighlightScope, selectorChartsHighlightedItem, function selectorChartSeriesHighlightedItem(scope, item, seriesId) {
return getSeriesHighlightedDataIndex(scope, item, seriesId);
});