fix: show only filterable columns on filter dropdown
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 72d4197..888e230 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 @@ '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 6d6966f..c4efde9 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 { 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 @@ description: '', }; -const createProps: () => ControlItemsProps = () => ({ +const createProps = (): ControlItemsProps => ({ expanded: false, datasetId: 1, disabled: false, @@ -179,3 +206,42 @@ 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 ed92809..4f297a3 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 @@ 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