You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2024/08/28 21:24:16 UTC
(superset) branch snowflake-oauth2 updated: Frontend
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch snowflake-oauth2
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/snowflake-oauth2 by this push:
new da2bc91a32 Frontend
da2bc91a32 is described below
commit da2bc91a32fb551c0a2c4d6bdd46f31a0643333c
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Wed Aug 28 17:16:17 2024 -0400
Frontend
---
.../src/components/DatabaseSelector/index.tsx | 29 +++++++++++++++++++---
.../ErrorMessage/OAuth2RedirectMessage.tsx | 2 +-
.../src/hooks/apiResources/catalogs.ts | 11 ++++++--
.../src/hooks/apiResources/queryApi.ts | 1 +
.../src/hooks/apiResources/schemas.ts | 11 ++++++--
5 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/superset-frontend/src/components/DatabaseSelector/index.tsx b/superset-frontend/src/components/DatabaseSelector/index.tsx
index 321d753bc5..3b677316a4 100644
--- a/superset-frontend/src/components/DatabaseSelector/index.tsx
+++ b/superset-frontend/src/components/DatabaseSelector/index.tsx
@@ -24,10 +24,11 @@ import {
useRef,
useCallback,
} from 'react';
-import { styled, SupersetClient, t } from '@superset-ui/core';
+import { styled, SupersetClient, SupersetError, t } from '@superset-ui/core';
import type { LabeledValue as AntdLabeledValue } from 'antd/lib/select';
import rison from 'rison';
import { AsyncSelect, Select } from 'src/components';
+import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace';
import Label from 'src/components/Label';
import { FormLabel } from 'src/components/Form';
import RefreshLabel from 'src/components/RefreshLabel';
@@ -154,6 +155,7 @@ export default function DatabaseSelector({
}: DatabaseSelectorProps) {
const showCatalogSelector = !!db?.allow_multi_catalog;
const [currentDb, setCurrentDb] = useState<DatabaseValue | undefined>();
+ const [errorPayload, setErrorPayload] = useState<SupersetError | null>();
const [currentCatalog, setCurrentCatalog] = useState<
CatalogOption | null | undefined
>(catalog ? { label: catalog, value: catalog, title: catalog } : undefined);
@@ -267,6 +269,7 @@ export default function DatabaseSelector({
dbId: currentDb?.value,
catalog: currentCatalog?.value,
onSuccess: (schemas, isFetched) => {
+ setErrorPayload(null);
if (schemas.length === 1) {
changeSchema(schemas[0]);
} else if (
@@ -279,7 +282,13 @@ export default function DatabaseSelector({
addSuccessToast('List refreshed');
}
},
- onError: () => handleError(t('There was an error loading the schemas')),
+ onError: error => {
+ if (error?.errors) {
+ setErrorPayload(error?.errors?.[0]);
+ } else {
+ handleError(t('There was an error loading the schemas'));
+ }
+ },
});
const schemaOptions = schemaData || EMPTY_SCHEMA_OPTIONS;
@@ -299,6 +308,7 @@ export default function DatabaseSelector({
} = useCatalogs({
dbId: showCatalogSelector ? currentDb?.value : undefined,
onSuccess: (catalogs, isFetched) => {
+ setErrorPayload(null);
if (!showCatalogSelector) {
changeCatalog(null);
} else if (catalogs.length === 1) {
@@ -315,9 +325,13 @@ export default function DatabaseSelector({
addSuccessToast('List refreshed');
}
},
- onError: () => {
+ onError: error => {
if (showCatalogSelector) {
- handleError(t('There was an error loading the catalogs'));
+ if (error?.errors) {
+ setErrorPayload(error?.errors?.[0]);
+ } else {
+ handleError(t('There was an error loading the catalogs'));
+ }
}
},
});
@@ -423,9 +437,16 @@ export default function DatabaseSelector({
);
}
+ function renderError() {
+ return errorPayload ? (
+ <ErrorMessageWithStackTrace error={errorPayload} source="crud" />
+ ) : null;
+ }
+
return (
<DatabaseSelectorWrapper data-test="DatabaseSelector">
{renderDatabaseSelect()}
+ {renderError()}
{showCatalogSelector && renderCatalogSelect()}
{renderSchemaSelect()}
</DatabaseSelectorWrapper>
diff --git a/superset-frontend/src/components/ErrorMessage/OAuth2RedirectMessage.tsx b/superset-frontend/src/components/ErrorMessage/OAuth2RedirectMessage.tsx
index 3f5a4b3201..6b1c6731b9 100644
--- a/superset-frontend/src/components/ErrorMessage/OAuth2RedirectMessage.tsx
+++ b/superset-frontend/src/components/ErrorMessage/OAuth2RedirectMessage.tsx
@@ -162,7 +162,7 @@ function OAuth2RedirectMessage({
>
provide authorization
</a>{' '}
- in order to run this query.
+ in order to run this operation.
</>
);
diff --git a/superset-frontend/src/hooks/apiResources/catalogs.ts b/superset-frontend/src/hooks/apiResources/catalogs.ts
index 5203797156..d5bbe9c697 100644
--- a/superset-frontend/src/hooks/apiResources/catalogs.ts
+++ b/superset-frontend/src/hooks/apiResources/catalogs.ts
@@ -17,6 +17,7 @@
* under the License.
*/
import { useCallback, useEffect } from 'react';
+import { ClientErrorObject } from '@superset-ui/core';
import useEffectEvent from 'src/hooks/useEffectEvent';
import { api, JsonResponse } from './queryApi';
@@ -30,7 +31,7 @@ export type FetchCatalogsQueryParams = {
dbId?: string | number;
forceRefresh: boolean;
onSuccess?: (data: CatalogOption[], isRefetched: boolean) => void;
- onError?: () => void;
+ onError?: (error: ClientErrorObject) => void;
};
type Params = Omit<FetchCatalogsQueryParams, 'forceRefresh'>;
@@ -77,6 +78,12 @@ export function useCatalogs(options: Params) {
},
);
+ useEffect(() => {
+ if (result.isError) {
+ onError?.(result.error);
+ }
+ }, [result.isError, result.error, onError]);
+
const fetchData = useEffectEvent(
(dbId: FetchCatalogsQueryParams['dbId'], forceRefresh = false) => {
if (dbId && (!result.currentData || forceRefresh)) {
@@ -85,7 +92,7 @@ export function useCatalogs(options: Params) {
onSuccess?.(data || EMPTY_CATALOGS, forceRefresh);
}
if (isError) {
- onError?.();
+ onError?.(result.error);
}
});
}
diff --git a/superset-frontend/src/hooks/apiResources/queryApi.ts b/superset-frontend/src/hooks/apiResources/queryApi.ts
index b0c0bf5781..d09174c9b8 100644
--- a/superset-frontend/src/hooks/apiResources/queryApi.ts
+++ b/superset-frontend/src/hooks/apiResources/queryApi.ts
@@ -64,6 +64,7 @@ export const supersetClientQuery: BaseQueryFn<
getClientErrorObject(response).then(errorObj => ({
error: {
error: errorObj?.message || errorObj?.error || response.statusText,
+ errors: errorObj?.errors || [], // used by <ErrorMessageWithStackTrace />
status: response.status,
},
})),
diff --git a/superset-frontend/src/hooks/apiResources/schemas.ts b/superset-frontend/src/hooks/apiResources/schemas.ts
index e60e62a7fb..7c2a7f6129 100644
--- a/superset-frontend/src/hooks/apiResources/schemas.ts
+++ b/superset-frontend/src/hooks/apiResources/schemas.ts
@@ -17,6 +17,7 @@
* under the License.
*/
import { useCallback, useEffect } from 'react';
+import { ClientErrorObject } from '@superset-ui/core';
import useEffectEvent from 'src/hooks/useEffectEvent';
import { api, JsonResponse } from './queryApi';
@@ -31,7 +32,7 @@ export type FetchSchemasQueryParams = {
catalog?: string;
forceRefresh: boolean;
onSuccess?: (data: SchemaOption[], isRefetched: boolean) => void;
- onError?: () => void;
+ onError?: (error: ClientErrorObject) => void;
};
type Params = Omit<FetchSchemasQueryParams, 'forceRefresh'>;
@@ -81,6 +82,12 @@ export function useSchemas(options: Params) {
},
);
+ useEffect(() => {
+ if (result.isError) {
+ onError?.(result.error);
+ }
+ }, [result.isError, result.error, onError]);
+
const fetchData = useEffectEvent(
(
dbId: FetchSchemasQueryParams['dbId'],
@@ -94,7 +101,7 @@ export function useSchemas(options: Params) {
onSuccess?.(data || EMPTY_SCHEMAS, forceRefresh);
}
if (isError) {
- onError?.();
+ onError?.(result.error);
}
},
);