UNPKG

recharts

Version:
486 lines (484 loc) 21.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RadialBar = RadialBar; exports.computeRadialBarDataItems = computeRadialBarDataItems; exports.defaultRadialBarProps = void 0; var _react = _interopRequireWildcard(require("react")); var React = _react; var _clsx = require("clsx"); var _RadialBarUtils = require("../util/RadialBarUtils"); var _Layer = require("../container/Layer"); var _ReactUtils = require("../util/ReactUtils"); var _LabelList = require("../component/LabelList"); var _Cell = require("../component/Cell"); var _DataUtils = require("../util/DataUtils"); var _ChartUtils = require("../util/ChartUtils"); var _types = require("../util/types"); var _tooltipContext = require("../context/tooltipContext"); var _SetTooltipEntrySettings = require("../state/SetTooltipEntrySettings"); var _radialBarSelectors = require("../state/selectors/radialBarSelectors"); var _hooks = require("../state/hooks"); var _tooltipSelectors = require("../state/selectors/tooltipSelectors"); var _SetLegendPayload = require("../state/SetLegendPayload"); var _useAnimationId = require("../util/useAnimationId"); var _RegisterGraphicalItemId = require("../context/RegisterGraphicalItemId"); var _SetGraphicalItem = require("../state/SetGraphicalItem"); var _svgPropertiesNoEvents = require("../util/svgPropertiesNoEvents"); var _JavascriptAnimate = require("../animation/JavascriptAnimate"); var _resolveDefaultProps = require("../util/resolveDefaultProps"); var _ZIndexLayer = require("../zIndex/ZIndexLayer"); var _DefaultZIndexes = require("../zIndex/DefaultZIndexes"); var _getZIndexFromUnknown = require("../zIndex/getZIndexFromUnknown"); var _excluded = ["shape", "activeShape", "cornerRadius", "id"], _excluded2 = ["onMouseEnter", "onClick", "onMouseLeave"], _excluded3 = ["value", "background"]; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } var STABLE_EMPTY_ARRAY = []; function RadialBarLabelListProvider(_ref) { var { showLabels, sectors, children } = _ref; var labelListEntries = sectors.map(sector => ({ value: sector.value, payload: sector.payload, parentViewBox: undefined, clockWise: false, viewBox: { cx: sector.cx, cy: sector.cy, innerRadius: sector.innerRadius, outerRadius: sector.outerRadius, startAngle: sector.startAngle, endAngle: sector.endAngle, clockWise: false }, fill: sector.fill })); return /*#__PURE__*/React.createElement(_LabelList.PolarLabelListContextProvider, { value: showLabels ? labelListEntries : undefined }, children); } function RadialBarSectors(_ref2) { var { sectors, allOtherRadialBarProps, showLabels } = _ref2; var { shape, activeShape, cornerRadius, id } = allOtherRadialBarProps, others = _objectWithoutProperties(allOtherRadialBarProps, _excluded); var baseProps = (0, _svgPropertiesNoEvents.svgPropertiesNoEvents)(others); var activeIndex = (0, _hooks.useAppSelector)(_tooltipSelectors.selectActiveTooltipIndex); var { onMouseEnter: onMouseEnterFromProps, onClick: onItemClickFromProps, onMouseLeave: onMouseLeaveFromProps } = allOtherRadialBarProps, restOfAllOtherProps = _objectWithoutProperties(allOtherRadialBarProps, _excluded2); var onMouseEnterFromContext = (0, _tooltipContext.useMouseEnterItemDispatch)(onMouseEnterFromProps, allOtherRadialBarProps.dataKey, id); var onMouseLeaveFromContext = (0, _tooltipContext.useMouseLeaveItemDispatch)(onMouseLeaveFromProps); var onClickFromContext = (0, _tooltipContext.useMouseClickItemDispatch)(onItemClickFromProps, allOtherRadialBarProps.dataKey, id); if (sectors == null) { return null; } return /*#__PURE__*/React.createElement(RadialBarLabelListProvider, { showLabels: showLabels, sectors: sectors }, sectors.map((entry, i) => { var isActive = activeShape && activeIndex === String(i); // @ts-expect-error the types need a bit of attention var onMouseEnter = onMouseEnterFromContext(entry, i); // @ts-expect-error the types need a bit of attention var onMouseLeave = onMouseLeaveFromContext(entry, i); // @ts-expect-error the types need a bit of attention var onClick = onClickFromContext(entry, i); var radialBarSectorProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, baseProps), {}, { cornerRadius: (0, _RadialBarUtils.parseCornerRadius)(cornerRadius) }, entry), (0, _types.adaptEventsOfChild)(restOfAllOtherProps, entry, i)), {}, { onMouseEnter, onMouseLeave, onClick, className: "recharts-radial-bar-sector ".concat(entry.className), forceCornerRadius: others.forceCornerRadius, cornerIsExternal: others.cornerIsExternal, isActive, option: isActive ? activeShape : shape }); if (isActive) { return /*#__PURE__*/React.createElement(_ZIndexLayer.ZIndexLayer, { zIndex: _DefaultZIndexes.DefaultZIndexes.activeBar, key: "sector-".concat(entry.cx, "-").concat(entry.cy, "-").concat(entry.innerRadius, "-").concat(entry.outerRadius, "-").concat(entry.startAngle, "-").concat(entry.endAngle, "-").concat(i) }, /*#__PURE__*/React.createElement(_RadialBarUtils.RadialBarSector, radialBarSectorProps)); } return /*#__PURE__*/React.createElement(_RadialBarUtils.RadialBarSector, _extends({ key: "sector-".concat(entry.cx, "-").concat(entry.cy, "-").concat(entry.innerRadius, "-").concat(entry.outerRadius, "-").concat(entry.startAngle, "-").concat(entry.endAngle, "-").concat(i) }, radialBarSectorProps)); }), /*#__PURE__*/React.createElement(_LabelList.LabelListFromLabelProp, { label: allOtherRadialBarProps.label }), allOtherRadialBarProps.children); } function SectorsWithAnimation(_ref3) { var { props, previousSectorsRef } = _ref3; var { sectors, isAnimationActive, animationBegin, animationDuration, animationEasing, onAnimationEnd, onAnimationStart } = props; var animationId = (0, _useAnimationId.useAnimationId)(props, 'recharts-radialbar-'); var prevData = previousSectorsRef.current; var [isAnimating, setIsAnimating] = (0, _react.useState)(false); var handleAnimationEnd = (0, _react.useCallback)(() => { if (typeof onAnimationEnd === 'function') { onAnimationEnd(); } setIsAnimating(false); }, [onAnimationEnd]); var handleAnimationStart = (0, _react.useCallback)(() => { if (typeof onAnimationStart === 'function') { onAnimationStart(); } setIsAnimating(true); }, [onAnimationStart]); return /*#__PURE__*/React.createElement(_JavascriptAnimate.JavascriptAnimate, { animationId: animationId, begin: animationBegin, duration: animationDuration, isActive: isAnimationActive, easing: animationEasing, onAnimationStart: handleAnimationStart, onAnimationEnd: handleAnimationEnd, key: animationId }, t => { var stepData = t === 1 ? sectors : (sectors !== null && sectors !== void 0 ? sectors : STABLE_EMPTY_ARRAY).map((entry, index) => { var prev = prevData && prevData[index]; if (prev) { return _objectSpread(_objectSpread({}, entry), {}, { startAngle: (0, _DataUtils.interpolate)(prev.startAngle, entry.startAngle, t), endAngle: (0, _DataUtils.interpolate)(prev.endAngle, entry.endAngle, t) }); } var { endAngle, startAngle } = entry; return _objectSpread(_objectSpread({}, entry), {}, { endAngle: (0, _DataUtils.interpolate)(startAngle, endAngle, t) }); }); if (t > 0) { // eslint-disable-next-line no-param-reassign previousSectorsRef.current = stepData !== null && stepData !== void 0 ? stepData : null; } return /*#__PURE__*/React.createElement(_Layer.Layer, null, /*#__PURE__*/React.createElement(RadialBarSectors, { sectors: stepData !== null && stepData !== void 0 ? stepData : STABLE_EMPTY_ARRAY, allOtherRadialBarProps: props, showLabels: !isAnimating })); }); } function RenderSectors(props) { var previousSectorsRef = (0, _react.useRef)(null); return /*#__PURE__*/React.createElement(SectorsWithAnimation, { props: props, previousSectorsRef: previousSectorsRef }); } function SetRadialBarPayloadLegend(props) { var legendPayload = (0, _hooks.useAppSelector)(state => (0, _radialBarSelectors.selectRadialBarLegendPayload)(state, props.legendType)); return /*#__PURE__*/React.createElement(_SetLegendPayload.SetPolarLegendPayload, { legendPayload: legendPayload !== null && legendPayload !== void 0 ? legendPayload : [] }); } var SetRadialBarTooltipEntrySettings = /*#__PURE__*/React.memo(_ref4 => { var { dataKey, sectors, stroke, strokeWidth, name, hide, fill, tooltipType, id } = _ref4; var tooltipEntrySettings = { dataDefinedOnItem: sectors, getPosition: _DataUtils.noop, settings: { graphicalItemId: id, stroke, strokeWidth, fill, nameKey: undefined, // RadialBar does not have nameKey, why? dataKey, name: (0, _ChartUtils.getTooltipNameProp)(name, dataKey), hide, type: tooltipType, color: fill, unit: '' // Why does RadialBar not support unit? } }; return /*#__PURE__*/React.createElement(_SetTooltipEntrySettings.SetTooltipEntrySettings, { tooltipEntrySettings: tooltipEntrySettings }); }); class RadialBarWithState extends _react.PureComponent { renderBackground(sectors) { if (sectors == null) { return null; } var { cornerRadius } = this.props; var backgroundProps = (0, _svgPropertiesNoEvents.svgPropertiesNoEventsFromUnknown)(this.props.background); return /*#__PURE__*/React.createElement(_ZIndexLayer.ZIndexLayer, { zIndex: (0, _getZIndexFromUnknown.getZIndexFromUnknown)(this.props.background, _DefaultZIndexes.DefaultZIndexes.barBackground) }, sectors.map((entry, i) => { var { value, background } = entry, rest = _objectWithoutProperties(entry, _excluded3); if (!background) { return null; } var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ cornerRadius: (0, _RadialBarUtils.parseCornerRadius)(cornerRadius) }, rest), {}, { // @ts-expect-error backgroundProps is contributing unknown props fill: '#eee' }, background), backgroundProps), (0, _types.adaptEventsOfChild)(this.props, entry, i)), {}, { index: i, className: (0, _clsx.clsx)('recharts-radial-bar-background-sector', String(backgroundProps === null || backgroundProps === void 0 ? void 0 : backgroundProps.className)), option: background, isActive: false }); return /*#__PURE__*/React.createElement(_RadialBarUtils.RadialBarSector, _extends({ key: "background-".concat(rest.cx, "-").concat(rest.cy, "-").concat(rest.innerRadius, "-").concat(rest.outerRadius, "-").concat(rest.startAngle, "-").concat(rest.endAngle, "-").concat(i) }, props)); })); } render() { var { hide, sectors, className, background } = this.props; if (hide) { return null; } var layerClass = (0, _clsx.clsx)('recharts-area', className); return /*#__PURE__*/React.createElement(_ZIndexLayer.ZIndexLayer, { zIndex: this.props.zIndex }, /*#__PURE__*/React.createElement(_Layer.Layer, { className: layerClass }, background && /*#__PURE__*/React.createElement(_Layer.Layer, { className: "recharts-radial-bar-background" }, this.renderBackground(sectors)), /*#__PURE__*/React.createElement(_Layer.Layer, { className: "recharts-radial-bar-sectors" }, /*#__PURE__*/React.createElement(RenderSectors, this.props)))); } } function RadialBarImpl(props) { var _useAppSelector; var cells = (0, _ReactUtils.findAllByType)(props.children, _Cell.Cell); var radialBarSettings = { data: undefined, hide: false, id: props.id, dataKey: props.dataKey, minPointSize: props.minPointSize, stackId: (0, _ChartUtils.getNormalizedStackId)(props.stackId), maxBarSize: props.maxBarSize, barSize: props.barSize, type: 'radialBar', angleAxisId: props.angleAxisId, radiusAxisId: props.radiusAxisId }; var sectors = (_useAppSelector = (0, _hooks.useAppSelector)(state => (0, _radialBarSelectors.selectRadialBarSectors)(state, props.radiusAxisId, props.angleAxisId, radialBarSettings, cells))) !== null && _useAppSelector !== void 0 ? _useAppSelector : STABLE_EMPTY_ARRAY; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SetRadialBarTooltipEntrySettings, { dataKey: props.dataKey, sectors: sectors, stroke: props.stroke, strokeWidth: props.strokeWidth, name: props.name, hide: props.hide, fill: props.fill, tooltipType: props.tooltipType, id: props.id }), /*#__PURE__*/React.createElement(RadialBarWithState, _extends({}, props, { sectors: sectors }))); } var defaultRadialBarProps = exports.defaultRadialBarProps = { angleAxisId: 0, animationBegin: 0, animationDuration: 1500, animationEasing: 'ease', background: false, cornerIsExternal: false, cornerRadius: 0, forceCornerRadius: false, hide: false, isAnimationActive: 'auto', label: false, legendType: 'rect', minPointSize: 0, radiusAxisId: 0, zIndex: _DefaultZIndexes.DefaultZIndexes.bar }; function computeRadialBarDataItems(_ref5) { var { displayedData, stackedData, dataStartIndex, stackedDomain, dataKey, baseValue, layout, radiusAxis, radiusAxisTicks, bandSize, pos, angleAxis, minPointSize, cx, cy, angleAxisTicks, cells, startAngle: rootStartAngle, endAngle: rootEndAngle } = _ref5; if (angleAxisTicks == null || radiusAxisTicks == null) { return STABLE_EMPTY_ARRAY; } return (displayedData !== null && displayedData !== void 0 ? displayedData : []).map((entry, index) => { var value, innerRadius, outerRadius, startAngle, endAngle, backgroundSector; if (stackedData) { // @ts-expect-error truncateByDomain expects only numerical domain, but it can received categorical domain too value = (0, _ChartUtils.truncateByDomain)(stackedData[dataStartIndex + index], stackedDomain); } else { value = (0, _ChartUtils.getValueByDataKey)(entry, dataKey); if (!Array.isArray(value)) { value = [baseValue, value]; } } if (layout === 'radial') { var _angleAxis$scale$map, _angleAxis$scale$map2; startAngle = (_angleAxis$scale$map = angleAxis.scale.map(value[0])) !== null && _angleAxis$scale$map !== void 0 ? _angleAxis$scale$map : rootStartAngle; endAngle = (_angleAxis$scale$map2 = angleAxis.scale.map(value[1])) !== null && _angleAxis$scale$map2 !== void 0 ? _angleAxis$scale$map2 : rootEndAngle; innerRadius = (0, _ChartUtils.getCateCoordinateOfBar)({ axis: radiusAxis, ticks: radiusAxisTicks, bandSize, offset: pos.offset, entry, index }); if (innerRadius != null && endAngle != null && startAngle != null) { outerRadius = innerRadius + pos.size; var deltaAngle = endAngle - startAngle; if (Math.abs(minPointSize) > 0 && Math.abs(deltaAngle) < Math.abs(minPointSize)) { var delta = (0, _DataUtils.mathSign)(deltaAngle || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaAngle)); endAngle += delta; } backgroundSector = { background: { cx, cy, innerRadius, outerRadius, startAngle: rootStartAngle, endAngle: rootEndAngle } }; } } else { innerRadius = radiusAxis.scale.map(value[0]); outerRadius = radiusAxis.scale.map(value[1]); startAngle = (0, _ChartUtils.getCateCoordinateOfBar)({ axis: angleAxis, ticks: angleAxisTicks, bandSize, offset: pos.offset, entry, index }); if (innerRadius != null && outerRadius != null && startAngle != null) { endAngle = startAngle + pos.size; var deltaRadius = outerRadius - innerRadius; if (Math.abs(minPointSize) > 0 && Math.abs(deltaRadius) < Math.abs(minPointSize)) { var _delta = (0, _DataUtils.mathSign)(deltaRadius || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaRadius)); outerRadius += _delta; } } } return _objectSpread(_objectSpread(_objectSpread({}, entry), backgroundSector), {}, { payload: entry, value: stackedData ? value : value[1], cx, cy, innerRadius, outerRadius, startAngle, // @ts-expect-error endAngle is used before assigned (?) endAngle }, cells && cells[index] && cells[index].props); }); } /** * @consumes PolarChartContext * @provides LabelListContext * @provides CellReader */ function RadialBar(outsideProps) { var props = (0, _resolveDefaultProps.resolveDefaultProps)(outsideProps, defaultRadialBarProps); return /*#__PURE__*/React.createElement(_RegisterGraphicalItemId.RegisterGraphicalItemId, { id: props.id, type: "radialBar" }, id => { var _props$hide, _props$angleAxisId, _props$radiusAxisId; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_SetGraphicalItem.SetPolarGraphicalItem, { type: "radialBar", id: id, data: undefined // why does RadialBar not allow data defined on the item? , dataKey: props.dataKey, hide: (_props$hide = props.hide) !== null && _props$hide !== void 0 ? _props$hide : defaultRadialBarProps.hide, angleAxisId: (_props$angleAxisId = props.angleAxisId) !== null && _props$angleAxisId !== void 0 ? _props$angleAxisId : defaultRadialBarProps.angleAxisId, radiusAxisId: (_props$radiusAxisId = props.radiusAxisId) !== null && _props$radiusAxisId !== void 0 ? _props$radiusAxisId : defaultRadialBarProps.radiusAxisId, stackId: (0, _ChartUtils.getNormalizedStackId)(props.stackId), barSize: props.barSize, minPointSize: props.minPointSize, maxBarSize: props.maxBarSize }), /*#__PURE__*/React.createElement(SetRadialBarPayloadLegend, props), /*#__PURE__*/React.createElement(RadialBarImpl, _extends({}, props, { id: id }))); }); } RadialBar.displayName = 'RadialBar';