UNPKG

@data-ui/xy-chart

Version:

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

169 lines (153 loc) 6.01 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _d3Array = require("d3-array"); var _theme = require("@data-ui/theme"); var _group = require("@vx/group"); var _shape = require("@vx/shape"); var _chartUtils = require("../utils/chartUtils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 GROUP_STYLE = { pointerEvents: 'none' }; var propTypes = { fullHeight: _propTypes.default.bool, fullWidth: _propTypes.default.bool, circleSize: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.number]), circleFill: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), circleStroke: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), circleStyles: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.objectOf(_propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]))]), lineStyles: _propTypes.default.objectOf(_propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])), showCircle: _propTypes.default.bool, showMultipleCircles: _propTypes.default.bool, showHorizontalLine: _propTypes.default.bool, showVerticalLine: _propTypes.default.bool, stroke: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), strokeDasharray: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.string]), strokeWidth: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.number]), // likely injected by parent datum: _propTypes.default.object, // eslint-disable-line react/forbid-prop-types series: _propTypes.default.objectOf(_propTypes.default.object), getScaledX: _propTypes.default.func, getScaledY: _propTypes.default.func, xScale: _propTypes.default.func, yScale: _propTypes.default.func }; var defaultProps = { circleSize: 4, circleFill: _theme.color.grays[7], circleStroke: '#ffffff', circleStyles: { pointerEvents: 'none' }, datum: {}, getScaledX: null, getScaledY: null, lineStyles: { pointerEvents: 'none' }, fullHeight: false, fullWidth: false, series: {}, showCircle: true, showMultipleCircles: false, showHorizontalLine: true, showVerticalLine: true, stroke: _theme.color.grays[6], strokeDasharray: '5,2', strokeWidth: 1, xScale: null, yScale: null }; function CrossHair(_ref) { var circleFill = _ref.circleFill, circleSize = _ref.circleSize, circleStroke = _ref.circleStroke, circleStyles = _ref.circleStyles, datum = _ref.datum, getScaledX = _ref.getScaledX, getScaledY = _ref.getScaledY, fullHeight = _ref.fullHeight, fullWidth = _ref.fullWidth, lineStyles = _ref.lineStyles, series = _ref.series, showHorizontalLine = _ref.showHorizontalLine, showCircle = _ref.showCircle, showMultipleCircles = _ref.showMultipleCircles, showVerticalLine = _ref.showVerticalLine, stroke = _ref.stroke, strokeDasharray = _ref.strokeDasharray, strokeWidth = _ref.strokeWidth, xScale = _ref.xScale, yScale = _ref.yScale; if (!xScale || !yScale || !getScaledX || !getScaledY) return null; var _extent = (0, _d3Array.extent)(xScale.range()), xMin = _extent[0], xMax = _extent[1]; var _extent2 = (0, _d3Array.extent)(yScale.range()), yMin = _extent2[0], yMax = _extent2[1]; var circleData = showMultipleCircles && series && Object.keys(series).length > 0 ? Object.keys(series).map(function (seriesKey) { return _extends({ seriesKey: seriesKey }, series[seriesKey]); }) : [datum]; var circlePositions = circleData.map(function (d) { return { x: getScaledX(d), y: getScaledY(d) }; }); return _react.default.createElement(_group.Group, { style: GROUP_STYLE }, showHorizontalLine && !showMultipleCircles && (0, _chartUtils.isDefined)(circlePositions[0].y) && _react.default.createElement(_shape.Line, { from: { x: xMin, y: circlePositions[0].y }, to: { x: fullWidth ? xMax : circlePositions[0].x, y: circlePositions[0].y }, style: lineStyles, stroke: stroke, strokeDasharray: strokeDasharray, strokeWidth: strokeWidth }), showVerticalLine && (0, _chartUtils.isDefined)(circlePositions[0].x) && _react.default.createElement(_shape.Line, { from: { x: circlePositions[0].x, y: yMax }, to: { x: circlePositions[0].x, y: fullHeight ? yMin : circlePositions[0].y }, style: lineStyles, stroke: stroke, strokeDasharray: strokeDasharray, strokeWidth: strokeWidth }), (showCircle || showMultipleCircles) && circleData.map(function (d, i) { var _circlePositions$i = circlePositions[i], x = _circlePositions$i.x, y = _circlePositions$i.y; return (0, _chartUtils.isDefined)(x) && (0, _chartUtils.isDefined)(y) && _react.default.createElement("circle", { key: "circle-" + (d.seriesKey || i), cx: x, cy: y, r: (0, _chartUtils.callOrValue)(circleSize, d, i), fill: (0, _chartUtils.callOrValue)(circleFill, d, i), strokeWidth: 1, stroke: (0, _chartUtils.callOrValue)(circleStroke, d, i), style: (0, _chartUtils.callOrValue)(circleStyles, d, i) }); })); } CrossHair.propTypes = propTypes; CrossHair.defaultProps = defaultProps; CrossHair.displayName = 'CrossHair'; var _default = CrossHair; exports.default = _default;