From f5c404fc51e9bcdee23fd4ec269f6083b283f74b Mon Sep 17 00:00:00 2001 From: Cody Leff Date: Fri, 13 Jan 2023 17:42:38 +0100 Subject: [PATCH] fix(explore): Restore missing dataset states (#22693) --- .../DatasourceControl.test.tsx | 32 +++++++++++++++++-- .../controls/DatasourceControl/index.jsx | 12 ++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx index 27b7bc568..2c094e72a 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx @@ -18,10 +18,11 @@ */ import React from 'react'; -import { render, screen, act, waitFor } from 'spec/helpers/testing-library'; +import fetchMock from 'fetch-mock'; import userEvent from '@testing-library/user-event'; import { DatasourceType, JsonObject, SupersetClient } from '@superset-ui/core'; -import fetchMock from 'fetch-mock'; +import { render, screen, act, waitFor } from 'spec/helpers/testing-library'; +import { fallbackExploreInitialData } from 'src/explore/fixtures'; import DatasourceControl from '.'; const SupersetClientGet = jest.spyOn(SupersetClient, 'get'); @@ -395,3 +396,30 @@ test('should not set the temporal column', async () => { ); }); }); + +test('should show missing params state', () => { + const props = createProps({ datasource: fallbackExploreInitialData.dataset }); + render(, { useRedux: true }); + expect(screen.getByText(/missing dataset/i)).toBeVisible(); + expect(screen.getByText(/missing url parameters/i)).toBeVisible(); + expect( + screen.getByText( + /the url is missing the dataset_id or slice_id parameters\./i, + ), + ).toBeVisible(); +}); + +test('should show missing dataset state', () => { + // @ts-ignore + delete window.location; + // @ts-ignore + window.location = { search: '?slice_id=152' }; + const props = createProps({ datasource: fallbackExploreInitialData.dataset }); + render(, { useRedux: true }); + expect(screen.getAllByText(/missing dataset/i)).toHaveLength(2); + expect( + screen.getByText( + /the dataset linked to this chart may have been deleted\./i, + ), + ).toBeVisible(); +}); diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index b6adbd9ce..c99193dd4 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -267,11 +267,12 @@ class DatasourceControl extends React.PureComponent { showSaveDatasetModal, } = this.state; const { datasource, onChange, theme } = this.props; - const isMissingDatasource = datasource?.id == null; + const isMissingDatasource = !datasource?.id; let isMissingParams = false; if (isMissingDatasource) { const datasourceId = getUrlParam(URL_PARAMS.datasourceId); const sliceId = getUrlParam(URL_PARAMS.sliceId); + if (!datasourceId && !sliceId) { isMissingParams = true; } @@ -288,7 +289,7 @@ class DatasourceControl extends React.PureComponent { const defaultDatasourceMenu = ( - {this.props.isEditable && ( + {this.props.isEditable && !isMissingDatasource && ( )} {t('Swap dataset')} - {datasource && canAccessSqlLab && ( + {!isMissingDatasource && canAccessSqlLab && ( {t('View in SQL Lab')} )} @@ -358,7 +359,10 @@ class DatasourceControl extends React.PureComponent { } } - const titleText = getDatasourceTitle(datasource); + const titleText = isMissingDatasource + ? t('Missing dataset') + : getDatasourceTitle(datasource); + const tooltip = titleText; return (