diff --git a/superset/assets/javascripts/explorev2/actions/exploreActions.js b/superset/assets/javascripts/explorev2/actions/exploreActions.js
index 427c6bb70d..8d0728fbba 100644
--- a/superset/assets/javascripts/explorev2/actions/exploreActions.js
+++ b/superset/assets/javascripts/explorev2/actions/exploreActions.js
@@ -24,8 +24,8 @@ export function fetchSucceeded() {
}
export const FETCH_FAILED = 'FETCH_FAILED';
-export function fetchFailed() {
- return { type: FETCH_FAILED };
+export function fetchFailed(error) {
+ return { type: FETCH_FAILED, error };
}
export function fetchFieldOptions(datasourceId, datasourceType) {
@@ -35,18 +35,19 @@ export function fetchFieldOptions(datasourceId, datasourceType) {
if (datasourceId) {
const params = [`datasource_id=${datasourceId}`, `datasource_type=${datasourceType}`];
const url = '/superset/fetch_datasource_metadata?' + params.join('&');
-
- $.get(url, (data, status) => {
- if (status === 'success') {
- // populate options for select type fields
+ $.ajax({
+ type: 'GET',
+ url,
+ success: (data) => {
dispatch(setFieldOptions(data.field_options));
dispatch(fetchSucceeded());
- } else if (status === 'error') {
- dispatch(fetchFailed());
- }
+ },
+ error(error) {
+ dispatch(fetchFailed(error.responseJSON.error));
+ },
});
} else {
- // in what case don't we have a datasource id?
+ dispatch(fetchFailed('Please select a datasource'));
}
};
}
@@ -119,8 +120,8 @@ export function chartUpdateStarted() {
}
export const CHART_UPDATE_FAILED = 'CHART_UPDATE_FAILED ';
-export function chartUpdateFailed() {
- return { type: CHART_UPDATE_FAILED };
+export function chartUpdateFailed(error) {
+ return { type: CHART_UPDATE_FAILED, error };
}
export function updateExplore(datasource_type, datasource_id, form_data) {
@@ -139,9 +140,18 @@ export function updateExplore(datasource_type, datasource_id, form_data) {
dispatch(updateChart(JSON.parse(data)));
},
error(error) {
- dispatch(chartUpdateFailed(error));
+ dispatch(chartUpdateFailed(error.responseJSON.error));
},
});
};
}
+export const REMOVE_CONTROL_PANEL_ALERT = 'REMOVE_CONTROL_PANEL_ALERT';
+export function removeControlPanelAlert() {
+ return { type: REMOVE_CONTROL_PANEL_ALERT };
+}
+
+export const REMOVE_CHART_ALERT = 'REMOVE_CHART_ALERT';
+export function removeChartAlert() {
+ return { type: REMOVE_CHART_ALERT };
+}
diff --git a/superset/assets/javascripts/explorev2/components/ChartContainer.jsx b/superset/assets/javascripts/explorev2/components/ChartContainer.jsx
index 23cb2b62dc..3ede6dbaaf 100644
--- a/superset/assets/javascripts/explorev2/components/ChartContainer.jsx
+++ b/superset/assets/javascripts/explorev2/components/ChartContainer.jsx
@@ -1,7 +1,7 @@
import $ from 'jquery';
import React, { PropTypes } from 'react';
import { connect } from 'react-redux';
-import { Panel } from 'react-bootstrap';
+import { Panel, Alert } from 'react-bootstrap';
import visMap from '../../../visualizations/main';
import { d3format } from '../../modules/utils';
import ExploreActionButtons from '../../explore/components/ExploreActionButtons';
@@ -24,6 +24,7 @@ const propTypes = {
data: PropTypes.any,
isChartLoading: PropTypes.bool,
isStarred: PropTypes.bool.isRequired,
+ alert: PropTypes.string,
};
class ChartContainer extends React.Component {
@@ -139,6 +140,9 @@ class ChartContainer extends React.Component {
};
}
+ removeAlert() {
+ this.props.actions.removeChartAlert();
+ }
renderVis() {
visMap[this.props.viz_type](this.state.mockSlice).render();
@@ -183,6 +187,16 @@ class ChartContainer extends React.Component {
}
>
+ {this.props.alert &&
+