You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2023/03/31 08:34:19 UTC

[superset] branch master updated: chore(welcome): harmonize submenu with other routes (#22803)

This is an automated email from the ASF dual-hosted git repository.

villebro 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 f6b5b658e5 chore(welcome): harmonize submenu with other routes (#22803)
f6b5b658e5 is described below

commit f6b5b658e5311696a641b71f2f34191c9e9e5e20
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Fri Mar 31 11:34:10 2023 +0300

    chore(welcome): harmonize submenu with other routes (#22803)
---
 superset-frontend/src/SqlLab/App.jsx               |   8 +-
 superset-frontend/src/SqlLab/actions/sqlLab.js     |   4 +-
 .../SqlLab/components/ShareSqlLabQuery/index.tsx   |   4 +-
 .../src/SqlLab/components/SouthPane/index.tsx      |   4 +-
 .../src/SqlLab/components/SqlEditor/index.jsx      |   4 +-
 .../SqlLab/components/TabbedSqlEditors/index.jsx   |   4 +-
 superset-frontend/src/components/Chart/Chart.jsx   |  11 +-
 .../src/components/Chart/chartAction.js            |   4 +-
 .../src/components/Datasource/DatasourceEditor.jsx |  10 +-
 .../src/components/Datasource/DatasourceModal.tsx  |   4 +-
 .../src/components/DynamicPlugins/index.tsx        |   3 +-
 .../src/dashboard/actions/dashboardState.js        |   7 +-
 superset-frontend/src/dashboard/actions/hydrate.js |   4 +-
 .../src/dashboard/actions/sliceEntities.js         |   4 +-
 .../DashboardBuilder/DashboardBuilder.test.tsx     |   3 +-
 .../DashboardBuilder/DashboardBuilder.tsx          |   3 +-
 .../dashboard/components/DashboardBuilder/state.ts |   3 +-
 .../components/FiltersBadge/FiltersBadge.test.tsx  |   8 +-
 .../Header/HeaderActionsDropdown/index.jsx         |   4 +-
 .../src/dashboard/components/Header/index.jsx      |   3 +-
 .../dashboard/components/PropertiesModal/index.tsx |   3 +-
 .../SliceHeaderControls.test.tsx                   |   2 +-
 .../components/SliceHeaderControls/index.tsx       |  11 +-
 .../nativeFilters/FilterBar/FilterBar.test.tsx     |   3 +-
 .../FilterBar/FilterControls/FilterValue.tsx       |  15 +-
 .../nativeFilters/FilterBar/Vertical.tsx           |  10 +-
 .../FiltersConfigForm/FiltersConfigForm.tsx        |   3 +-
 superset-frontend/src/dataMask/actions.ts          |   9 +-
 .../components/DataTablesPane/DataTablesPane.tsx   |   4 +-
 .../DataTablesPane/test/DataTablesPane.test.tsx    |   2 +-
 .../explore/components/DatasourcePanel/index.tsx   |   7 +-
 .../src/explore/components/ExploreChartPanel.jsx   |   7 +-
 .../src/explore/components/SaveModal.tsx           |   9 +-
 .../index.tsx                                      |  11 +-
 .../useExploreAdditionalActionsMenu/index.jsx      |   4 +-
 superset-frontend/src/featureFlags.ts              |   5 +-
 superset-frontend/src/middleware/asyncEvent.ts     |   3 +-
 .../src/pages/ChartCreation/index.tsx              |   9 +-
 superset-frontend/src/pages/ChartList/index.tsx    |   3 +-
 .../src/pages/DashboardList/index.tsx              |   4 +-
 superset-frontend/src/pages/DatabaseList/index.tsx |   4 +-
 .../src/pages/DatasetList/DatasetList.test.tsx     |   6 +-
 superset-frontend/src/pages/DatasetList/index.tsx  |   4 +-
 superset-frontend/src/pages/Home/Home.test.tsx     |   2 +-
 superset-frontend/src/pages/Home/index.tsx         | 196 +++++++++++----------
 .../src/pages/SavedQueryList/index.tsx             |   4 +-
 superset-frontend/src/pages/Tags/index.tsx         |   4 +-
 superset-frontend/src/utils/hostNamesConfig.js     |   7 +-
 .../src/views/CRUD/alert/AlertReportModal.tsx      |   7 +-
 .../src/views/CRUD/chart/ChartCard.tsx             |   4 +-
 .../src/views/CRUD/dashboard/DashboardCard.tsx     |   4 +-
 superset-frontend/src/views/CRUD/tags/TagCard.tsx  |   4 +-
 52 files changed, 257 insertions(+), 212 deletions(-)

diff --git a/superset-frontend/src/SqlLab/App.jsx b/superset-frontend/src/SqlLab/App.jsx
index b75ea5c624..a86228c684 100644
--- a/superset-frontend/src/SqlLab/App.jsx
+++ b/superset-frontend/src/SqlLab/App.jsx
@@ -21,14 +21,10 @@ import { createStore, compose, applyMiddleware } from 'redux';
 import { Provider } from 'react-redux';
 import thunkMiddleware from 'redux-thunk';
 import { hot } from 'react-hot-loader/root';
-import { ThemeProvider } from '@superset-ui/core';
+import { FeatureFlag, ThemeProvider } from '@superset-ui/core';
 import { GlobalStyles } from 'src/GlobalStyles';
 import QueryProvider from 'src/views/QueryProvider';
-import {
-  initFeatureFlags,
-  isFeatureEnabled,
-  FeatureFlag,
-} from 'src/featureFlags';
+import { initFeatureFlags, isFeatureEnabled } from 'src/featureFlags';
 import setupExtensions from 'src/setup/setupExtensions';
 import getBootstrapData from 'src/utils/getBootstrapData';
 import logger from 'src/middleware/loggerMiddleware';
diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.js b/superset-frontend/src/SqlLab/actions/sqlLab.js
index 88c500022b..4b65b59925 100644
--- a/superset-frontend/src/SqlLab/actions/sqlLab.js
+++ b/superset-frontend/src/SqlLab/actions/sqlLab.js
@@ -18,10 +18,10 @@
  */
 import shortid from 'shortid';
 import rison from 'rison';
-import { SupersetClient, t } from '@superset-ui/core';
+import { FeatureFlag, SupersetClient, t } from '@superset-ui/core';
 import invert from 'lodash/invert';
 import mapKeys from 'lodash/mapKeys';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 import { now } from 'src/utils/dates';
 import {
diff --git a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx
index 73a7749646..fe9990ad3f 100644
--- a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx
+++ b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx
@@ -17,14 +17,14 @@
  * under the License.
  */
 import React from 'react';
-import { t, useTheme, styled } from '@superset-ui/core';
+import { FeatureFlag, styled, t, useTheme } from '@superset-ui/core';
 import Button from 'src/components/Button';
 import Icons from 'src/components/Icons';
 import withToasts from 'src/components/MessageToasts/withToasts';
 import CopyToClipboard from 'src/components/CopyToClipboard';
 import { storeQuery } from 'src/utils/common';
 import { getClientErrorObject } from 'src/utils/getClientErrorObject';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor';
 
 interface ShareSqlLabQueryProps {
diff --git a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx
index 0b389dfb39..047bfebd65 100644
--- a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx
+++ b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx
@@ -22,10 +22,10 @@ import shortid from 'shortid';
 import Alert from 'src/components/Alert';
 import Tabs from 'src/components/Tabs';
 import { EmptyStateMedium } from 'src/components/EmptyState';
-import { t, styled } from '@superset-ui/core';
+import { FeatureFlag, styled, t } from '@superset-ui/core';
 
 import { setActiveSouthPaneTab } from 'src/SqlLab/actions/sqlLab';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 import Label from 'src/components/Label';
 import { SqlLabRootState } from 'src/SqlLab/types';
diff --git a/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx b/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx
index c19db43089..83286e5881 100644
--- a/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx
+++ b/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx
@@ -29,7 +29,7 @@ import { CSSTransition } from 'react-transition-group';
 import { useDispatch, useSelector } from 'react-redux';
 import PropTypes from 'prop-types';
 import Split from 'react-split';
-import { css, t, styled, useTheme } from '@superset-ui/core';
+import { css, FeatureFlag, styled, t, useTheme } from '@superset-ui/core';
 import debounce from 'lodash/debounce';
 import throttle from 'lodash/throttle';
 import Modal from 'src/components/Modal';
@@ -78,7 +78,7 @@ import {
   LocalStorageKeys,
   setItem,
 } from 'src/utils/localStorageHelpers';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { EmptyStateBig } from 'src/components/EmptyState';
 import getBootstrapData from 'src/utils/getBootstrapData';
 import { isEmpty } from 'lodash';
diff --git a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx
index 1b3e3a999d..1a6aac0bf8 100644
--- a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx
+++ b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx
@@ -22,8 +22,8 @@ import { EditableTabs } from 'src/components/Tabs';
 import { connect } from 'react-redux';
 import { bindActionCreators } from 'redux';
 import URI from 'urijs';
-import { styled, t } from '@superset-ui/core';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { FeatureFlag, styled, t } from '@superset-ui/core';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { Tooltip } from 'src/components/Tooltip';
 import { detectOS } from 'src/utils/common';
 import * as Actions from 'src/SqlLab/actions/sqlLab';
diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx
index e8453ee27b..74bde69c5c 100644
--- a/superset-frontend/src/components/Chart/Chart.jsx
+++ b/superset-frontend/src/components/Chart/Chart.jsx
@@ -18,9 +18,14 @@
  */
 import PropTypes from 'prop-types';
 import React from 'react';
-import { styled, logging, t, ensureIsArray } from '@superset-ui/core';
-
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import {
+  ensureIsArray,
+  FeatureFlag,
+  logging,
+  styled,
+  t,
+} from '@superset-ui/core';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { PLACEHOLDER_DATASOURCE } from 'src/dashboard/constants';
 import Loading from 'src/components/Loading';
 import { EmptyStateBig } from 'src/components/EmptyState';
diff --git a/superset-frontend/src/components/Chart/chartAction.js b/superset-frontend/src/components/Chart/chartAction.js
index 7418a8f8b7..25c3cd1ab8 100644
--- a/superset-frontend/src/components/Chart/chartAction.js
+++ b/superset-frontend/src/components/Chart/chartAction.js
@@ -19,9 +19,9 @@
 /* eslint no-undef: 'error' */
 /* eslint no-param-reassign: ["error", { "props": false }] */
 import moment from 'moment';
-import { t, SupersetClient, isDefined } from '@superset-ui/core';
+import { FeatureFlag, isDefined, SupersetClient, t } from '@superset-ui/core';
 import { getControlsState } from 'src/explore/store';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   getAnnotationJsonUrl,
   getExploreUrl,
diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
index 6f0f8a8486..f4d7e48573 100644
--- a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
+++ b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx
@@ -24,7 +24,13 @@ import Card from 'src/components/Card';
 import Alert from 'src/components/Alert';
 import Badge from 'src/components/Badge';
 import shortid from 'shortid';
-import { styled, SupersetClient, t, withTheme } from '@superset-ui/core';
+import {
+  FeatureFlag,
+  styled,
+  SupersetClient,
+  t,
+  withTheme,
+} from '@superset-ui/core';
 import { Select, AsyncSelect, Row, Col } from 'src/components';
 import { FormLabel } from 'src/components/Form';
 import Button from 'src/components/Button';
@@ -42,7 +48,7 @@ import TextControl from 'src/explore/components/controls/TextControl';
 import TextAreaControl from 'src/explore/components/controls/TextAreaControl';
 import SpatialControl from 'src/explore/components/controls/SpatialControl';
 import withToasts from 'src/components/MessageToasts/withToasts';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import Icons from 'src/components/Icons';
 import CollectionTable from './CollectionTable';
 import Fieldset from './Fieldset';
diff --git a/superset-frontend/src/components/Datasource/DatasourceModal.tsx b/superset-frontend/src/components/Datasource/DatasourceModal.tsx
index b0a0bb9c42..3f5e377463 100644
--- a/superset-frontend/src/components/Datasource/DatasourceModal.tsx
+++ b/superset-frontend/src/components/Datasource/DatasourceModal.tsx
@@ -19,11 +19,11 @@
 import React, { FunctionComponent, useState, useRef } from 'react';
 import Alert from 'src/components/Alert';
 import Button from 'src/components/Button';
-import { styled, t, SupersetClient } from '@superset-ui/core';
+import { FeatureFlag, styled, SupersetClient, t } from '@superset-ui/core';
 
 import Modal from 'src/components/Modal';
 import AsyncEsmComponent from 'src/components/AsyncEsmComponent';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 import { getClientErrorObject } from 'src/utils/getClientErrorObject';
 import withToasts from 'src/components/MessageToasts/withToasts';
diff --git a/superset-frontend/src/components/DynamicPlugins/index.tsx b/superset-frontend/src/components/DynamicPlugins/index.tsx
index b11798fbd8..87701d2462 100644
--- a/superset-frontend/src/components/DynamicPlugins/index.tsx
+++ b/superset-frontend/src/components/DynamicPlugins/index.tsx
@@ -20,11 +20,12 @@ import React, { useContext, useEffect, useReducer } from 'react';
 import {
   ChartMetadata,
   defineSharedModules,
+  FeatureFlag,
   getChartMetadataRegistry,
   logging,
   makeApi,
 } from '@superset-ui/core';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { omitBy } from 'lodash';
 
 const metadataRegistry = getChartMetadataRegistry();
diff --git a/superset-frontend/src/dashboard/actions/dashboardState.js b/superset-frontend/src/dashboard/actions/dashboardState.js
index a166e5d4db..ad59ac378c 100644
--- a/superset-frontend/src/dashboard/actions/dashboardState.js
+++ b/superset-frontend/src/dashboard/actions/dashboardState.js
@@ -21,9 +21,10 @@ import { ActionCreators as UndoActionCreators } from 'redux-undo';
 import rison from 'rison';
 import {
   ensureIsArray,
-  t,
-  SupersetClient,
+  FeatureFlag,
   getSharedLabelColor,
+  SupersetClient,
+  t,
 } from '@superset-ui/core';
 import {
   addChart,
@@ -50,7 +51,7 @@ import serializeActiveFilterValues from 'src/dashboard/util/serializeActiveFilte
 import serializeFilterScopes from 'src/dashboard/util/serializeFilterScopes';
 import { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters';
 import { safeStringify } from 'src/utils/safeStringify';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { logEvent } from 'src/logger/actions';
 import { LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA } from 'src/logger/LogUtils';
 import { UPDATE_COMPONENTS_PARENTS_LIST } from './dashboardLayout';
diff --git a/superset-frontend/src/dashboard/actions/hydrate.js b/superset-frontend/src/dashboard/actions/hydrate.js
index e0b17b737d..4f1b94379b 100644
--- a/superset-frontend/src/dashboard/actions/hydrate.js
+++ b/superset-frontend/src/dashboard/actions/hydrate.js
@@ -16,6 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+/* eslint-disable camelcase */
+import { FeatureFlag } from '@superset-ui/core';
 import { chart } from 'src/components/Chart/chartReducer';
 import { initSliceEntities } from 'src/dashboard/reducers/sliceEntities';
 import { getInitialState as getInitialNativeFilterState } from 'src/dashboard/reducers/nativeFilters';
@@ -51,7 +53,7 @@ import { TIME_RANGE } from 'src/visualizations/FilterBox/FilterBox';
 import { URL_PARAMS } from 'src/constants';
 import { getUrlParam } from 'src/utils/urlUtils';
 import { ResourceStatus } from 'src/hooks/apiResources/apiResources';
-import { FeatureFlag, isFeatureEnabled } from '../../featureFlags';
+import { isFeatureEnabled } from '../../featureFlags';
 import extractUrlParams from '../util/extractUrlParams';
 import { updateColorSchema } from './dashboardInfo';
 import updateComponentParentsList from '../util/updateComponentParentsList';
diff --git a/superset-frontend/src/dashboard/actions/sliceEntities.js b/superset-frontend/src/dashboard/actions/sliceEntities.js
index 13d7ce45bf..99a0627211 100644
--- a/superset-frontend/src/dashboard/actions/sliceEntities.js
+++ b/superset-frontend/src/dashboard/actions/sliceEntities.js
@@ -17,12 +17,12 @@
  * under the License.
  */
 /* eslint camelcase: 0 */
-import { t, SupersetClient } from '@superset-ui/core';
+import { FeatureFlag, SupersetClient, t } from '@superset-ui/core';
 import rison from 'rison';
 
 import { addDangerToast } from 'src/components/MessageToasts/actions';
 import { getClientErrorObject } from 'src/utils/getClientErrorObject';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 export const SET_ALL_SLICES = 'SET_ALL_SLICES';
 const FETCH_SLICES_PAGE_SIZE = 200;
diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx
index 3a641660da..388f8ee3c1 100644
--- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx
+++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx
@@ -21,7 +21,8 @@ import React from 'react';
 import fetchMock from 'fetch-mock';
 import { render } from 'spec/helpers/testing-library';
 import { fireEvent, within } from '@testing-library/react';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { FeatureFlag } from '@superset-ui/core';
+import { isFeatureEnabled } from 'src/featureFlags';
 import DashboardBuilder from 'src/dashboard/components/DashboardBuilder/DashboardBuilder';
 import useStoredSidebarWidth from 'src/components/ResizableSidebar/useStoredSidebarWidth';
 import {
diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx
index 3c64c2ef1e..07eb85482b 100644
--- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx
+++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx
@@ -29,6 +29,7 @@ import React, {
 import {
   addAlpha,
   css,
+  FeatureFlag,
   JsonObject,
   styled,
   t,
@@ -57,7 +58,7 @@ import {
   setDirectPathToChild,
   setEditMode,
 } from 'src/dashboard/actions/dashboardState';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   deleteTopLevelTabs,
   handleComponentDrop,
diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/state.ts b/superset-frontend/src/dashboard/components/DashboardBuilder/state.ts
index 8072282138..d213d292ee 100644
--- a/superset-frontend/src/dashboard/components/DashboardBuilder/state.ts
+++ b/superset-frontend/src/dashboard/components/DashboardBuilder/state.ts
@@ -17,7 +17,8 @@
  * under the License.
  */
 import { useSelector } from 'react-redux';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { FeatureFlag } from '@superset-ui/core';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { useCallback, useEffect, useState } from 'react';
 import { URL_PARAMS } from 'src/constants';
 import { getUrlParam } from 'src/utils/urlUtils';
diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/FiltersBadge.test.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/FiltersBadge.test.tsx
index cae293bd74..058c5329b6 100644
--- a/superset-frontend/src/dashboard/components/FiltersBadge/FiltersBadge.test.tsx
+++ b/superset-frontend/src/dashboard/components/FiltersBadge/FiltersBadge.test.tsx
@@ -18,7 +18,6 @@
  */
 import React from 'react';
 import { shallow } from 'enzyme';
-import { supersetTheme } from '@superset-ui/core';
 import { Provider } from 'react-redux';
 import { Store } from 'redux';
 import * as SupersetUI from '@superset-ui/core';
@@ -36,7 +35,6 @@ import {
 import { sliceId } from 'spec/fixtures/mockChartQueries';
 import { dashboardFilters } from 'spec/fixtures/mockDashboardFilters';
 import { dashboardWithFilter } from 'spec/fixtures/mockDashboardLayout';
-import { FeatureFlag } from 'src/featureFlags';
 
 const defaultStore = getMockStoreWithFilters();
 function setup(store: Store = defaultStore) {
@@ -60,7 +58,9 @@ describe('FiltersBadge', () => {
     // shallow rendering in enzyme doesn't propagate contexts correctly,
     // so we have to mock the hook.
     // See https://medium.com/7shifts-engineering-blog/testing-usecontext-react-hook-with-enzyme-shallow-da062140fc83
-    jest.spyOn(SupersetUI, 'useTheme').mockImplementation(() => supersetTheme);
+    jest
+      .spyOn(SupersetUI, 'useTheme')
+      .mockImplementation(() => SupersetUI.supersetTheme);
   });
 
   describe('for dashboard filters', () => {
@@ -135,7 +135,7 @@ describe('FiltersBadge', () => {
     it('shows the indicator when filters have been applied', () => {
       // @ts-ignore
       global.featureFlags = {
-        [FeatureFlag.DASHBOARD_NATIVE_FILTERS]: true,
+        [SupersetUI.FeatureFlag.DASHBOARD_NATIVE_FILTERS]: true,
       };
       const store = getMockStoreWithNativeFilters();
       // start with basic dashboard state, dispatch an event to simulate query completion
diff --git a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
index ae1e5b8308..7c375caf5b 100644
--- a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
+++ b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx
@@ -20,7 +20,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { isEmpty } from 'lodash';
 
-import { SupersetClient, t } from '@superset-ui/core';
+import { FeatureFlag, SupersetClient, t } from '@superset-ui/core';
 
 import { Menu } from 'src/components/Menu';
 import { URL_PARAMS } from 'src/constants';
@@ -37,7 +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';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 const propTypes = {
   addSuccessToast: PropTypes.func.isRequired,
diff --git a/superset-frontend/src/dashboard/components/Header/index.jsx b/superset-frontend/src/dashboard/components/Header/index.jsx
index 083f566834..72d583ebf2 100644
--- a/superset-frontend/src/dashboard/components/Header/index.jsx
+++ b/superset-frontend/src/dashboard/components/Header/index.jsx
@@ -23,12 +23,13 @@ import PropTypes from 'prop-types';
 import {
   styled,
   css,
+  FeatureFlag,
   t,
   getSharedLabelColor,
   getUiOverrideRegistry,
 } from '@superset-ui/core';
 import { Global } from '@emotion/react';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   LOG_ACTIONS_PERIODIC_RENDER_DASHBOARD,
   LOG_ACTIONS_FORCE_REFRESH_DASHBOARD,
diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
index b12102d324..22b2734761 100644
--- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
+++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
@@ -26,6 +26,7 @@ import rison from 'rison';
 import {
   CategoricalColorNamespace,
   ensureIsArray,
+  FeatureFlag,
   getCategoricalSchemeRegistry,
   getSharedLabelColor,
   styled,
@@ -40,7 +41,7 @@ import ColorSchemeControlWrapper from 'src/dashboard/components/ColorSchemeContr
 import FilterScopeModal from 'src/dashboard/components/filterscope/FilterScopeModal';
 import { getClientErrorObject } from 'src/utils/getClientErrorObject';
 import withToasts from 'src/components/MessageToasts/withToasts';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import TagType from 'src/types/TagType';
 import { addTag, deleteTaggedObjects, fetchTags, OBJECT_TYPES } from 'src/tags';
 import { loadTags } from 'src/components/Tags/utils';
diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx
index 3a1e305640..26f3a6bbbf 100644
--- a/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx
+++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx
@@ -21,7 +21,7 @@ import userEvent from '@testing-library/user-event';
 import React from 'react';
 import { getMockStore } from 'spec/fixtures/mockStore';
 import { render, screen } from 'spec/helpers/testing-library';
-import { FeatureFlag } from 'src/featureFlags';
+import { FeatureFlag } from '@superset-ui/core';
 import SliceHeaderControls, { SliceHeaderControlsProps } from '.';
 
 jest.mock('src/components/Dropdown', () => {
diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx
index 2d82b39d86..71a1585036 100644
--- a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx
+++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx
@@ -30,12 +30,19 @@ import {
   withRouter,
 } from 'react-router-dom';
 import moment from 'moment';
-import { css, QueryFormData, styled, t, useTheme } from '@superset-ui/core';
+import {
+  css,
+  FeatureFlag,
+  QueryFormData,
+  styled,
+  t,
+  useTheme,
+} from '@superset-ui/core';
 import { Menu } from 'src/components/Menu';
 import { NoAnimationDropdown } from 'src/components/Dropdown';
 import ShareMenuItems from 'src/dashboard/components/menu/ShareMenuItems';
 import downloadAsImage from 'src/utils/downloadAsImage';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { getSliceHeaderTooltip } from 'src/dashboard/util/getSliceHeaderTooltip';
 import { Tooltip } from 'src/components/Tooltip';
 import Icons from 'src/components/Icons';
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx
index 7a8106ecbe..d6428e0f00 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx
@@ -23,8 +23,7 @@ import userEvent from '@testing-library/user-event';
 import { stateWithoutNativeFilters } from 'spec/fixtures/mockStore';
 import * as mockCore from '@superset-ui/core';
 import { testWithId } from 'src/utils/testUtils';
-import { FeatureFlag } from 'src/featureFlags';
-import { Preset } from '@superset-ui/core';
+import { FeatureFlag, Preset } from '@superset-ui/core';
 import { TimeFilterPlugin, SelectFilterPlugin } from 'src/filters/components';
 import { DATE_FILTER_TEST_KEY } from 'src/explore/components/controls/DateFilterControl';
 import fetchMock from 'fetch-mock';
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
index 0347d2095e..ad61be7a13 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
@@ -24,22 +24,23 @@ import React, {
   useState,
 } from 'react';
 import {
+  ChartDataResponseResult,
+  Behavior,
+  DataMask,
+  FeatureFlag,
+  getChartMetadataRegistry,
+  JsonObject,
   QueryFormData,
+  styled,
   SuperChart,
-  DataMask,
   t,
-  styled,
-  Behavior,
-  ChartDataResponseResult,
-  JsonObject,
-  getChartMetadataRegistry,
 } from '@superset-ui/core';
 import { useDispatch, useSelector } from 'react-redux';
 import { isEqual, isEqualWith } from 'lodash';
 import { getChartDataRequest } from 'src/components/Chart/chartAction';
 import Loading from 'src/components/Loading';
 import BasicErrorAlert from 'src/components/ErrorMessage/BasicErrorAlert';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { waitForAsyncData } from 'src/middleware/asyncEvent';
 import { ClientErrorObject } from 'src/utils/getClientErrorObject';
 import { FilterBarOrientation, RootState } from 'src/dashboard/types';
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
index 265c5932ac..07b327e3b4 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
@@ -28,10 +28,16 @@ import React, {
   createContext,
 } from 'react';
 import cx from 'classnames';
-import { HandlerFunction, styled, t, isNativeFilter } from '@superset-ui/core';
+import {
+  FeatureFlag,
+  HandlerFunction,
+  isNativeFilter,
+  styled,
+  t,
+} from '@superset-ui/core';
 import Icons from 'src/components/Icons';
 import { AntdTabs } from 'src/components';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import Loading from 'src/components/Loading';
 import { EmptyStateSmall } from 'src/components/EmptyState';
 import { getFilterBarTestId } from './utils';
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 3b804acd8f..7ffcd3a98b 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
@@ -27,6 +27,7 @@ import {
   Behavior,
   ChartDataResponseResult,
   Column,
+  FeatureFlag,
   Filter,
   GenericDataType,
   getChartMetadataRegistry,
@@ -69,7 +70,7 @@ import {
 } from 'src/dashboard/types';
 import DateFilterControl from 'src/explore/components/controls/DateFilterControl';
 import AdhocFilterControl from 'src/explore/components/controls/FilterControl/AdhocFilterControl';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { waitForAsyncData } from 'src/middleware/asyncEvent';
 import { ClientErrorObject } from 'src/utils/getClientErrorObject';
 import { SingleValueType } from 'src/filters/components/Range/SingleValueType';
diff --git a/superset-frontend/src/dataMask/actions.ts b/superset-frontend/src/dataMask/actions.ts
index a26b49f807..89e88ce130 100644
--- a/superset-frontend/src/dataMask/actions.ts
+++ b/superset-frontend/src/dataMask/actions.ts
@@ -16,8 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { DataMask, FilterConfiguration, Filters } from '@superset-ui/core';
-import { FeatureFlag, isFeatureEnabled } from '../featureFlags';
+import {
+  DataMask,
+  FeatureFlag,
+  FilterConfiguration,
+  Filters,
+} from '@superset-ui/core';
+import { isFeatureEnabled } from '../featureFlags';
 import { getInitialDataMask } from './reducer';
 
 export const CLEAR_DATA_MASK_STATE = 'CLEAR_DATA_MASK_STATE';
diff --git a/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx b/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx
index 4101911da7..54f222c717 100644
--- a/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx
+++ b/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx
@@ -23,10 +23,10 @@ import React, {
   useState,
   MouseEvent,
 } from 'react';
-import { styled, t, useTheme } from '@superset-ui/core';
+import { FeatureFlag, styled, t, useTheme } from '@superset-ui/core';
 import Icons from 'src/components/Icons';
 import Tabs from 'src/components/Tabs';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   getItem,
   setItem,
diff --git a/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx b/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx
index a27385f51e..4a4a5203f5 100644
--- a/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx
+++ b/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx
@@ -19,7 +19,7 @@
 import React from 'react';
 import userEvent from '@testing-library/user-event';
 import fetchMock from 'fetch-mock';
-import { FeatureFlag } from 'src/featureFlags';
+import { FeatureFlag } from '@superset-ui/core';
 import * as copyUtils from 'src/utils/copy';
 import {
   render,
diff --git a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
index dedffc1044..efedacd220 100644
--- a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
+++ b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
@@ -19,11 +19,12 @@
 import React, { useEffect, useMemo, useRef, useState } from 'react';
 import {
   css,
-  styled,
-  t,
   DatasourceType,
+  FeatureFlag,
   Metric,
   QueryFormData,
+  styled,
+  t,
 } from '@superset-ui/core';
 
 import { ControlConfig, ColumnMeta } from '@superset-ui/chart-controls';
@@ -36,7 +37,7 @@ import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal';
 import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils';
 import { Input } from 'src/components/Input';
 import { FAST_DEBOUNCE } from 'src/constants';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { ExploreActions } from 'src/explore/actions/exploreActions';
 import Control from 'src/explore/components/Control';
 import DatasourcePanelDragOption from './DatasourcePanelDragOption';
diff --git a/superset-frontend/src/explore/components/ExploreChartPanel.jsx b/superset-frontend/src/explore/components/ExploreChartPanel.jsx
index a2f7d05b28..1e57e0750e 100644
--- a/superset-frontend/src/explore/components/ExploreChartPanel.jsx
+++ b/superset-frontend/src/explore/components/ExploreChartPanel.jsx
@@ -21,18 +21,19 @@ import PropTypes from 'prop-types';
 import Split from 'react-split';
 import {
   css,
+  DatasourceType,
   ensureIsArray,
+  FeatureFlag,
+  getChartMetadataRegistry,
   styled,
   SupersetClient,
   t,
   useTheme,
-  getChartMetadataRegistry,
-  DatasourceType,
 } from '@superset-ui/core';
 import { useResizeDetector } from 'react-resize-detector';
 import { chartPropShape } from 'src/dashboard/util/propShapes';
 import ChartContainer from 'src/components/Chart/ChartContainer';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   getItem,
   setItem,
diff --git a/superset-frontend/src/explore/components/SaveModal.tsx b/superset-frontend/src/explore/components/SaveModal.tsx
index 8d7bd2d895..9e63f10b61 100644
--- a/superset-frontend/src/explore/components/SaveModal.tsx
+++ b/superset-frontend/src/explore/components/SaveModal.tsx
@@ -25,11 +25,12 @@ import { withRouter, RouteComponentProps } from 'react-router-dom';
 import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls';
 import {
   css,
-  t,
-  styled,
   DatasourceType,
-  isDefined,
   ensureIsArray,
+  FeatureFlag,
+  isDefined,
+  styled,
+  t,
 } from '@superset-ui/core';
 import { Input } from 'src/components/Input';
 import { Form, FormItem } from 'src/components/Form';
@@ -41,7 +42,7 @@ import { Select } from 'src/components';
 import Loading from 'src/components/Loading';
 import { setSaveChartModalVisibility } from 'src/explore/actions/saveModalActions';
 import { SaveActionType } from 'src/explore/types';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 // Session storage key for recent dashboard
 const SK_DASHBOARD_ID = 'save_chart_recent_dashboard';
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
index 84feb448f6..482746acf8 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
@@ -20,12 +20,13 @@ import React, { useEffect, useState } from 'react';
 import FormItem from 'src/components/Form/FormItem';
 import { Select } from 'src/components';
 import {
-  t,
-  SupersetClient,
-  SupersetTheme,
-  styled,
+  FeatureFlag,
   hasGenericChartAxes,
   isDefined,
+  styled,
+  SupersetClient,
+  SupersetTheme,
+  t,
 } from '@superset-ui/core';
 import {
   Operators,
@@ -42,7 +43,7 @@ import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilt
 import { Tooltip } from 'src/components/Tooltip';
 import { Input } from 'src/components/Input';
 import { optionLabel } from 'src/utils/common';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   ColumnMeta,
   Dataset,
diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx
index 445db6dc44..11e242a2e3 100644
--- a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx
+++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx
@@ -18,7 +18,7 @@
  */
 import React, { useCallback, useMemo, useState } from 'react';
 import { useSelector } from 'react-redux';
-import { css, styled, t, useTheme } from '@superset-ui/core';
+import { css, FeatureFlag, styled, t, useTheme } from '@superset-ui/core';
 import Icons from 'src/components/Icons';
 import { Menu } from 'src/components/Menu';
 import ModalTrigger from 'src/components/ModalTrigger';
@@ -29,7 +29,7 @@ import downloadAsImage from 'src/utils/downloadAsImage';
 import { getChartPermalink } from 'src/utils/urlUtils';
 import copyTextToClipboard from 'src/utils/copy';
 import HeaderReportDropDown from 'src/components/ReportModal/HeaderReportDropdown';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import ViewQueryModal from '../controls/ViewQueryModal';
 import EmbedCodeContent from '../EmbedCodeContent';
 import DashboardsSubMenu from './DashboardsSubMenu';
diff --git a/superset-frontend/src/featureFlags.ts b/superset-frontend/src/featureFlags.ts
index e71ec82074..d7387f2796 100644
--- a/superset-frontend/src/featureFlags.ts
+++ b/superset-frontend/src/featureFlags.ts
@@ -16,10 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { FeatureFlagMap, FeatureFlag } from '@superset-ui/core';
-
-export { FeatureFlag } from '@superset-ui/core';
-export type { FeatureFlagMap } from '@superset-ui/core';
+import { FeatureFlag, FeatureFlagMap } from '@superset-ui/core';
 
 export function initFeatureFlags(featureFlags?: FeatureFlagMap) {
   if (!window.featureFlags) {
diff --git a/superset-frontend/src/middleware/asyncEvent.ts b/superset-frontend/src/middleware/asyncEvent.ts
index 6966ad6d3f..5d878cef55 100644
--- a/superset-frontend/src/middleware/asyncEvent.ts
+++ b/superset-frontend/src/middleware/asyncEvent.ts
@@ -18,13 +18,14 @@
  */
 import {
   ensureIsArray,
+  FeatureFlag,
   makeApi,
   SupersetClient,
   logging,
 } from '@superset-ui/core';
 import { SupersetError } from 'src/components/ErrorMessage/types';
 import getBootstrapData from 'src/utils/getBootstrapData';
-import { FeatureFlag, isFeatureEnabled } from '../featureFlags';
+import { isFeatureEnabled } from '../featureFlags';
 import {
   getClientErrorObject,
   parseErrorJson,
diff --git a/superset-frontend/src/pages/ChartCreation/index.tsx b/superset-frontend/src/pages/ChartCreation/index.tsx
index baa0c78f1a..7ff3442c9d 100644
--- a/superset-frontend/src/pages/ChartCreation/index.tsx
+++ b/superset-frontend/src/pages/ChartCreation/index.tsx
@@ -20,11 +20,12 @@ import React, { ReactNode } from 'react';
 import rison from 'rison';
 import querystring from 'query-string';
 import {
+  FeatureFlag,
+  isDefined,
+  JsonResponse,
   styled,
-  t,
   SupersetClient,
-  JsonResponse,
-  isDefined,
+  t,
 } from '@superset-ui/core';
 import { getUrlParam } from 'src/utils/urlUtils';
 import { URL_PARAMS } from 'src/constants';
@@ -33,7 +34,7 @@ import Button from 'src/components/Button';
 import { AsyncSelect, Steps } from 'src/components';
 import { Tooltip } from 'src/components/Tooltip';
 import withToasts from 'src/components/MessageToasts/withToasts';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 
 import VizTypeGallery, {
   MAX_ADVISABLE_VIZ_GALLERY_WIDTH,
diff --git a/superset-frontend/src/pages/ChartList/index.tsx b/superset-frontend/src/pages/ChartList/index.tsx
index 1da3394fd2..8265604556 100644
--- a/superset-frontend/src/pages/ChartList/index.tsx
+++ b/superset-frontend/src/pages/ChartList/index.tsx
@@ -18,6 +18,7 @@
  */
 import {
   ensureIsArray,
+  FeatureFlag,
   getChartMetadataRegistry,
   JsonResponse,
   styled,
@@ -28,7 +29,7 @@ import React, { useState, useMemo, useCallback } from 'react';
 import rison from 'rison';
 import { uniqBy } from 'lodash';
 import moment from 'moment';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   createErrorHandler,
   createFetchRelated,
diff --git a/superset-frontend/src/pages/DashboardList/index.tsx b/superset-frontend/src/pages/DashboardList/index.tsx
index d4c484043d..e0f81e0bf4 100644
--- a/superset-frontend/src/pages/DashboardList/index.tsx
+++ b/superset-frontend/src/pages/DashboardList/index.tsx
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { styled, SupersetClient, t } from '@superset-ui/core';
+import { FeatureFlag, styled, SupersetClient, t } from '@superset-ui/core';
 import React, { useState, useMemo, useCallback } from 'react';
 import { Link } from 'react-router-dom';
 import rison from 'rison';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   createFetchRelated,
   createErrorHandler,
diff --git a/superset-frontend/src/pages/DatabaseList/index.tsx b/superset-frontend/src/pages/DatabaseList/index.tsx
index c20c3b006b..a9ae567c60 100644
--- a/superset-frontend/src/pages/DatabaseList/index.tsx
+++ b/superset-frontend/src/pages/DatabaseList/index.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { SupersetClient, t, styled } from '@superset-ui/core';
+import { FeatureFlag, styled, SupersetClient, t } from '@superset-ui/core';
 import React, { useState, useMemo, useEffect } from 'react';
 import rison from 'rison';
 import { useSelector } from 'react-redux';
@@ -24,7 +24,7 @@ import { useQueryParams, BooleanParam } from 'use-query-params';
 import { LocalStorageKeys, setItem } from 'src/utils/localStorageHelpers';
 
 import Loading from 'src/components/Loading';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { useListViewResource } from 'src/views/CRUD/hooks';
 import { createErrorHandler, uploadUserPerms } from 'src/views/CRUD/utils';
 import withToasts from 'src/components/MessageToasts/withToasts';
diff --git a/superset-frontend/src/pages/DatasetList/DatasetList.test.tsx b/superset-frontend/src/pages/DatasetList/DatasetList.test.tsx
index 1ce9a7bc0f..c061d1ab25 100644
--- a/superset-frontend/src/pages/DatasetList/DatasetList.test.tsx
+++ b/superset-frontend/src/pages/DatasetList/DatasetList.test.tsx
@@ -23,6 +23,7 @@ import fetchMock from 'fetch-mock';
 import { Provider } from 'react-redux';
 import { styledMount as mount } from 'spec/helpers/theming';
 import { render, screen, cleanup } from 'spec/helpers/testing-library';
+import { FeatureFlag } from '@superset-ui/core';
 import userEvent from '@testing-library/user-event';
 import { QueryParamProvider } from 'use-query-params';
 import * as featureFlags from 'src/featureFlags';
@@ -255,10 +256,7 @@ describe('RTL', () => {
     return mounted;
   }
 
-  let isFeatureEnabledMock: jest.SpyInstance<
-    boolean,
-    [feature: featureFlags.FeatureFlag]
-  >;
+  let isFeatureEnabledMock: jest.SpyInstance<boolean, [feature: FeatureFlag]>;
   beforeEach(async () => {
     isFeatureEnabledMock = jest
       .spyOn(featureFlags, 'isFeatureEnabled')
diff --git a/superset-frontend/src/pages/DatasetList/index.tsx b/superset-frontend/src/pages/DatasetList/index.tsx
index bdb2683ad4..68f6c11348 100644
--- a/superset-frontend/src/pages/DatasetList/index.tsx
+++ b/superset-frontend/src/pages/DatasetList/index.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { SupersetClient, t, styled } from '@superset-ui/core';
+import { FeatureFlag, styled, SupersetClient, t } from '@superset-ui/core';
 import React, {
   FunctionComponent,
   useState,
@@ -54,7 +54,7 @@ import FacePile from 'src/components/FacePile';
 import CertifiedBadge from 'src/components/CertifiedBadge';
 import InfoTooltip from 'src/components/InfoTooltip';
 import ImportModelsModal from 'src/components/ImportModal/index';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip';
 import { isUserAdmin } from 'src/dashboard/util/permissionUtils';
 import { GenericLink } from 'src/components/GenericLink/GenericLink';
diff --git a/superset-frontend/src/pages/Home/Home.test.tsx b/superset-frontend/src/pages/Home/Home.test.tsx
index fd90d1624a..cbf9b00272 100644
--- a/superset-frontend/src/pages/Home/Home.test.tsx
+++ b/superset-frontend/src/pages/Home/Home.test.tsx
@@ -40,7 +40,7 @@ const chartFavoriteStatusEndpoint = 'glob:*/api/v1/chart/favorite_status?*';
 const dashboardsEndpoint = 'glob:*/api/v1/dashboard/?*';
 const dashboardInfoEndpoint = 'glob:*/api/v1/dashboard/_info?*';
 const dashboardFavoriteStatusEndpoint =
-  'glob:*/api/v1/dashboard/favorite_status?*';
+  'glob:*/api/v1/dashboard/favorite_status/?*';
 const savedQueryEndpoint = 'glob:*/api/v1/saved_query/?*';
 const savedQueryInfoEndpoint = 'glob:*/api/v1/saved_query/_info?*';
 const recentActivityEndpoint = 'glob:*/api/v1/log/recent_activity/*';
diff --git a/superset-frontend/src/pages/Home/index.tsx b/superset-frontend/src/pages/Home/index.tsx
index fa1d3649c4..6018b38bfa 100644
--- a/superset-frontend/src/pages/Home/index.tsx
+++ b/superset-frontend/src/pages/Home/index.tsx
@@ -18,6 +18,7 @@
  */
 import React, { useEffect, useMemo, useState } from 'react';
 import {
+  FeatureFlag,
   getExtensionsRegistry,
   JsonObject,
   styled,
@@ -28,26 +29,27 @@ import Collapse from 'src/components/Collapse';
 import { User } from 'src/types/bootstrapTypes';
 import { reject } from 'lodash';
 import {
-  getItem,
   dangerouslyGetItemDoNotUse,
-  setItem,
   dangerouslySetItemDoNotUse,
+  getItem,
   LocalStorageKeys,
+  setItem,
 } from 'src/utils/localStorageHelpers';
 import ListViewCard from 'src/components/ListViewCard';
 import withToasts from 'src/components/MessageToasts/withToasts';
 import {
+  CardContainer,
   createErrorHandler,
   getRecentActivityObjs,
-  mq,
-  CardContainer,
   getUserOwnedObjects,
   loadingCardCount,
+  mq,
 } from 'src/views/CRUD/utils';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { AntdSwitch } from 'src/components';
 import getBootstrapData from 'src/utils/getBootstrapData';
 import { TableTab } from 'src/views/CRUD/types';
+import SubMenu, { SubMenuProps } from 'src/views/components/SubMenu';
 import { canUserAccessSqlLab } from 'src/dashboard/util/permissionUtils';
 import { WelcomePageLastTab } from 'src/views/CRUD/welcome/types';
 import ActivityTable from 'src/views/CRUD/welcome/ActivityTable';
@@ -125,23 +127,14 @@ const WelcomeContainer = styled.div`
 
 const WelcomeNav = styled.div`
   ${({ theme }) => `
-    display: flex;
-    justify-content: space-between;
-    height: 50px;
-    background-color: ${theme.colors.grayscale.light5};
-    .welcome-header {
-      font-size: ${theme.typography.sizes.l}px;
-      padding: ${theme.gridUnit * 4}px ${theme.gridUnit * 2 + 2}px;
-      margin: 0 ${theme.gridUnit * 2}px;
-    }
     .switch {
       display: flex;
       flex-direction: row;
       margin: ${theme.gridUnit * 4}px;
       span {
         display: block;
-        margin: ${theme.gridUnit * 1}px;
-        line-height: 1;
+        margin: ${theme.gridUnit}px;
+        line-height: ${theme.gridUnit * 3.5}px;
       }
     }
   `}
@@ -171,7 +164,8 @@ function Welcome({ user, addDangerToast }: WelcomeProps) {
   const [activeChild, setActiveChild] = useState('Loading');
   const userKey = dangerouslyGetItemDoNotUse(id, null);
   let defaultChecked = false;
-  if (isFeatureEnabled(FeatureFlag.THUMBNAILS)) {
+  const isThumbnailsEnabled = isFeatureEnabled(FeatureFlag.THUMBNAILS);
+  if (isThumbnailsEnabled) {
     defaultChecked =
       userKey?.thumbnails === undefined ? true : userKey?.thumbnails;
   }
@@ -334,91 +328,107 @@ function Welcome({ user, addDangerToast }: WelcomeProps) {
   const isRecentActivityLoading =
     !activityData?.[TableTab.Other] && !activityData?.[TableTab.Viewed];
 
-  return (
-    <WelcomeContainer>
-      {WelcomeMessageExtension && <WelcomeMessageExtension />}
-      {WelcomeTopExtension && <WelcomeTopExtension />}
-      {WelcomeMainExtension && <WelcomeMainExtension />}
-      {(!WelcomeTopExtension || !WelcomeMainExtension) && (
-        <>
+  const menuData: SubMenuProps = {
+    activeChild: 'Home',
+    name: t('Home'),
+  };
+
+  if (isThumbnailsEnabled) {
+    menuData.buttons = [
+      {
+        name: (
           <WelcomeNav>
-            <h1 className="welcome-header">{t('Home')}</h1>
-            {isFeatureEnabled(FeatureFlag.THUMBNAILS) ? (
-              <div className="switch">
-                <AntdSwitch checked={checked} onChange={handleToggle} />
-                <span>{t('Thumbnails')}</span>
-              </div>
-            ) : null}
+            <div className="switch">
+              <AntdSwitch checked={checked} onClick={handleToggle} />
+              <span>{t('Thumbnails')}</span>
+            </div>
           </WelcomeNav>
-          <Collapse
-            activeKey={activeState}
-            onChange={handleCollapse}
-            ghost
-            bigger
-          >
-            <Collapse.Panel header={t('Recents')} key="1">
-              {activityData &&
-              (activityData[TableTab.Viewed] ||
-                activityData[TableTab.Other] ||
-                activityData[TableTab.Created]) &&
-              activeChild !== 'Loading' ? (
-                <ActivityTable
-                  user={{ userId: user.userId! }} // user is definitely not a guest user on this page
-                  activeChild={activeChild}
-                  setActiveChild={setActiveChild}
-                  activityData={activityData}
-                  isFetchingActivityData={isFetchingActivityData}
-                />
-              ) : (
-                <LoadingCards />
-              )}
-            </Collapse.Panel>
-            <Collapse.Panel header={t('Dashboards')} key="2">
-              {!dashboardData || isRecentActivityLoading ? (
-                <LoadingCards cover={checked} />
-              ) : (
-                <DashboardTable
-                  user={user}
-                  mine={dashboardData}
-                  showThumbnails={checked}
-                  otherTabData={activityData?.[TableTab.Other]}
-                  otherTabFilters={otherTabFilters}
-                  otherTabTitle={otherTabTitle}
-                />
-              )}
-            </Collapse.Panel>
-            <Collapse.Panel header={t('Charts')} key="3">
-              {!chartData || isRecentActivityLoading ? (
-                <LoadingCards cover={checked} />
-              ) : (
-                <ChartTable
-                  showThumbnails={checked}
-                  user={user}
-                  mine={chartData}
-                  otherTabData={activityData?.[TableTab.Other]}
-                  otherTabFilters={otherTabFilters}
-                  otherTabTitle={otherTabTitle}
-                />
-              )}
-            </Collapse.Panel>
-            {canAccessSqlLab && (
-              <Collapse.Panel header={t('Saved queries')} key="4">
-                {!queryData ? (
+        ),
+        onClick: handleToggle,
+        buttonStyle: 'link',
+      },
+    ];
+  }
+
+  return (
+    <>
+      <SubMenu {...menuData} />
+      <WelcomeContainer>
+        {WelcomeMessageExtension && <WelcomeMessageExtension />}
+        {WelcomeTopExtension && <WelcomeTopExtension />}
+        {WelcomeMainExtension && <WelcomeMainExtension />}
+        {(!WelcomeTopExtension || !WelcomeMainExtension) && (
+          <>
+            <Collapse
+              activeKey={activeState}
+              onChange={handleCollapse}
+              ghost
+              bigger
+            >
+              <Collapse.Panel header={t('Recents')} key="1">
+                {activityData &&
+                (activityData[TableTab.Viewed] ||
+                  activityData[TableTab.Other] ||
+                  activityData[TableTab.Created]) &&
+                activeChild !== 'Loading' ? (
+                  <ActivityTable
+                    user={{ userId: user.userId! }} // user is definitely not a guest user on this page
+                    activeChild={activeChild}
+                    setActiveChild={setActiveChild}
+                    activityData={activityData}
+                    isFetchingActivityData={isFetchingActivityData}
+                  />
+                ) : (
+                  <LoadingCards />
+                )}
+              </Collapse.Panel>
+              <Collapse.Panel header={t('Dashboards')} key="2">
+                {!dashboardData || isRecentActivityLoading ? (
                   <LoadingCards cover={checked} />
                 ) : (
-                  <SavedQueries
+                  <DashboardTable
+                    user={user}
+                    mine={dashboardData}
+                    showThumbnails={checked}
+                    otherTabData={activityData?.[TableTab.Other]}
+                    otherTabFilters={otherTabFilters}
+                    otherTabTitle={otherTabTitle}
+                  />
+                )}
+              </Collapse.Panel>
+              <Collapse.Panel header={t('Charts')} key="3">
+                {!chartData || isRecentActivityLoading ? (
+                  <LoadingCards cover={checked} />
+                ) : (
+                  <ChartTable
                     showThumbnails={checked}
                     user={user}
-                    mine={queryData}
-                    featureFlag={isFeatureEnabled(FeatureFlag.THUMBNAILS)}
+                    mine={chartData}
+                    otherTabData={activityData?.[TableTab.Other]}
+                    otherTabFilters={otherTabFilters}
+                    otherTabTitle={otherTabTitle}
                   />
                 )}
               </Collapse.Panel>
-            )}
-          </Collapse>
-        </>
-      )}
-    </WelcomeContainer>
+              {canAccessSqlLab && (
+                <Collapse.Panel header={t('Saved queries')} key="4">
+                  {!queryData ? (
+                    <LoadingCards cover={checked} />
+                  ) : (
+                    <SavedQueries
+                      showThumbnails={checked}
+                      user={user}
+                      mine={queryData}
+                      featureFlag={isThumbnailsEnabled}
+                    />
+                  )}
+                </Collapse.Panel>
+              )}
+            </Collapse>
+          </>
+        )}
+      </WelcomeContainer>
+    </>
   );
 }
 
diff --git a/superset-frontend/src/pages/SavedQueryList/index.tsx b/superset-frontend/src/pages/SavedQueryList/index.tsx
index 5f57de5713..71eedc1de1 100644
--- a/superset-frontend/src/pages/SavedQueryList/index.tsx
+++ b/superset-frontend/src/pages/SavedQueryList/index.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { SupersetClient, t, styled } from '@superset-ui/core';
+import { FeatureFlag, styled, SupersetClient, t } from '@superset-ui/core';
 import React, { useState, useMemo, useCallback } from 'react';
 import rison from 'rison';
 import moment from 'moment';
@@ -49,7 +49,7 @@ import { commonMenuData } from 'src/views/CRUD/data/common';
 import { SavedQueryObject } from 'src/views/CRUD/types';
 import copyTextToClipboard from 'src/utils/copy';
 import Tag from 'src/types/TagType';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import ImportModelsModal from 'src/components/ImportModal/index';
 import Icons from 'src/components/Icons';
 import { BootstrapUser } from 'src/types/bootstrapTypes';
diff --git a/superset-frontend/src/pages/Tags/index.tsx b/superset-frontend/src/pages/Tags/index.tsx
index 440e33bf9c..13c3e8ec49 100644
--- a/superset-frontend/src/pages/Tags/index.tsx
+++ b/superset-frontend/src/pages/Tags/index.tsx
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { t } from '@superset-ui/core';
+import { FeatureFlag, t } from '@superset-ui/core';
 import React, { useMemo, useCallback } from 'react';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import {
   createFetchRelated,
   createErrorHandler,
diff --git a/superset-frontend/src/utils/hostNamesConfig.js b/superset-frontend/src/utils/hostNamesConfig.js
index 2fda95c46a..eabc3b64ee 100644
--- a/superset-frontend/src/utils/hostNamesConfig.js
+++ b/superset-frontend/src/utils/hostNamesConfig.js
@@ -16,11 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import {
-  initFeatureFlags,
-  isFeatureEnabled,
-  FeatureFlag,
-} from 'src/featureFlags';
+import { FeatureFlag } from '@superset-ui/core';
+import { initFeatureFlags, isFeatureEnabled } from 'src/featureFlags';
 import getBootstrapData from './getBootstrapData';
 
 function getDomainsConfig() {
diff --git a/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx
index 302f9afdd9..9bf6cb6107 100644
--- a/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx
+++ b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx
@@ -24,11 +24,12 @@ import React, {
   useCallback,
 } from 'react';
 import {
+  css,
+  FeatureFlag,
   styled,
-  t,
   SupersetClient,
-  css,
   SupersetTheme,
+  t,
 } from '@superset-ui/core';
 import rison from 'rison';
 import { useSingleViewResource } from 'src/views/CRUD/hooks';
@@ -39,7 +40,7 @@ import Modal from 'src/components/Modal';
 import TimezoneSelector from 'src/components/TimezoneSelector';
 import { Radio } from 'src/components/Radio';
 import { propertyComparator } from 'src/components/Select/utils';
-import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import withToasts from 'src/components/MessageToasts/withToasts';
 import Owner from 'src/types/Owner';
 import { AntdCheckbox, AsyncSelect, Select } from 'src/components';
diff --git a/superset-frontend/src/views/CRUD/chart/ChartCard.tsx b/superset-frontend/src/views/CRUD/chart/ChartCard.tsx
index df9b148567..1a80d34aa8 100644
--- a/superset-frontend/src/views/CRUD/chart/ChartCard.tsx
+++ b/superset-frontend/src/views/CRUD/chart/ChartCard.tsx
@@ -17,9 +17,9 @@
  * under the License.
  */
 import React from 'react';
-import { t, useTheme } from '@superset-ui/core';
+import { FeatureFlag, t, useTheme } from '@superset-ui/core';
 import { Link, useHistory } from 'react-router-dom';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import ConfirmStatusChange from 'src/components/ConfirmStatusChange';
 import Icons from 'src/components/Icons';
 import Chart from 'src/types/Chart';
diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
index 0a46749a01..8d15939515 100644
--- a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
+++ b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
@@ -18,9 +18,9 @@
  */
 import React from 'react';
 import { Link, useHistory } from 'react-router-dom';
-import { t, useTheme } from '@superset-ui/core';
+import { FeatureFlag, t, useTheme } from '@superset-ui/core';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { CardStyles } from 'src/views/CRUD/utils';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
 import { AntdDropdown } from 'src/components';
 import { Menu } from 'src/components/Menu';
 import ListViewCard from 'src/components/ListViewCard';
diff --git a/superset-frontend/src/views/CRUD/tags/TagCard.tsx b/superset-frontend/src/views/CRUD/tags/TagCard.tsx
index 84e600262e..7ed8c1df0d 100644
--- a/superset-frontend/src/views/CRUD/tags/TagCard.tsx
+++ b/superset-frontend/src/views/CRUD/tags/TagCard.tsx
@@ -18,9 +18,9 @@
  */
 import React from 'react';
 import { Link } from 'react-router-dom';
-import { t, useTheme } from '@superset-ui/core';
+import { FeatureFlag, t, useTheme } from '@superset-ui/core';
 import { CardStyles } from 'src/views/CRUD/utils';
-import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { AntdDropdown } from 'src/components';
 import { Menu } from 'src/components/Menu';
 import ConfirmStatusChange from 'src/components/ConfirmStatusChange';