diff --git a/superset-frontend/src/SqlLab/App.jsx b/superset-frontend/src/SqlLab/App.jsx index 8f36b7e2ab..37a45fc6fb 100644 --- a/superset-frontend/src/SqlLab/App.jsx +++ b/superset-frontend/src/SqlLab/App.jsx @@ -27,7 +27,7 @@ import { isFeatureEnabled, } from '@superset-ui/core'; import { GlobalStyles } from 'src/GlobalStyles'; -import { setupStore } from 'src/views/store'; +import { setupStore, userReducer } from 'src/views/store'; import setupExtensions from 'src/setup/setupExtensions'; import getBootstrapData from 'src/utils/getBootstrapData'; import { tableApiUtil } from 'src/hooks/apiResources/tables'; @@ -78,12 +78,6 @@ const sqlLabPersistStateConfig = { } }); - if (subset.sqlLab?.user) { - // Don't persist the user. - // User should really not be stored under the "sqlLab" field. Oh well. - delete subset.sqlLab.user; - } - const data = JSON.stringify(subset); // 2 digit precision const currentSize = @@ -105,9 +99,6 @@ const sqlLabPersistStateConfig = { ...initialState.sqlLab, }, }; - // Filter out any user data that may have been persisted in an older version. - // Get user from bootstrap data instead, every time - result.sqlLab.user = initialState.sqlLab.user; return result; }, }, @@ -115,7 +106,7 @@ const sqlLabPersistStateConfig = { export const store = setupStore({ initialState, - rootReducers: reducers, + rootReducers: { ...reducers, user: userReducer }, ...(!isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) && { enhancers: [ persistState( diff --git a/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx b/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx index 76784695a8..4aa8351796 100644 --- a/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx +++ b/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx @@ -41,7 +41,7 @@ describe('QueryTable', () => { it('renders a proper table', () => { const mockStore = configureStore([thunk]); const store = mockStore({ - sqlLab: user, + user, }); const wrapper = mount( diff --git a/superset-frontend/src/SqlLab/components/QueryTable/index.tsx b/superset-frontend/src/SqlLab/components/QueryTable/index.tsx index 96e1f4568d..1ea83de58c 100644 --- a/superset-frontend/src/SqlLab/components/QueryTable/index.tsx +++ b/superset-frontend/src/SqlLab/components/QueryTable/index.tsx @@ -105,7 +105,7 @@ const QueryTable = ({ [columns], ); - const user = useSelector(state => state.sqlLab.user); + const user = useSelector(state => state.user); const data = useMemo(() => { const restoreSql = (query: QueryResponse) => { diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx index 7f605967ad..8ef9fa4847 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx @@ -42,8 +42,6 @@ import { DatasetRadioState, EXPLORE_CHART_DEFAULT, DatasetOwner, - SqlLabExploreRootState, - getInitialState, SqlLabRootState, } from 'src/SqlLab/types'; import { mountExploreUrl } from 'src/explore/exploreUtils'; @@ -177,9 +175,7 @@ export const SaveDatasetModal = ({ >(undefined); const [loading, setLoading] = useState(false); - const user = useSelector(user => - getInitialState(user), - ); + const user = useSelector(state => state.user); const dispatch = useDispatch<(dispatch: any) => Promise>(); const createWindow = (url: string) => { diff --git a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx index c2b0cc3beb..4e38a76f9c 100644 --- a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx +++ b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx @@ -107,8 +107,8 @@ const SouthPane = ({ const dispatch = useDispatch(); const { editorQueries, dataPreviewQueries, databases, offline, user } = - useSelector(({ sqlLab }: SqlLabRootState) => { - const { databases, offline, user, queries, tables } = sqlLab; + useSelector(({ user, sqlLab }: SqlLabRootState) => { + const { databases, offline, queries, tables } = sqlLab; const dataPreviewQueries = tables .filter( ({ dataPreviewQueryId, queryEditorId: qeId }) => diff --git a/superset-frontend/src/SqlLab/fixtures.ts b/superset-frontend/src/SqlLab/fixtures.ts index 0afd1c4149..4f6ad9ceb5 100644 --- a/superset-frontend/src/SqlLab/fixtures.ts +++ b/superset-frontend/src/SqlLab/fixtures.ts @@ -660,10 +660,10 @@ export const initialState = { workspaceQueries: [], queriesLastUpdate: 0, activeSouthPaneTab: 'Results', - user: { user }, unsavedQueryEditor: {}, }, messageToasts: [], + user, common: { conf: { DEFAULT_SQLLAB_LIMIT: 1000, diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.js b/superset-frontend/src/SqlLab/reducers/getInitialState.js index 1e3ac94d11..5bc225824c 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.js +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.js @@ -33,7 +33,6 @@ export default function getInitialState({ tab_state_ids: tabStateIds = [], databases, queries: queries_, - requested_query: requestedQuery, user, }) { /** @@ -200,11 +199,9 @@ export default function getInitialState({ tabHistory: dedupeTabHistory(tabHistory), tables: Object.values(tables), queriesLastUpdate: Date.now(), - user, unsavedQueryEditor, queryCostEstimates: {}, }, - requestedQuery, messageToasts: getToastsFromPyFlashMessages( (common || {}).flash_messages || [], ), @@ -213,5 +210,6 @@ export default function getInitialState({ flash_messages: common.flash_messages, conf: common.conf, }, + user, }; } diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts b/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts index a3c71cbd88..af074c3cc4 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.test.ts @@ -42,7 +42,7 @@ const apiDataWithTabState = { }; describe('getInitialState', () => { it('should output the user that is passed in', () => { - expect(getInitialState(apiData).sqlLab.user.userId).toEqual(1); + expect(getInitialState(apiData).user.userId).toEqual(1); }); it('should return undefined instead of null for templateParams', () => { expect( diff --git a/superset-frontend/src/SqlLab/types.ts b/superset-frontend/src/SqlLab/types.ts index b1a8812471..eb0d89a98d 100644 --- a/superset-frontend/src/SqlLab/types.ts +++ b/superset-frontend/src/SqlLab/types.ts @@ -19,7 +19,6 @@ import { JsonObject, QueryResponse } from '@superset-ui/core'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; import { ToastType } from 'src/components/MessageToasts/types'; -import { RootState } from 'src/dashboard/types'; import { DropdownButtonProps } from 'src/components/DropdownButton'; import { ButtonProps } from 'src/components/Button'; @@ -66,33 +65,20 @@ export type SqlLabRootState = { tabHistory: string[]; // default is activeTab ? [activeTab.id.toString()] : [] tables: Record[]; queriesLastUpdate: number; - user: UserWithPermissionsAndRoles; errorMessage: string | null; unsavedQueryEditor: Partial; queryCostEstimates?: Record; + editorTabLastUpdatedAt?: number; }; localStorageUsageInKilobytes: number; messageToasts: toastState[]; + user: UserWithPermissionsAndRoles; common: { flash_messages: string[]; conf: JsonObject; }; }; -export type SqlLabExploreRootState = SqlLabRootState | RootState; - -export const getInitialState = (state: SqlLabExploreRootState) => { - if (state.hasOwnProperty('sqlLab')) { - const { - sqlLab: { user }, - } = state as SqlLabRootState; - return user; - } - - const { user } = state as RootState; - return user as UserWithPermissionsAndRoles; -}; - export enum DatasetRadioState { SAVE_NEW = 1, OVERWRITE_DATASET = 2, diff --git a/superset-frontend/src/views/store.ts b/superset-frontend/src/views/store.ts index cf03207f48..b4fa3b4055 100644 --- a/superset-frontend/src/views/store.ts +++ b/superset-frontend/src/views/store.ts @@ -66,7 +66,7 @@ export type UserLoadedAction = { user: UserWithPermissionsAndRoles; }; -const userReducer = ( +export const userReducer = ( user = bootstrapData.user || {}, action: UserLoadedAction, ): BootstrapUser | UndefinedUser => {