From db3fa8df771a7d2b6e56ca2f37282ca9ea64aab6 Mon Sep 17 00:00:00 2001 From: "JUST.in DO IT" Date: Wed, 17 Jul 2024 10:37:58 -0700 Subject: [PATCH] fix(sqllab): Show warning message when deprecated db is selected (#29607) --- .../components/SqlEditor/SqlEditor.test.tsx | 12 +- .../src/SqlLab/components/SqlEditor/index.tsx | 185 ++++++++++-------- superset-frontend/src/SqlLab/fixtures.ts | 2 +- 3 files changed, 116 insertions(+), 83 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.tsx b/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.tsx index 9697d14a9..d24c7e9d8 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.tsx +++ b/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.tsx @@ -160,13 +160,23 @@ describe('SqlEditor', () => { }); it('does not render SqlEditor if no db selected', async () => { - const queryEditor = initialState.sqlLab.queryEditors[1]; + const queryEditor = initialState.sqlLab.queryEditors[2]; const { findByText } = setup({ ...mockedProps, queryEditor }, store); expect( await findByText('Select a database to write a query'), ).toBeInTheDocument(); }); + it('renders db unavailable message', async () => { + const queryEditor = initialState.sqlLab.queryEditors[1]; + const { findByText } = setup({ ...mockedProps, queryEditor }, store); + expect( + await findByText( + 'The database that was used to generate this query could not be found', + ), + ).toBeInTheDocument(); + }); + it('render a SqlEditorLeftBar', async () => { const { getByTestId } = setup(mockedProps, store); await waitFor(() => diff --git a/superset-frontend/src/SqlLab/components/SqlEditor/index.tsx b/superset-frontend/src/SqlLab/components/SqlEditor/index.tsx index dd22442de..c17ac9324 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditor/index.tsx +++ b/superset-frontend/src/SqlLab/components/SqlEditor/index.tsx @@ -99,6 +99,7 @@ import { setItem, } from 'src/utils/localStorageHelpers'; import { EmptyStateBig } from 'src/components/EmptyState'; +import Alert from 'src/components/Alert'; import getBootstrapData from 'src/utils/getBootstrapData'; import useLogAction from 'src/logger/useLogAction'; import { @@ -258,31 +259,38 @@ const SqlEditor: FC = ({ const theme = useTheme(); const dispatch = useDispatch(); - const { database, latestQuery, hideLeftBar, currentQueryEditorId } = - useSelector< - SqlLabRootState, - { - database?: DatabaseObject; - latestQuery?: QueryResponse; - hideLeftBar?: boolean; - currentQueryEditorId: QueryEditor['id']; - } - >(({ sqlLab: { unsavedQueryEditor, databases, queries, tabHistory } }) => { - let { dbId, latestQueryId, hideLeftBar } = queryEditor; - if (unsavedQueryEditor?.id === queryEditor.id) { - dbId = unsavedQueryEditor.dbId || dbId; - latestQueryId = unsavedQueryEditor.latestQueryId || latestQueryId; - hideLeftBar = isBoolean(unsavedQueryEditor.hideLeftBar) - ? unsavedQueryEditor.hideLeftBar - : hideLeftBar; - } - return { - database: databases[dbId || ''], - latestQuery: queries[latestQueryId || ''], - hideLeftBar, - currentQueryEditorId: tabHistory.slice(-1)[0], - }; - }, shallowEqual); + const { + database, + latestQuery, + hideLeftBar, + currentQueryEditorId, + hasSqlStatement, + } = useSelector< + SqlLabRootState, + { + database?: DatabaseObject; + latestQuery?: QueryResponse; + hideLeftBar?: boolean; + currentQueryEditorId: QueryEditor['id']; + hasSqlStatement: boolean; + } + >(({ sqlLab: { unsavedQueryEditor, databases, queries, tabHistory } }) => { + let { dbId, latestQueryId, hideLeftBar } = queryEditor; + if (unsavedQueryEditor?.id === queryEditor.id) { + dbId = unsavedQueryEditor.dbId || dbId; + latestQueryId = unsavedQueryEditor.latestQueryId || latestQueryId; + hideLeftBar = isBoolean(unsavedQueryEditor.hideLeftBar) + ? unsavedQueryEditor.hideLeftBar + : hideLeftBar; + } + return { + hasSqlStatement: Boolean(queryEditor.sql?.trim().length > 0), + database: databases[dbId || ''], + latestQuery: queries[latestQueryId || ''], + hideLeftBar, + currentQueryEditorId: tabHistory.slice(-1)[0], + }; + }, shallowEqual); const logAction = useLogAction({ queryEditorId: queryEditor.id }); const isActive = currentQueryEditorId === queryEditor.id; @@ -728,7 +736,7 @@ const SqlEditor: FC = ({ dispatch(addSavedQueryToTabState(queryEditor, savedQuery)); }; - const renderEditorBottomBar = () => { + const renderEditorBottomBar = (hideActions: boolean) => { const { allow_ctas: allowCTAS, allow_cvas: allowCVAS } = database || {}; const showMenu = allowCTAS || allowCVAS; @@ -767,63 +775,78 @@ const SqlEditor: FC = ({ return ( -
- - - - {isFeatureEnabled(FeatureFlag.EstimateQueryCost) && - database?.allows_cost_estimate && ( + {hideActions ? ( + + ) : ( + <> +
- - )} - - - - {latestQuery && ( - - )} -
-
- - - dispatch(updateSavedQuery(query, remoteId)) - } - saveQueryWarning={saveQueryWarning} - database={database} - /> - - - - - - - -
+ {isFeatureEnabled(FeatureFlag.EstimateQueryCost) && + database?.allows_cost_estimate && ( + + + + )} + + + + {latestQuery && ( + + )} +
+
+ + + dispatch(updateSavedQuery(query, remoteId)) + } + saveQueryWarning={saveQueryWarning} + database={database} + /> + + + + + + + +
+ + )}
); }; @@ -866,7 +889,7 @@ const SqlEditor: FC = ({ height={`${aceEditorHeight}px`} hotkeys={hotkeys} /> - {renderEditorBottomBar()} + {renderEditorBottomBar(showEmptyState)} = ({ > - ) : showEmptyState ? ( + ) : showEmptyState && !hasSqlStatement ? (