diff --git a/superset-frontend/cypress-base/cypress/e2e/dashboard/shared_dashboard_functions.ts b/superset-frontend/cypress-base/cypress/e2e/dashboard/shared_dashboard_functions.ts index b0f7853e94b..595bf45da09 100644 --- a/superset-frontend/cypress-base/cypress/e2e/dashboard/shared_dashboard_functions.ts +++ b/superset-frontend/cypress-base/cypress/e2e/dashboard/shared_dashboard_functions.ts @@ -55,6 +55,7 @@ export function prepareDashboardFilters( controlValues: { enableEmptyFilter: false, defaultToFirstItem: false, + creatable: true, multiSelect: true, searchAllOptions: false, inverseSelection: false, diff --git a/superset-frontend/spec/fixtures/mockNativeFilters.ts b/superset-frontend/spec/fixtures/mockNativeFilters.ts index b83cdcc8dcc..414935c8b36 100644 --- a/superset-frontend/spec/fixtures/mockNativeFilters.ts +++ b/superset-frontend/spec/fixtures/mockNativeFilters.ts @@ -48,6 +48,7 @@ export const nativeFilters: NativeFiltersState = { excluded: [], }, controlValues: { + creatable: false, multiSelect: false, enableEmptyFilter: false, inverseSelection: false, @@ -79,6 +80,7 @@ export const nativeFilters: NativeFiltersState = { excluded: [], }, controlValues: { + creatable: false, multiSelect: false, enableEmptyFilter: false, inverseSelection: false, @@ -463,6 +465,7 @@ export const buildNativeFilter = ( ) => ({ id, controlValues: { + creatable: true, multiSelect: true, enableEmptyFilter: false, defaultToFirstItem: false, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx index 7ef4e6bacbf..01effc9aa1a 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx @@ -136,6 +136,7 @@ type ControlKey = keyof PluginFilterSelectCustomizeProps; const controlsOrder: ControlKey[] = [ 'enableEmptyFilter', 'defaultToFirstItem', + 'creatable', 'multiSelect', 'searchAllOptions', 'inverseSelection', diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.stories.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.stories.tsx index 55808ad6ad7..46e056b5ffd 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.stories.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.stories.tsx @@ -29,17 +29,20 @@ getChartTransformPropsRegistry().registerValue('filter_select', transformProps); export default { title: 'Filter Plugins', argTypes: { + creatable: { control: 'boolean', defaultValue: true }, multiSelect: { control: 'boolean', defaultValue: true }, inverseSelection: { control: 'boolean', defaultValue: false }, }, }; export const Select = ({ + creatable, multiSeelct, inverseSelection, width, height, }: { + creatable: boolean; multiSeelct: boolean; inverseSelection: boolean; width: number; @@ -53,6 +56,7 @@ export const Select = ({ formData={{ adhoc_filters: [], extra_filters: [], + creatable, multiSelect: { multiSeelct }, inverseSelection: { inverseSelection }, row_limit: 1000, diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx index 8b88ebba695..ec6b33d95b0 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx @@ -27,6 +27,7 @@ jest.useFakeTimers(); const selectMultipleProps = { formData: { sortAscending: true, + creatable: false, multiSelect: true, enableEmptyFilter: true, defaultToFirstItem: false, @@ -259,4 +260,16 @@ describe('SelectFilterPlugin', () => { await userEvent.type(screen.getByRole('combobox'), '1'); expect(screen.queryByLabelText(String(bigValue))).toBeInTheDocument(); }); + + test('Should not allow for new values when creatable is false', () => { + getWrapper({ creatable: false }); + userEvent.type(screen.getByRole('combobox'), 'new value'); + expect(screen.queryByTitle('new value')).not.toBeInTheDocument(); + }); + + test('Should allow for new values when creatable is false', async () => { + getWrapper({ creatable: true }); + userEvent.type(screen.getByRole('combobox'), 'new value'); + expect(await screen.findByTitle('new value')).toBeInTheDocument(); + }); }); diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx index 23447fb295d..ca8fbda8df7 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx @@ -100,6 +100,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { } = props; const { enableEmptyFilter, + creatable, multiSelect, showSearch, inverseSelection, @@ -296,7 +297,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) {