Skip to content
This repository has been archived by the owner on Feb 19, 2022. It is now read-only.

Commit

Permalink
add downsample prop to VictoryZoomContainer, use victory-core Data.do…
Browse files Browse the repository at this point in the history
…wnsampleZoomFriendly
  • Loading branch information
chrisbolin committed Jul 28, 2017
1 parent 76ed67e commit 40b5e8a
Showing 1 changed file with 39 additions and 3 deletions.
42 changes: 39 additions & 3 deletions src/components/containers/victory-zoom-container.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import PropTypes from "prop-types";
import React from "react";
import { defaults, isEqual } from "lodash";
import { defaults, isEqual, get } from "lodash";
import ZoomHelpers from "./zoom-helpers";
import { VictoryContainer, VictoryClipContainer, PropTypes as CustomPropTypes } from "victory-core";
import {
VictoryContainer, VictoryClipContainer, Data, PropTypes as CustomPropTypes
} from "victory-core";

const DEFAULT_DOWNSAMPLE = 150;

export const zoomContainerMixin = (base) => class VictoryZoomContainer extends base {
static displayName = "VictoryZoomContainer";
Expand All @@ -12,6 +16,10 @@ export const zoomContainerMixin = (base) => class VictoryZoomContainer extends b
allowZoom: PropTypes.bool,
clipContainerComponent: PropTypes.element.isRequired,
dimension: PropTypes.oneOf(["x", "y"]),
downsample: PropTypes.oneOfType([
PropTypes.bool,
PropTypes.number
]),
minimumZoom: PropTypes.shape({
x: PropTypes.number,
y: PropTypes.number
Expand Down Expand Up @@ -128,6 +136,30 @@ export const zoomContainerMixin = (base) => class VictoryZoomContainer extends b
};
}

downsampleZoomData(props, childProps, domain) {
const { downsample } = props;
const rawData = get(childProps, "data");
// return undefined if downsample is not run, then default() will replace with child.props.data
if (!downsample || !rawData || !domain) { return undefined; }

// if data accessors are not used, skip calling expensive Data.formatData
const data = (childProps.x || childProps.y) ? Data.formatData(rawData, childProps) : rawData;
const maxPoints = (downsample === true) ? DEFAULT_DOWNSAMPLE : downsample;
const dimension = props.dimension || "x";

// important: assumes data is ordered by dimension
// get the start and end of the data that is in the current visible domain
let startIndex = data.findIndex((d) => d[dimension] >= domain[dimension][0]);
let endIndex = data.findIndex((d) => d[dimension] > domain[dimension][1]);
// pick one more point (if available) at each end so that VictoryLine, VictoryArea connect
if (startIndex !== 0) { startIndex -= 1; }
if (endIndex !== -1) { endIndex += 1; }

const visableData = data.slice(startIndex, endIndex);

return Data.downsampleZoomFriendly(visableData, maxPoints, startIndex);
}

modifyChildren(props) {
const childComponents = React.Children.toArray(props.children);

Expand Down Expand Up @@ -158,7 +190,11 @@ export const zoomContainerMixin = (base) => class VictoryZoomContainer extends b
};
}
return React.cloneElement(
child, defaults({ domain: newDomain }, child.props)
child,
defaults({
domain: newDomain,
data: this.downsampleZoomData(props, child.props, newDomain)
}, child.props)
);
});
}
Expand Down

0 comments on commit 40b5e8a

Please sign in to comment.