UNPKG

@data-ui/xy-chart

Version:

A package of charts with standard x- and y- axes. https://williaster.github.io/data-ui

209 lines (176 loc) 7.37 kB
"use strict"; exports.__esModule = true; exports.default = exports.defaultLabelProps = void 0; var _shape = require("@vx/shape"); var _shared = require("@data-ui/shared"); var _group = require("@vx/group"); var _text = require("@vx/text"); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireDefault(require("react")); var _theme = require("@data-ui/theme"); var _propShapes = require("../utils/propShapes"); var _chartUtils = require("../utils/chartUtils"); var _sharedSeriesProps = _interopRequireDefault(require("../utils/sharedSeriesProps")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var baseLabel = _theme.svgLabel.baseLabel; var defaultLabelProps = _extends({}, baseLabel, { pointerEvents: 'none', stroke: '#fff', strokeWidth: 2, paintOrder: 'stroke', fontSize: 12 }); exports.defaultLabelProps = defaultLabelProps; var propTypes = _extends({}, _sharedSeriesProps.default, { data: _propShapes.barSeriesDataShape.isRequired, defaultLabelProps: _propTypes.default.object, // eslint-disable-line react/forbid-prop-types fill: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), fillOpacity: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.number]), renderLabel: _propTypes.default.func, stroke: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), strokeWidth: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.number]), horizontal: _propTypes.default.bool }); var defaultProps = { defaultLabelProps: defaultLabelProps, fill: _theme.color.default, fillOpacity: null, /* eslint-disable react/prop-types */ renderLabel: function renderLabel(_ref) { var datum = _ref.datum, labelProps = _ref.labelProps; return datum.label ? _react.default.createElement(_text.Text, labelProps, datum.label) : null; }, /* eslint-enable react/prop-types */ stroke: '#FFFFFF', strokeWidth: 1, horizontal: false }; var x = function x(d) { return d.x; }; var y = function y(d) { return d.y; }; var noEventsStyles = { pointerEvents: 'none' }; var BarSeries = /*#__PURE__*/ function (_React$PureComponent) { _inheritsLoose(BarSeries, _React$PureComponent); function BarSeries() { return _React$PureComponent.apply(this, arguments) || this; } var _proto = BarSeries.prototype; _proto.render = function render() { var _this$props = this.props, data = _this$props.data, labelProps = _this$props.defaultLabelProps, disableMouseEvents = _this$props.disableMouseEvents, fill = _this$props.fill, fillOpacity = _this$props.fillOpacity, stroke = _this$props.stroke, strokeWidth = _this$props.strokeWidth, xScale = _this$props.xScale, yScale = _this$props.yScale, onClick = _this$props.onClick, onMouseMove = _this$props.onMouseMove, onMouseLeave = _this$props.onMouseLeave, renderLabel = _this$props.renderLabel, horizontal = _this$props.horizontal; if (!xScale || !yScale) return null; var valueScale = horizontal ? xScale : yScale; var categoryScale = horizontal ? yScale : xScale; var barWidth = categoryScale.barWidth || categoryScale.bandwidth && categoryScale.bandwidth() || 0; var valueField = horizontal ? x : y; var categoryField = horizontal ? y : x; var minValue = Math.min.apply(Math, valueScale.domain()); var minPosition = valueScale(minValue < 0 ? 0 : minValue); var categoryOffset = categoryScale.offset || 0; var Labels = []; // Labels on top return _react.default.createElement(_group.Group, { style: disableMouseEvents ? noEventsStyles : null }, data.map(function (d, i) { var barPosition = categoryScale(categoryField(d)) - categoryOffset; var barLength = horizontal ? valueScale(valueField(d)) - minPosition : valueScale(valueField(d)) - minPosition; var color = d.fill || (0, _chartUtils.callOrValue)(fill, d, i); var key = "bar-" + barPosition; if (renderLabel) { var Label = renderLabel({ datum: d, index: i, labelProps: _extends({ key: key }, labelProps, { x: horizontal ? minPosition + Math.abs(barLength) : barPosition + barWidth / 2, y: horizontal ? barPosition + barWidth / 2 : minPosition + Math.min(0, barLength), dx: horizontal ? '0.5em' : 0, dy: horizontal ? 0 : '-0.74em', textAnchor: horizontal ? 'start' : 'middle', verticalAnchor: horizontal ? 'middle' : 'end', width: horizontal ? null : barWidth }) }); if (Label) Labels.push(Label); } return (0, _chartUtils.isDefined)(horizontal ? d.x : d.y) && _react.default.createElement(_shared.FocusBlurHandler, { key: key, onBlur: disableMouseEvents ? null : onMouseLeave, onFocus: disableMouseEvents ? null : function (event) { onMouseMove({ event: event, data: data, datum: d, color: color, index: i }); } }, _react.default.createElement(_shape.Bar, { x: horizontal ? minPosition + Math.min(0, barLength) : barPosition, y: horizontal ? barPosition : minPosition + Math.min(0, barLength), width: horizontal ? Math.abs(barLength) : barWidth, height: horizontal ? barWidth : Math.abs(barLength), fill: color, fillOpacity: d.fillOpacity || (0, _chartUtils.callOrValue)(fillOpacity, d, i), stroke: d.stroke || (0, _chartUtils.callOrValue)(stroke, d, i), strokeWidth: d.strokeWidth || (0, _chartUtils.callOrValue)(strokeWidth, d, i), onClick: disableMouseEvents ? null : onClick && function () { return function (event) { onClick({ event: event, data: data, datum: d, color: color, index: i }); }; }, onMouseMove: disableMouseEvents ? null : onMouseMove && function () { return function (event) { onMouseMove({ event: event, data: data, datum: d, color: color, index: i }); }; }, onMouseLeave: disableMouseEvents ? null : onMouseLeave && function () { return onMouseLeave; } })); }), Labels.map(function (Label) { return Label; })); }; return BarSeries; }(_react.default.PureComponent); exports.default = BarSeries; BarSeries.propTypes = propTypes; BarSeries.defaultProps = defaultProps; BarSeries.displayName = 'BarSeries';