UNPKG

recharts

Version:
200 lines (190 loc) 7.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tooltipReducer = exports.setTooltipSettingsState = exports.setSyncInteraction = exports.setMouseOverAxisIndex = exports.setMouseClickAxisIndex = exports.setKeyboardInteraction = exports.setActiveMouseOverItemIndex = exports.setActiveClickItemIndex = exports.removeTooltipEntrySettings = exports.noInteraction = exports.mouseLeaveItem = exports.mouseLeaveChart = exports.initialState = exports.addTooltipEntrySettings = void 0; var _toolkit = require("@reduxjs/toolkit"); var _immer = require("immer"); /** * One Tooltip can display multiple TooltipPayloadEntries at a time. */ /** * So what happens is that the tooltip payload is decided based on the available data, and the dataKey. * The dataKey can either be defined on the graphical element (like Line, or Bar) * or on the tooltip itself. * * The data can be defined in the chart element, or in the graphical item. * * So this type is all the settings, other than the data + dataKey complications. */ /** * This is what Tooltip renders. */ /** * null means no active index * string means: whichever index from the chart data it is. * Different charts have different requirements on data shapes, * and are also responsible for providing a function that will accept this index * and return data. */ /** * Different items have different data shapes so the state has no opinion on what the data shape should be; * the only requirement is that the chart also provides a searcher function * that accepts the data, and a key, and returns whatever the payload in Tooltip should be. */ /** * So this informs the "tooltip event type". Tooltip event type can be either "axis" or "item" * and it is used for two things: * 1. Sets the active area * 2. Sets the background and cursor highlights * * Some charts only allow to have one type of tooltip event type, some allow both. * Those charts that allow both will have one default, and the "shared" prop will be used to switch between them. * Undefined means "use the chart default". * * Charts that only allow one tooltip event type, will ignore the shared prop. */ /** * A generic state for user interaction with the chart. * User interaction can come through multiple channels: mouse events, keyboard events, or hardcoded in props, or synchronised from other charts. * * Each of the interaction states is represented as TooltipInteractionState, * and then the selectors and Tooltip will decide which of the interaction states to use. */ var noInteraction = exports.noInteraction = { active: false, index: null, dataKey: undefined, coordinate: undefined }; /** * The tooltip interaction state stores: * * - Which graphical item is user interacting with at the moment, * - which axis (or, which part of chart background) is user interacting with at the moment * - The data that individual graphical items wish to be displayed in case the tooltip gets activated */ var initialState = exports.initialState = { itemInteraction: { click: noInteraction, hover: noInteraction }, axisInteraction: { click: noInteraction, hover: noInteraction }, keyboardInteraction: noInteraction, syncInteraction: { active: false, index: null, dataKey: undefined, label: undefined, coordinate: undefined }, tooltipItemPayloads: [], settings: { shared: undefined, trigger: 'hover', axisId: 0, active: false, defaultIndex: undefined } }; var tooltipSlice = (0, _toolkit.createSlice)({ name: 'tooltip', initialState, reducers: { addTooltipEntrySettings(state, action) { state.tooltipItemPayloads.push((0, _immer.castDraft)(action.payload)); }, removeTooltipEntrySettings(state, action) { var index = (0, _toolkit.current)(state).tooltipItemPayloads.indexOf((0, _immer.castDraft)(action.payload)); if (index > -1) { state.tooltipItemPayloads.splice(index, 1); } }, setTooltipSettingsState(state, action) { state.settings = action.payload; }, setActiveMouseOverItemIndex(state, action) { state.syncInteraction.active = false; state.keyboardInteraction.active = false; state.itemInteraction.hover.active = true; state.itemInteraction.hover.index = action.payload.activeIndex; state.itemInteraction.hover.dataKey = action.payload.activeDataKey; state.itemInteraction.hover.coordinate = action.payload.activeCoordinate; }, mouseLeaveChart(state) { /* * Clear only the active flags. Why? * 1. Keep Coordinate to preserve animation - next time the Tooltip appears, we want to render it from * the last place where it was when it disappeared. * 2. We want to keep all the properties anyway just in case the tooltip has `active=true` prop * and continues being visible even after the mouse has left the chart. */ state.itemInteraction.hover.active = false; state.axisInteraction.hover.active = false; }, mouseLeaveItem(state) { state.itemInteraction.hover.active = false; }, setActiveClickItemIndex(state, action) { state.syncInteraction.active = false; state.itemInteraction.click.active = true; state.keyboardInteraction.active = false; state.itemInteraction.click.index = action.payload.activeIndex; state.itemInteraction.click.dataKey = action.payload.activeDataKey; state.itemInteraction.click.coordinate = action.payload.activeCoordinate; }, setMouseOverAxisIndex(state, action) { state.syncInteraction.active = false; state.axisInteraction.hover.active = true; state.keyboardInteraction.active = false; state.axisInteraction.hover.index = action.payload.activeIndex; state.axisInteraction.hover.dataKey = action.payload.activeDataKey; state.axisInteraction.hover.coordinate = action.payload.activeCoordinate; }, setMouseClickAxisIndex(state, action) { state.syncInteraction.active = false; state.keyboardInteraction.active = false; state.axisInteraction.click.active = true; state.axisInteraction.click.index = action.payload.activeIndex; state.axisInteraction.click.dataKey = action.payload.activeDataKey; state.axisInteraction.click.coordinate = action.payload.activeCoordinate; }, setSyncInteraction(state, action) { state.syncInteraction = action.payload; }, setKeyboardInteraction(state, action) { state.keyboardInteraction.active = action.payload.active; state.keyboardInteraction.index = action.payload.activeIndex; state.keyboardInteraction.coordinate = action.payload.activeCoordinate; state.keyboardInteraction.dataKey = action.payload.activeDataKey; } } }); var { addTooltipEntrySettings, removeTooltipEntrySettings, setTooltipSettingsState, setActiveMouseOverItemIndex, mouseLeaveItem, mouseLeaveChart, setActiveClickItemIndex, setMouseOverAxisIndex, setMouseClickAxisIndex, setSyncInteraction, setKeyboardInteraction } = tooltipSlice.actions; exports.setKeyboardInteraction = setKeyboardInteraction; exports.setSyncInteraction = setSyncInteraction; exports.setMouseClickAxisIndex = setMouseClickAxisIndex; exports.setMouseOverAxisIndex = setMouseOverAxisIndex; exports.setActiveClickItemIndex = setActiveClickItemIndex; exports.mouseLeaveChart = mouseLeaveChart; exports.mouseLeaveItem = mouseLeaveItem; exports.setActiveMouseOverItemIndex = setActiveMouseOverItemIndex; exports.setTooltipSettingsState = setTooltipSettingsState; exports.removeTooltipEntrySettings = removeTooltipEntrySettings; exports.addTooltipEntrySettings = addTooltipEntrySettings; var tooltipReducer = exports.tooltipReducer = tooltipSlice.reducer;