Skip to content
This repository has been archived by the owner on Jun 3, 2024. It is now read-only.

Commit

Permalink
Enhancement: add property Graph.prependData to support Plotly.prepend…
Browse files Browse the repository at this point in the history
…Traces
  • Loading branch information
sleighsoft committed Aug 27, 2020
1 parent 0ceb2de commit 115b566
Show file tree
Hide file tree
Showing 3 changed files with 270 additions and 22 deletions.
63 changes: 53 additions & 10 deletions src/components/Graph.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
privateDefaultProps,
} from '../fragments/Graph.privateprops';

const EMPTY_EXTEND_DATA = [];
const EMPTY_DATA = [];

/**
* Graph can be used to render any plotly.js-powered data visualization.
Expand All @@ -22,13 +22,19 @@ class PlotlyGraph extends Component {
super(props);

this.state = {
prependData: [],
extendData: [],
};

this.clearExtendData = this.clearExtendData.bind(this);
this.clearState = this.clearState.bind(this);
}

componentDidMount() {
if (this.props.prependData) {
this.setState({
prependData: [this.props.prependData],
});
}
if (this.props.extendData) {
this.setState({
extendData: [this.props.extendData],
Expand All @@ -38,15 +44,37 @@ class PlotlyGraph extends Component {

componentWillUnmount() {
this.setState({
prependData: [],
extendData: [],
});
}

UNSAFE_componentWillReceiveProps(nextProps) {
let prependData = this.state.prependData.slice(0);

if (this.props.figure !== nextProps.figure) {
prependData = EMPTY_DATA;
}

if (
nextProps.prependData &&
this.props.prependData !== nextProps.prependData
) {
prependData.push(nextProps.prependData);
} else {
prependData = EMPTY_DATA;
}

if (prependData !== EMPTY_DATA) {
this.setState({
prependData,
});
}

let extendData = this.state.extendData.slice(0);

if (this.props.figure !== nextProps.figure) {
extendData = EMPTY_EXTEND_DATA;
extendData = EMPTY_DATA;
}

if (
Expand All @@ -55,22 +83,23 @@ class PlotlyGraph extends Component {
) {
extendData.push(nextProps.extendData);
} else {
extendData = EMPTY_EXTEND_DATA;
extendData = EMPTY_DATA;
}

if (extendData !== EMPTY_EXTEND_DATA) {
if (extendData !== EMPTY_DATA) {
this.setState({
extendData,
});
}
}

clearExtendData() {
this.setState(({extendData}) => {
clearState(dataKey) {
this.setState(props => {
var data = props[dataKey];
const res =
extendData && extendData.length
data && data.length
? {
extendData: EMPTY_EXTEND_DATA,
data: EMPTY_DATA,
}
: undefined;

Expand All @@ -82,8 +111,9 @@ class PlotlyGraph extends Component {
return (
<ControlledPlotlyGraph
{...this.props}
prependData={this.state.prependData}
extendData={this.state.extendData}
clearExtendData={this.clearExtendData}
clearState={this.clearState}
/>
);
}
Expand Down Expand Up @@ -191,6 +221,18 @@ PlotlyGraph.propTypes = {
*/
extendData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),

/**
* Data that should be prepended to existing traces. Has the form
* `[updateData, traceIndices, maxPoints]`, where `updateData` is an object
* containing the data to prepend, `traceIndices` (optional) is an array of
* trace indices that should be prepended, and `maxPoints` (optional) is
* either an integer defining the maximum number of points allowed or an
* object with key:value pairs matching `updateData`
* Reference the Plotly.prependTraces API for full usage:
* https://plotly.com/javascript/plotlyjs-function-reference/#plotlyprependtraces
*/
prependData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),

/**
* Data from latest restyle event which occurs
* when the user toggles a legend item, changes
Expand Down Expand Up @@ -523,6 +565,7 @@ PlotlyGraph.defaultProps = {
hoverData: null,
selectedData: null,
relayoutData: null,
prependData: null,
extendData: null,
restyleData: null,
figure: {
Expand Down
41 changes: 29 additions & 12 deletions src/fragments/Graph.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,18 +188,19 @@ class PlotlyGraph extends Component {
});
}

extend(props) {
const {clearExtendData, extendData: extendDataArray} = props;
mergeTraces(props, dataKey, plotlyFnKey) {
const clearState = props.clearState;
const dataArray = props[dataKey];

extendDataArray.forEach(extendData => {
dataArray.forEach(data => {
let updateData, traceIndices, maxPoints;
if (
Array.isArray(extendData) &&
typeof extendData[0] === 'object'
Array.isArray(data) &&
typeof data[0] === 'object'
) {
[updateData, traceIndices, maxPoints] = extendData;
[updateData, traceIndices, maxPoints] = data;
} else {
updateData = extendData;
updateData = data;
}

if (!traceIndices) {
Expand All @@ -214,9 +215,14 @@ class PlotlyGraph extends Component {
}

const gd = this.gd.current;
return Plotly.extendTraces(gd, updateData, traceIndices, maxPoints);
return Plotly[plotlyFnKey](
gd,
updateData,
traceIndices,
maxPoints
);
});
clearExtendData();
clearState(dataKey);
}

getConfig(config, responsive) {
Expand Down Expand Up @@ -348,8 +354,11 @@ class PlotlyGraph extends Component {

componentDidMount() {
this.plot(this.props);
if (this.props.prependData) {
this.mergeTraces(this.props, 'prependData', 'prependTraces');
}
if (this.props.extendData) {
this.extend(this.props);
this.mergeTraces(this.props, 'extendData', 'extendTraces');
}
}

Expand Down Expand Up @@ -392,8 +401,12 @@ class PlotlyGraph extends Component {
this.plot(nextProps);
}

if (this.props.prependData !== nextProps.prependData) {
this.mergeTraces(nextProps, 'prependData', 'prependTraces');
}

if (this.props.extendData !== nextProps.extendData) {
this.extend(nextProps);
this.mergeTraces(nextProps, 'extendData', 'extendTraces');
}
}

Expand Down Expand Up @@ -432,14 +445,18 @@ class PlotlyGraph extends Component {

PlotlyGraph.propTypes = {
...graphPropTypes,
prependData: PropTypes.arrayOf(
PropTypes.oneOfType([PropTypes.array, PropTypes.object])
),
extendData: PropTypes.arrayOf(
PropTypes.oneOfType([PropTypes.array, PropTypes.object])
),
clearExtendData: PropTypes.func.isRequired,
clearState: PropTypes.func.isRequired,
};

PlotlyGraph.defaultProps = {
...graphDefaultProps,
prependData: [],
extendData: [],
};

Expand Down
Loading

0 comments on commit 115b566

Please sign in to comment.