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,

Reply via email to