UNPKG

@data-ui/xy-chart

Version:

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

98 lines (85 loc) 3.53 kB
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); } import { Children } from 'react'; import collectDataFromChildSeries from './collectDataFromChildSeries'; // import collectExtentsFromChildSeries from './collectExtentsFromChildSeries'; import getChartDimensions from './getChartDimensions'; import getScaleForAccessor from './getScaleForAccessor'; import { componentName, isBarSeries, isCirclePackSeries } from './chartUtils'; var getX = function getX(d) { return d && d.x; }; var xString = function xString(d) { return getX(d).toString(); }; var getY = function getY(d) { return d && d.y; }; var yString = function yString(d) { return getY(d).toString(); }; export default function collectScalesFromProps(props) { var xScaleObject = props.xScale, yScaleObject = props.yScale, children = props.children; var _getChartDimensions = getChartDimensions(props), innerWidth = _getChartDimensions.innerWidth, innerHeight = _getChartDimensions.innerHeight; var allData = collectDataFromChildSeries(children); // TODO could collect data extents from child series // which would support passing arbitrary x/y accessors // const [xExtent, yExtent] = collectExtentsFromChildSeries(children); // issues: // voronoi transforms data via scale(getXorY(d)) // => Could be solved by transforming in data collection // tooltip/crosshair transforms data via scale(getXorY(d)) // => could be solved by transforming in the mousemove call so series own it? var xScale = getScaleForAccessor(_extends({ allData: allData, minAccessor: function minAccessor(d) { return typeof d.x0 === 'undefined' ? d.x : d.x0; }, maxAccessor: function maxAccessor(d) { return typeof d.x1 === 'undefined' ? d.x : d.x1; }, range: [0, innerWidth] }, xScaleObject)); var yScale = getScaleForAccessor(_extends({ allData: allData, minAccessor: function minAccessor(d) { return typeof d.y0 === 'undefined' ? d.y : d.y0; }, maxAccessor: function maxAccessor(d) { return typeof d.y1 === 'undefined' ? d.y : d.y1; }, range: [innerHeight, 0] }, yScaleObject)); Children.forEach(children, function (Child) { // Child-specific scales or adjustments here var name = componentName(Child); if (isBarSeries(name)) { var horizontal = Child.props.horizontal; var categoryScaleObject = horizontal ? yScaleObject : xScaleObject; if (categoryScaleObject.type !== 'band') { var categoryScale = horizontal ? yScale : xScale; var range = horizontal ? innerHeight : innerWidth; var dummyBand = getScaleForAccessor({ allData: allData, minAccessor: horizontal ? yString : xString, maxAccessor: horizontal ? yString : xString, type: 'band', rangeRound: [0, range], paddingOuter: 1 }); var offset = dummyBand.bandwidth() / 2; categoryScale.range([offset, range - offset]); categoryScale.barWidth = dummyBand.bandwidth(); categoryScale.offset = offset; } } if (isCirclePackSeries(name)) { yScale.domain([-innerHeight / 2, innerHeight / 2]); } }); return { xScale: xScale, yScale: yScale }; }