From 7bc9123fe569c47ebb9eb049c96ff833478f7ded Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Thu, 14 Apr 2022 12:58:34 -0300 Subject: [PATCH] fix: Filter dependencies are not being applied in default values (#19698) --- .../FiltersConfigForm/FiltersConfigForm.tsx | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) 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 50fb6e8ffe..ff04e0ebe5 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx @@ -73,7 +73,10 @@ import { waitForAsyncData } from 'src/middleware/asyncEvent'; import { cacheWrapper } from 'src/utils/cacheWrapper'; import { ClientErrorObject } from 'src/utils/getClientErrorObject'; import { SingleValueType } from 'src/filters/components/Range/SingleValueType'; -import { getFormData } from 'src/dashboard/components/nativeFilters/utils'; +import { + getFormData, + mergeExtraFormData, +} from 'src/dashboard/components/nativeFilters/utils'; import { ALLOW_DEPENDENCIES as TYPES_SUPPORT_DEPENDENCIES, getFiltersConfigModalTestId, @@ -346,10 +349,11 @@ const FiltersConfigForm = ( const forceUpdate = useForceUpdate(); const [datasetDetails, setDatasetDetails] = useState>(); const defaultFormFilter = useMemo(() => ({}), []); - const formValues = form.getFieldValue('filters')?.[filterId]; + const filters = form.getFieldValue('filters'); + const formValues = filters?.[filterId]; const formFilter = formValues || undoFormValues || defaultFormFilter; - const dependencies = + const dependencies: string[] = formFilter?.dependencies || filterToEdit?.cascadeParentIds; const nativeFilterItems = getChartMetadataRegistry().items; @@ -439,6 +443,21 @@ const FiltersConfigForm = ( forceUpdate(); }; + // Calculates the dependencies default values to be used + // to extract the available values to the filter + let dependenciesDefaultValues = {}; + if (dependencies && dependencies.length > 0 && filters) { + dependencies.forEach(dependency => { + const extraFormData = filters[dependency]?.defaultDataMask?.extraFormData; + dependenciesDefaultValues = mergeExtraFormData( + dependenciesDefaultValues, + extraFormData, + ); + }); + } + + const dependenciesText = JSON.stringify(dependenciesDefaultValues); + const refreshHandler = useCallback( (force = false) => { if (!hasDataset || !formFilter?.dataset?.value) { @@ -450,6 +469,9 @@ const FiltersConfigForm = ( groupby: formFilter?.column, ...formFilter, }); + + formData.extra_form_data = dependenciesDefaultValues; + setNativeFilterFieldValuesWrapper({ defaultValueQueriesData: null, isDataDirty: false, @@ -499,14 +521,19 @@ const FiltersConfigForm = ( }); }); }, - [filterId, forceUpdate, form, formFilter, hasDataset], + [filterId, forceUpdate, form, formFilter, hasDataset, dependenciesText], ); + // TODO: refreshHandler changes itself because of the dependencies. Needs refactor. + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => refreshHandler(), [dependenciesText]); + const newFormData = getFormData({ datasetId, groupby: hasColumn ? formFilter?.column : undefined, ...formFilter, }); + newFormData.extra_form_data = dependenciesDefaultValues; const [hasDefaultValue, isRequired, defaultValueTooltip, setHasDefaultValue] = useDefaultValue(formFilter, filterToEdit); @@ -1084,6 +1111,11 @@ const FiltersConfigForm = ( tooltip={defaultValueTooltip} onChange={value => { setHasDefaultValue(value); + if (!value) { + setNativeFilterFieldValues(form, filterId, { + defaultDataMask: null, + }); + } formChanged(); }} >