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 41c591ade3c8..758b9fd602d8 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx @@ -24,7 +24,6 @@ import { useToasts } from 'src/components/MessageToasts/withToasts'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import { cacheWrapper } from 'src/utils/cacheWrapper'; import { NativeFiltersForm } from '../types'; -import { doesColumnMatchFilterType } from './utils'; interface ColumnSelectProps { allowClear?: boolean; @@ -84,10 +83,7 @@ export function ColumnSelect({ ); useEffect(() => { - if ( - currentColumn && - !doesColumnMatchFilterType(currentFilterType, currentColumn) - ) { + if (currentColumn && !filterValues(currentColumn)) { resetColumnField(); } }, [currentColumn, currentFilterType, resetColumnField]); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx index 3ba2765a30c9..c4f6f7165151 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx @@ -23,10 +23,15 @@ import { Select } from 'src/components'; import { CollapsibleControl } from './CollapsibleControl'; interface DependencyListProps { - availableFilters: { label: string; value: string }[]; + availableFilters: { + label: string; + value: string; + type: string | undefined; + }[]; dependencies: string[]; onDependenciesChange: (dependencies: string[]) => void; getDependencySuggestion: () => string; + children?: JSX.Element; } const MainPanel = styled.div` @@ -176,6 +181,7 @@ const DependencyList = ({ dependencies = [], onDependenciesChange, getDependencySuggestion, + children, }: DependencyListProps) => { const hasAvailableFilters = availableFilters.length > 0; const hasDependencies = dependencies.length > 0; @@ -205,6 +211,7 @@ const DependencyList = ({ onDependenciesChange={onDependenciesChange} getDependencySuggestion={getDependencySuggestion} /> + {children} ); 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 0b6a33f06932..4c18a2c85c80 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx @@ -299,7 +299,9 @@ export interface FiltersConfigFormProps { removedFilters: Record; restoreFilter: (filterId: string) => void; form: FormInstance; - getAvailableFilters: (filterId: string) => { label: string; value: string }[]; + getAvailableFilters: ( + filterId: string, + ) => { label: string; value: string; type: string | undefined }[]; handleActiveFilterPanelChange: (activeFilterPanel: string | string[]) => void; activeFilterPanelKeys: string | string[]; isActive: boolean; @@ -654,6 +656,9 @@ const FiltersConfigForm = ( const availableFilters = getAvailableFilters(filterId); const hasAvailableFilters = availableFilters.length > 0; + const hasTimeDependency = availableFilters + .filter(filter => filter.type === 'filter_time') + .some(filter => dependencies.includes(filter.value)); useEffect(() => { if (datasetId) { @@ -736,6 +741,42 @@ const FiltersConfigForm = ( return restoreFilter(filterId)} />; } + const timeColumn = ( + + {t('Time column')}  + + + } + initialValue={filterToEdit?.granularity_sqla} + > + !!column.is_dttm} + datasetId={datasetId} + onChange={column => { + // We need reset default value when when column changed + setNativeFilterFieldValues(form, filterId, { + granularity_sqla: column, + }); + forceUpdate(); + }} + /> + + ); + return ( getDependencySuggestion(filterId) } - /> + > + {hasTimeDependency ? timeColumn : undefined} + )} {hasDataset && hasAdditionalFilters && ( @@ -966,39 +1009,9 @@ const FiltersConfigForm = ( /> )} - {hasTimeRange && ( - - {t('Time column')}  - - - } - initialValue={filterToEdit?.granularity_sqla} - > - !!column.is_dttm} - datasetId={datasetId} - onChange={column => { - // We need reset default value when when column changed - setNativeFilterFieldValues(form, filterId, { - granularity_sqla: column, - }); - forceUpdate(); - }} - /> - - )} + {hasTimeRange && !hasTimeDependency + ? timeColumn + : undefined} )} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx index fa7ef238e8f7..eb68e01ba6d2 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx @@ -89,7 +89,11 @@ export interface FiltersConfigModalProps { onSave: (filterConfig: FilterConfiguration) => Promise; onCancel: () => void; } -export const ALLOW_DEPENDENCIES = ['filter_select']; +export const ALLOW_DEPENDENCIES = [ + 'filter_range', + 'filter_select', + 'filter_time', +]; const DEFAULT_EMPTY_FILTERS: string[] = []; const DEFAULT_REMOVED_FILTERS: Record = {}; @@ -287,11 +291,12 @@ function FiltersConfigModal({ const getAvailableFilters = useCallback( (filterId: string) => filterIds - .filter(key => key !== filterId) - .filter(filterId => canBeUsedAsDependency(filterId)) - .map(key => ({ - label: getFilterTitle(key), - value: key, + .filter(id => id !== filterId) + .filter(id => canBeUsedAsDependency(id)) + .map(id => ({ + label: getFilterTitle(id), + value: id, + type: filterConfigMap[id]?.filterType, })), [canBeUsedAsDependency, filterIds, getFilterTitle], );