-
+
{
+ if (isNewSlice) {
+ this.props.actions.createNewSlice(
+ data.can_add, data.can_download, data.can_overwrite,
+ data.slice, data.form_data);
+ } else {
+ this.props.actions.updateChartTitle(newTitle);
+ }
+ });
+ }
+
+ renderChartTitle() {
+ let title;
+ if (this.props.slice) {
+ title = this.props.slice.slice_name;
+ } else {
+ title = t('%s - untitled', this.props.table_name);
+ }
+ return title;
+ }
+
+ render() {
+ const queryResponse = this.props.chart.queryResponse;
+ const data = {
+ csv_endpoint: getExploreUrl(this.props.form_data, 'csv'),
+ json_endpoint: getExploreUrl(this.props.form_data, 'json'),
+ standalone_endpoint: getExploreUrl(this.props.form_data, 'standalone'),
+ };
+
+ return (
+
+ );
+ }
+}
+
+ExploreChartHeader.propTypes = propTypes;
+
+export default ExploreChartHeader;
diff --git a/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx b/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx
new file mode 100644
index 0000000000..7834787c78
--- /dev/null
+++ b/superset/assets/javascripts/explore/components/ExploreChartPanel.jsx
@@ -0,0 +1,79 @@
+import $ from 'jquery';
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Panel } from 'react-bootstrap';
+
+import { chartPropType } from '../../chart/chartReducer';
+import ChartContainer from '../../chart/ChartContainer';
+import ExploreChartHeader from './ExploreChartHeader';
+
+const propTypes = {
+ actions: PropTypes.object.isRequired,
+ can_overwrite: PropTypes.bool.isRequired,
+ can_download: PropTypes.bool.isRequired,
+ datasource: PropTypes.object,
+ column_formats: PropTypes.object,
+ containerId: PropTypes.string.isRequired,
+ height: PropTypes.string.isRequired,
+ width: PropTypes.string.isRequired,
+ isStarred: PropTypes.bool.isRequired,
+ slice: PropTypes.object,
+ table_name: PropTypes.string,
+ vizType: PropTypes.string.isRequired,
+ form_data: PropTypes.object,
+ standalone: PropTypes.bool,
+ timeout: PropTypes.number,
+ chart: PropTypes.shape(chartPropType),
+};
+
+class ExploreChartPanel extends React.PureComponent {
+ getHeight() {
+ const headerHeight = this.props.standalone ? 0 : 100;
+ return parseInt(this.props.height, 10) - headerHeight;
+ }
+
+ render() {
+ if (this.props.standalone) {
+ // dom manipulation hack to get rid of the boostrap theme's body background
+ $('body').addClass('background-transparent');
+ return this.renderChart();
+ }
+
+ const header = (
+
);
+ return (
+
+ );
+ }
+}
+
+ExploreChartPanel.propTypes = propTypes;
+
+export default ExploreChartPanel;
diff --git a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx
index f696ed6445..e3ea7f2a73 100644
--- a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx
+++ b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx
@@ -3,27 +3,28 @@ import React from 'react';
import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
-import ChartContainer from './ChartContainer';
+
+import ExploreChartPanel from './ExploreChartPanel';
import ControlPanelsContainer from './ControlPanelsContainer';
import SaveModal from './SaveModal';
import QueryAndSaveBtns from './QueryAndSaveBtns';
import { getExploreUrl } from '../exploreUtils';
import { getFormDataFromControls } from '../stores/store';
+import { chartPropType } from '../../chart/chartReducer';
import * as exploreActions from '../actions/exploreActions';
import * as saveModalActions from '../actions/saveModalActions';
-import * as chartActions from '../actions/chartActions';
+import * as chartActions from '../../chart/chartAction';
const propTypes = {
actions: PropTypes.object.isRequired,
datasource_type: PropTypes.string.isRequired,
isDatasourceMetaLoading: PropTypes.bool.isRequired,
chartStatus: PropTypes.string,
+ chart: PropTypes.shape(chartPropType).isRequired,
controls: PropTypes.object.isRequired,
forcedHeight: PropTypes.string,
form_data: PropTypes.object.isRequired,
standalone: PropTypes.bool.isRequired,
- triggerQuery: PropTypes.bool.isRequired,
- queryRequest: PropTypes.object,
timeout: PropTypes.number,
};
@@ -39,13 +40,12 @@ class ExploreViewContainer extends React.Component {
componentDidMount() {
window.addEventListener('resize', this.handleResize.bind(this));
- this.triggerQueryIfNeeded();
}
componentWillReceiveProps(np) {
if (np.controls.viz_type.value !== this.props.controls.viz_type.value) {
this.props.actions.resetControls();
- this.props.actions.triggerQuery();
+ this.props.actions.triggerQuery(true, this.props.chart.chartKey);
}
if (np.controls.datasource.value !== this.props.controls.datasource.value) {
this.props.actions.fetchDatasourceMetadata(np.form_data.datasource, true);
@@ -63,9 +63,7 @@ class ExploreViewContainer extends React.Component {
onQuery() {
// remove alerts when query
this.props.actions.removeControlPanelAlert();
- this.props.actions.removeChartAlert();
-
- this.props.actions.triggerQuery();
+ this.props.actions.triggerQuery(true, this.props.chart.chartKey);
history.pushState(
{},
@@ -74,7 +72,7 @@ class ExploreViewContainer extends React.Component {
}
onStop() {
- this.props.actions.chartUpdateStopped(this.props.queryRequest);
+ this.props.actions.chartUpdateStopped(this.props.chart.queryRequest);
}
getWidth() {
@@ -90,8 +88,9 @@ class ExploreViewContainer extends React.Component {
}
triggerQueryIfNeeded() {
- if (this.props.triggerQuery && !this.hasErrors()) {
- this.props.actions.runQuery(this.props.form_data, false, this.props.timeout);
+ if (this.props.chart.triggerQuery && !this.hasErrors()) {
+ this.props.actions.runQuery(this.props.form_data, false,
+ this.props.timeout, this.props.chart.chartKey);
}
}
@@ -134,10 +133,10 @@ class ExploreViewContainer extends React.Component {
}
renderChartContainer() {
return (
-
);
}
@@ -168,7 +167,7 @@ class ExploreViewContainer extends React.Component {
onQuery={this.onQuery.bind(this)}
onSave={this.toggleModal.bind(this)}
onStop={this.onStop.bind(this)}
- loading={this.props.chartStatus === 'loading'}
+ loading={this.props.chart.chartStatus === 'loading'}
errorMessage={this.renderErrorMessage()}
/>
@@ -191,18 +190,28 @@ class ExploreViewContainer extends React.Component {
ExploreViewContainer.propTypes = propTypes;
-function mapStateToProps({ explore, chart }) {
+function mapStateToProps({ explore, charts }) {
const form_data = getFormDataFromControls(explore.controls);
+ const chartKey = Object.keys(charts)[0];
+ const chart = charts[chartKey];
return {
isDatasourceMetaLoading: explore.isDatasourceMetaLoading,
+ datasource: explore.datasource,
datasource_type: explore.datasource.type,
+ datasourceId: explore.datasource_id,
controls: explore.controls,
+ can_overwrite: !!explore.can_overwrite,
+ can_download: !!explore.can_download,
+ column_formats: explore.datasource ? explore.datasource.column_formats : null,
+ containerId: explore.slice ? `slice-container-${explore.slice.slice_id}` : 'slice-container',
+ isStarred: explore.isStarred,
+ slice: explore.slice,
form_data,
+ table_name: form_data.datasource_name,
+ vizType: form_data.viz_type,
standalone: explore.standalone,
- triggerQuery: explore.triggerQuery,
forcedHeight: explore.forced_height,
- queryRequest: chart.queryRequest,
- chartStatus: chart.chartStatus,
+ chart,
timeout: explore.common.conf.SUPERSET_WEBSERVER_TIMEOUT,
};
}
diff --git a/superset/assets/javascripts/explore/components/SaveModal.jsx b/superset/assets/javascripts/explore/components/SaveModal.jsx
index 2939f2ef66..7b375c2a0a 100644
--- a/superset/assets/javascripts/explore/components/SaveModal.jsx
+++ b/superset/assets/javascripts/explore/components/SaveModal.jsx
@@ -13,7 +13,7 @@ const propTypes = {
onHide: PropTypes.func.isRequired,
actions: PropTypes.object.isRequired,
form_data: PropTypes.object,
- user_id: PropTypes.string.isRequired,
+ userId: PropTypes.string.isRequired,
dashboards: PropTypes.array.isRequired,
alert: PropTypes.string,
slice: PropTypes.object,
@@ -34,7 +34,7 @@ class SaveModal extends React.Component {
};
}
componentDidMount() {
- this.props.actions.fetchDashboards(this.props.user_id);
+ this.props.actions.fetchDashboards(this.props.userId);
}
onChange(name, event) {
switch (name) {
@@ -243,7 +243,7 @@ function mapStateToProps({ explore, saveModal }) {
datasource: explore.datasource,
slice: explore.slice,
can_overwrite: explore.can_overwrite,
- user_id: explore.user_id,
+ userId: explore.userId,
dashboards: saveModal.dashboards,
alert: saveModal.saveModalAlert,
};
diff --git a/superset/assets/javascripts/explore/index.jsx b/superset/assets/javascripts/explore/index.jsx
index 049e731fe8..2247019f08 100644
--- a/superset/assets/javascripts/explore/index.jsx
+++ b/superset/assets/javascripts/explore/index.jsx
@@ -34,19 +34,23 @@ const bootstrappedState = Object.assign(
filterColumnOpts: [],
isDatasourceMetaLoading: false,
isStarred: false,
- triggerQuery: true,
- triggerRender: false,
},
);
+const chartKey = bootstrappedState.slice ? ('slice_' + bootstrappedState.slice.slice_id) : 'slice';
const initState = {
- chart: {
- chartAlert: null,
- chartStatus: null,
- chartUpdateEndTime: null,
- chartUpdateStartTime: now(),
- latestQueryFormData: getFormDataFromControls(controls),
- queryResponse: null,
+ charts: {
+ [chartKey]: {
+ chartKey,
+ chartAlert: null,
+ chartStatus: null,
+ chartUpdateEndTime: null,
+ chartUpdateStartTime: now(),
+ latestQueryFormData: getFormDataFromControls(controls),
+ queryResponse: null,
+ triggerQuery: true,
+ triggerRender: false,
+ },
},
saveModal: {
dashboards: [],
diff --git a/superset/assets/javascripts/explore/reducers/chartReducer.js b/superset/assets/javascripts/explore/reducers/chartReducer.js
deleted file mode 100644
index 808d884071..0000000000
--- a/superset/assets/javascripts/explore/reducers/chartReducer.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/* eslint camelcase: 0 */
-import { now } from '../../modules/dates';
-import * as actions from '../actions/chartActions';
-import { t } from '../../locales';
-
-export default function chartReducer(state = {}, action) {
- const actionHandlers = {
- [actions.CHART_UPDATE_SUCCEEDED]() {
- return Object.assign(
- {},
- state,
- {
- chartStatus: 'success',
- queryResponse: action.queryResponse,
- },
- );
- },
- [actions.CHART_UPDATE_STARTED]() {
- return Object.assign({}, state,
- {
- chartStatus: 'loading',
- chartUpdateEndTime: null,
- chartUpdateStartTime: now(),
- queryRequest: action.queryRequest,
- latestQueryFormData: action.latestQueryFormData,
- });
- },
- [actions.CHART_UPDATE_STOPPED]() {
- return Object.assign({}, state,
- {
- chartStatus: 'stopped',
- chartAlert: t('Updating chart was stopped'),
- });
- },
- [actions.CHART_RENDERING_FAILED]() {
- return Object.assign({}, state, {
- chartStatus: 'failed',
- chartAlert: t('An error occurred while rendering the visualization: %s', action.error),
- });
- },
- [actions.CHART_UPDATE_TIMEOUT]() {
- return Object.assign({}, state, {
- chartStatus: 'failed',
- chartAlert: (
- '
Query timeout - visualization query are set to timeout at ' +
- `${action.timeout} seconds. ` +
- t('Perhaps your data has grown, your database is under unusual load, ' +
- 'or you are simply querying a data source that is to large ' +
- 'to be processed within the timeout range. ' +
- 'If that is the case, we recommend that you summarize your data further.')),
- });
- },
- [actions.CHART_UPDATE_FAILED]() {
- return Object.assign({}, state, {
- chartStatus: 'failed',
- chartAlert: action.queryResponse ? action.queryResponse.error : t('Network error.'),
- chartUpdateEndTime: now(),
- queryResponse: action.queryResponse,
- });
- },
- [actions.UPDATE_CHART_STATUS]() {
- const newState = Object.assign({}, state, { chartStatus: action.status });
- if (action.status === 'success' || action.status === 'failed') {
- newState.chartUpdateEndTime = now();
- }
- return newState;
- },
- [actions.REMOVE_CHART_ALERT]() {
- if (state.chartAlert !== null) {
- return Object.assign({}, state, { chartAlert: null });
- }
- return state;
- },
- };
-
- if (action.type in actionHandlers) {
- return actionHandlers[action.type]();
- }
- return state;
-}
diff --git a/superset/assets/javascripts/explore/reducers/exploreReducer.js b/superset/assets/javascripts/explore/reducers/exploreReducer.js
index e37df6eb9f..7b55748800 100644
--- a/superset/assets/javascripts/explore/reducers/exploreReducer.js
+++ b/superset/assets/javascripts/explore/reducers/exploreReducer.js
@@ -56,11 +56,6 @@ export default function exploreReducer(state = {}, action) {
}
return Object.assign({}, state, changes);
},
- [actions.TRIGGER_QUERY]() {
- return Object.assign({}, state, {
- triggerQuery: action.value,
- });
- },
[actions.UPDATE_CHART_TITLE]() {
const updatedSlice = Object.assign({}, state.slice, { slice_name: action.slice_name });
return Object.assign({}, state, { slice: updatedSlice });
@@ -69,9 +64,6 @@ export default function exploreReducer(state = {}, action) {
const controls = getControlsState(state, getFormDataFromControls(state.controls));
return Object.assign({}, state, { controls });
},
- [actions.RENDER_TRIGGERED]() {
- return Object.assign({}, state, { triggerRender: false });
- },
[actions.CREATE_NEW_SLICE]() {
return Object.assign({}, state, {
slice: action.slice,
diff --git a/superset/assets/javascripts/explore/reducers/index.js b/superset/assets/javascripts/explore/reducers/index.js
index 0d5acb04c7..22f7e8f303 100644
--- a/superset/assets/javascripts/explore/reducers/index.js
+++ b/superset/assets/javascripts/explore/reducers/index.js
@@ -1,11 +1,11 @@
import { combineReducers } from 'redux';
-import chart from './chartReducer';
+import charts from '../../chart/chartReducer';
import saveModal from './saveModalReducer';
import explore from './exploreReducer';
export default combineReducers({
- chart,
+ charts,
saveModal,
explore,
});
diff --git a/superset/assets/javascripts/modules/utils.js b/superset/assets/javascripts/modules/utils.js
index 83ec2c0bbf..e7757d4b06 100644
--- a/superset/assets/javascripts/modules/utils.js
+++ b/superset/assets/javascripts/modules/utils.js
@@ -240,3 +240,11 @@ export function tryNumify(s) {
}
return n;
}
+
+export function getParam(name) {
+ /* eslint no-useless-escape: 0 */
+ const formattedName = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
+ const regex = new RegExp('[\\?&]' + formattedName + '=([^]*)');
+ const results = regex.exec(location.search);
+ return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
+}
diff --git a/superset/assets/javascripts/reduxUtils.js b/superset/assets/javascripts/reduxUtils.js
index fc42083d56..abe2d7f231 100644
--- a/superset/assets/javascripts/reduxUtils.js
+++ b/superset/assets/javascripts/reduxUtils.js
@@ -19,10 +19,9 @@ export function alterInObject(state, arrKey, obj, alterations) {
return Object.assign({}, state, { [arrKey]: newObject });
}
-export function alterInArr(state, arrKey, obj, alterations) {
+export function alterInArr(state, arrKey, obj, alterations, idKey = 'id') {
// Finds an item in an array in the state and replaces it with a
// new object with an altered property
- const idKey = 'id';
const newArr = [];
state[arrKey].forEach((arrItem) => {
if (obj[idKey] === arrItem[idKey]) {
@@ -96,19 +95,5 @@ export function areArraysShallowEqual(arr1, arr2) {
}
export function areObjectsEqual(obj1, obj2) {
- if (!obj1 || !obj2) {
- return false;
- }
- if (!Object.keys(obj1).length !== Object.keys(obj2).length) {
- return false;
- }
- for (const id in obj1) {
- if (!obj2.hasOwnProperty(id)) {
- return false;
- }
- if (obj1[id] !== obj2[id]) {
- return false;
- }
- }
- return true;
+ return JSON.stringify(obj1) === JSON.stringify(obj2);
}
diff --git a/superset/assets/spec/javascripts/dashboard/SliceCell_spec.jsx b/superset/assets/spec/javascripts/dashboard/SliceCell_spec.jsx
deleted file mode 100644
index 8dbf661d20..0000000000
--- a/superset/assets/spec/javascripts/dashboard/SliceCell_spec.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import { mount } from 'enzyme';
-import { describe, it } from 'mocha';
-import { expect } from 'chai';
-import { slice } from './fixtures';
-
-import SliceCell from '../../../javascripts/dashboard/components/SliceCell';
-
-describe('SliceCell', () => {
- const mockedProps = {
- slice,
- removeSlice: () => {},
- expandedSlices: {},
- };
- it('is valid', () => {
- expect(
- React.isValidElement(
),
- ).to.equal(true);
- });
- it('renders six links', () => {
- const wrapper = mount(
);
- expect(wrapper.find('a')).to.have.length(6);
- });
-});
diff --git a/superset/assets/spec/javascripts/dashboard/fixtures.jsx b/superset/assets/spec/javascripts/dashboard/fixtures.jsx
index 7c822d78f9..be515e39a8 100644
--- a/superset/assets/spec/javascripts/dashboard/fixtures.jsx
+++ b/superset/assets/spec/javascripts/dashboard/fixtures.jsx
@@ -66,5 +66,5 @@ export const contextData = {
dash_save_perm: true,
standalone_mode: false,
dash_edit_perm: true,
- user_id: '1',
+ userId: '1',
};
diff --git a/superset/assets/spec/javascripts/explore/chartActions_spec.js b/superset/assets/spec/javascripts/explore/chartActions_spec.js
index b2e069ab97..f88de8f955 100644
--- a/superset/assets/spec/javascripts/explore/chartActions_spec.js
+++ b/superset/assets/spec/javascripts/explore/chartActions_spec.js
@@ -3,7 +3,7 @@ import { expect } from 'chai';
import sinon from 'sinon';
import $ from 'jquery';
import * as exploreUtils from '../../../javascripts/explore/exploreUtils';
-import * as actions from '../../../javascripts/explore/actions/chartActions';
+import * as actions from '../../../javascripts/chart/chartAction';
describe('chart actions', () => {
let dispatch;
diff --git a/superset/assets/spec/javascripts/explore/components/ChartContainer_spec.js b/superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js
similarity index 100%
rename from superset/assets/spec/javascripts/explore/components/ChartContainer_spec.js
rename to superset/assets/spec/javascripts/explore/components/ExploreChartPanel_spec.js
diff --git a/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx b/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
index e548d21a60..346fedac4b 100644
--- a/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
+++ b/superset/assets/spec/javascripts/explore/components/SaveModal_spec.jsx
@@ -24,7 +24,7 @@ describe('SaveModal', () => {
},
explore: {
can_overwrite: true,
- user_id: '1',
+ userId: '1',
datasource: {},
slice: {
slice_id: 1,
diff --git a/superset/assets/spec/javascripts/explore/exploreActions_spec.js b/superset/assets/spec/javascripts/explore/exploreActions_spec.js
index 5d2926de2e..d37fc46dcc 100644
--- a/superset/assets/spec/javascripts/explore/exploreActions_spec.js
+++ b/superset/assets/spec/javascripts/explore/exploreActions_spec.js
@@ -3,6 +3,7 @@ import { it, describe } from 'mocha';
import { expect } from 'chai';
import sinon from 'sinon';
import $ from 'jquery';
+import * as chartActions from '../../../javascripts/chart/chartAction';
import * as actions from '../../../javascripts/explore/actions/exploreActions';
import { defaultState } from '../../../javascripts/explore/stores/store';
import exploreReducer from '../../../javascripts/explore/reducers/exploreReducer';
@@ -77,7 +78,7 @@ describe('fetching actions', () => {
ajaxStub.yieldsTo('success', { data: '' });
makeRequest(true);
expect(dispatch.callCount).to.equal(5);
- expect(dispatch.getCall(4).args[0].type).to.equal(actions.TRIGGER_QUERY);
+ expect(dispatch.getCall(4).args[0].type).to.equal(chartActions.TRIGGER_QUERY);
});
});
});
diff --git a/superset/assets/stylesheets/dashboard.css b/superset/assets/stylesheets/dashboard.css
index 289ead3852..b110311046 100644
--- a/superset/assets/stylesheets/dashboard.css
+++ b/superset/assets/stylesheets/dashboard.css
@@ -18,17 +18,26 @@ div.widget .chart-controls {
right: 0;
top: 5px;
padding: 5px 5px;
+ opacity: 0;
+ transition: opacity 0.5s ease-in-out;
+}
+div.widget:hover .chart-controls {
opacity: 0.75;
- display: none;
+ transition: opacity 0.5s ease-in-out;
}
.slice-grid div.widget {
border-radius: 0;
- border: 0px;
+ border: 0;
box-shadow: none;
background-color: #fff;
overflow: visible;
}
+.slice-grid .slice_container {
+ background-color: #fff;
+ padding-left: 5px;
+}
+
.dashboard .slice-grid .dragging,
.dashboard .slice-grid .resizing {
opacity: 0.5;
@@ -84,10 +93,12 @@ div.widget .chart-controls {
.slice-cell {
box-shadow: 0px 0px 20px 5px rgba(0,0,0,0);
transition: box-shadow 1s ease-in;
+ height: 100%;
}
.slice-cell-highlight {
box-shadow: 0px 0px 20px 5px rgba(0,0,0,0.2);
+ height: 100%;
}
.slice-cell .editable-title input[type="button"] {
@@ -95,7 +106,7 @@ div.widget .chart-controls {
}
.dashboard .separator.widget .slice_container {
- padding: 0px;
+ padding: 0;
overflow: visible;
}
.dashboard .separator.widget .slice_container hr {
@@ -116,6 +127,8 @@ div.widget .chart-controls {
.dashboard .title .favstar {
font-size: 20px;
+ position: relative;
+ top: -5px;
}
.chart-header .header {
diff --git a/superset/assets/stylesheets/superset.less b/superset/assets/stylesheets/superset.less
index ea43e54b7e..a42c8ba565 100644
--- a/superset/assets/stylesheets/superset.less
+++ b/superset/assets/stylesheets/superset.less
@@ -189,8 +189,23 @@ div.widget .chart-header a {
display: none;
}
-div.widget .slice_container {
- overflow: hidden;
+div.widget {
+ .slice_container {
+ overflow: hidden;
+ }
+
+ .stack-trace-container.has-trace {
+ .alert-warning:hover {
+ cursor: pointer;
+ }
+ }
+
+ .is-loading {
+ .stack-trace-container,
+ .slice_container {
+ opacity: 0.5;
+ }
+ }
}
.navbar .alert {
diff --git a/superset/assets/visualizations/markup.js b/superset/assets/visualizations/markup.js
index 739e4510d9..8b437162e2 100644
--- a/superset/assets/visualizations/markup.js
+++ b/superset/assets/visualizations/markup.js
@@ -22,7 +22,7 @@ function markupWidget(slice, payload) {
jqdiv.html(`
`);
diff --git a/superset/assets/webpack.config.js b/superset/assets/webpack.config.js
index bb1729c144..ca1465e703 100644
--- a/superset/assets/webpack.config.js
+++ b/superset/assets/webpack.config.js
@@ -19,7 +19,7 @@ const config = {
common: APP_DIR + '/javascripts/common.js',
addSlice: ['babel-polyfill', APP_DIR + '/javascripts/addSlice/index.jsx'],
explore: ['babel-polyfill', APP_DIR + '/javascripts/explore/index.jsx'],
- dashboard: ['babel-polyfill', APP_DIR + '/javascripts/dashboard/Dashboard.jsx'],
+ dashboard: ['babel-polyfill', APP_DIR + '/javascripts/dashboard/index.jsx'],
sqllab: ['babel-polyfill', APP_DIR + '/javascripts/SqlLab/index.jsx'],
welcome: ['babel-polyfill', APP_DIR + '/javascripts/welcome.js'],
profile: ['babel-polyfill', APP_DIR + '/javascripts/profile/index.jsx'],
diff --git a/superset/templates/superset/dashboard.html b/superset/templates/superset/dashboard.html
index bb0b97cf6f..1a158d92a7 100644
--- a/superset/templates/superset/dashboard.html
+++ b/superset/templates/superset/dashboard.html
@@ -6,11 +6,5 @@
class="dashboard container-fluid"
data-bootstrap="{{ bootstrap_data }}"
>
-
-
-
-
-
-