This is an automated email from the ASF dual-hosted git repository. rusackas pushed a commit to branch removing-DASHBOARD_CROSS_FILTERS-flag in repository https://gitbox.apache.org/repos/asf/superset.git
commit 3e2c261ce49d631f120eef111fcdc95679f36949 Author: Evan Rusackas <[email protected]> AuthorDate: Fri Jan 10 12:55:25 2025 -0700 removing flag and all that comes with it. --- RESOURCES/FEATURE_FLAGS.md | 1 - UPDATING.md | 1 + .../superset-ui-core/src/utils/featureFlags.ts | 2 - .../Chart/ChartContextMenu/ChartContextMenu.tsx | 4 +- .../Chart/ChartContextMenu/useContextMenu.test.tsx | 1 - .../src/components/Chart/ChartRenderer.jsx | 7 +- .../src/dashboard/actions/dashboardState.js | 24 +++---- superset-frontend/src/dashboard/actions/hydrate.js | 18 +++-- .../src/dashboard/components/Dashboard.jsx | 7 +- .../DashboardBuilder/DashboardBuilder.tsx | 6 +- .../components/SliceHeaderControls/index.tsx | 1 - .../FilterBarSettings/FilterBarSettings.test.tsx | 30 -------- .../FilterBar/FilterBarSettings/index.tsx | 11 +-- .../FilterBar/FilterControls/FilterControls.tsx | 22 ++---- .../nativeFilters/FilterBar/Horizontal.tsx | 29 +++----- .../nativeFilters/FilterBar/Vertical.tsx | 12 +--- .../components/nativeFilters/selectors.ts | 82 ++++++++++------------ .../components/nativeFilters/utils.test.ts | 12 ---- .../dashboard/components/nativeFilters/utils.ts | 5 +- .../src/dashboard/util/crossFilters.test.ts | 30 +------- .../src/dashboard/util/crossFilters.ts | 9 +-- superset-frontend/src/dataMask/reducer.ts | 20 +++--- superset/config.py | 1 - 23 files changed, 93 insertions(+), 242 deletions(-) diff --git a/RESOURCES/FEATURE_FLAGS.md b/RESOURCES/FEATURE_FLAGS.md index b5ab3f6d6f..f6ed2ffc00 100644 --- a/RESOURCES/FEATURE_FLAGS.md +++ b/RESOURCES/FEATURE_FLAGS.md @@ -98,7 +98,6 @@ These features flags currently default to True and **will be removed in a future [//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY" - AVOID_COLORS_COLLISION -- DASHBOARD_CROSS_FILTERS - DRILL_TO_DETAIL - ENABLE_JAVASCRIPT_CONTROLS - KV_STORE diff --git a/UPDATING.md b/UPDATING.md index 4a67b26738..d2f21c1ce0 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -25,6 +25,7 @@ assists people when migrating to a new version. ## Next - [31894](https://github.com/apache/superset/pull/31894) Domain sharding is deprecated in favor of HTTP2. The `SUPERSET_WEBSERVER_DOMAINS` configuration will be removed in the next major version (6.0) +- [31794](https://github.com/apache/superset/pull/31794) Removed the previously deprecated `DASHBOARD_CROSS_FILTERS` feature flag - [31774](https://github.com/apache/superset/pull/31774): Fixes the spelling of the `USE-ANALAGOUS-COLORS` feature flag. Please update any scripts/configuration item to use the new/corrected `USE-ANALOGOUS-COLORS` flag spelling. - [31582](https://github.com/apache/superset/pull/31582) Removed the legacy Area, Bar, Event Flow, Heatmap, Histogram, Line, Sankey, and Sankey Loop charts. They were all automatically migrated to their ECharts counterparts with the exception of the Event Flow and Sankey Loop charts which were removed as they were not actively maintained and not widely used. If you were using the Event Flow or Sankey Loop charts, you will need to find an alternative solution. - [31198](https://github.com/apache/superset/pull/31198) Disallows by default the use of the following ClickHouse functions: "version", "currentDatabase", "hostName". diff --git a/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts b/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts index 34e8d51f27..96dbaddaaf 100644 --- a/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts +++ b/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts @@ -30,8 +30,6 @@ export enum FeatureFlag { AvoidColorsCollision = 'AVOID_COLORS_COLLISION', ChartPluginsExperimental = 'CHART_PLUGINS_EXPERIMENTAL', ConfirmDashboardDiff = 'CONFIRM_DASHBOARD_DIFF', - /** @deprecated */ - DashboardCrossFilters = 'DASHBOARD_CROSS_FILTERS', DashboardVirtualization = 'DASHBOARD_VIRTUALIZATION', DashboardRbac = 'DASHBOARD_RBAC', DatapanelClosedByDefault = 'DATAPANEL_CLOSED_BY_DEFAULT', diff --git a/superset-frontend/src/components/Chart/ChartContextMenu/ChartContextMenu.tsx b/superset-frontend/src/components/Chart/ChartContextMenu/ChartContextMenu.tsx index 9b3752152e..d619dae489 100644 --- a/superset-frontend/src/components/Chart/ChartContextMenu/ChartContextMenu.tsx +++ b/superset-frontend/src/components/Chart/ChartContextMenu/ChartContextMenu.tsx @@ -127,9 +127,7 @@ const ChartContextMenu = ( canDrillBy && isDisplayed(ContextMenuItem.DrillBy); - const showCrossFilters = - isFeatureEnabled(FeatureFlag.DashboardCrossFilters) && - isDisplayed(ContextMenuItem.CrossFilter); + const showCrossFilters = isDisplayed(ContextMenuItem.CrossFilter); const isCrossFilteringSupportedByChart = getChartMetadataRegistry() .get(formData.viz_type) diff --git a/superset-frontend/src/components/Chart/ChartContextMenu/useContextMenu.test.tsx b/superset-frontend/src/components/Chart/ChartContextMenu/useContextMenu.test.tsx index c06857d556..e1db166269 100644 --- a/superset-frontend/src/components/Chart/ChartContextMenu/useContextMenu.test.tsx +++ b/superset-frontend/src/components/Chart/ChartContextMenu/useContextMenu.test.tsx @@ -29,7 +29,6 @@ const CONTEXT_MENU_TEST_ID = 'chart-context-menu'; // @ts-ignore global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, [FeatureFlag.DrillToDetail]: true, [FeatureFlag.DrillBy]: true, }; diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index d93e30a107..9440548620 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -24,8 +24,6 @@ import { logging, Behavior, t, - isFeatureEnabled, - FeatureFlag, getChartMetadataRegistry, VizType, } from '@superset-ui/core'; @@ -90,10 +88,7 @@ class ChartRenderer extends Component { )?.suppressContextMenu; this.state = { showContextMenu: - props.source === ChartSource.Dashboard && - !suppressContextMenu && - (isFeatureEnabled(FeatureFlag.DrillToDetail) || - isFeatureEnabled(FeatureFlag.DashboardCrossFilters)), + props.source === ChartSource.Dashboard && !suppressContextMenu, inContextMenu: false, legendState: undefined, }; diff --git a/superset-frontend/src/dashboard/actions/dashboardState.js b/superset-frontend/src/dashboard/actions/dashboardState.js index 4ade6f3327..a4b0c9a748 100644 --- a/superset-frontend/src/dashboard/actions/dashboardState.js +++ b/superset-frontend/src/dashboard/actions/dashboardState.js @@ -353,16 +353,14 @@ export function saveDashboardRequest(data, id, saveType) { if (lastModifiedTime) { dispatch(saveDashboardRequestSuccess(lastModifiedTime)); } - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - const { chartConfiguration, globalChartConfiguration } = - handleChartConfiguration(); - dispatch( - saveChartConfiguration({ - chartConfiguration, - globalChartConfiguration, - }), - ); - } + const { chartConfiguration, globalChartConfiguration } = + handleChartConfiguration(); + dispatch( + saveChartConfiguration({ + chartConfiguration, + globalChartConfiguration, + }), + ); dispatch(saveDashboardFinished()); dispatch(addSuccessToast(t('This dashboard was saved successfully.'))); return response; @@ -437,10 +435,8 @@ export function saveDashboardRequest(data, id, saveType) { ) { let chartConfiguration = {}; let globalChartConfiguration = {}; - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - ({ chartConfiguration, globalChartConfiguration } = - handleChartConfiguration()); - } + ({ chartConfiguration, globalChartConfiguration } = + handleChartConfiguration()); const updatedDashboard = saveType === SAVE_TYPE_OVERWRITE_CONFIRMED ? data diff --git a/superset-frontend/src/dashboard/actions/hydrate.js b/superset-frontend/src/dashboard/actions/hydrate.js index 8dd36a8063..55754b1c27 100644 --- a/superset-frontend/src/dashboard/actions/hydrate.js +++ b/superset-frontend/src/dashboard/actions/hydrate.js @@ -230,16 +230,14 @@ export const hydrateDashboard = filterConfig: metadata?.native_filter_configuration || [], }); - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - const { chartConfiguration, globalChartConfiguration } = - getCrossFiltersConfiguration( - dashboardLayout.present, - metadata, - chartQueries, - ); - metadata.chart_configuration = chartConfiguration; - metadata.global_chart_configuration = globalChartConfiguration; - } + const { chartConfiguration, globalChartConfiguration } = + getCrossFiltersConfiguration( + dashboardLayout.present, + metadata, + chartQueries, + ); + metadata.chart_configuration = chartConfiguration; + metadata.global_chart_configuration = globalChartConfiguration; const { roles } = user; const canEdit = canUserEditDashboard(dashboard, user); diff --git a/superset-frontend/src/dashboard/components/Dashboard.jsx b/superset-frontend/src/dashboard/components/Dashboard.jsx index 48e70c8fd4..762e120390 100644 --- a/superset-frontend/src/dashboard/components/Dashboard.jsx +++ b/superset-frontend/src/dashboard/components/Dashboard.jsx @@ -18,7 +18,7 @@ */ import { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { isFeatureEnabled, t, FeatureFlag } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { PluginContext } from 'src/components/DynamicPlugins'; import Loading from 'src/components/Loading'; @@ -163,10 +163,7 @@ class Dashboard extends PureComponent { editMode, } = this.props; const { appliedFilters, appliedOwnDataCharts } = this; - if ( - isFeatureEnabled(FeatureFlag.DashboardCrossFilters) && - !chartConfiguration - ) { + if (!chartConfiguration) { // For a first loading we need to wait for cross filters charts data loaded to get all active filters // for correct comparing of filters to avoid unnecessary requests return; diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx index 29dc12a7c8..a1e3a26ce2 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx @@ -396,9 +396,6 @@ const DashboardBuilder = () => { const fullSizeChartId = useSelector<RootState, number | null>( state => state.dashboardState.fullSizeChartId, ); - const crossFiltersEnabled = isFeatureEnabled( - FeatureFlag.DashboardCrossFilters, - ); const filterBarOrientation = useSelector<RootState, FilterBarOrientation>( ({ dashboardInfo }) => isFeatureEnabled(FeatureFlag.HorizontalFilterBar) @@ -476,8 +473,7 @@ const DashboardBuilder = () => { ELEMENT_ON_SCREEN_OPTIONS, ); - const showFilterBar = - (crossFiltersEnabled || nativeFiltersEnabled) && !editMode; + const showFilterBar = !editMode; const offset = FILTER_BAR_HEADER_HEIGHT + diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx index 25750dcca1..12479d02f6 100644 --- a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx @@ -177,7 +177,6 @@ const SliceHeaderControls = ( useSelector<RootState, boolean>( ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, ) && - isFeatureEnabled(FeatureFlag.DashboardCrossFilters) && getChartMetadataRegistry() .get(props.slice.viz_type) ?.behaviors?.includes(Behavior.InteractiveChart); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx index 2c6196962e..2863a07931 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx @@ -104,33 +104,7 @@ test('Dropdown trigger does not render without dashboard edit permissions', asyn expect(screen.queryByRole('img', { name: 'gear' })).not.toBeInTheDocument(); }); -test('Dropdown trigger renders with FF DASHBOARD_CROSS_FILTERS on', async () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; - await setup(); - - expect(screen.getByRole('img', { name: 'gear' })).toBeInTheDocument(); -}); - -test('Dropdown trigger does not render with FF DASHBOARD_CROSS_FILTERS off', async () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: false, - }; - await setup({ - dash_edit_perm: false, - }); - - expect(screen.queryByRole('img', { name: 'gear' })).not.toBeInTheDocument(); -}); - test('Popover shows cross-filtering option on by default', async () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; await setup(); userEvent.click(screen.getByLabelText('gear')); expect(screen.getByText('Enable cross-filtering')).toBeInTheDocument(); @@ -138,10 +112,6 @@ test('Popover shows cross-filtering option on by default', async () => { }); test('Can enable/disable cross-filtering', async () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; fetchMock.reset(); fetchMock.put('glob:*/api/v1/dashboard/1', { result: {}, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx index 9afc05b40c..404d737999 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx @@ -83,13 +83,9 @@ const FilterBarSettings = () => { ); const [selectedFilterBarOrientation, setSelectedFilterBarOrientation] = useState(filterBarOrientation); - const isCrossFiltersFeatureEnabled = isFeatureEnabled( - FeatureFlag.DashboardCrossFilters, - ); - const shouldEnableCrossFilters = - isCrossFiltersEnabled && isCrossFiltersFeatureEnabled; + const [crossFiltersEnabled, setCrossFiltersEnabled] = useState<boolean>( - shouldEnableCrossFilters, + isCrossFiltersEnabled, ); const canEdit = useSelector<RootState, boolean>( ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, @@ -188,7 +184,7 @@ const FilterBarSettings = () => { divider: canSetHorizontalFilterBar, }); } - if (isCrossFiltersFeatureEnabled && canEdit) { + if (canEdit) { items.push({ key: CROSS_FILTERS_MENU_KEY, label: crossFiltersMenuItem, @@ -222,7 +218,6 @@ const FilterBarSettings = () => { crossFiltersMenuItem, dashboardId, filterValues, - isCrossFiltersFeatureEnabled, ]); if (!menuItems.length) { diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx index d959026792..18126b2f99 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx @@ -62,15 +62,12 @@ import crossFiltersSelector from '../CrossFilters/selectors'; import CrossFilter from '../CrossFilters/CrossFilter'; import { useFilterOutlined } from '../useFilterOutlined'; import { useChartsVerboseMaps } from '../utils'; -import { CrossFilterIndicator } from '../../selectors'; type FilterControlsProps = { dataMaskSelected: DataMaskStateWithId; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; }; -const EMPTY_ARRAY: CrossFilterIndicator[] = []; - const FilterControls: FC<FilterControlsProps> = ({ dataMaskSelected, onFilterSelectionChange, @@ -94,20 +91,15 @@ const FilterControls: FC<FilterControlsProps> = ({ const chartLayoutItems = useChartLayoutItems(); const verboseMaps = useChartsVerboseMaps(); - const isCrossFiltersEnabled = isFeatureEnabled( - FeatureFlag.DashboardCrossFilters, - ); const selectedCrossFilters = useMemo( () => - isCrossFiltersEnabled - ? crossFiltersSelector({ - dataMask, - chartIds, - chartLayoutItems, - verboseMaps, - }) - : EMPTY_ARRAY, - [chartIds, chartLayoutItems, dataMask, isCrossFiltersEnabled, verboseMaps], + crossFiltersSelector({ + dataMask, + chartIds, + chartLayoutItems, + verboseMaps, + }), + [chartIds, chartLayoutItems, dataMask, verboseMaps], ); const { filterControlFactory, filtersWithValues } = useFilterControlFactory( dataMaskSelected, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx index 0e5b82aed2..13761afc4a 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx @@ -18,13 +18,7 @@ */ import { FC, memo, useMemo } from 'react'; -import { - DataMaskStateWithId, - FeatureFlag, - isFeatureEnabled, - styled, - t, -} from '@superset-ui/core'; +import { DataMaskStateWithId, styled, t } from '@superset-ui/core'; import Loading from 'src/components/Loading'; import { RootState } from 'src/dashboard/types'; import { useChartLayoutItems } from 'src/dashboard/util/useChartLayoutItems'; @@ -35,7 +29,6 @@ import { useChartsVerboseMaps, getFilterBarTestId } from './utils'; import { HorizontalBarProps } from './types'; import FilterBarSettings from './FilterBarSettings'; import crossFiltersSelector from './CrossFilters/selectors'; -import { CrossFilterIndicator } from '../selectors'; const HorizontalBar = styled.div` ${({ theme }) => ` @@ -72,7 +65,6 @@ const FilterBarEmptyStateContainer = styled.div` `} `; -const EMPTY_ARRAY: CrossFilterIndicator[] = []; const HorizontalFilterBar: FC<HorizontalBarProps> = ({ actions, dataMaskSelected, @@ -85,22 +77,17 @@ const HorizontalFilterBar: FC<HorizontalBarProps> = ({ ); const chartIds = useChartIds(); const chartLayoutItems = useChartLayoutItems(); - const isCrossFiltersEnabled = isFeatureEnabled( - FeatureFlag.DashboardCrossFilters, - ); const verboseMaps = useChartsVerboseMaps(); const selectedCrossFilters = useMemo( () => - isCrossFiltersEnabled - ? crossFiltersSelector({ - dataMask, - chartIds, - chartLayoutItems, - verboseMaps, - }) - : EMPTY_ARRAY, - [chartIds, chartLayoutItems, dataMask, isCrossFiltersEnabled, verboseMaps], + crossFiltersSelector({ + dataMask, + chartIds, + chartLayoutItems, + verboseMaps, + }), + [chartIds, chartLayoutItems, dataMask, verboseMaps], ); const hasFilters = filterValues.length > 0 || selectedCrossFilters.length > 0; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx index b76b65c133..dccf747973 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx @@ -30,7 +30,7 @@ import { FC, } from 'react'; import cx from 'classnames'; -import { FeatureFlag, isFeatureEnabled, styled, t } from '@superset-ui/core'; +import { styled, t } from '@superset-ui/core'; import Icons from 'src/components/Icons'; import Loading from 'src/components/Loading'; import { EmptyStateSmall } from 'src/components/EmptyState'; @@ -190,14 +190,6 @@ const VerticalFilterBar: FC<VerticalBarProps> = ({ [canEdit, dataMaskSelected, filterValues.length, onSelectionChange], ); - const crossFilters = useMemo( - () => - isFeatureEnabled(FeatureFlag.DashboardCrossFilters) ? ( - <CrossFiltersVertical /> - ) : null, - [], - ); - return ( <FilterBarScrollContext.Provider value={isScrolling}> <BarWrapper @@ -230,7 +222,7 @@ const VerticalFilterBar: FC<VerticalBarProps> = ({ ) : ( <div css={tabPaneStyle} onScroll={onScroll}> <> - {crossFilters} + <CrossFiltersVertical /> {filterControls} </> </div> diff --git a/superset-frontend/src/dashboard/components/nativeFilters/selectors.ts b/superset-frontend/src/dashboard/components/nativeFilters/selectors.ts index 232ff57de2..0539a4317a 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/selectors.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/selectors.ts @@ -21,11 +21,9 @@ import { DataMaskStateWithId, DataMaskType, ensureIsArray, - FeatureFlag, Filters, FilterState, getColumnLabel, - isFeatureEnabled, NativeFilterType, NO_TIME_RANGE, QueryFormColumn, @@ -289,39 +287,37 @@ export const selectChartCrossFilters = ( filterEmitter = false, ): Indicator[] | CrossFilterIndicator[] => { let crossFilterIndicators: any = []; - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - crossFilterIndicators = Object.values(chartConfiguration) - .filter(chartConfig => { - const inScope = - chartConfig.crossFilters?.chartsInScope?.includes(chartId); - if (!filterEmitter && inScope) { - return true; - } - if (filterEmitter && !inScope) { - return true; - } - return false; - }) - .map(chartConfig => { - const filterIndicator = getCrossFilterIndicator( - Number(chartConfig.id), - dataMask[chartConfig.id], - chartLayoutItems, - ); - const filterStatus = getStatus({ - label: filterIndicator.value, - column: filterIndicator.column - ? getColumnLabel(filterIndicator.column) - : undefined, - type: DataMaskType.CrossFilters, - appliedColumns, - rejectedColumns, - }); + crossFilterIndicators = Object.values(chartConfiguration) + .filter(chartConfig => { + const inScope = + chartConfig.crossFilters?.chartsInScope?.includes(chartId); + if (!filterEmitter && inScope) { + return true; + } + if (filterEmitter && !inScope) { + return true; + } + return false; + }) + .map(chartConfig => { + const filterIndicator = getCrossFilterIndicator( + Number(chartConfig.id), + dataMask[chartConfig.id], + chartLayoutItems, + ); + const filterStatus = getStatus({ + label: filterIndicator.value, + column: filterIndicator.column + ? getColumnLabel(filterIndicator.column) + : undefined, + type: DataMaskType.CrossFilters, + appliedColumns, + rejectedColumns, + }); - return { ...filterIndicator, status: filterStatus }; - }) - .filter(filter => filter.status === IndicatorStatus.CrossFilterApplied); - } + return { ...filterIndicator, status: filterStatus }; + }) + .filter(filter => filter.status === IndicatorStatus.CrossFilterApplied); return crossFilterIndicators; }; @@ -379,16 +375,14 @@ export const selectNativeIndicatorsForChart = ( }); let crossFilterIndicators: any = []; - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - crossFilterIndicators = selectChartCrossFilters( - dataMask, - chartId, - chartLayoutItems, - chartConfiguration, - appliedColumns, - rejectedColumns, - ); - } + crossFilterIndicators = selectChartCrossFilters( + dataMask, + chartId, + chartLayoutItems, + chartConfiguration, + appliedColumns, + rejectedColumns, + ); const indicators = crossFilterIndicators.concat(nativeFilterIndicators); cachedNativeIndicatorsForChart[chartId] = indicators; cachedNativeFilterDataForChart[chartId] = { diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.test.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.test.ts index db21db547d..0f402ee134 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/utils.test.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.test.ts @@ -56,18 +56,6 @@ describe('nativeFilterGate', () => { }); describe('with cross filters and experimental feature flag enabled', () => { - beforeAll(() => { - isFeatureEnabledMock = jest - .spyOn(uiCore, 'isFeatureEnabled') - .mockImplementation((featureFlag: FeatureFlag) => - [FeatureFlag.DashboardCrossFilters].includes(featureFlag), - ); - }); - - afterAll(() => { - isFeatureEnabledMock.mockRestore(); - }); - it('should return true for regular chart', () => { expect(nativeFilterGate([])).toEqual(true); }); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts index 734e0ce91f..ef577b354b 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts @@ -23,8 +23,6 @@ import { EXTRA_FORM_DATA_APPEND_KEYS, EXTRA_FORM_DATA_OVERRIDE_KEYS, ExtraFormData, - isFeatureEnabled, - FeatureFlag, Filter, getChartMetadataRegistry, QueryFormData, @@ -150,8 +148,7 @@ export function getExtraFormData( export function nativeFilterGate(behaviors: Behavior[]): boolean { return ( !behaviors.includes(Behavior.NativeFilter) || - (isFeatureEnabled(FeatureFlag.DashboardCrossFilters) && - behaviors.includes(Behavior.InteractiveChart)) + behaviors.includes(Behavior.InteractiveChart) ); } diff --git a/superset-frontend/src/dashboard/util/crossFilters.test.ts b/superset-frontend/src/dashboard/util/crossFilters.test.ts index 07e8064e7d..06a3aa2069 100644 --- a/superset-frontend/src/dashboard/util/crossFilters.test.ts +++ b/superset-frontend/src/dashboard/util/crossFilters.test.ts @@ -17,7 +17,7 @@ * under the License. */ import sinon, { SinonStub } from 'sinon'; -import { Behavior, FeatureFlag } from '@superset-ui/core'; +import { Behavior } from '@superset-ui/core'; import * as core from '@superset-ui/core'; import { getCrossFiltersConfiguration } from './crossFilters'; import { DEFAULT_CROSS_FILTER_SCOPING } from '../constants'; @@ -146,11 +146,6 @@ afterEach(() => { }); test('Generate correct cross filters configuration without initial configuration', () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; - // @ts-ignore expect(getCrossFiltersConfiguration(DASHBOARD_LAYOUT, {}, CHARTS)).toEqual({ chartConfiguration: { @@ -180,11 +175,6 @@ test('Generate correct cross filters configuration without initial configuration }); test('Generate correct cross filters configuration with initial configuration', () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; - expect( getCrossFiltersConfiguration( DASHBOARD_LAYOUT, @@ -221,25 +211,7 @@ test('Generate correct cross filters configuration with initial configuration', }); }); -test('Return undefined if DASHBOARD_CROSS_FILTERS feature flag is disabled', () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: false, - }; - expect( - getCrossFiltersConfiguration( - DASHBOARD_LAYOUT, - CHART_CONFIG_METADATA, - CHARTS, - ), - ).toEqual(undefined); -}); - test('Recalculate charts in global filter scope when charts change', () => { - // @ts-ignore - global.featureFlags = { - [FeatureFlag.DashboardCrossFilters]: true, - }; expect( getCrossFiltersConfiguration( { diff --git a/superset-frontend/src/dashboard/util/crossFilters.ts b/superset-frontend/src/dashboard/util/crossFilters.ts index 123435a430..04d3e368fc 100644 --- a/superset-frontend/src/dashboard/util/crossFilters.ts +++ b/superset-frontend/src/dashboard/util/crossFilters.ts @@ -19,10 +19,8 @@ import { cloneDeep } from 'lodash'; import { Behavior, - FeatureFlag, getChartMetadataRegistry, isDefined, - isFeatureEnabled, } from '@superset-ui/core'; import { getChartIdsInFilterScope } from './getChartIdsInFilterScope'; import { @@ -38,8 +36,7 @@ import { CHART_TYPE } from './componentTypes'; export const isCrossFiltersEnabled = ( metadataCrossFiltersEnabled: boolean | undefined, ): boolean => - isFeatureEnabled(FeatureFlag.DashboardCrossFilters) && - (metadataCrossFiltersEnabled === undefined || metadataCrossFiltersEnabled); + metadataCrossFiltersEnabled === undefined || metadataCrossFiltersEnabled; export const getCrossFiltersConfiguration = ( dashboardLayout: DashboardLayout, @@ -49,10 +46,6 @@ export const getCrossFiltersConfiguration = ( >, charts: ChartsState, ) => { - if (!isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - return undefined; - } - const chartLayoutItems = Object.values(dashboardLayout).filter( item => item?.type === CHART_TYPE, ); diff --git a/superset-frontend/src/dataMask/reducer.ts b/superset-frontend/src/dataMask/reducer.ts index b79f17fb1d..6d240b4989 100644 --- a/superset-frontend/src/dataMask/reducer.ts +++ b/superset-frontend/src/dataMask/reducer.ts @@ -24,8 +24,6 @@ import { DataMask, DataMaskStateWithId, DataMaskWithId, - isFeatureEnabled, - FeatureFlag, Filter, FilterConfiguration, Filters, @@ -148,16 +146,14 @@ const dataMaskReducer = produce( // TODO: update hydrate to .ts // @ts-ignore case HYDRATE_DASHBOARD: - if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) { - Object.keys( - // @ts-ignore - action.data.dashboardInfo?.metadata?.chart_configuration, - ).forEach(id => { - cleanState[id] = { - ...getInitialDataMask(id), // take initial data - }; - }); - } + Object.keys( + // @ts-ignore + action.data.dashboardInfo?.metadata?.chart_configuration, + ).forEach(id => { + cleanState[id] = { + ...getInitialDataMask(id), // take initial data + }; + }); fillNativeFilters( // @ts-ignore action.data.dashboardInfo?.metadata?.native_filter_configuration ?? diff --git a/superset/config.py b/superset/config.py index 0a9d150ce6..f4e22ce500 100644 --- a/superset/config.py +++ b/superset/config.py @@ -491,7 +491,6 @@ DEFAULT_FEATURE_FLAGS: dict[str, bool] = { "LISTVIEWS_DEFAULT_CARD_VIEW": False, # When True, this escapes HTML (rather than rendering it) in Markdown components "ESCAPE_MARKDOWN_HTML": False, - "DASHBOARD_CROSS_FILTERS": True, # deprecated "DASHBOARD_VIRTUALIZATION": True, # This feature flag is stil in beta and is not recommended for production use. "GLOBAL_ASYNC_QUERIES": False,
