feat(Native Filters): Configure creatable filter behavior (#33096)

This commit is contained in:
Geido
2025-04-11 20:38:02 +03:00
committed by GitHub
parent 4f97b739b1
commit 014b39290b
9 changed files with 41 additions and 1 deletions

View File

@@ -55,6 +55,7 @@ export function prepareDashboardFilters(
controlValues: {
enableEmptyFilter: false,
defaultToFirstItem: false,
creatable: true,
multiSelect: true,
searchAllOptions: false,
inverseSelection: false,

View File

@@ -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,

View File

@@ -136,6 +136,7 @@ type ControlKey = keyof PluginFilterSelectCustomizeProps;
const controlsOrder: ControlKey[] = [
'enableEmptyFilter',
'defaultToFirstItem',
'creatable',
'multiSelect',
'searchAllOptions',
'inverseSelection',

View File

@@ -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,

View File

@@ -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();
});
});

View File

@@ -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) {
<Select
name={formData.nativeFilterId}
allowClear
allowNewOptions={!searchAllOptions}
allowNewOptions={!searchAllOptions && creatable !== false}
allowSelectAll={!searchAllOptions}
// @ts-ignore
value={filterState.value || []}

View File

@@ -30,6 +30,7 @@ describe('Select buildQuery', () => {
filters: undefined,
enableEmptyFilter: false,
inverseSelection: false,
creatable: false,
multiSelect: false,
defaultToFirstItem: false,
searchAllOptions: false,

View File

@@ -27,6 +27,7 @@ const {
enableEmptyFilter,
inverseSelection,
multiSelect,
creatable,
defaultToFirstItem,
searchAllOptions,
sortAscending,
@@ -66,6 +67,19 @@ const config: ControlPanelConfig = {
},
},
],
[
{
name: 'creatable',
config: {
type: 'CheckboxControl',
label: t('Allow creation of new values'),
default: creatable,
resetConfig: true,
affectsDataMask: true,
renderTrigger: true,
},
},
],
[
{
name: 'multiSelect',

View File

@@ -36,6 +36,7 @@ export interface PluginFilterSelectCustomizeProps {
defaultValue?: SelectValue;
enableEmptyFilter: boolean;
inverseSelection: boolean;
creatable: boolean;
multiSelect: boolean;
defaultToFirstItem: boolean;
searchAllOptions: boolean;
@@ -71,6 +72,7 @@ export const DEFAULT_FORM_DATA: PluginFilterSelectCustomizeProps = {
enableEmptyFilter: false,
inverseSelection: false,
defaultToFirstItem: false,
creatable: true,
multiSelect: true,
searchAllOptions: false,
sortAscending: true,