This is an automated email from the ASF dual-hosted git repository.

beto pushed a commit to branch fix-filterable-columns
in repository https://gitbox.apache.org/repos/asf/superset.git

commit d9108523b74bfb27287e16efb477f31f0875c6a7
Author: Beto Dealmeida <[email protected]>
AuthorDate: Thu May 1 17:20:55 2025 -0400

    fix: show only filterable columns on filter dropdown
---
 .../FiltersConfigForm/ColumnSelect.tsx             |  1 +
 .../FiltersConfigForm/getControlItemsMap.test.tsx  | 70 +++++++++++++++++++++-
 .../FiltersConfigForm/getControlItemsMap.tsx       |  5 +-
 3 files changed, 73 insertions(+), 3 deletions(-)

diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
index 72d4197acc..888e230350 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
@@ -99,6 +99,7 @@ export function ColumnSelect({
             'columns.column_name',
             'columns.is_dttm',
             'columns.type_generic',
+            'columns.filterable',
           ],
         })}`,
       })
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
index 6d6966f709..c4efde92ad 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
@@ -20,11 +20,38 @@ import { Filter, NativeFilterType } from 
'@superset-ui/core';
 import { render, screen, userEvent } from 'spec/helpers/testing-library';
 import { FormInstance } from 'src/components';
 import getControlItemsMap, { ControlItemsProps } from './getControlItemsMap';
-import { getControlItems, setNativeFilterFieldValues } from './utils';
+import {
+  getControlItems,
+  setNativeFilterFieldValues,
+  doesColumnMatchFilterType,
+} from './utils';
 
 jest.mock('./utils', () => ({
   getControlItems: jest.fn(),
   setNativeFilterFieldValues: jest.fn(),
+  doesColumnMatchFilterType: jest.fn(),
+}));
+
+// Mock ColumnSelect to test filterValues logic
+jest.mock('./ColumnSelect', () => ({
+  ColumnSelect: ({
+    filterValues,
+  }: {
+    filterValues: (column: any) => boolean;
+  }) => {
+    const columns = [
+      { name: 'col1', filterable: true },
+      { name: 'col2', filterable: false },
+      { name: 'col3', filterable: true },
+    ];
+    return (
+      <>
+        {columns.filter(filterValues).map(column => (
+          <div key={column.name}>{column.name}</div>
+        ))}
+      </>
+    );
+  },
 }));
 
 const formMock: FormInstance = {
@@ -62,7 +89,7 @@ const filterMock: Filter = {
   description: '',
 };
 
-const createProps: () => ControlItemsProps = () => ({
+const createProps = (): ControlItemsProps => ({
   expanded: false,
   datasetId: 1,
   disabled: false,
@@ -179,3 +206,42 @@ test('Clicking on checkbox when resetConfig:false', () => {
   expect(props.forceUpdate).toHaveBeenCalled();
   expect(setNativeFilterFieldValues).not.toHaveBeenCalled();
 });
+
+describe('ColumnSelect filterValues behavior', () => {
+  beforeEach(() => {
+    (getControlItems as jest.Mock).mockReturnValue([
+      {
+        name: 'groupby',
+        config: { label: 'Column', multiple: false, required: false },
+      },
+    ]);
+  });
+
+  test('only renders filterable columns when doesColumnMatchFilterType returns 
true', () => {
+    (doesColumnMatchFilterType as jest.Mock).mockReturnValue(true);
+    const props = {
+      ...createProps(),
+      formFilter: { filterType: 'filterType' },
+    };
+    const element = getControlItemsMap(props).mainControlItems.groupby
+      .element as React.ReactElement;
+    render(element);
+    expect(screen.getByText('col1')).toBeInTheDocument();
+    expect(screen.getByText('col3')).toBeInTheDocument();
+    expect(screen.queryByText('col2')).not.toBeInTheDocument();
+  });
+
+  test('renders no columns when doesColumnMatchFilterType returns false', () 
=> {
+    (doesColumnMatchFilterType as jest.Mock).mockReturnValue(false);
+    const props = {
+      ...createProps(),
+      formFilter: { filterType: 'filterType' },
+    };
+    const element = getControlItemsMap(props).mainControlItems.groupby
+      .element as React.ReactElement;
+    render(element);
+    expect(screen.queryByText('col1')).not.toBeInTheDocument();
+    expect(screen.queryByText('col3')).not.toBeInTheDocument();
+    expect(screen.queryByText('col2')).not.toBeInTheDocument();
+  });
+});
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
index ed92809988..4f297a3f23 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
@@ -131,7 +131,10 @@ export default function getControlItemsMap({
               filterId={filterId}
               datasetId={datasetId}
               filterValues={column =>
-                doesColumnMatchFilterType(formFilter?.filterType || '', column)
+                doesColumnMatchFilterType(
+                  formFilter?.filterType || '',
+                  column,
+                ) && column.filterable
               }
               onChange={() => {
                 // We need reset default value when column changed

Reply via email to