| 1 | import { createSelector } from 'reselect';
|
|---|
| 2 | import { combineAppliedValues, combineAreasDomain, combineAxisDomain, combineAxisDomainWithNiceTicks, combineCategoricalDomain, combineDisplayedData, combineDomainOfAllAppliedNumericalValuesIncludingErrorValues, combineDomainOfStackGroups, combineDotsDomain, combineDuplicateDomain, combineGraphicalItemsData, combineGraphicalItemsSettings, combineLinesDomain, combineNiceTicks, combineNumericalDomain, combineRealScaleType, combineScaleFunction, combineStackGroups, filterGraphicalNotStackedItems, filterReferenceElements, getDomainDefinition, itemAxisPredicate, mergeDomains, selectAllErrorBarSettings, selectAxisRange, selectHasBar, selectReferenceAreas, selectReferenceDots, selectReferenceLines, selectTooltipAxis, selectTooltipAxisDataKey } from './axisSelectors';
|
|---|
| 3 | import { selectChartLayout } from '../../context/chartLayoutContext';
|
|---|
| 4 | import { isCategoricalAxis } from '../../util/ChartUtils';
|
|---|
| 5 | import { selectChartDataWithIndexes } from './dataSelectors';
|
|---|
| 6 | import { selectChartName, selectReverseStackOrder, selectStackOffsetType } from './rootPropsSelectors';
|
|---|
| 7 | import { isNotNil, mathSign } from '../../util/DataUtils';
|
|---|
| 8 | import { combineAxisRangeWithReverse } from './combiners/combineAxisRangeWithReverse';
|
|---|
| 9 | import { combineTooltipEventType, selectDefaultTooltipEventType, selectValidateTooltipEventTypes } from './selectTooltipEventType';
|
|---|
| 10 | import { combineActiveLabel } from './combiners/combineActiveLabel';
|
|---|
| 11 | import { selectTooltipSettings } from './selectTooltipSettings';
|
|---|
| 12 | import { combineTooltipInteractionState } from './combiners/combineTooltipInteractionState';
|
|---|
| 13 | import { combineActiveTooltipIndex } from './combiners/combineActiveTooltipIndex';
|
|---|
| 14 | import { combineCoordinateForDefaultIndex } from './combiners/combineCoordinateForDefaultIndex';
|
|---|
| 15 | import { selectChartHeight, selectChartWidth } from './containerSelectors';
|
|---|
| 16 | import { selectChartOffsetInternal } from './selectChartOffsetInternal';
|
|---|
| 17 | import { combineTooltipPayloadConfigurations } from './combiners/combineTooltipPayloadConfigurations';
|
|---|
| 18 | import { selectTooltipPayloadSearcher } from './selectTooltipPayloadSearcher';
|
|---|
| 19 | import { selectTooltipState } from './selectTooltipState';
|
|---|
| 20 | import { combineTooltipPayload } from './combiners/combineTooltipPayload';
|
|---|
| 21 | import { selectTooltipAxisId } from './selectTooltipAxisId';
|
|---|
| 22 | import { selectTooltipAxisType } from './selectTooltipAxisType';
|
|---|
| 23 | import { combineDisplayedStackedData } from './combiners/combineDisplayedStackedData';
|
|---|
| 24 | import { isStacked } from '../types/StackedGraphicalItem';
|
|---|
| 25 | import { numericalDomainSpecifiedWithoutRequiringData } from '../../util/isDomainSpecifiedByUser';
|
|---|
| 26 | import { numberDomainEqualityCheck } from './numberDomainEqualityCheck';
|
|---|
| 27 | import { emptyArraysAreEqualCheck } from './arrayEqualityCheck';
|
|---|
| 28 | import { isWellBehavedNumber } from '../../util/isWellBehavedNumber';
|
|---|
| 29 | export var selectTooltipAxisRealScaleType = createSelector([selectTooltipAxis, selectHasBar, selectChartName], combineRealScaleType);
|
|---|
| 30 | export var selectAllUnfilteredGraphicalItems = createSelector([state => state.graphicalItems.cartesianItems, state => state.graphicalItems.polarItems], (cartesianItems, polarItems) => [...cartesianItems, ...polarItems]);
|
|---|
| 31 | var selectTooltipAxisPredicate = createSelector([selectTooltipAxisType, selectTooltipAxisId], itemAxisPredicate);
|
|---|
| 32 | export var selectAllGraphicalItemsSettings = createSelector([selectAllUnfilteredGraphicalItems, selectTooltipAxis, selectTooltipAxisPredicate], combineGraphicalItemsSettings, {
|
|---|
| 33 | memoizeOptions: {
|
|---|
| 34 | resultEqualityCheck: emptyArraysAreEqualCheck
|
|---|
| 35 | }
|
|---|
| 36 | });
|
|---|
| 37 | var selectAllStackedGraphicalItemsSettings = createSelector([selectAllGraphicalItemsSettings], graphicalItems => graphicalItems.filter(isStacked));
|
|---|
| 38 | export var selectTooltipGraphicalItemsData = createSelector([selectAllGraphicalItemsSettings], combineGraphicalItemsData, {
|
|---|
| 39 | memoizeOptions: {
|
|---|
| 40 | resultEqualityCheck: emptyArraysAreEqualCheck
|
|---|
| 41 | }
|
|---|
| 42 | });
|
|---|
| 43 |
|
|---|
| 44 | /**
|
|---|
| 45 | * Data for tooltip always use the data with indexes set by a Brush,
|
|---|
| 46 | * and never accept the isPanorama flag:
|
|---|
| 47 | * because Tooltip never displays inside the panorama anyway
|
|---|
| 48 | * so we don't need to worry what would happen there.
|
|---|
| 49 | */
|
|---|
| 50 | export var selectTooltipDisplayedData = createSelector([selectTooltipGraphicalItemsData, selectChartDataWithIndexes], combineDisplayedData);
|
|---|
| 51 | var selectTooltipStackedData = createSelector([selectAllStackedGraphicalItemsSettings, selectChartDataWithIndexes, selectTooltipAxis], combineDisplayedStackedData);
|
|---|
| 52 | var selectAllTooltipAppliedValues = createSelector([selectTooltipDisplayedData, selectTooltipAxis, selectAllGraphicalItemsSettings], combineAppliedValues);
|
|---|
| 53 | var selectTooltipAxisDomainDefinition = createSelector([selectTooltipAxis], getDomainDefinition);
|
|---|
| 54 | var selectTooltipDataOverflow = createSelector([selectTooltipAxis], axisSettings => axisSettings.allowDataOverflow);
|
|---|
| 55 | var selectTooltipDomainFromUserPreferences = createSelector([selectTooltipAxisDomainDefinition, selectTooltipDataOverflow], numericalDomainSpecifiedWithoutRequiringData);
|
|---|
| 56 | var selectAllStackedGraphicalItems = createSelector([selectAllGraphicalItemsSettings], graphicalItems => graphicalItems.filter(isStacked));
|
|---|
| 57 | var selectTooltipStackGroups = createSelector([selectTooltipStackedData, selectAllStackedGraphicalItems, selectStackOffsetType, selectReverseStackOrder], combineStackGroups);
|
|---|
| 58 | var selectTooltipDomainOfStackGroups = createSelector([selectTooltipStackGroups, selectChartDataWithIndexes, selectTooltipAxisType, selectTooltipDomainFromUserPreferences], combineDomainOfStackGroups);
|
|---|
| 59 | var selectTooltipItemsSettingsExceptStacked = createSelector([selectAllGraphicalItemsSettings], filterGraphicalNotStackedItems);
|
|---|
| 60 | var selectDomainOfAllAppliedNumericalValuesIncludingErrorValues = createSelector([selectTooltipDisplayedData, selectTooltipAxis, selectTooltipItemsSettingsExceptStacked, selectAllErrorBarSettings, selectTooltipAxisType], combineDomainOfAllAppliedNumericalValuesIncludingErrorValues, {
|
|---|
| 61 | memoizeOptions: {
|
|---|
| 62 | resultEqualityCheck: numberDomainEqualityCheck
|
|---|
| 63 | }
|
|---|
| 64 | });
|
|---|
| 65 | var selectReferenceDotsByTooltipAxis = createSelector([selectReferenceDots, selectTooltipAxisType, selectTooltipAxisId], filterReferenceElements);
|
|---|
| 66 | var selectTooltipReferenceDotsDomain = createSelector([selectReferenceDotsByTooltipAxis, selectTooltipAxisType], combineDotsDomain);
|
|---|
| 67 | var selectReferenceAreasByTooltipAxis = createSelector([selectReferenceAreas, selectTooltipAxisType, selectTooltipAxisId], filterReferenceElements);
|
|---|
| 68 | var selectTooltipReferenceAreasDomain = createSelector([selectReferenceAreasByTooltipAxis, selectTooltipAxisType], combineAreasDomain);
|
|---|
| 69 | var selectReferenceLinesByTooltipAxis = createSelector([selectReferenceLines, selectTooltipAxisType, selectTooltipAxisId], filterReferenceElements);
|
|---|
| 70 | var selectTooltipReferenceLinesDomain = createSelector([selectReferenceLinesByTooltipAxis, selectTooltipAxisType], combineLinesDomain);
|
|---|
| 71 | var selectTooltipReferenceElementsDomain = createSelector([selectTooltipReferenceDotsDomain, selectTooltipReferenceLinesDomain, selectTooltipReferenceAreasDomain], mergeDomains);
|
|---|
| 72 | var selectTooltipNumericalDomain = createSelector([selectTooltipAxis, selectTooltipAxisDomainDefinition, selectTooltipDomainFromUserPreferences, selectTooltipDomainOfStackGroups, selectDomainOfAllAppliedNumericalValuesIncludingErrorValues, selectTooltipReferenceElementsDomain, selectChartLayout, selectTooltipAxisType], combineNumericalDomain);
|
|---|
| 73 | export var selectTooltipAxisDomain = createSelector([selectTooltipAxis, selectChartLayout, selectTooltipDisplayedData, selectAllTooltipAppliedValues, selectStackOffsetType, selectTooltipAxisType, selectTooltipNumericalDomain], combineAxisDomain);
|
|---|
| 74 | var selectTooltipNiceTicks = createSelector([selectTooltipAxisDomain, selectTooltipAxis, selectTooltipAxisRealScaleType], combineNiceTicks);
|
|---|
| 75 | export var selectTooltipAxisDomainIncludingNiceTicks = createSelector([selectTooltipAxis, selectTooltipAxisDomain, selectTooltipNiceTicks, selectTooltipAxisType], combineAxisDomainWithNiceTicks);
|
|---|
| 76 | var selectTooltipAxisRange = state => {
|
|---|
| 77 | var axisType = selectTooltipAxisType(state);
|
|---|
| 78 | var axisId = selectTooltipAxisId(state);
|
|---|
| 79 | var isPanorama = false; // Tooltip never displays in panorama so this is safe to assume
|
|---|
| 80 | return selectAxisRange(state, axisType, axisId, isPanorama);
|
|---|
| 81 | };
|
|---|
| 82 | export var selectTooltipAxisRangeWithReverse = createSelector([selectTooltipAxis, selectTooltipAxisRange], combineAxisRangeWithReverse);
|
|---|
| 83 | export var selectTooltipAxisScale = createSelector([selectTooltipAxis, selectTooltipAxisRealScaleType, selectTooltipAxisDomainIncludingNiceTicks, selectTooltipAxisRangeWithReverse], combineScaleFunction);
|
|---|
| 84 | var selectTooltipDuplicateDomain = createSelector([selectChartLayout, selectAllTooltipAppliedValues, selectTooltipAxis, selectTooltipAxisType], combineDuplicateDomain);
|
|---|
| 85 | export var selectTooltipCategoricalDomain = createSelector([selectChartLayout, selectAllTooltipAppliedValues, selectTooltipAxis, selectTooltipAxisType], combineCategoricalDomain);
|
|---|
| 86 | var combineTicksOfTooltipAxis = (layout, axis, realScaleType, scale, range, duplicateDomain, categoricalDomain, axisType) => {
|
|---|
| 87 | if (!axis) {
|
|---|
| 88 | return undefined;
|
|---|
| 89 | }
|
|---|
| 90 | var {
|
|---|
| 91 | type
|
|---|
| 92 | } = axis;
|
|---|
| 93 | var isCategorical = isCategoricalAxis(layout, axisType);
|
|---|
| 94 | if (!scale) {
|
|---|
| 95 | return undefined;
|
|---|
| 96 | }
|
|---|
| 97 | var offsetForBand = realScaleType === 'scaleBand' && scale.bandwidth ? scale.bandwidth() / 2 : 2;
|
|---|
| 98 | var offset = type === 'category' && scale.bandwidth ? scale.bandwidth() / offsetForBand : 0;
|
|---|
| 99 | offset = axisType === 'angleAxis' && range != null && (range === null || range === void 0 ? void 0 : range.length) >= 2 ? mathSign(range[0] - range[1]) * 2 * offset : offset;
|
|---|
| 100 |
|
|---|
| 101 | // When axis is a categorical axis, but the type of axis is number or the scale of axis is not "auto"
|
|---|
| 102 | if (isCategorical && categoricalDomain) {
|
|---|
| 103 | return categoricalDomain.map((entry, index) => {
|
|---|
| 104 | var scaled = scale.map(entry);
|
|---|
| 105 | if (!isWellBehavedNumber(scaled)) {
|
|---|
| 106 | return null;
|
|---|
| 107 | }
|
|---|
| 108 | return {
|
|---|
| 109 | coordinate: scaled + offset,
|
|---|
| 110 | value: entry,
|
|---|
| 111 | index,
|
|---|
| 112 | offset
|
|---|
| 113 | };
|
|---|
| 114 | }).filter(isNotNil);
|
|---|
| 115 | }
|
|---|
| 116 |
|
|---|
| 117 | // When axis has duplicated text, serial numbers are used to generate scale
|
|---|
| 118 | return scale.domain().map((entry, index) => {
|
|---|
| 119 | var scaled = scale.map(entry);
|
|---|
| 120 | if (!isWellBehavedNumber(scaled)) {
|
|---|
| 121 | return null;
|
|---|
| 122 | }
|
|---|
| 123 | return {
|
|---|
| 124 | coordinate: scaled + offset,
|
|---|
| 125 | // @ts-expect-error can't use Date as an index
|
|---|
| 126 | value: duplicateDomain ? duplicateDomain[entry] : entry,
|
|---|
| 127 | index,
|
|---|
| 128 | offset
|
|---|
| 129 | };
|
|---|
| 130 | }).filter(isNotNil);
|
|---|
| 131 | };
|
|---|
| 132 |
|
|---|
| 133 | /**
|
|---|
| 134 | * Of on four almost identical implementations of tick generation.
|
|---|
| 135 | * The four horsemen of tick generation are:
|
|---|
| 136 | * - {@link selectTooltipAxisTicks}
|
|---|
| 137 | * - {@link combineAxisTicks}
|
|---|
| 138 | * - {@link getTicksOfAxis}.
|
|---|
| 139 | * - {@link combineGraphicalItemTicks}
|
|---|
| 140 | */
|
|---|
| 141 | export var selectTooltipAxisTicks = createSelector([selectChartLayout, selectTooltipAxis, selectTooltipAxisRealScaleType, selectTooltipAxisScale, selectTooltipAxisRange, selectTooltipDuplicateDomain, selectTooltipCategoricalDomain, selectTooltipAxisType], combineTicksOfTooltipAxis);
|
|---|
| 142 | var selectTooltipEventType = createSelector([selectDefaultTooltipEventType, selectValidateTooltipEventTypes, selectTooltipSettings], (defaultTooltipEventType, validateTooltipEventType, settings) => combineTooltipEventType(settings.shared, defaultTooltipEventType, validateTooltipEventType));
|
|---|
| 143 | var selectTooltipTrigger = state => state.tooltip.settings.trigger;
|
|---|
| 144 | var selectDefaultIndex = state => state.tooltip.settings.defaultIndex;
|
|---|
| 145 | var selectTooltipInteractionState = createSelector([selectTooltipState, selectTooltipEventType, selectTooltipTrigger, selectDefaultIndex], combineTooltipInteractionState);
|
|---|
| 146 | export var selectActiveTooltipIndex = createSelector([selectTooltipInteractionState, selectTooltipDisplayedData, selectTooltipAxisDataKey, selectTooltipAxisDomain], combineActiveTooltipIndex);
|
|---|
| 147 | export var selectActiveLabel = createSelector([selectTooltipAxisTicks, selectActiveTooltipIndex], combineActiveLabel);
|
|---|
| 148 | export var selectActiveTooltipDataKey = createSelector([selectTooltipInteractionState], tooltipInteraction => {
|
|---|
| 149 | if (!tooltipInteraction) {
|
|---|
| 150 | return undefined;
|
|---|
| 151 | }
|
|---|
| 152 | return tooltipInteraction.dataKey;
|
|---|
| 153 | });
|
|---|
| 154 | export var selectActiveTooltipGraphicalItemId = createSelector([selectTooltipInteractionState], tooltipInteraction => {
|
|---|
| 155 | if (!tooltipInteraction) {
|
|---|
| 156 | return undefined;
|
|---|
| 157 | }
|
|---|
| 158 | return tooltipInteraction.graphicalItemId;
|
|---|
| 159 | });
|
|---|
| 160 | var selectTooltipPayloadConfigurations = createSelector([selectTooltipState, selectTooltipEventType, selectTooltipTrigger, selectDefaultIndex], combineTooltipPayloadConfigurations);
|
|---|
| 161 | var selectTooltipCoordinateForDefaultIndex = createSelector([selectChartWidth, selectChartHeight, selectChartLayout, selectChartOffsetInternal, selectTooltipAxisTicks, selectDefaultIndex, selectTooltipPayloadConfigurations], combineCoordinateForDefaultIndex);
|
|---|
| 162 | export var selectActiveTooltipCoordinate = createSelector([selectTooltipInteractionState, selectTooltipCoordinateForDefaultIndex], (tooltipInteractionState, defaultIndexCoordinate) => {
|
|---|
| 163 | if (tooltipInteractionState !== null && tooltipInteractionState !== void 0 && tooltipInteractionState.coordinate) {
|
|---|
| 164 | return tooltipInteractionState.coordinate;
|
|---|
| 165 | }
|
|---|
| 166 | return defaultIndexCoordinate;
|
|---|
| 167 | });
|
|---|
| 168 | export var selectIsTooltipActive = createSelector([selectTooltipInteractionState], tooltipInteractionState => {
|
|---|
| 169 | var _tooltipInteractionSt;
|
|---|
| 170 | return (_tooltipInteractionSt = tooltipInteractionState === null || tooltipInteractionState === void 0 ? void 0 : tooltipInteractionState.active) !== null && _tooltipInteractionSt !== void 0 ? _tooltipInteractionSt : false;
|
|---|
| 171 | });
|
|---|
| 172 | export var selectActiveTooltipPayload = createSelector([selectTooltipPayloadConfigurations, selectActiveTooltipIndex, selectChartDataWithIndexes, selectTooltipAxisDataKey, selectActiveLabel, selectTooltipPayloadSearcher, selectTooltipEventType], combineTooltipPayload);
|
|---|
| 173 | export var selectActiveTooltipDataPoints = createSelector([selectActiveTooltipPayload], payload => {
|
|---|
| 174 | if (payload == null) {
|
|---|
| 175 | return undefined;
|
|---|
| 176 | }
|
|---|
| 177 | var dataPoints = payload.map(p => p.payload).filter(p => p != null);
|
|---|
| 178 | return Array.from(new Set(dataPoints));
|
|---|
| 179 | }); |
|---|