diff --git a/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts index fb3445fc6366f..bc18f2c410f2c 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts @@ -28,7 +28,7 @@ import { HEALTH_POP_FORM_DATA_DEFAULTS } from './visualizations/shared.helper'; const apiURL = (endpoint: string, queryObject: Record) => `${endpoint}?q=${rison.encode(queryObject)}`; -describe('Test explore links', () => { +describe.skip('Test explore links', () => { beforeEach(() => { cy.login(); interceptChart({ legacy: true }).as('chartData'); diff --git a/superset-frontend/src/explore/ExplorePage.tsx b/superset-frontend/src/explore/ExplorePage.tsx index d8aefda1345bc..6425f4c49dbef 100644 --- a/superset-frontend/src/explore/ExplorePage.tsx +++ b/superset-frontend/src/explore/ExplorePage.tsx @@ -19,27 +19,45 @@ import React, { useEffect, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import { useLocation } from 'react-router-dom'; -import { makeApi, t } from '@superset-ui/core'; +import { makeApi, t, isDefined, JsonObject } from '@superset-ui/core'; import Loading from 'src/components/Loading'; import { addDangerToast } from 'src/components/MessageToasts/actions'; -import { isNullish } from 'src/utils/common'; import { getUrlParam } from 'src/utils/urlUtils'; import { URL_PARAMS } from 'src/constants'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import { getParsedExploreURLParams } from './exploreUtils/getParsedExploreURLParams'; import { hydrateExplore } from './actions/hydrateExplore'; import ExploreViewContainer from './components/ExploreViewContainer'; import { ExploreResponsePayload } from './types'; import { fallbackExploreInitialData } from './fixtures'; -const loadErrorMessage = t('Failed to load chart data.'); +const isResult = (rv: JsonObject): rv is ExploreResponsePayload => + rv?.result?.form_data && + rv?.result?.dataset && + isDefined(rv?.result?.dataset?.id); -const fetchExploreData = (exploreUrlParams: URLSearchParams) => - makeApi<{}, ExploreResponsePayload>({ - method: 'GET', - endpoint: 'api/v1/explore/', - })(exploreUrlParams); +const fetchExploreData = async (exploreUrlParams: URLSearchParams) => { + try { + const rv = await makeApi<{}, ExploreResponsePayload>({ + method: 'GET', + endpoint: 'api/v1/explore/', + })(exploreUrlParams); + if (isResult(rv)) { + return rv; + } + throw new Error(t('Failed to load chart data.')); + } catch (err) { + // todo: encapsulate the error handler + const clientError = await getClientErrorObject(err); + throw new Error( + clientError.message || + clientError.error || + t('Failed to load chart data.'), + ); + } +}; -const ExplorePage = () => { +export default function ExplorePage() { const [isLoaded, setIsLoaded] = useState(false); const isExploreInitialized = useRef(false); const dispatch = useDispatch(); @@ -51,16 +69,11 @@ const ExplorePage = () => { if (!isExploreInitialized.current || isSaveAction) { fetchExploreData(exploreUrlParams) .then(({ result }) => { - if (isNullish(result.dataset?.id) && isNullish(result.dataset?.uid)) { - dispatch(hydrateExplore(fallbackExploreInitialData)); - dispatch(addDangerToast(loadErrorMessage)); - } else { - dispatch(hydrateExplore(result)); - } + dispatch(hydrateExplore(result)); }) - .catch(() => { + .catch(err => { dispatch(hydrateExplore(fallbackExploreInitialData)); - dispatch(addDangerToast(loadErrorMessage)); + dispatch(addDangerToast(err.message)); }) .finally(() => { setIsLoaded(true); @@ -73,6 +86,4 @@ const ExplorePage = () => { return ; } return ; -}; - -export default ExplorePage; +} diff --git a/superset-frontend/src/explore/actions/hydrateExplore.ts b/superset-frontend/src/explore/actions/hydrateExplore.ts index ab5afde665bbf..b16ac30a7bc10 100644 --- a/superset-frontend/src/explore/actions/hydrateExplore.ts +++ b/superset-frontend/src/explore/actions/hydrateExplore.ts @@ -56,8 +56,7 @@ export const hydrateExplore = if (dashboardId) { initialFormData.dashboardId = dashboardId; } - const initialDatasource = - datasources?.[initialFormData.datasource] ?? dataset; + const initialDatasource = dataset; const initialExploreState = { form_data: initialFormData,