diff --git a/superset-frontend/src/addSlice/AddSliceContainer.test.tsx b/superset-frontend/src/addSlice/AddSliceContainer.test.tsx
index a656efb81844..b26ac9a4a76a 100644
--- a/superset-frontend/src/addSlice/AddSliceContainer.test.tsx
+++ b/superset-frontend/src/addSlice/AddSliceContainer.test.tsx
@@ -17,17 +17,19 @@
* under the License.
*/
import React from 'react';
-import { ReactWrapper } from 'enzyme';
+import { ReactWrapper, mount } from 'enzyme';
import Button from 'src/components/Button';
import { AsyncSelect } from 'src/components';
-import AddSliceContainer, {
+import {
+ AddSliceContainer,
AddSliceContainerProps,
AddSliceContainerState,
} from 'src/addSlice/AddSliceContainer';
import VizTypeGallery from 'src/explore/components/controls/VizTypeControl/VizTypeGallery';
-import { styledMount as mount } from 'spec/helpers/theming';
import { act } from 'spec/helpers/testing-library';
import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes';
+import { ThemeProvider } from '@emotion/react';
+import { supersetTheme } from '@superset-ui/core';
const datasource = {
value: '1',
@@ -61,7 +63,13 @@ const mockUserWithDatasetWrite: UserWithPermissionsAndRoles = {
};
async function getWrapper(user = mockUser) {
- const wrapper = mount() as ReactWrapper<
+ const wrapper = mount(
+ null} />,
+ {
+ wrappingComponent: ThemeProvider,
+ wrappingComponentProps: { theme: supersetTheme },
+ },
+ ) as unknown as ReactWrapper<
AddSliceContainerProps,
AddSliceContainerState,
AddSliceContainer
diff --git a/superset-frontend/src/addSlice/AddSliceContainer.tsx b/superset-frontend/src/addSlice/AddSliceContainer.tsx
index 84c37b61c713..98821c71a1b6 100644
--- a/superset-frontend/src/addSlice/AddSliceContainer.tsx
+++ b/superset-frontend/src/addSlice/AddSliceContainer.tsx
@@ -18,6 +18,7 @@
*/
import React, { ReactNode } from 'react';
import rison from 'rison';
+import querystring from 'query-string';
import { styled, t, SupersetClient, JsonResponse } from '@superset-ui/core';
import { getUrlParam } from 'src/utils/urlUtils';
import { URL_PARAMS } from 'src/constants';
@@ -25,10 +26,12 @@ import { isNullish } from 'src/utils/common';
import Button from 'src/components/Button';
import { AsyncSelect, Steps } from 'src/components';
import { Tooltip } from 'src/components/Tooltip';
+import withToasts from 'src/components/MessageToasts/withToasts';
import VizTypeGallery, {
MAX_ADVISABLE_VIZ_GALLERY_WIDTH,
} from 'src/explore/components/controls/VizTypeControl/VizTypeGallery';
+import _ from 'lodash';
import { findPermission } from 'src/utils/findPermission';
import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes';
@@ -41,10 +44,12 @@ type Dataset = {
export type AddSliceContainerProps = {
user: UserWithPermissionsAndRoles;
+ addSuccessToast: (arg: string) => void;
};
export type AddSliceContainerState = {
datasource?: { label: string; value: string };
+ datasetName?: string | string[] | null;
vizType: string | null;
canCreateDataset: boolean;
};
@@ -201,7 +206,7 @@ const StyledStepDescription = styled.div`
`}
`;
-export default class AddSliceContainer extends React.PureComponent<
+export class AddSliceContainer extends React.PureComponent<
AddSliceContainerProps,
AddSliceContainerState
> {
@@ -224,6 +229,21 @@ export default class AddSliceContainer extends React.PureComponent<
this.onVizTypeDoubleClick = this.onVizTypeDoubleClick.bind(this);
}
+ componentDidMount() {
+ const params = querystring.parse(window.location.search)?.dataset as string;
+ if (params) {
+ this.loadDatasources(params, 0, 1).then(r => {
+ const datasource = r.data[0];
+ // override here to force styling of option label
+ // which expects a reactnode instead of string
+ // @ts-expect-error
+ datasource.label = datasource.customLabel;
+ this.setState({ datasource });
+ });
+ this.props.addSuccessToast(t('The dataset has been saved'));
+ }
+ }
+
exploreUrl() {
const dashboardId = getUrlParam(URL_PARAMS.dashboardId);
let url = `/explore/?viz_type=${this.state.vizType}&datasource=${this.state.datasource?.value}`;
@@ -397,3 +417,5 @@ export default class AddSliceContainer extends React.PureComponent<
);
}
}
+
+export default withToasts(AddSliceContainer);
diff --git a/superset-frontend/src/addSlice/App.tsx b/superset-frontend/src/addSlice/App.tsx
index 61c9078b2aa9..11adbb30a2d0 100644
--- a/superset-frontend/src/addSlice/App.tsx
+++ b/superset-frontend/src/addSlice/App.tsx
@@ -18,8 +18,14 @@
*/
import React from 'react';
import { hot } from 'react-hot-loader/root';
+import thunk from 'redux-thunk';
+import { createStore, compose, applyMiddleware, combineReducers } from 'redux';
+import { Provider } from 'react-redux';
import { ThemeProvider } from '@superset-ui/core';
import { GlobalStyles } from 'src/GlobalStyles';
+import messageToastReducer from 'src/components/MessageToasts/reducers';
+import { initEnhancer } from 'src/reduxUtils';
+import ToastContainer from 'src/components/MessageToasts/ToastContainer';
import setupApp from '../setup/setupApp';
import setupPlugins from '../setup/setupPlugins';
import { DynamicPluginProvider } from '../components/DynamicPlugins';
@@ -35,15 +41,26 @@ const bootstrapData = JSON.parse(
addSliceContainer?.getAttribute('data-bootstrap') || '{}',
);
+const store = createStore(
+ combineReducers({
+ messageToasts: messageToastReducer,
+ }),
+ {},
+ compose(applyMiddleware(thunk), initEnhancer(false)),
+);
+
initFeatureFlags(bootstrapData.common.feature_flags);
const App = () => (
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
);
export default hot(App);
diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx
index dd05e25a9e8d..02cc5d12ad89 100644
--- a/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx
+++ b/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx
@@ -50,7 +50,6 @@ const TableSelectorContainer = styled.div`
const DatasetModal: FunctionComponent = ({
addDangerToast,
- addSuccessToast,
onDatasetAdd,
onHide,
show,
@@ -123,7 +122,7 @@ const DatasetModal: FunctionComponent = ({
if (onDatasetAdd) {
onDatasetAdd({ id: response.id, ...response });
}
- addSuccessToast(t('The dataset has been saved'));
+ window.location.href = `/chart/add?dataset=${currentTableName}`;
hide();
});
};
@@ -134,7 +133,7 @@ const DatasetModal: FunctionComponent = ({
primaryButtonLoading={loading}
onHandledPrimaryAction={onSave}
onHide={hide}
- primaryButtonName={t('Add')}
+ primaryButtonName={t('Add Dataset and Create Chart')}
show={show}
title={t('Add dataset')}
>