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
