You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by jo...@apache.org on 2023/03/17 01:10:14 UTC
[superset] branch master updated: chore(dashboard): Disable 'Set filter mapping' when appropriate (#23261)
This is an automated email from the ASF dual-hosted git repository.
johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new ad72cd3171 chore(dashboard): Disable 'Set filter mapping' when appropriate (#23261)
ad72cd3171 is described below
commit ad72cd3171ce6fb4ccb55149ac9153e9f6df4fb9
Author: John Bodley <45...@users.noreply.github.com>
AuthorDate: Fri Mar 17 14:09:52 2023 +1300
chore(dashboard): Disable 'Set filter mapping' when appropriate (#23261)
---
.../HeaderActionsDropdown.test.tsx | 70 +++++++++++++++++++++-
.../Header/HeaderActionsDropdown/index.jsx | 22 ++++---
2 files changed, 83 insertions(+), 9 deletions(-)
diff --git a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx
index 37ff40c6b7..e4affa887f 100644
--- a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx
+++ b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx
@@ -24,8 +24,12 @@ import userEvent from '@testing-library/user-event';
import fetchMock from 'fetch-mock';
import { HeaderDropdownProps } from 'src/dashboard/components/Header/types';
import injectCustomCss from 'src/dashboard/util/injectCustomCss';
+import { FeatureFlag } from '@superset-ui/core';
+import * as featureFlags from 'src/featureFlags';
import HeaderActionsDropdown from '.';
+let isFeatureEnabledMock: jest.MockInstance<boolean, [feature: FeatureFlag]>;
+
const createProps = () => ({
addSuccessToast: jest.fn(),
addDangerToast: jest.fn(),
@@ -70,11 +74,24 @@ const createProps = () => ({
dataMask: {},
logEvent: jest.fn(),
});
+
const editModeOnProps = {
...createProps(),
editMode: true,
};
+const editModeOnWithFilterScopesProps = {
+ ...editModeOnProps,
+ dashboardInfo: {
+ ...editModeOnProps.dashboardInfo,
+ metadata: {
+ filter_scopes: {
+ '1': { scopes: ['ROOT_ID'], immune: [] },
+ },
+ },
+ },
+};
+
function setup(props: HeaderDropdownProps) {
return render(
<div className="dashboard-header">
@@ -112,11 +129,62 @@ test('should render the menu items in edit mode', async () => {
setup(editModeOnProps);
expect(screen.getAllByRole('menuitem')).toHaveLength(4);
expect(screen.getByText('Set auto-refresh interval')).toBeInTheDocument();
- expect(screen.getByText('Set filter mapping')).toBeInTheDocument();
expect(screen.getByText('Edit properties')).toBeInTheDocument();
expect(screen.getByText('Edit CSS')).toBeInTheDocument();
});
+describe('with native filters feature flag disabled', () => {
+ beforeAll(() => {
+ isFeatureEnabledMock = jest
+ .spyOn(featureFlags, 'isFeatureEnabled')
+ .mockImplementation(
+ (featureFlag: FeatureFlag) =>
+ featureFlag !== FeatureFlag.DASHBOARD_NATIVE_FILTERS,
+ );
+ });
+
+ afterAll(() => {
+ // @ts-ignore
+ isFeatureEnabledMock.restore();
+ });
+
+ it('should render filter mapping in edit mode if explicit filter scopes undefined', async () => {
+ setup(editModeOnProps);
+ expect(screen.getByText('Set filter mapping')).toBeInTheDocument();
+ });
+
+ it('should render filter mapping in edit mode if explicit filter scopes defined', async () => {
+ setup(editModeOnWithFilterScopesProps);
+ expect(screen.getByText('Set filter mapping')).toBeInTheDocument();
+ });
+});
+
+describe('with native filters feature flag enabled', () => {
+ beforeAll(() => {
+ isFeatureEnabledMock = jest
+ .spyOn(featureFlags, 'isFeatureEnabled')
+ .mockImplementation(
+ (featureFlag: FeatureFlag) =>
+ featureFlag === FeatureFlag.DASHBOARD_NATIVE_FILTERS,
+ );
+ });
+
+ afterAll(() => {
+ // @ts-ignore
+ isFeatureEnabledMock.restore();
+ });
+
+ it('should not render filter mapping in edit mode if explicit filter scopes undefined', async () => {
+ setup(editModeOnProps);
+ expect(screen.queryByText('Set filter mapping')).not.toBeInTheDocument();
+ });
+
+ it('should render filter mapping in edit mode if explicit filter scopes defined', async () => {
+ setup(editModeOnWithFilterScopesProps);
+ expect(screen.getByText('Set filter mapping')).toBeInTheDocument();
+ });
+});
+
test('should show the share actions', async () => {
const mockedProps = createProps();
const canShareProps = {
diff --git a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
index 971dd3507d..ae1e5b8308 100644
--- a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
+++ b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
@@ -18,6 +18,7 @@
*/
import React from 'react';
import PropTypes from 'prop-types';
+import { isEmpty } from 'lodash';
import { SupersetClient, t } from '@superset-ui/core';
@@ -36,6 +37,7 @@ import getDashboardUrl from 'src/dashboard/util/getDashboardUrl';
import { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters';
import { getUrlParam } from 'src/utils/urlUtils';
import { LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE } from 'src/logger/LogUtils';
+import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
const propTypes = {
addSuccessToast: PropTypes.func.isRequired,
@@ -370,14 +372,18 @@ class HeaderActionsDropdown extends React.PureComponent {
</Menu>
)
) : null}
- {editMode && (
- <Menu.Item key={MENU_KEYS.SET_FILTER_MAPPING}>
- <FilterScopeModal
- className="m-r-5"
- triggerNode={t('Set filter mapping')}
- />
- </Menu.Item>
- )}
+ {editMode &&
+ !(
+ isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS) &&
+ isEmpty(dashboardInfo?.metadata?.filter_scopes)
+ ) && (
+ <Menu.Item key={MENU_KEYS.SET_FILTER_MAPPING}>
+ <FilterScopeModal
+ className="m-r-5"
+ triggerNode={t('Set filter mapping')}
+ />
+ </Menu.Item>
+ )}
<Menu.Item key={MENU_KEYS.AUTOREFRESH_MODAL}>
<RefreshIntervalModal