diff --git a/superset/assets/javascripts/SqlLab/components/TabbedSqlEditors.jsx b/superset/assets/javascripts/SqlLab/components/TabbedSqlEditors.jsx index 776133204034e..bc828b718e6b1 100644 --- a/superset/assets/javascripts/SqlLab/components/TabbedSqlEditors.jsx +++ b/superset/assets/javascripts/SqlLab/components/TabbedSqlEditors.jsx @@ -101,7 +101,9 @@ class TabbedSqlEditors extends React.PureComponent { const activeQueryEditor = this.activeQueryEditor(); const qe = { title: `Untitled Query ${queryCount}`, - dbId: (activeQueryEditor) ? activeQueryEditor.dbId : null, + dbId: (activeQueryEditor && activeQueryEditor.dbId) ? + activeQueryEditor.dbId : + this.props.defaultDbId, schema: (activeQueryEditor) ? activeQueryEditor.schema : null, autorun: false, sql: 'SELECT ...', @@ -216,6 +218,7 @@ function mapStateToProps(state) { tabHistory: state.tabHistory, networkOn: state.networkOn, tables: state.tables, + defaultDbId: state.defaultDbId, }; } function mapDispatchToProps(dispatch) { diff --git a/superset/assets/javascripts/SqlLab/index.jsx b/superset/assets/javascripts/SqlLab/index.jsx index e34186c7b07a4..13df75d80c4cf 100644 --- a/superset/assets/javascripts/SqlLab/index.jsx +++ b/superset/assets/javascripts/SqlLab/index.jsx @@ -4,7 +4,7 @@ require('bootstrap'); import React from 'react'; import { render } from 'react-dom'; -import { initialState, sqlLabReducer } from './reducers'; +import { getInitialState, sqlLabReducer } from './reducers'; import { enhancer } from '../reduxUtils'; import { createStore, compose, applyMiddleware } from 'redux'; import { Provider } from 'react-redux'; @@ -15,8 +15,12 @@ import App from './components/App'; require('./main.css'); +const appContainer = document.getElementById('app'); +const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap')); +const state = Object.assign({}, getInitialState(bootstrapData.defaultDbId), bootstrapData); + let store = createStore( - sqlLabReducer, initialState, compose(applyMiddleware(thunkMiddleware), enhancer())); + sqlLabReducer, state, compose(applyMiddleware(thunkMiddleware), enhancer())); // jquery hack to highlight the navbar menu $('a:contains("SQL Lab")').parent().addClass('active'); @@ -25,5 +29,5 @@ render( , - document.getElementById('app') + appContainer ); diff --git a/superset/assets/javascripts/SqlLab/reducers.js b/superset/assets/javascripts/SqlLab/reducers.js index 791a86a218011..8a2bbdf308530 100644 --- a/superset/assets/javascripts/SqlLab/reducers.js +++ b/superset/assets/javascripts/SqlLab/reducers.js @@ -4,27 +4,29 @@ import { now } from '../modules/dates'; import { addToObject, alterInObject, alterInArr, removeFromArr, getFromArr, addToArr } from '../reduxUtils.js'; -export const defaultQueryEditor = { - id: shortid.generate(), - title: 'Untitled Query', - sql: 'SELECT *\nFROM\nWHERE', - selectedText: null, - latestQueryId: null, - autorun: false, - dbId: null, -}; +export function getInitialState(defaultDbId) { + const defaultQueryEditor = { + id: shortid.generate(), + title: 'Untitled Query', + sql: 'SELECT *\nFROM\nWHERE', + selectedText: null, + latestQueryId: null, + autorun: false, + dbId: defaultDbId, + }; -export const initialState = { - alerts: [], - networkOn: true, - queries: {}, - databases: {}, - queryEditors: [defaultQueryEditor], - tabHistory: [defaultQueryEditor.id], - tables: [], - queriesLastUpdate: 0, - activeSouthPaneTab: 'Results', -}; + return { + alerts: [], + networkOn: true, + queries: {}, + databases: {}, + queryEditors: [defaultQueryEditor], + tabHistory: [defaultQueryEditor.id], + tables: [], + queriesLastUpdate: 0, + activeSouthPaneTab: 'Results', + }; +} export const sqlLabReducer = function (state, action) { const actionHandlers = { @@ -70,7 +72,7 @@ export const sqlLabReducer = function (state, action) { return Object.assign({}, state, { queries: newQueries }); }, [actions.RESET_STATE]() { - return Object.assign({}, initialState); + return Object.assign({}, getInitialState()); }, [actions.MERGE_TABLE]() { const at = Object.assign({}, action.table); diff --git a/superset/config.py b/superset/config.py index bf5913253a68e..697eb5b7289cd 100644 --- a/superset/config.py +++ b/superset/config.py @@ -234,6 +234,9 @@ class CeleryConfig(object): # Timeout duration for SQL Lab synchronous queries SQLLAB_TIMEOUT = 30 +# SQLLAB_DEFAULT_DBID +SQLLAB_DEFAULT_DBID = None + # An instantiated derivative of werkzeug.contrib.cache.BaseCache # if enabled, it can be used to store the results of long-running queries # in SQL Lab by using the "Run Async" button/feature diff --git a/superset/views.py b/superset/views.py index 8369ce3ca9476..955ac0b13ff29 100755 --- a/superset/views.py +++ b/superset/views.py @@ -2702,8 +2702,13 @@ def profile(self, username): @expose("/sqllab") def sqllab(self): """SQL Editor""" - return self.render_template('superset/sqllab.html') - + d = { + 'defaultDbId': config.get('SQLLAB_DEFAULT_DBID'), + } + return self.render_template( + 'superset/sqllab.html', + bootstrap_data=json.dumps(d, default=utils.json_iso_dttm_ser) + ) appbuilder.add_view_no_menu(Superset) if config['DRUID_IS_ACTIVE']: