diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.test.tsx index ab192508828..e9c35d10cd7 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.test.tsx @@ -18,7 +18,12 @@ */ import React from 'react'; import { Provider } from 'react-redux'; -import { render, screen, fireEvent } from 'spec/helpers/testing-library'; +import { + render, + screen, + fireEvent, + waitFor, +} from 'spec/helpers/testing-library'; import { mockStoreWithChartsInTabsAndRoot } from 'spec/fixtures/mockStore'; import { Form, FormInstance } from 'src/common/components'; import { NativeFiltersForm } from 'src/dashboard/components/nativeFilters/FiltersConfigModal/types'; @@ -34,7 +39,7 @@ describe('FilterScope', () => { save, }; - const MockModal = ({ scope }: { scope: object | undefined }) => { + const MockModal = ({ scope }: { scope?: object }) => { const [newForm] = Form.useForm(); form = newForm; if (scope) { @@ -55,56 +60,66 @@ describe('FilterScope', () => { ); }; - const getWrapper = (scope?: object) => { - render(); - }; - const getTreeSwitcher = (order = 0) => document.querySelectorAll('.ant-tree-switcher')[order]; it('renders "apply to all" filter scope', () => { - getWrapper(); - expect(screen.queryByRole('tree')).toBe(null); + render(); + expect(screen.queryByRole('tree')).not.toBeInTheDocument(); }); - it('select tree values with 1 excluded', () => { - getWrapper(); + it('select tree values with 1 excluded', async () => { + render(); + fireEvent.click(screen.getByText('Scoping')); fireEvent.click(screen.getByLabelText('Apply to specific panels')); expect(screen.getByRole('tree')).not.toBe(null); fireEvent.click(getTreeSwitcher(2)); fireEvent.click(screen.getByText('CHART_ID2')); - expect(form.getFieldValue('filters')?.[mockedProps.filterId].scope).toEqual( - { + await waitFor(() => + expect( + form.getFieldValue('filters')?.[mockedProps.filterId].scope, + ).toEqual({ excluded: [20], rootPath: ['ROOT_ID'], - }, + }), ); }); - it('select 1 value only', () => { - getWrapper(); + it('select 1 value only', async () => { + render(); + fireEvent.click(screen.getByText('Scoping')); fireEvent.click(screen.getByLabelText('Apply to specific panels')); expect(screen.getByRole('tree')).not.toBe(null); fireEvent.click(getTreeSwitcher(2)); fireEvent.click(screen.getByText('CHART_ID2')); fireEvent.click(screen.getByText('tab1')); - expect(form.getFieldValue('filters')?.[mockedProps.filterId].scope).toEqual( - { + await waitFor(() => + expect( + form.getFieldValue('filters')?.[mockedProps.filterId].scope, + ).toEqual({ excluded: [18, 20], rootPath: ['ROOT_ID'], - }, + }), ); }); - it('correct init tree with values', () => { - getWrapper({ - rootPath: ['TAB_ID'], - excluded: [], - }); - fireEvent.click(screen.getByLabelText('Apply to specific panels')); - expect(screen.getByRole('tree')).not.toBe(null); - expect(document.querySelectorAll('.ant-tree-checkbox-checked').length).toBe( - 1, + it('correct init tree with values', async () => { + render( + , ); + fireEvent.click(screen.getByText('Scoping')); + fireEvent.click(screen.getByLabelText('Apply to specific panels')); + + await waitFor(() => { + expect(screen.getByRole('tree')).toBeInTheDocument(); + expect( + document.querySelectorAll('.ant-tree-checkbox-checked').length, + ).toBe(1); + }); }); }); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx index 58d6434702d..e8ffde2df1e 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx @@ -64,7 +64,6 @@ const FilterScope: FC = ({ return ( - {t('Scoping')} = ({ return ( <> - {t('Settings')} - - {t('Filter name')}} - initialValue={filterToEdit?.name} - rules={[{ required: !removed, message: t('Name is required') }]} + + - - - {t('Filter Type')}} - {...getFiltersConfigModalTestId('filter-type')} - > - + + {t('Filter Type')}} + {...getFiltersConfigModalTestId('filter-type')} + > + - - )} - - }> - {hasDataset && hasFilledDataset && ( - - )} - - {t('Default Value')}} - > - {showDefaultValue ? ( - { - setNativeFilterFieldValues(form, filterId, { - defaultDataMask: dataMask, - }); - forceUpdate(); - }} - filterId={filterId} - hasDataset={hasDataset} - form={form} - formData={newFormData} + {hasFilledDataset && ( + - - - - {t('Apply changes instantly')} - - - - {hasMetrics && ( - {t('Sort Metric')}} - data-test="field-input" - > - ({ - value: metric.metric_name, - label: metric.verbose_name ?? metric.metric_name, - }))} - onChange={(value: string | null): void => { - if (value !== undefined) { - setNativeFilterFieldValues(form, filterId, { - sortMetric: value, - }); - forceUpdate(); - } - }} + - )} - - setNativeFilterFieldValues(form, filterId, values) - } - pathToFormValue={['filters', filterId]} - forceUpdate={forceUpdate} - scope={filterToEdit?.scope} - formScope={formFilter?.scope} - formScoping={formFilter?.scoping} - /> + {isCascadingFilter && ( + {t('Parent filter')}} + initialValue={parentFilterOptions.find( + ({ value }) => value === filterToEdit?.cascadeParentIds[0], + )} + data-test="parent-filter-input" + > +