This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch default-db-schema-dropdown in repository https://gitbox.apache.org/repos/asf/superset.git
commit ff17daa4246f7569ec3f7b64cf10e84f336896ff Author: Beto Dealmeida <[email protected]> AuthorDate: Thu Dec 18 19:10:21 2025 -0500 Small fix --- .../DatabaseSelector/DatabaseSelector.test.tsx | 5 +- .../src/components/DatabaseSelector/index.tsx | 129 ++++++++++++--------- 2 files changed, 80 insertions(+), 54 deletions(-) diff --git a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx index 8d3d8bd8b0..fb6a5275cc 100644 --- a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx +++ b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx @@ -371,10 +371,11 @@ test('Sends the correct schema when changing the schema', async () => { }); await waitFor(() => expect(fetchMock.calls(databaseApiRoute).length).toBe(1)); rerender(<DatabaseSelector {...props} />); - expect(props.onSchemaChange).toHaveBeenCalledTimes(0); - const select = screen.getByRole('combobox', { + // Wait for schema data to load + const select = await screen.findByRole('combobox', { name: 'Select schema or type to search schemas: public', }); + expect(props.onSchemaChange).toHaveBeenCalledTimes(0); expect(select).toBeInTheDocument(); await userEvent.click(select); const schemaOption = await screen.findByText('information_schema'); diff --git a/superset-frontend/src/components/DatabaseSelector/index.tsx b/superset-frontend/src/components/DatabaseSelector/index.tsx index 7d110b4215..068d9f5033 100644 --- a/superset-frontend/src/components/DatabaseSelector/index.tsx +++ b/superset-frontend/src/components/DatabaseSelector/index.tsx @@ -246,33 +246,11 @@ export function DatabaseSelector({ data: schemaData, isFetching: loadingSchemas, refetch: refetchSchemas, + defaultSchema, } = useSchemas({ dbId: currentDb?.value, catalog: currentCatalog?.value, - onSuccess: (schemas, isFetched, defaultSchema) => { - setErrorPayload(null); - if (schemas.length === 1) { - changeSchema(schemas[0]); - } else if ( - !schemas.find(schemaOption => schemaRef.current === schemaOption.value) - ) { - // Current selection not in list - try to apply default on first load - if ( - defaultSchema && - appliedSchemaDefaultRef.current !== defaultSchema - ) { - const defaultOption = schemas.find(s => s.value === defaultSchema); - if (defaultOption) { - appliedSchemaDefaultRef.current = defaultSchema; - changeSchema(defaultOption); - } else { - changeSchema(undefined); - } - } else { - changeSchema(undefined); - } - } - + onSuccess: (schemas, isFetched) => { if (isFetched) { addSuccessToast('List refreshed'); } @@ -288,6 +266,36 @@ export function DatabaseSelector({ const schemaOptions = schemaData || EMPTY_SCHEMA_OPTIONS; + // Handle schema auto-selection when data changes + useEffect(() => { + if (!schemaData || loadingSchemas) return; + + setErrorPayload(null); + + if (schemaData.length === 1) { + changeSchema(schemaData[0]); + } else if ( + !schemaData.find(schemaOption => schemaRef.current === schemaOption.value) + ) { + // Current selection not in list - try to apply default on first load + if ( + defaultSchema && + appliedSchemaDefaultRef.current !== defaultSchema + ) { + const defaultOption = schemaData.find(s => s.value === defaultSchema); + if (defaultOption) { + appliedSchemaDefaultRef.current = defaultSchema; + changeSchema(defaultOption); + } else { + changeSchema(undefined); + } + } else { + changeSchema(undefined); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [schemaData, defaultSchema, loadingSchemas]); + function changeCatalog(catalog: CatalogOption | null | undefined) { setCurrentCatalog(catalog); setCurrentSchema(undefined); @@ -302,36 +310,10 @@ export function DatabaseSelector({ data: catalogData, isFetching: loadingCatalogs, refetch: refetchCatalogs, + defaultCatalog, } = useCatalogs({ dbId: showCatalogSelector ? currentDb?.value : undefined, - onSuccess: (catalogs, isFetched, defaultCatalog) => { - setErrorPayload(null); - if (!showCatalogSelector) { - changeCatalog(null); - } else if (catalogs.length === 1) { - changeCatalog(catalogs[0]); - } else if ( - !catalogs.find( - catalogOption => catalogRef.current === catalogOption.value, - ) - ) { - // Current selection not in list - try to apply default on first load - if ( - defaultCatalog && - appliedCatalogDefaultRef.current !== defaultCatalog - ) { - const defaultOption = catalogs.find(c => c.value === defaultCatalog); - if (defaultOption) { - appliedCatalogDefaultRef.current = defaultCatalog; - changeCatalog(defaultOption); - } else { - changeCatalog(undefined); - } - } else { - changeCatalog(undefined); - } - } - + onSuccess: (catalogs, isFetched) => { if (showCatalogSelector && isFetched) { addSuccessToast('List refreshed'); } @@ -349,6 +331,49 @@ export function DatabaseSelector({ const catalogOptions = catalogData || EMPTY_CATALOG_OPTIONS; + // Handle catalog auto-selection when data changes + useEffect(() => { + if (loadingCatalogs) return; + + setErrorPayload(null); + + if (!showCatalogSelector) { + // Only clear catalog if it's not already null + if (currentCatalog !== null) { + setCurrentCatalog(null); + if (onCatalogChange && catalogRef.current !== null) { + onCatalogChange(null); + } + } + } else if (catalogData && catalogData.length === 1) { + changeCatalog(catalogData[0]); + } else if ( + catalogData && + !catalogData.find( + catalogOption => catalogRef.current === catalogOption.value, + ) + ) { + // Current selection not in list - try to apply default on first load + if ( + defaultCatalog && + appliedCatalogDefaultRef.current !== defaultCatalog + ) { + const defaultOption = catalogData.find( + c => c.value === defaultCatalog, + ); + if (defaultOption) { + appliedCatalogDefaultRef.current = defaultCatalog; + changeCatalog(defaultOption); + } else { + changeCatalog(undefined); + } + } else { + changeCatalog(undefined); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [catalogData, defaultCatalog, loadingCatalogs, showCatalogSelector]); + function changeDatabase( value: { label: string; value: number }, database: DatabaseValue,
