diff --git a/src/client/visualizations/data-provider/data-provider.tsx b/src/client/visualizations/data-provider/data-provider.tsx index aea9dba8a..216432d53 100644 --- a/src/client/visualizations/data-provider/data-provider.tsx +++ b/src/client/visualizations/data-provider/data-provider.tsx @@ -29,11 +29,12 @@ import { Essence } from "../../../common/models/essence/essence"; import { Stage } from "../../../common/models/stage/stage"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { debounceWithPromise, Unary } from "../../../common/utils/functional/functional"; -import { Loader } from "../../components/loader/loader"; +import { Button } from "../../components/button/button"; import { QueryError } from "../../components/query-error/query-error"; import { reportError } from "../../utils/error-reporter/error-reporter"; import { VisualizationQuery } from "../../views/cube-view/api-context"; import { DownloadableDataset, DownloadableDatasetContext } from "../../views/cube-view/downloadable-dataset-context"; +import { Loader } from "../../components/loader/loader"; interface DataProviderProps { refreshRequestTimestamp: number; @@ -46,21 +47,17 @@ interface DataProviderProps { interface DataProviderState { dataset: DatasetRequest; + requesting: boolean; } export class DataProvider extends React.Component { static contextType = DownloadableDatasetContext; context: DownloadableDataset; - state: DataProviderState = { dataset: loading }; + state: DataProviderState = { dataset: loading, requesting: false }; private lastQueryEssence: Essence = null; - componentDidMount() { - const { essence } = this.props; - this.loadData(essence); - } - componentWillUnmount() { this.lastQueryEssence = null; this.debouncedCallExecutor.cancel(); @@ -68,15 +65,18 @@ export class DataProvider extends React.Component { // TODO: encode it better @@ -92,17 +92,16 @@ export class DataProvider extends React.Component { - this.lastQueryEssence = essence; return this.debouncedCallExecutor(essence); } private callExecutor = (essence: Essence): Promise => this.props.query(essence) .then((dataset: Dataset) => { - // signal out of order requests with null - if (!this.wasUsedForLastQuery(essence)) return null; - return loaded(dataset); - }, + // signal out of order requests with null + if (!this.wasUsedForLastQuery(essence)) return null; + return loaded(dataset); + }, err => { // signal out of order requests with null if (!this.wasUsedForLastQuery(essence)) return null; @@ -153,14 +152,28 @@ export class DataProvider extends React.Component { + this.setState({ requesting: true }); + this.loadData(this.props.essence); + }; + render() { const { children } = this.props; - const { dataset } = this.state; + const { dataset, requesting } = this.state; switch (dataset.status) { case DatasetRequestStatus.LOADING: - return ; + return requesting ? : ( +
+
+ ); case DatasetRequestStatus.ERROR: - return ; + return ; case DatasetRequestStatus.LOADED: return children(dataset.dataset); }