UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

95 lines (91 loc) 4.96 kB
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); });