Skip to content

Commit

Permalink
Stop ChartContainer from rendering twice on chartStatus change (#1828)
Browse files Browse the repository at this point in the history
* Stop ChartContainer from rendering twice on chartStatus change

* Make spinner overlay and dim chart while laoding

* Added timeout to make render more stable on resize

* Put viz in state and call resize at browser size change

* add render after height change since resize depends on render called on the same object

* Change name of renderVis to renderVisOnChange

* Only call resize at height change, persist viz in state

* Call resize wihout render at window size change
  • Loading branch information
vera-liu committed Dec 15, 2016
1 parent e06a0cd commit 7a5bb94
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 23 deletions.
52 changes: 32 additions & 20 deletions superset/assets/javascripts/explorev2/components/ChartContainer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,31 +43,39 @@ class ChartContainer extends React.Component {
this.state = {
selector: `#${props.containerId}`,
mockSlice: {},
viz: {},
};
}

componentWillMount() {
this.setState({ mockSlice: this.getMockedSliceObject(this.props) });
const mockSlice = this.getMockedSliceObject(this.props);
this.setState({
mockSlice,
viz: visMap[this.props.viz_type](mockSlice),
});
}

componentDidMount() {
this.renderVis();
this.state.viz.render();
}

componentWillReceiveProps(nextProps) {
if (nextProps.chartStatus !== this.props.chartStatus
|| nextProps.height !== this.props.height) {
this.setState({ mockSlice: this.getMockedSliceObject(nextProps) });
if (nextProps.chartStatus === 'loading') {
const mockSlice = this.getMockedSliceObject(nextProps);
this.setState({
mockSlice,
viz: visMap[nextProps.viz_type](mockSlice),
});
}
}

shouldComponentUpdate(nextProps) {
return (nextProps.chartStatus !== this.props.chartStatus
|| nextProps.height !== this.props.height);
}

componentDidUpdate() {
this.renderVis();
componentDidUpdate(prevProps) {
if (this.props.chartStatus === 'loading') {
this.state.viz.render();
}
if (prevProps.height !== this.props.height) {
this.state.viz.resize();
}
}

getMockedSliceObject(props) {
Expand Down Expand Up @@ -96,7 +104,7 @@ class ChartContainer extends React.Component {
// should call callback to adjust height of chart
$(this.state.selector).css(dim, size);
},
height: () => parseInt(props.height, 10) - 100,
height: () => parseInt(this.props.height, 10) - 100,

show: () => { this.render(); },

Expand All @@ -108,7 +116,7 @@ class ChartContainer extends React.Component {

width: () => this.chartContainerRef.getBoundingClientRect().width,

height: () => parseInt(props.height, 10) - 100,
height: () => parseInt(this.props.height, 10) - 100,

selector: this.state.selector,

Expand Down Expand Up @@ -149,10 +157,6 @@ class ChartContainer extends React.Component {
this.props.actions.removeChartAlert();
}

renderVis() {
visMap[this.props.viz_type](this.state.mockSlice).render();
}

renderChartTitle() {
let title;
if (this.props.slice_name) {
Expand Down Expand Up @@ -180,13 +184,21 @@ class ChartContainer extends React.Component {
return (
<div>
{loading &&
<img alt="loading" width="25" src="/static/assets/images/loading.gif" />
<img
alt="loading"
width="25"
src="/static/assets/images/loading.gif"
style={{ position: 'absolute' }}
/>
}
<div
id={this.props.containerId}
ref={(ref) => { this.chartContainerRef = ref; }}
className={this.props.viz_type}
style={{ overflowX: 'auto' }}
style={{
overflowX: 'auto',
opacity: loading ? '0.25' : '1',
}}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ class ExploreViewContainer extends React.Component {

componentDidMount() {
window.addEventListener('resize', this.handleResize.bind(this));
this.props.actions.updateChartStatus('success');
}

componentWillReceiveProps(nextProps) {
Expand Down Expand Up @@ -64,7 +63,10 @@ class ExploreViewContainer extends React.Component {
}

handleResize() {
this.setState({ height: this.getHeight() });
clearTimeout(this.resizeTimer);
this.resizeTimer = setTimeout(() => {
this.setState({ height: this.getHeight() });
}, 250);
}

toggleModal() {
Expand Down
3 changes: 2 additions & 1 deletion superset/assets/visualizations/nvd3_vis.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ function nvd3Vis(slice) {
let chart;
let colorKey = 'key';


const render = function () {
d3.json(slice.jsonEndpoint(), function (error, payload) {
slice.container.html('');
Expand Down Expand Up @@ -373,6 +372,8 @@ function nvd3Vis(slice) {

const update = function () {
if (chart && chart.update) {
chart.height(slice.height());
chart.width(slice.width());
chart.update();
}
};
Expand Down

0 comments on commit 7a5bb94

Please sign in to comment.